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