00001
00013 #ifndef _COBJECT_H
00014 #define _COBJECT_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 <set>
00027 #include <map>
00028 #include <algorithm>
00029
00030
00040 unsigned char* loadTGA(const char *fname, int *w, int* h, int* bpp);
00041
00042
00044 void rotationTo(float* result2f, float* own_pos, float* tgt_pos, float* base_ori, float*tower_ori = NULL);
00045
00046
00048
00049 enum Roles {
00050
00051 BASE,
00052 NAMEABLE,
00053 SOCIALISED,
00054 TRACEABLE,
00055 COLLIDEABLE,
00056 DAMAGEABLE,
00057 ENTITY,
00058
00059
00060 MECH,
00061 BUILDING,
00062 TREE,
00063 IMMOBILE,
00064
00065
00066 RED,
00067 BLUE,
00068 GREEN,
00069 YELLOW,
00070 CIVIL,
00071
00072
00073 WOUNDED,
00074 SERIOUS,
00075 CRITICAL,
00076 DEAD,
00077
00078
00079 HUMANPLAYER,
00080 FRAGGED,
00081
00082 MAX_ROLES
00083 };
00084
00091 struct rRole {
00092 };
00093
00097 struct rBase : public rRole {
00099 OID oid;
00101 double seconds;
00103
00104 rBase() : oid(0), seconds(0) {
00105 }
00107
00108 rBase(rBase * original) {
00109 if (original == NULL) {
00110 rBase();
00111 return;
00112 }
00113 oid = original->oid;
00114 seconds = original->seconds;
00115 }
00116 };
00117
00121 struct rNameable : public rRole {
00123 std::string name;
00125 std::string description;
00127 unsigned int designation;
00129
00130 rNameable() : name("Unnamed"), description("Undescribed"), designation(0) {
00131 }
00133
00134 rNameable(rNameable * original) {
00135 if (original == NULL) {
00136 rNameable();
00137 return;
00138 }
00139 name = original->name;
00140 description = original->description;
00141 designation = original->designation;
00142 }
00143 };
00144
00148 struct rSocialised : public rRole {
00150 std::set<OID> allies;
00152 std::set<OID> enemies;
00154
00155 rSocialised() {
00156 }
00158
00159 rSocialised(rSocialised * original) {
00160 if (original == NULL) {
00161 rSocialised();
00162 return;
00163 }
00164 allies = original->allies;
00165 enemies = original->enemies;
00166 }
00167
00169
00170 bool hasAllied(Roles role) {
00171 return ( allies.find(role) != allies.end());
00172 }
00173
00175
00176 void addAllied(Roles role) {
00177 allies.insert(role);
00178 }
00179
00181
00182 void remAllied(Roles role) {
00183 allies.erase(role);
00184 }
00185
00187
00188 bool hasEnemy(Roles role) {
00189 return ( enemies.find(role) != enemies.end());
00190 }
00191
00193
00194 void addEnemy(Roles role) {
00195 enemies.insert(role);
00196 }
00197
00199
00200 void remEnemy(Roles role) {
00201 enemies.erase(role);
00202 }
00203 };
00204
00208 struct rTraceable : public cParticle, public rRole {
00210
00211 rTraceable() : cParticle() {
00212 }
00214
00215 rTraceable(cParticle * original) : cParticle(original) {
00216 }
00217 };
00218
00222 struct rCollideable : public rRole {
00224
00225 rCollideable() {
00226 };
00227
00229
00230 rCollideable(rCollideable * original) {
00231 };
00232 };
00233
00237 struct rDamageable : public rRole {
00239
00240 enum Parts {
00241 BODY = 0,
00242 LEGS,
00243 LEFT,
00244 RIGHT,
00245 MAX_PARTS
00246 };
00248 float hp[MAX_PARTS];
00249
00250
00251
00252
00253
00254
00256
00257 rDamageable() {
00258 loopi(MAX_PARTS) hp[i] = 100.0f;
00259 }
00261
00262 rDamageable(rDamageable * original) {
00263 if (original == NULL) {
00264 rDamageable();
00265 return;
00266 }
00267 loopi(MAX_PARTS) hp[i] = original->hp[i];
00268 }
00269 };
00270
00274 struct rEntity : public rRole {
00276 OID target;
00278 OID disturber;
00280 std::vector<float> destination;
00282 cPad* pad;
00284 cController* controller;
00286
00287 rEntity() : target(0), disturber(0), destination(3), pad(NULL), controller(NULL) {
00288 destination[0] = destination[1] = destination[2] = float_NAN;
00289 }
00291
00292 rEntity(rEntity * original) {
00293 if (original == NULL) {
00294 rEntity();
00295 return;
00296 }
00297 target = original->target;
00298 disturber = original->disturber;
00299 destination = original->destination;
00300 pad = original->pad;
00301 controller = original->controller;
00302 }
00303 };
00304
00316 class cObject {
00317 friend class cWorld;
00318 public:
00319
00321 static int ENABLE_TEXTURE_3D;
00322
00323 public:
00324
00325 rBase* base;
00326 rNameable* nameable;
00327 rSocialised* socialised;
00328 rTraceable* traceable;
00329 rCollideable* collideable;
00330 rDamageable* damageable;
00331 rEntity* entity;
00332
00333 public:
00334
00335 static std::map<std::string, OID> roleids;
00336 static std::map<OID, std::string> rolenames;
00337 std::map<OID, rRole*> roles;
00338 std::set<OID> roleset;
00339
00340 public:
00341
00342 cObject() {
00343 if (roleids.empty()) {
00344 registerRole(BASE, "BASE");
00345 registerRole(SOCIALISED, "SOCIALISED");
00346 registerRole(TRACEABLE, "TRACEABLE");
00347 registerRole(COLLIDEABLE, "COLLIDEABLE");
00348 registerRole(DAMAGEABLE, "DAMAGEABLE");
00349 registerRole(ENTITY, "ENTITY");
00350 }
00351 base = new rBase;
00352 nameable = new rNameable;
00353 socialised = NULL;
00354 traceable = new rTraceable;
00355 collideable = NULL;
00356 damageable = NULL;
00357 entity = NULL;
00358 roles[BASE] = base;
00359 roles[NAMEABLE] = nameable;
00360
00361 roles[TRACEABLE] = traceable;
00362
00363
00364
00365 }
00366
00367 cObject(cObject* original) {
00368 if (original->base) base = new rBase(original->base);
00369 if (original->nameable) nameable = new rNameable(original->nameable);
00370 if (original->socialised) socialised = new rSocialised(original->socialised);
00371 if (original->traceable) traceable = new rTraceable(original->traceable);
00372 if (original->collideable) collideable = new rCollideable(original->collideable);
00373 if (original->damageable) damageable = new rDamageable(original->damageable);
00374 if (original->entity) entity = new rEntity(original->entity);
00375 if (original->base) roles[BASE] = base;
00376 if (original->nameable) roles[NAMEABLE] = nameable;
00377 if (original->socialised) roles[SOCIALISED] = socialised;
00378 if (original->traceable) roles[TRACEABLE] = traceable;
00379 if (original->collideable) roles[COLLIDEABLE] = collideable;
00380 if (original->damageable) roles[DAMAGEABLE] = damageable;
00381 if (original->entity) roles[ENTITY] = entity;
00382 }
00383
00384 virtual ~cObject() {
00385 delete this->base;
00386 delete this->damageable;
00387 delete this->collideable;
00388 delete this->entity;
00389 delete this->nameable;
00390 delete this->socialised;
00391 delete this->traceable;
00392 }
00393
00394 static void registerRole(OID id, std::string name) {
00395 rolenames[id] = name;
00396 roleids[name] = id;
00397 }
00398
00399 bool anyRoles(std::set<OID>* test) {
00400 std::set<OID> result;
00401 std::set_intersection(roleset.begin(), roleset.end(), test->begin(), test->end(), std::inserter(result, result.begin()));
00402 return (!result.empty());
00403 }
00404
00405 bool allRoles(std::set<OID>* test) {
00406 std::set<OID> result;
00407 std::set_intersection(roleset.begin(), roleset.end(), test->begin(), test->end(), std::inserter(result, result.begin()));
00408 return (result.size() == test->size());
00409 }
00410
00412
00413 bool hasRole(OID role) {
00414 return (roleset.find(role) != roleset.end());
00415 }
00416
00418
00419 void addRole(OID role, rRole* roleobj = NULL) {
00420 roles[role] = roleobj;
00421 roleset.insert(role);
00422 }
00423
00425
00426 void remRole(OID role, bool deleteobj = false) {
00427 if (deleteobj) delete roles[role];
00428 roles.erase(role);
00429 roleset.erase(role);
00430 }
00431
00432
00434
00435 virtual void onSpawn() {
00436 }
00437
00439
00440 virtual void onMessage(void* message) {
00441 }
00442
00444
00445 virtual void onFrag() {
00446 }
00447
00449
00450 virtual void multEyeMatrix() {
00451 }
00452
00454
00455 virtual void setAsAudioListener() {
00456 }
00457
00459
00460 virtual void animate(float dt) {
00461 base->seconds += dt;
00462 }
00463
00465
00466 virtual void transform() {
00467 }
00468
00470
00471 virtual void drawSolid() {
00472 }
00473
00475
00476 virtual void drawEffect() {
00477 }
00478
00480
00481 virtual void drawHUD() {
00482 }
00483
00484
00485
00486
00494 virtual void damageByParticle(float* localpos, float damage, cObject* enactor = NULL) {
00495
00496 }
00497
00498
00499
00500
00512 virtual float constrainParticle(float* worldpos, float radius = 0.0f, float* localpos = NULL, cObject* enactor = NULL) {
00513 return 0;
00514 }
00515
00516
00517
00518
00519
00520
00522
00523 virtual OID enemyNearby() {
00524 return 0;
00525 }
00526
00528
00529 virtual OID disturbedBy() {
00530 return 0;
00531 }
00532
00533
00534
00536
00537 virtual float inDestinationRange() {
00538 return 0.0f;
00539 }
00540
00542
00543 virtual float inMeeleRange() {
00544 return 0.0f;
00545 }
00546
00548
00549 virtual float inWeaponRange() {
00550 return 0.0f;
00551 }
00552
00554
00555 virtual float inTargetRange() {
00556 return 0.0f;
00557 }
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00577
00578 virtual void do_moveTowards() {
00579 }
00580
00582
00583 virtual void do_moveNear() {
00584 }
00585
00587
00588 virtual void do_aimAt() {
00589 }
00590
00592
00593 virtual void do_fireAt() {
00594 }
00595
00597
00598 virtual void do_idle() {
00599 }
00600
00602
00603 virtual void do_aimFor(OID target) {
00604 }
00605
00607
00608 virtual void do_moveFor(float* dest) {
00609 }
00610 };
00611
00612 #endif