1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ 2 3 #ifndef COB_INSTANCE_H 4 #define COB_INSTANCE_H 5 6 #include "UnitScript.h" 7 8 9 #define PACKXZ(x,z) (((int)(x) << 16)+((int)(z) & 0xffff)) 10 #define UNPACKX(xz) ((signed short)((boost::uint32_t)(xz) >> 16)) 11 #define UNPACKZ(xz) ((signed short)((boost::uint32_t)(xz) & 0xffff)) 12 13 14 static const int COBSCALE = 65536; 15 static const int COBSCALEHALF = COBSCALE / 2; 16 static const float CORDDIV = 1.0f / COBSCALE; 17 static const float RAD2TAANG = COBSCALEHALF / PI; 18 static const float TAANG2RAD = PI / COBSCALEHALF; 19 20 21 class CCobThread; 22 class CCobFile; 23 class CCobInstance; 24 25 26 typedef void (*CBCobThreadFinish) (int retCode, void *p1, void *p2); 27 28 29 class CCobInstance : public CUnitScript 30 { 31 protected: 32 CCobFile& script; 33 34 // because COB has a set of "script pieces", which isn't necessarily equal 35 // to the set of all LocalModelPieces, we need to map script piece -> LMP. 36 std::vector<LocalModelPiece*> pieces; 37 38 void MapScriptToModelPieces(LocalModel* lmodel); 39 40 int RealCall(int functionId, std::vector<int> &args, CBCobThreadFinish cb, void *p1, void *p2); 41 42 virtual void ShowScriptError(const std::string& msg); 43 44 public: 45 std::vector<int> staticVars; 46 std::list<CCobThread *> threads; GetScriptAddr()47 const CCobFile* GetScriptAddr() const { return &script; } 48 49 public: 50 CCobInstance(CCobFile &script, CUnit *unit); 51 virtual ~CCobInstance(); 52 53 // takes COBFN_* constant as argument 54 bool HasFunction(int id) const; 55 56 virtual bool HasBlockShot(int weaponNum) const; 57 virtual bool HasTargetWeight(int weaponNum) const; 58 59 // call overloads, they all call RealCall 60 int Call(const std::string &fname); 61 int Call(const std::string &fname, int p1); 62 int Call(const std::string &fname, std::vector<int> &args); 63 int Call(const std::string &fname, std::vector<int> &args, CBCobThreadFinish cb, void *p1, void *p2); 64 // these take a COBFN_* constant as argument, which is then translated to the actual function number 65 int Call(int id); 66 int Call(int id, std::vector<int> &args); 67 int Call(int id, int p1); 68 int Call(int id, std::vector<int> &args, CBCobThreadFinish cb, void *p1, void *p2); 69 // these take the raw function number 70 int RawCall(int fn, std::vector<int> &args); 71 72 // returns function number as expected by RawCall, but not Call 73 // returns -1 if the function does not exist 74 int GetFunctionId(const std::string& fname) const; 75 76 // used by CCobThread 77 void Signal(int signal); 78 void PlayUnitSound(int snr, int attr); 79 80 // translate cob piece coords into worldcoordinates Spin(int piece,int axis,int speed,int accel)81 void Spin(int piece, int axis, int speed, int accel) { 82 // COBWTF 83 if (axis == 2) 84 speed = -speed; 85 CUnitScript::Spin(piece, axis, speed * TAANG2RAD, accel * TAANG2RAD); 86 } StopSpin(int piece,int axis,int decel)87 void StopSpin(int piece, int axis, int decel) { 88 CUnitScript::StopSpin(piece, axis, decel * TAANG2RAD); 89 } Turn(int piece,int axis,int speed,int destination)90 void Turn(int piece, int axis, int speed, int destination) { 91 // COBWTF 92 if (axis == 2) 93 destination = -destination; 94 CUnitScript::Turn(piece, axis, speed * TAANG2RAD, destination * TAANG2RAD); 95 } Move(int piece,int axis,int speed,int destination)96 void Move(int piece, int axis, int speed, int destination) { 97 // COBWTF 98 if (axis == 0) 99 destination = -destination; 100 CUnitScript::Move(piece, axis, speed * CORDDIV, destination * CORDDIV); 101 } MoveNow(int piece,int axis,int destination)102 void MoveNow(int piece, int axis, int destination) { 103 // COBWTF 104 if (axis == 0) 105 destination = -destination; 106 CUnitScript::MoveNow(piece, axis, destination * CORDDIV); 107 } TurnNow(int piece,int axis,int destination)108 void TurnNow(int piece, int axis, int destination) { 109 // COBWTF 110 if (axis == 2) 111 destination = -destination; 112 CUnitScript::TurnNow(piece, axis, destination * TAANG2RAD); 113 } 114 115 // callins, called throughout sim 116 virtual void RawCall(int functionId); 117 virtual void Create(); 118 virtual void Killed(); 119 virtual void WindChanged(float heading, float speed); 120 virtual void ExtractionRateChanged(float speed); 121 virtual void RockUnit(const float3& rockDir); 122 virtual void HitByWeapon(const float3& hitDir, int weaponDefId, float& inout_damage); 123 virtual void SetSFXOccupy(int curTerrainType); 124 virtual void QueryLandingPads(std::vector<int>& out_pieces); 125 virtual void BeginTransport(const CUnit* unit); 126 virtual int QueryTransport(const CUnit* unit); 127 virtual void TransportPickup(const CUnit* unit); 128 virtual void TransportDrop(const CUnit* unit, const float3& pos); 129 virtual void StartBuilding(float heading, float pitch); 130 virtual int QueryNanoPiece(); 131 virtual int QueryBuildInfo(); 132 133 virtual void Destroy(); 134 virtual void StartMoving(bool reversing); 135 virtual void StopMoving(); 136 virtual void StartUnload(); 137 virtual void EndTransport(); 138 virtual void StartBuilding(); 139 virtual void StopBuilding(); 140 virtual void Falling(); 141 virtual void Landed(); 142 virtual void Activate(); 143 virtual void Deactivate(); 144 virtual void MoveRate(int curRate); 145 virtual void FireWeapon(int weaponNum); 146 virtual void EndBurst(int weaponNum); 147 148 // weapon callins 149 virtual int QueryWeapon(int weaponNum); 150 virtual void AimWeapon(int weaponNum, float heading, float pitch); 151 virtual void AimShieldWeapon(CPlasmaRepulser* weapon); 152 virtual int AimFromWeapon(int weaponNum); 153 virtual void Shot(int weaponNum); 154 virtual bool BlockShot(int weaponNum, const CUnit* targetUnit, bool userTarget); 155 virtual float TargetWeight(int weaponNum, const CUnit* targetUnit); 156 }; 157 158 #endif // COB_INSTANCE_H 159