1 #ifndef _avpchunk_hpp_
2 #define _avpchunk_hpp_
3 
4 #include "chunk.hpp"
5 #include "chnktype.hpp"
6 #include "envchunk.hpp"
7 #include "sndchunk.hpp"
8 
9 #define AVPGENFLAG_MODEFLAGSSET 0x00000001
10 
11 // same as obchunk 4 compatibility
12 
13 #define AVPGENFLAG_AVPGAMEMODEMARINE 		0x00000800
14 #define AVPGENFLAG_AVPGAMEMODEALIEN 		0x00001000
15 #define AVPGENFLAG_AVPGAMEMODEPREDATOR	0x00002000
16 
17 #define AVPGENFLAG_NOTDIFFICULTY1 					0x00100000
18 #define AVPGENFLAG_NOTDIFFICULTY2 					0x00200000
19 #define AVPGENFLAG_NOTDIFFICULTY3 					0x00400000
20 
21 #define AVPGENFLAG_USEOWNLIMIT 0x02000000
22 #define AVPGENFLAG_USEOWNRATE 0x04000000
23 #define AVPGENFLAG_ADVANCEDGENERATOR 0x08000000
24 
25 #define AVPGENFLAG_MULTIPLAYERSTART     0x40000000
26 #define AVPGENFLAG_GENERATORINACTIVE	0x80000000
27 enum GenerTypes
28 {
29 	GenerType_Intermittent = 0,
30 	GenerType_BadGuy1,
31 	GenerType_BadGuy2,
32 	GenerType_BadGuy3,
33 };
34 
35 class AVP_Generator_Extra_Data_Chunk;
36 class AVP_Generator_Extended_Settings_Chunk;
37 class Object_Alternate_Locations_Chunk;
38 
39 class AVP_Generator_Chunk : public Chunk
40 {
41 public:
42 
AVP_Generator_Chunk(Chunk_With_Children * parent)43 	AVP_Generator_Chunk (Chunk_With_Children * parent)
44 	: Chunk (parent, "AVPGENER"),
45 		textureID (0),
46 		sub_type (0),
47 		extra1 (0),
48 		extra2 (0),
49 		name (0)
50 	{}
51 
52 	~AVP_Generator_Chunk ();
53 
54 	ChunkVectorInt location;
55 
56 	int orientation; //euler y
57 	int type;
58 
59 	int flags;
60 	unsigned char textureID;
61 
62 	unsigned char sub_type;
63 	unsigned char extra1;
64 	unsigned char extra2;
65 
66 	char * name;
67 
68 	ObjectID CalculateID();
69 	virtual void fill_data_block (char * data_start);
70 	virtual size_t size_chunk ();
71 
72 	AVP_Generator_Extra_Data_Chunk* get_extra_data_chunk();
73 	AVP_Generator_Extra_Data_Chunk* create_extra_data_chunk();
74 
75 	AVP_Generator_Extended_Settings_Chunk* get_extended_settings();
76 	AVP_Generator_Extended_Settings_Chunk* create_extended_settings();
77 
78 	Object_Alternate_Locations_Chunk* get_alternate_locations_chunk();
79 	AVP_Generator_Chunk (Chunk_With_Children * parent, const char * data, size_t size);
80 private:
81 
82 	friend class Special_Objects_Chunk;
83 
84 
85 };
86 
87 //For attaching extra data to the generators and badguys
88 class AVP_Generator_Extra_Data_Chunk:public Chunk_With_Children
89 {
90 public:
91 
AVP_Generator_Extra_Data_Chunk(Chunk_With_Children * parent)92 	AVP_Generator_Extra_Data_Chunk(Chunk_With_Children * parent)
93 	: Chunk_With_Children (parent, "AVPGENEX")
94 	{}
95 
96 	AVP_Generator_Extra_Data_Chunk (Chunk_With_Children * const parent,const char *, size_t const);
97 	AVP_Generator_Extra_Data_Chunk (Chunk_With_Children * parent,AVP_Generator_Chunk*);
98 
99 	AVP_Generator_Chunk* get_generator_chunk();
100 };
101 
102 //Needed so I can match the extra data chunk with the appropriate generator_chunk
103 class AVP_Generator_Extra_Name_Chunk : public Chunk
104 {
105 public :
106 	AVP_Generator_Extra_Name_Chunk(Chunk_With_Children* parent,const char*,size_t);
107 	AVP_Generator_Extra_Name_Chunk(Chunk_With_Children* parent,const char* _name);
108 	~AVP_Generator_Extra_Name_Chunk();
109 
110 	char* name;
111 
112 
113 	virtual size_t size_chunk();
114 	virtual void fill_data_block(char* data_start);
115 };
116 
117 
118 struct AVP_Generator_Weighting
119 {
120 	int data_size;
121 
122 	int PulseMarine_Wt;
123 	int FlameMarine_Wt;
124 	int SmartMarine_Wt;
125 	int SadarMarine_Wt;
126 	int GrenadeMarine_Wt;
127 	int MinigunMarine_Wt;
128 	int ShotgunCiv_Wt;
129 	int PistolCiv_Wt;
130 	int FlameCiv_Wt;
131 	int UnarmedCiv_Wt;
132 	int MolotovCiv_Wt;
133 
134 	int Alien_Wt;
135 	int PredAlien_Wt;
136 	int Praetorian_Wt;
137 
138 	int PistolMarine_Wt;
139 
140 };
141 
142 class AVP_Generator_Extended_Settings_Chunk : public Chunk
143 {
144 public :
145 	AVP_Generator_Extended_Settings_Chunk(Chunk_With_Children* parent,const char* data, size_t);
146 	AVP_Generator_Extended_Settings_Chunk(Chunk_With_Children* parent);
147 	~AVP_Generator_Extended_Settings_Chunk();
148 
149 	void fill_data_block(char* data);
150 	size_t size_chunk();
151 
152 	int GenerationRate;
153 	int GenRateIncrease;
154 	unsigned char GenLimit;
155 	unsigned char pad1,pad2,pad3;
156 
157 	int spare1;
158 	int spare2;
159 
160 	AVP_Generator_Weighting * weights;
161 
162 };
163 
164 #define R6GENFLAG_OBJECTIVE_MASK 0x00000007
165 #define R6GENFLAG_BADDY_INDEX_MASK 0xff000000
166 #define R6GENFLAG_BADDY_INDEX_SHIFT 24
167 
168 class Rainbow6_Generator_Extra_Data_Chunk : public Chunk
169 {
170 public :
171 	Rainbow6_Generator_Extra_Data_Chunk(Chunk_With_Children* parent,const char*,size_t);
172 	Rainbow6_Generator_Extra_Data_Chunk(Chunk_With_Children*);
173 	~Rainbow6_Generator_Extra_Data_Chunk();
174 
Get_Baddy_Index()175 	int Get_Baddy_Index(){ return (flags & R6GENFLAG_BADDY_INDEX_MASK)>>R6GENFLAG_BADDY_INDEX_SHIFT;}
Set_Baddy_Index(int index)176 	void Set_Baddy_Index(int index) { flags&=~R6GENFLAG_BADDY_INDEX_MASK; flags |=(index<<R6GENFLAG_BADDY_INDEX_SHIFT);}
177 
178 	int distance;
179 	int flags;
180 	int num_extra_data;
181 	int* extra_data;
182 
183 	size_t size_chunk();
184 	void fill_data_block(char* data_start);
185 
186 };
187 
188 enum Generated_Enemies
189 {
190 	Generate_Aliens,
191 	Generate_Marines,
192 };
193 
194 class Global_Generator_Data_Chunk : public Chunk
195 {
196 public :
197 	Global_Generator_Data_Chunk(Chunk_With_Children* parent,const char*,size_t);
198 	Global_Generator_Data_Chunk(Chunk_With_Children* parent);
199 
200 	int EnemyGenerated;
201 	int MaxNPCSOnLevel;
202 	int NPCSPerMinute;
203 	int NPCAcceleration;	 //in npcs per minute per minute
204 	int HiveStateChangeTime; //in seconds
205 	int spare1;
206 	int spare2;
207 
208 	virtual size_t size_chunk();
209 	virtual void fill_data_block(char* data_start);
210 };
211 
212 
213 
214 class AVP_Player_Start_Chunk : public Chunk
215 {
216 public :
217 	AVP_Player_Start_Chunk (Chunk_With_Children * parent, const char * data, size_t size);
218 	AVP_Player_Start_Chunk (Chunk_With_Children * parent);
219 
220 	virtual void fill_data_block (char * data);
221 	virtual size_t size_chunk ();
222 
223 	ChunkVectorInt location;
224 	ChunkMatrix orientation;
225 
226 	ObjectID moduleID; //r6 only
227 };
228 
229 #define PowerCableFlag_UseDefaultSettings 0x00000001
230 
231 class AVP_Power_Cable_Chunk : public Chunk
232 {
233 public :
234 	AVP_Power_Cable_Chunk(Chunk_With_Children* parent,const char* data, size_t);
235 	AVP_Power_Cable_Chunk(Chunk_With_Children* parent,const char* _name,ObjectID _id);
236 
237 	~AVP_Power_Cable_Chunk();
238 
239 	void fill_data_block(char* data);
240 	size_t size_chunk();
241 
242 	ChunkVectorInt location;
243 	char* name;
244 	ObjectID id;
245 	int max_charge;
246 	int initial_charge;
247 	int recharge_rate;
248 	int flags;
249 
250 	int spare[3];
251 
252 
253 };
254 class AVP_Environment_Settings_Chunk;
255 
256 struct AVP_Environment_Settings
257 {
258 private :
259 	friend class AVP_Environment_Settings_Chunk;
260 	int data_size;
261 public :
262 
263 	int sky_colour_red;
264 	int sky_colour_green;
265 	int sky_colour_blue;
266 
267 	//available predator weapons
268 	unsigned int predator_pistol :1;
269 	unsigned int predator_plasmacaster :1;
270 	unsigned int predator_disc :1;
271 	unsigned int predator_grappling_hook :1;
272 	unsigned int predator_medicomp :1;
273 
274 	unsigned int marine_jetpack :1;
275 
276 	unsigned int stars_in_sky :1;
277 
278 	unsigned int spare_bits :25;
279 	int  predator_num_spears;
280 };
281 
282 class AVP_Environment_Settings_Chunk : public Chunk
283 {
284 public :
285 	AVP_Environment_Settings_Chunk(Chunk_With_Children* parent,const char* data, size_t);
286 	AVP_Environment_Settings_Chunk(Chunk_With_Children* parent);
287 	~AVP_Environment_Settings_Chunk();
288 
289 	void fill_data_block(char* data);
290 	size_t size_chunk();
291 
292 	AVP_Environment_Settings *  settings;
293 
294 };
295 
296 
297 AVP_Environment_Settings_Chunk* GetAVPEnvironmentSettings(Environment_Data_Chunk* env_chunk);
298 
299 
300 struct AVP_Decal
301 {
302 	int DecalID;
303 	ChunkVectorInt Vertices[4];
304 	int UOffset;
305 	int object_index;
306 };
307 
308 class AVP_Decal_Chunk : public Chunk
309 {
310 public :
311 	AVP_Decal_Chunk(Chunk_With_Children* parent,const char* data, size_t);
312 	AVP_Decal_Chunk(Chunk_With_Children* parent,int num_dec);
313 	~AVP_Decal_Chunk();
314 
315 	void fill_data_block(char* data);
316 	size_t size_chunk();
317 
318 	int num_decals;
319 	/*the pointer to the array of decals is only set if the loaded decal structure size
320 	is less than or equal to the current decal structure size*/
321 	AVP_Decal* decals;
322 
323 private :
324 	int decal_size;
325 	char* decal_buffer;
326 };
327 
328 /////////////////////Particle Generators////////////////////////////////////////
329 
330 class AVP_Particle_Generator_Data_Chunk;
331 
332 class AVP_Particle_Generator_Chunk : public Chunk_With_Children
333 {
334 public :
335 
336 	AVP_Particle_Generator_Chunk(Chunk_With_Children* parent,const char* name,ObjectID& id);
337 	AVP_Particle_Generator_Chunk(Chunk_With_Children * const parent,const char *, size_t const);
338 
339 	AVP_Particle_Generator_Data_Chunk* get_data_chunk();
340 	Object_Alternate_Locations_Chunk* get_alternate_locations_chunk();
341 	Indexed_Sound_Chunk* get_sound_chunk();
342 };
343 
344 #define ParticleGeneratorFlag_Inactive 0x00000001
345 
346 class AVP_Particle_Generator_Data_Chunk : public Chunk
347 {
348 public :
349 	AVP_Particle_Generator_Data_Chunk(Chunk_With_Children* parent,const char* data, size_t);
350 	AVP_Particle_Generator_Data_Chunk(Chunk_With_Children* parent,const char* _name,ObjectID& _id);
351 	~AVP_Particle_Generator_Data_Chunk();
352 
353 	void fill_data_block(char* data);
354 	size_t size_chunk();
355 
356 	int type;
357 	unsigned short time; //int tenths of a second
358 	unsigned short probability;//0-100
359 	unsigned short speed;//in cm/second
360 	unsigned short quantity;
361 	int spare1,spare2;
362 	int flags;
363 	ObjectID id;
364 	ObjectID parent_id; //gnerator can be positioned relative to another object
365 	ChunkVectorInt location;
366 	ChunkQuat orientation;
367 
368 	char* name;
369 
370 };
371 
372 
373 
374 #endif
375