00001
00013 #ifndef _OBJECT_H
00014 #define _OBJECT_H
00015
00016 class cObject;
00017 class cPad;
00018 class cController;
00019 class cWorld;
00020
00021 #include "cWorld.h"
00022 #include "cParticle.h"
00023
00024 #include <string>
00025 #include <vector>
00026 #include <bitset>
00027
00028
00038 unsigned char* loadTGA(const char *fname, int *w, int* h, int* bpp);
00039
00040
00042 void rotationTo(float* result2f, float* own_pos, float* tgt_pos, float* base_ori, float*tower_ori = NULL);
00043
00044
00056 class cObject {
00057 friend class cWorld;
00058 public:
00059
00061 static int ENABLE_TEXTURE_3D;
00062
00064
00065 enum Roles {
00066
00067 NAMEABLE,
00068 SOCIALISED,
00069 TRACEABLE,
00070 COLLIDEABLE,
00071 DAMAGEABLE,
00072 ENTITY,
00073
00074
00075 MECH,
00076 BUILDING,
00077 TREE,
00078 IMMOBILE,
00079
00080
00081 RED,
00082 BLUE,
00083 GREEN,
00084 YELLOW,
00085 CIVIL,
00086
00087
00088 WOUNDED,
00089 SERIOUS,
00090 CRITICAL,
00091 DEAD,
00092
00093
00094 HUMANPLAYER,
00095 FRAGGED,
00096
00097 MAX_ROLES
00098 };
00099
00100 public:
00101
00102 struct rBase {
00104 OID oid;
00106 double seconds;
00108 rBase() : oid(0), seconds(0) {
00109 }
00111 rBase(rBase* original) {
00112 if (original == NULL) {
00113 rBase();
00114 return;
00115 }
00116 oid = original->oid;
00117 seconds = original->seconds;
00118 }
00119 };
00120
00121 rBase* base;
00122
00123
00124 public:
00125
00127
00128 struct rNameable {
00130 std::string name;
00132 std::string description;
00134 unsigned int designation;
00136 rNameable() : name("Unnamed"), description("Undescribed"), designation(0) {
00137 }
00139 rNameable(rNameable* original) {
00140 if (original == NULL) {
00141 rNameable();
00142 return;
00143 }
00144 name = original->name;
00145 description = original->description;
00146 designation = original->designation;
00147 }
00148 };
00149
00150 rNameable* nameable;
00151
00152
00153 public:
00154
00156
00157 struct rSocialised {
00159 std::bitset<MAX_ROLES> roles;
00161 std::bitset<MAX_ROLES> allies;
00163 std::bitset<MAX_ROLES> enemies;
00165 rSocialised() : roles(0), allies(0), enemies(0) {
00166 }
00168 rSocialised(rSocialised* original) {
00169 if (original == NULL) {
00170 rSocialised();
00171 return;
00172 }
00173 roles = original->roles;
00174 allies = original->allies;
00175 enemies = original->enemies;
00176 }
00177 };
00178
00179 rSocialised* socialised;
00180
00181 public:
00182
00184
00185 struct rTraceable : public cParticle {
00187 rTraceable() : cParticle() {}
00189 rTraceable(cParticle* original) : cParticle(original) {}
00190 };
00191
00192 rTraceable* traceable;
00193
00194 public:
00195
00197
00198 struct rDamageable {
00200 enum Parts {
00201 BODY = 0,
00202 LEGS,
00203 LEFT,
00204 RIGHT,
00205 MAX_PARTS
00206 };
00208 float hp[MAX_PARTS];
00209
00210
00211
00212
00213
00214
00216 rDamageable() {
00217 loopi(MAX_PARTS) hp[i] = 100.0f;
00218 }
00220 rDamageable(rDamageable* original) {
00221 if (original == NULL) {
00222 rDamageable();
00223 return;
00224 }
00225 loopi(MAX_PARTS) hp[i] = original->hp[i];
00226 }
00227 };
00228
00229 rDamageable* damageable;
00230
00231 public:
00232
00234
00235 struct rEntity {
00237 OID target;
00239 OID disturber;
00241 std::vector<float> destination;
00243 cPad* pad;
00245 cController* controller;
00247 rEntity() : target(0), disturber(0), destination(3), pad(NULL), controller(NULL) {
00248 destination[0] = destination[1] = destination[2] = float_NAN;
00249 }
00251 rEntity(rEntity* original) {
00252 if (original == NULL) {
00253 rEntity();
00254 return;
00255 }
00256 target = original->target;
00257 disturber = original->disturber;
00258 destination = original->destination;
00259 pad = original->pad;
00260 controller = original->controller;
00261 }
00262 };
00263
00264 rEntity* entity;
00265
00266 public:
00267
00268 cObject() {
00269 base = new rBase;
00270 nameable = new rNameable;
00271 socialised = new rSocialised;
00272 traceable = new rTraceable;
00273 damageable = new rDamageable;
00274 entity = new rEntity;
00275 }
00276
00277 cObject(cObject* original) {
00278 base = new rBase(original->base);
00279 nameable = new rNameable(original->nameable);
00280 socialised = new rSocialised(original->socialised);
00281 traceable = new rTraceable(original->traceable);
00282 damageable = new rDamageable(original->damageable);
00283 entity = new rEntity(original->entity);
00284 }
00285
00286 virtual ~cObject() {
00287 delete this->base;
00288 delete this->damageable;
00289 delete this->entity;
00290 delete this->nameable;
00291 delete this->socialised;
00292 delete this->traceable;
00293 }
00294
00295
00296
00297
00299
00300 bool hasRole(Roles role) {
00301 return socialised->roles[role];
00302 }
00303
00305
00306 void addRole(Roles role) {
00307 socialised->roles[role] = true;
00308 }
00309
00311
00312 void remRole(Roles role) {
00313 socialised->roles[role] = false;
00314 }
00315
00316
00317
00318
00320
00321 bool hasAllied(Roles role) {
00322 return socialised->allies[role];
00323 }
00324
00326
00327 void addAllied(Roles role) {
00328 socialised->allies[role] = true;
00329 }
00330
00332
00333 void remAllied(Roles role) {
00334 socialised->allies[role] = false;
00335 }
00336
00337
00338
00339
00341
00342 bool hasEnemy(Roles role) {
00343 return socialised->enemies[role];
00344 }
00345
00347
00348 void addEnemy(Roles role) {
00349 socialised->enemies[role] = true;
00350 }
00351
00353
00354 void remEnemy(Roles role) {
00355 socialised->enemies[role] = false;
00356 }
00357
00359
00360 virtual void onSpawn() {
00361 }
00362
00364
00365 virtual void onMessage(void* message) {
00366 }
00367
00369
00370 virtual void onFrag() {
00371 }
00372
00374
00375 virtual void multEyeMatrix() {
00376 }
00377
00379
00380 virtual void setAsAudioListener() {
00381 }
00382
00384
00385 virtual void animate(float dt) {
00386 base->seconds += dt;
00387 }
00388
00390
00391 virtual void transform() {
00392 }
00393
00395
00396 virtual void drawSolid() {
00397 }
00398
00400
00401 virtual void drawEffect() {
00402 }
00403
00405
00406 virtual void drawHUD() {
00407 }
00408
00409
00410
00411
00419 virtual void damageByParticle(float* localpos, float damage, cObject* enactor = NULL) {
00420
00421 }
00422
00423
00424
00425
00437 virtual float constrainParticle(float* worldpos, float radius = 0.0f, float* localpos = NULL) {
00438 return 0;
00439 }
00440
00441
00442
00443
00444
00445
00447
00448 virtual OID enemyNearby() {
00449 return 0;
00450 }
00451
00453
00454 virtual OID disturbedBy() {
00455 return 0;
00456 }
00457
00458
00459
00461
00462 virtual float inDestinationRange() {
00463 return 0.0f;
00464 }
00465
00467
00468 virtual float inMeeleRange() {
00469 return 0.0f;
00470 }
00471
00473
00474 virtual float inWeaponRange() {
00475 return 0.0f;
00476 }
00477
00479
00480 virtual float inTargetRange() {
00481 return 0.0f;
00482 }
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00502
00503 virtual void do_moveTowards() {
00504 }
00505
00507
00508 virtual void do_moveNear() {
00509 }
00510
00512
00513 virtual void do_aimAt() {
00514 }
00515
00517
00518 virtual void do_fireAt() {
00519 }
00520
00522
00523 virtual void do_idle() {
00524 }
00525
00527
00528 virtual void do_aimFor(OID target) {
00529 }
00530
00532
00533 virtual void do_moveFor(float* dest) {
00534 }
00535 };
00536
00537 #endif