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