00001
00009 #ifndef _CMECH_H
00010 #define _CMECH_H
00011
00012 class cMech;
00013
00014 #include "psi3d/md5frmt.h"
00015
00016 #include "cObject.h"
00017 #include "cWeapon.h"
00018 #include "cComcom.h"
00019
00020 #include <vector>
00021 #include <map>
00022
00023 class cWeapon;
00024
00025
00026 #define MECH_CHASSIS_LR_AXIS AX_LR1
00027 #define MECH_TURRET_LR_AXIS AX_LR2
00028 #define MECH_TURRET_UD_AXIS AX_UD2
00029 #define MECH_THROTTLE_AXIS AX_UD1
00030
00031 #define MECH_FIRE_BUTTON BT_R2
00032
00033 #define MECH_JET_BUTTON BT_L2
00034 #define MECH_CAMERA_BUTTON BT_DELTA
00035 #define MECH_NEXT_BUTTON BT_CIRCLE
00036 #define MECH_PREV_BUTTON BT_SQUARE
00037
00042 class cMech : public cObject {
00043 friend class cWepcom;
00044 friend class cForcom;
00045 protected:
00046
00047
00049
00050 enum {
00051 MAX_CAMERAMODES = 6
00052 };
00053
00054
00055 protected:
00056
00058 static int sInstances;
00059
00061 static std::map<int,long> sTextures;
00062
00063 protected:
00064
00065 struct rMisc {
00067 std::vector<cWeapon*> weapons;
00068
00070 int currentWeapon;
00071
00072
00073 cExplosion explosion;
00074
00076 float bse[3];
00077
00079 float twr[3];
00080
00082 float jetpower;
00083
00085 float throttle;
00086
00088 int camerastate;
00089 };
00090
00091 rMisc* misc;
00092
00093
00094 struct rComputerised {
00095 cComcom* comcom;
00096 cTarcom* tarcom;
00097 cSyscom* syscom;
00098 cWepcom* wepcom;
00099 cForcom* forcom;
00100 cNavcom* navcom;
00102 rComputerised(cObject * o);
00104 ~rComputerised();
00106 void process(float dt);
00107 };
00108
00109 rComputerised* computerised;
00110
00111 struct rRigged {
00113 float scale;
00115 MD5Format::model* model;
00117 MD5Format::joint* joints;
00119 std::map<int, int> jointpoints;
00121 std::map<int, std::map<int, float> > rotators;
00122
00123 float HDMount[16];
00124 float CTMount[16];
00125 float BKMount[16];
00126 float RSMount[16];
00127 float RAMount[16];
00128 float LSMount[16];
00129 float LAMount[16];
00130
00131 std::map<int, float*> baseverts;
00133
00134 enum Jointpoints {
00135 EYE, HEAD, NECK,
00136 CTMOUNT, LAMOUNT, RAMOUNT, LSMOUNT, RSMOUNT, BKMOUNT,
00137 JET0, JET1, JET2, JET3, JET4,
00138 SPINE, TORSOR, LEFTLEG, RIGHTLEG, LEFTCALF, RIGHTCALF, MAX_JOINTPOINTS
00139 };
00140
00142
00143 rRigged() : scale(1.0f), model(NULL), joints(NULL) {
00144 }
00146
00147 ~rRigged() {
00148 delete model;
00149 delete joints;
00150 }
00151
00152 std::string getJointname(unsigned int num) {
00153 const char* names[] = {
00154 "EYE", "HEAD", "NECK",
00155 "CTMOUNT", "LAMOUNT", "RAMOUNT", "LSMOUNT", "RSMOUNT", "BKMOUNT",
00156 "JET0", "JET1", "JET2", "JET3", "JET4",
00157 "SPINE", "TORSOR", "LEFTLEG", "RIGHTLEG", "LEFTCALF", "RIGHTCALF"
00158 };
00159 if (num >= MAX_JOINTPOINTS) return string("");
00160 return string(names[num]);
00161 }
00162 };
00163
00164 rRigged* rigged;
00165
00166
00167 public:
00168 cMech(float* pos = NULL, float* rot = NULL);
00169 ~cMech();
00170
00171
00172 virtual void onMessage(void* message);
00173 virtual void onSpawn();
00174
00175
00176 void multEyeMatrix();
00177 void setAsAudioListener();
00178
00179
00180 void animatePhysics(float spf);
00181 void poseRunning(float spf);
00182 void poseJumping(float spf);
00183
00184
00185 void ChassisLR(float radians);
00186 void ChassisUD(float radians);
00187 float TowerLR(float radians);
00188 void TowerUD(float radians);
00189
00190
00191 void fireAllWeapons();
00192 void fireWeapon(unsigned n);
00193 void mountWeapon(char* point, cWeapon *weapon, bool add = true);
00194
00195
00196 virtual void animate(float spf);
00197 virtual void transform();
00198 virtual void drawSolid();
00199 virtual void drawEffect();
00200 virtual void drawHUD();
00201
00202
00203 virtual void damageByParticle(float* localpos, float damage, cObject* enactor = NULL);
00204 virtual float constrainParticle(float* worldpos, float radius = 0.0f, float* localpos = NULL, cObject* enactor = NULL);
00205 float constrainParticleToWorld(float* worldpos, float radius = 0.0f);
00206 public:
00207
00208 virtual OID enemyNearby();
00209 virtual OID disturbedBy();
00210
00211
00212 virtual float inDestinationRange();
00213 virtual float inMeeleRange();
00214 virtual float inWeaponRange();
00215 virtual float inTargetRange();
00216
00217
00218 virtual void do_moveTowards();
00219 virtual void do_moveNear();
00220 virtual void do_aimAt();
00221 virtual void do_fireAt();
00222 virtual void do_idle();
00223 virtual void do_aimFor(OID target);
00224 virtual void do_moveFor(float* dest);
00225 };
00226
00227
00228 #endif
00229