Tiberian Technologies Scripts Reference Revision: 9000
Loading...
Searching...
No Matches
JMGRenetBuster.h
1/* Renegade Renet Busters Scripts by Jerad Gray
2 Copyright 2007 Jerad Gray, Jonathan Wilson
3
4 This file is part of the Renegade scripts.dll
5 The Renegade scripts.dll is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version. See the file COPYING for more details.
9 In addition, an exemption is given to allow Run Time Dynamic Linking of this code with any closed source module that does not contain code covered by this licence.
10 Only the source code to the module(s) containing the licenced code has to be released.
11*/
12
13#include "direct.h"
14bool IsRenegadeServer = true;
15#define PI 3.14159265f
16#define PI180 PI/180
17#define MaxGamePlayerCount 8
18bool PlayerRequestingALife[MaxGamePlayerCount] = {false};
19#define MaxNumberOfHighYieldWarheads 2
20#define PLAYERDRONE_ID 1000000091
21#define CARGOSHIP_ID 1000000074
22#define CARGOSHIPTURRET_ID 1000000077
23#define MaxHyperdriveCharge 5
24
25// Perk Types
26
27#define PERKCOUNT 126
28#define PERKCATEGORIES 11
29enum PerkTypeCategories{INVALID = -1,PerkPurchase = 0,PerkJob = 1,PerkSwimming = 2,PerkCharacterHealth = 3,PerkVehicle = 4,PerkCombat = 5,PerkDeath = 6,PerkMisc = 7,PerkWeapon = 8,PerkSpawnCharacter = 9,PerkUnusable = 999};
30
31struct PerkSystemPerkTypeNode
32{
33 int PerkID;
34 int CategoryPerkID;
35 PerkTypeCategories Category;
36 char Name[256];
37 char Description[512];
38 unsigned int UnlockCost;
39 bool MultiplyUnlockCost;
40 bool ResetOnFail;
41 bool RequiresOrder;
42 int MaxPerkUse;
43 void AddDescription(const char *String)
44 {
45 if (strlen(String) <= 256)
46 sprintf(Description,"%s",String);
47 else
48 {
49 char msg[512];
50 sprintf(msg,"msg Perk %d's Description is too long!",PerkID);
51 Console_Input(msg);
52 }
53 }
54};
55
56PerkSystemPerkTypeNode PerkSystemPerkTypeNodeList[PERKCOUNT];
57
58class PerkSystemPerkTypeList
59{
60private:
61 void Reset()
62 {
63 USEABLEPERKCOUNT = 0;
64 for (int x = 0;x < PERKCATEGORIES;x++)
65 PerkTypeCategoryCounts[x] = 0;
66 for (int x = 0;x < PERKCOUNT;x++)
67 PerkSystemPerkTypeNodeList[x].Category = INVALID;
68 }
69 int PerkTypeCategoryCounts[PERKCATEGORIES];
70public:
71 static int USEABLEPERKCOUNT;
72 PerkSystemPerkTypeList()
73 {
74 Reset();
75 }
76 void AddAPerkType(int PerkID,const char *Name,unsigned int UnlockCost,bool MultiplyUnlockCost,bool ResetOnFail,bool RequiresOrder,PerkTypeCategories Category,int MaxPerkUse,const char *Description)
77 {
78 if (PerkSystemPerkTypeNodeList[PerkID].Category != INVALID)
79 {
80 char errormsg[220];
81 sprintf(errormsg,"msg ADDAPERKTYPE ERROR: PerkID %d has already been assigned!",PerkID);
82 Console_Input(errormsg);
83 Commands->Create_2D_WAV_Sound("yo1.wav");
84 }
85 USEABLEPERKCOUNT++;
86 PerkSystemPerkTypeNodeList[PerkID].PerkID = PerkID;
87 sprintf(PerkSystemPerkTypeNodeList[PerkID].Name,"%s",Name);
88 PerkSystemPerkTypeNodeList[PerkID].AddDescription(Description);
89 PerkSystemPerkTypeNodeList[PerkID].UnlockCost = UnlockCost;
90 PerkSystemPerkTypeNodeList[PerkID].MultiplyUnlockCost = MultiplyUnlockCost;
91 PerkSystemPerkTypeNodeList[PerkID].ResetOnFail = ResetOnFail;
92 PerkSystemPerkTypeNodeList[PerkID].RequiresOrder = RequiresOrder;
93 PerkSystemPerkTypeNodeList[PerkID].Category = Category;
94 PerkSystemPerkTypeNodeList[PerkID].MaxPerkUse = MaxPerkUse;
95 }
96 void Clean_Up()
97 {
98 Reset();
99 }
100 void Finalize_Perks()
101 {
102 for (int x = 0;x < PERKCOUNT;x++)
103 PerkSystemPerkTypeNodeList[x].CategoryPerkID = (PerkTypeCategoryCounts[PerkSystemPerkTypeNodeList[x].Category] = (PerkTypeCategoryCounts[PerkSystemPerkTypeNodeList[x].Category]+1));
104 }
105};
106int PerkSystemPerkTypeList::USEABLEPERKCOUNT = 0;
107// Player Perks
108
109struct PlayerPerkDataNode
110{// A single perk for a player
111 bool HasPerk;
112 unsigned int PerkProgress;
113 PlayerPerkDataNode()
114 {
115 PerkProgress = 0;
116 HasPerk = false;
117 };
118};
119
120struct PlayerPerksDataNode
121{// All of the players perks
122 char PlayerName[128];
123 int UnlockedPerks;
124 PlayerPerkDataNode PlayerPerkList[PERKCOUNT];
125 PlayerPerksDataNode *next;
126 PlayerPerksDataNode()
127 {
128 UnlockedPerks = 0;
129 for (int x = 0;x < PERKCOUNT;x++)
130 PlayerPerkList[x] = PlayerPerkDataNode();
131 };
132};
133
134PlayerPerksDataNode *PlayerPerkListNodes[128] = {NULL};
135
136class PlayerPerksNodeControlSystem
137{
138private:
139 bool HasLoaded;
140 PlayerPerksDataNode *PlayerPerksDataNodeList;
141 PlayerPerksDataNode *AddAPlayerPerkNode(PlayerPerksDataNode *Node,const char *PlayerName,PlayerPerkDataNode PPerkList[])
142 {
143 sprintf(Node->PlayerName,"%s",PlayerName);
144 for (int x = 0;x < PERKCOUNT;x++)
145 {
146 Node->PlayerPerkList[x].HasPerk = PPerkList[x].HasPerk;
147 Node->PlayerPerkList[x].PerkProgress = PPerkList[x].PerkProgress;
148 }
149 Node->UnlockedPerks = 0;
150 Node->next = NULL;
151 return Node;
152 }
153 PlayerPerksDataNode *GetPlayerPerkList(const char *PlayerName)
154 {// Used to find if a player's perk list already exists, if not it creates a new node for the player's name
155 if (!PlayerPerksDataNodeList)
156 {
157 PlayerPerkDataNode PPerkList[PERKCOUNT] = {PlayerPerkDataNode()};
158 PlayerPerksDataNodeList = AddAPlayerPerkNode(new PlayerPerksDataNode,PlayerName,PPerkList);
159 return PlayerPerksDataNodeList;
160 }
161 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
162 while (Current)
163 {
164 if (!_stricmp(Current->PlayerName,PlayerName))
165 return Current;
166 if (!Current->next)
167 {
168 PlayerPerkDataNode PPerkList[PERKCOUNT] = {PlayerPerkDataNode()};
169 Current->next = AddAPlayerPerkNode(new PlayerPerksDataNode,PlayerName,PPerkList);
170 return Current->next;
171 }
172 Current = Current->next;
173 }
174 return NULL;
175 }
176 void AddPlayerToPerkList(const char *PlayerName,PlayerPerkDataNode PPerkList[])
177 {// Used when loading the player perk list control file
178 if (!PlayerPerksDataNodeList)
179 {
180 PlayerPerksDataNodeList = AddAPlayerPerkNode(new PlayerPerksDataNode,PlayerName,PPerkList);
181 return;
182 }
183 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
184 while (Current)
185 {
186 if (!_stricmp(Current->PlayerName,PlayerName))
187 return;
188 if (!Current->next)
189 {
190 Current->next = AddAPlayerPerkNode(new PlayerPerksDataNode,PlayerName,PPerkList);
191 return;
192 }
193 Current = Current->next;
194 }
195 return;
196 }
197public:
198 PlayerPerksNodeControlSystem()
199 {
200 HasLoaded = false;
201 for (int x = 0;x < 128;x++)
202 PlayerPerkListNodes[x] = NULL;
203 PlayerPerksDataNodeList = NULL;
204 };
205 void FindPlayerPerkList(GameObject *obj,int DisplayMessage)
206 {// Searches for the player's perk list, when it finds it it pulls it into the player ID if it isn't already, then it reloads the player's selected perks
207 if (!Commands->Is_A_Star(obj))
208 return;
209 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
210 const char *PlayerName = Get_Player_Name(obj);
211 if (!PlayerPerkListNodes[PlayerID] || _stricmp(PlayerPerkListNodes[PlayerID]->PlayerName,PlayerName))
212 PlayerPerkListNodes[PlayerID] = GetPlayerPerkList(PlayerName);
213 }
214 bool IncreasePlayerPerkUnlockAmount(GameObject *obj,int PerkID,unsigned int IncreaseAmount)
215 {
216 if (!Commands->Is_A_Star(obj))
217 return false;
218 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
219 if (!PlayerPerkListNodes[PlayerID])
220 return false;
221 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].HasPerk)
222 return false;
223 if (PerkSystemPerkTypeNodeList[PerkID].RequiresOrder)
224 {
225 if ((PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress + 1) == IncreaseAmount)
226 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = IncreaseAmount;
227 else if (PerkSystemPerkTypeNodeList[PerkID].ResetOnFail)
228 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = 0;
229 else
230 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = IncreaseAmount;
231 }
232 else if (PerkSystemPerkTypeNodeList[PerkID].MultiplyUnlockCost)
233 if (!PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress)
234 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = IncreaseAmount;
235 else
236 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress *= IncreaseAmount;
237 else
238 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress += IncreaseAmount;
239 if ((PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress >= PerkSystemPerkTypeNodeList[PerkID].UnlockCost && !PerkSystemPerkTypeNodeList[PerkID].ResetOnFail) || PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress == PerkSystemPerkTypeNodeList[PerkID].UnlockCost)
240 {
241 GameObject *Player = Get_GameObj(PlayerID);
242 if (Player)
243 {
244 char perkmsg[512];
245 if (PerkSystemPerkTypeNodeList[PerkID].Category != PerkUnusable)
246 {
247 sprintf(perkmsg,"You have unlocked the %s perk!",PerkSystemPerkTypeNodeList[PerkID].Name);
248 JmgUtility::DisplayChatMessage(Player,230,230,0,perkmsg);
249 }
250 JmgUtility::DisplayChatMessage(Player,230,230,0,PerkSystemPerkTypeNodeList[PerkID].Description);
251 Create_2D_WAV_Sound_Player(Player,"sysmsg.wav");
252 }
253 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = PerkSystemPerkTypeNodeList[PerkID].UnlockCost;
254 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].HasPerk = true;
255 PlayerPerkListNodes[PlayerID]->UnlockedPerks++;
256 }
257 else if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress > PerkSystemPerkTypeNodeList[PerkID].UnlockCost && PerkSystemPerkTypeNodeList[PerkID].ResetOnFail)
258 {
259 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = 0;
260 return false;
261 }
262 return true;
263 }
264 void ResetPerkProgress(int PerkID)
265 {
266 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
267 while (Current)
268 {
269 if (Current->PlayerPerkList[PerkID].HasPerk)
270 {
271 Current->UnlockedPerks--;
272 Current->PlayerPerkList[PerkID].HasPerk = false;
273 }
274 Current->PlayerPerkList[PerkID].PerkProgress = 0;
275 Current = Current->next;
276 }
277 }
278 int GetPlayerPerkUnlockAmount(GameObject *obj,int PerkID)
279 {
280 if (!Commands->Is_A_Star(obj))
281 return 0;
282 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
283 if (!PlayerPerkListNodes[PlayerID])
284 return 0;
285 return PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress;
286 }
287 int GetPlayerUnlockedPerkCountByCategory(GameObject *obj,int Category)
288 {
289 if (!Commands->Is_A_Star(obj))
290 return 0;
291 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
292 if (!PlayerPerkListNodes[PlayerID])
293 return 0;
294 int Count = 0;
295 for (int x = 0;x < PERKCOUNT;x++)
296 if (PerkSystemPerkTypeNodeList[x].Category == Category)
297 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[x].HasPerk)
298 Count++;
299 return Count;
300 }
301 bool CheckForAnyUnlockedPerks(GameObject *obj)
302 {
303 if (!Commands->Is_A_Star(obj))
304 return false;
305 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
306 if (!PlayerPerkListNodes[PlayerID])
307 return false;
308 for (int x = 0;x < PERKCOUNT;x++)
309 if (PerkSystemPerkTypeNodeList[x].Category != INVALID)
310 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[x].HasPerk)
311 return true;
312 return false;
313 }
314 bool CheckIfPlayerHasPerkUnlocked(GameObject *obj,int PerkID)
315 {
316 if (!Commands->Is_A_Star(obj))
317 return false;
318 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
319 if (!PlayerPerkListNodes[PlayerID])
320 return false;
321 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].HasPerk)
322 return true;
323 return false;
324 }
325 void ClearPerksList()
326 {
327 HasLoaded = false;
328 for (int x = 0;x < 128;x++)
329 PlayerPerkListNodes[x] = NULL;
330 PlayerPerksDataNode *Current = PlayerPerksDataNodeList,*Temp = NULL;
331 while (Current)
332 {
333 Temp = Current;
334 Current = Current->next;
335 delete Temp;
336 }
337 PlayerPerksDataNodeList = NULL;
338 }
339 void SaveData()
340 {
341 if (!HasLoaded)
342 {
343 Console_Input("msg PlayerPerksNodeControlSystem ERROR: Saved blocked!");
344 return;
345 }
346 char filePath[256], tempPath[256];
347 sprintf(filePath,"%sSave",Get_File_Path());
348 _mkdir(filePath);
349 sprintf(tempPath,"%sSave\\BetaRp2PlayerPerks.tmp",Get_File_Path());
350 FILE *SavePerks = fopen(tempPath,"w");
351 if (!SavePerks)
352 return;
353 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
354 while (Current)
355 {
356 char EncryptString[2048];
357 sprintf(EncryptString,"");
358 for (int x = 0;x < PERKCOUNT;x++)
359 sprintf(EncryptString,"%s%d %d ",EncryptString,Current->PlayerPerkList[x].PerkProgress,Current->PlayerPerkList[x].PerkProgress);
360 fprintf(SavePerks,"%s\n%s",JmgUtility::Rp2Encrypt(Current->PlayerName,25,5),JmgUtility::Rp2Encrypt2(EncryptString,Current->PlayerName[0],Current->PlayerName[1]));
361 if (Current->next)
362 fprintf(SavePerks,"\n");
363 Current = Current->next;
364 }
365 fclose(SavePerks);
366 sprintf(tempPath,"%sSave\\BetaRp2PlayerPerks.tmp",Get_File_Path());
367 sprintf(filePath,"%sSave\\BetaRp2PlayerPerks.Rp2",Get_File_Path());
368 remove(filePath);
369 rename(tempPath,filePath);
370 sprintf(tempPath,"%sSave\\BetaRp2PlayerPerks.txt",Get_File_Path());
371 FILE *SavePerks2 = fopen(tempPath,"w");
372 Current = PlayerPerksDataNodeList;
373 while (Current)
374 {
375 char EncryptString[2048];
376 sprintf(EncryptString,"");
377 for (int x = 0;x < PERKCOUNT;x++)
378 sprintf(EncryptString,"%s%.2f ",EncryptString,Current->PlayerPerkList[x].HasPerk ? 100.00 : ((float)Current->PlayerPerkList[x].PerkProgress/PerkSystemPerkTypeNodeList[x].UnlockCost*100.0f));
379 fprintf(SavePerks2,"%s\n%s\n",Current->PlayerName,EncryptString);
380 Current = Current->next;
381 }
382 fclose(SavePerks2);
383 }
384 void LoadData()
385 {
386 char loadPath[256];
387 sprintf(loadPath,"%sSave\\BetaRp2PlayerPerks.Rp2",Get_File_Path());
388 FILE *LoadPerks = fopen(loadPath,"r");
389 if (LoadPerks)
390 {
391 while (!feof(LoadPerks))
392 {
393 char PlayerName[256];
394 fgets(PlayerName,256,LoadPerks);
395 int Length = strlen(PlayerName);
396 if (Length <= 0)
397 {
398 Console_Input("msg PlayerPerksNodeControlSystem::LoadData ERROR: Length is less than 1");
399 char DecryptString[2048];
400 fgets(DecryptString,2048,LoadPerks);
401 continue;
402 }
403 PlayerName[Length-1] = '\0';
404 PlayerPerksDataNode *Current = GetPlayerPerkList(JmgUtility::Rp2Decrypt(PlayerName,25,5));
405 char DecryptString[2048];
406 fgets(DecryptString,2048,LoadPerks);
407 char DecryptedString[2048];
408 sprintf(DecryptedString,"%s",JmgUtility::Rp2Decrypt(DecryptString,Current->PlayerName[0],Current->PlayerName[1]));
409 PlayerPerkDataNode LA[PERKCOUNT] = {PlayerPerkDataNode()};
410 PlayerPerkDataNode LA2[PERKCOUNT] = {PlayerPerkDataNode()};
411 sscanf(DecryptedString,"%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d 0",&LA[0].PerkProgress,&LA2[0].PerkProgress,&LA[1].PerkProgress,&LA2[1].PerkProgress,&LA[2].PerkProgress,&LA2[2].PerkProgress,&LA[3].PerkProgress,&LA2[3].PerkProgress,&LA[4].PerkProgress,&LA2[4].PerkProgress,&LA[5].PerkProgress,&LA2[5].PerkProgress,&LA[6].PerkProgress,&LA2[6].PerkProgress,&LA[7].PerkProgress,&LA2[7].PerkProgress,&LA[8].PerkProgress,&LA2[8].PerkProgress,&LA[9].PerkProgress,&LA2[9].PerkProgress,&LA[10].PerkProgress,&LA2[10].PerkProgress,&LA[11].PerkProgress,&LA2[11].PerkProgress,&LA[12].PerkProgress,&LA2[12].PerkProgress,&LA[13].PerkProgress,&LA2[13].PerkProgress,&LA[14].PerkProgress,&LA2[14].PerkProgress,&LA[15].PerkProgress,&LA2[15].PerkProgress,&LA[16].PerkProgress,&LA2[16].PerkProgress,&LA[17].PerkProgress,&LA2[17].PerkProgress,&LA[18].PerkProgress,&LA2[18].PerkProgress,&LA[19].PerkProgress,&LA2[19].PerkProgress,&LA[20].PerkProgress,&LA2[20].PerkProgress,&LA[21].PerkProgress,&LA2[21].PerkProgress,&LA[22].PerkProgress,&LA2[22].PerkProgress,&LA[23].PerkProgress,&LA2[23].PerkProgress,&LA[24].PerkProgress,&LA2[24].PerkProgress,&LA[25].PerkProgress,&LA2[25].PerkProgress,&LA[26].PerkProgress,&LA2[26].PerkProgress,&LA[27].PerkProgress,&LA2[27].PerkProgress,&LA[28].PerkProgress,&LA2[28].PerkProgress,&LA[29].PerkProgress,&LA2[29].PerkProgress,&LA[30].PerkProgress,&LA2[30].PerkProgress,&LA[31].PerkProgress,&LA2[31].PerkProgress,&LA[32].PerkProgress,&LA2[32].PerkProgress,&LA[33].PerkProgress,&LA2[33].PerkProgress,&LA[34].PerkProgress,&LA2[34].PerkProgress,&LA[35].PerkProgress,&LA2[35].PerkProgress,&LA[36].PerkProgress,&LA2[36].PerkProgress,&LA[37].PerkProgress,&LA2[37].PerkProgress,&LA[38].PerkProgress,&LA2[38].PerkProgress,&LA[39].PerkProgress,&LA2[39].PerkProgress,&LA[40].PerkProgress,&LA2[40].PerkProgress,&LA[41].PerkProgress,&LA2[41].PerkProgress,&LA[42].PerkProgress,&LA2[42].PerkProgress,&LA[43].PerkProgress,&LA2[43].PerkProgress,&LA[44].PerkProgress,&LA2[44].PerkProgress,&LA[45].PerkProgress,&LA2[45].PerkProgress,&LA[46].PerkProgress,&LA2[46].PerkProgress,&LA[47].PerkProgress,&LA2[47].PerkProgress,&LA[48].PerkProgress,&LA2[48].PerkProgress,&LA[49].PerkProgress,&LA2[49].PerkProgress,&LA[50].PerkProgress,&LA2[50].PerkProgress,&LA[51].PerkProgress,&LA2[51].PerkProgress,&LA[52].PerkProgress,&LA2[52].PerkProgress,&LA[53].PerkProgress,&LA2[53].PerkProgress,&LA[54].PerkProgress,&LA2[54].PerkProgress,&LA[55].PerkProgress,&LA2[55].PerkProgress,&LA[56].PerkProgress,&LA2[56].PerkProgress,&LA[57].PerkProgress,&LA2[57].PerkProgress,&LA[58].PerkProgress,&LA2[58].PerkProgress,&LA[59].PerkProgress,&LA2[59].PerkProgress,&LA[60].PerkProgress,&LA2[60].PerkProgress,&LA[61].PerkProgress,&LA2[61].PerkProgress,&LA[62].PerkProgress,&LA2[62].PerkProgress,&LA[63].PerkProgress,&LA2[63].PerkProgress,&LA[64].PerkProgress,&LA2[64].PerkProgress,&LA[65].PerkProgress,&LA2[65].PerkProgress,&LA[66].PerkProgress,&LA2[66].PerkProgress,&LA[67].PerkProgress,&LA2[67].PerkProgress,&LA[68].PerkProgress,&LA2[68].PerkProgress,&LA[69].PerkProgress,&LA2[69].PerkProgress,&LA[70].PerkProgress,&LA2[70].PerkProgress,&LA[71].PerkProgress,&LA2[71].PerkProgress,&LA[72].PerkProgress,&LA2[72].PerkProgress,&LA[73].PerkProgress,&LA2[73].PerkProgress,&LA[74].PerkProgress,&LA2[74].PerkProgress,&LA[75].PerkProgress,&LA2[75].PerkProgress,&LA[76].PerkProgress,&LA2[76].PerkProgress,&LA[77].PerkProgress,&LA2[77].PerkProgress,&LA[78].PerkProgress,&LA2[78].PerkProgress,&LA[79].PerkProgress,&LA2[79].PerkProgress,&LA[80].PerkProgress,&LA2[80].PerkProgress,&LA[81].PerkProgress,&LA2[81].PerkProgress,&LA[82].PerkProgress,&LA2[82].PerkProgress,&LA[83].PerkProgress,&LA2[83].PerkProgress,&LA[84].PerkProgress,&LA2[84].PerkProgress,&LA[85].PerkProgress,&LA2[85].PerkProgress,&LA[86].PerkProgress,&LA2[86].PerkProgress,&LA[87].PerkProgress,&LA2[87].PerkProgress,&LA[88].PerkProgress,&LA2[88].PerkProgress,&LA[89].PerkProgress,&LA2[89].PerkProgress,&LA[90].PerkProgress,&LA2[90].PerkProgress,&LA[91].PerkProgress,&LA2[91].PerkProgress,&LA[92].PerkProgress,&LA2[92].PerkProgress,&LA[93].PerkProgress,&LA2[93].PerkProgress,&LA[94].PerkProgress,&LA2[94].PerkProgress,&LA[95].PerkProgress,&LA2[95].PerkProgress,&LA[96].PerkProgress,&LA2[96].PerkProgress,&LA[97].PerkProgress,&LA2[97].PerkProgress,&LA[98].PerkProgress,&LA2[98].PerkProgress,&LA[99].PerkProgress,&LA2[99].PerkProgress,&LA[100].PerkProgress,&LA2[100].PerkProgress,&LA[101].PerkProgress,&LA2[101].PerkProgress,&LA[102].PerkProgress,&LA2[102].PerkProgress,&LA[103].PerkProgress,&LA2[103].PerkProgress,&LA[104].PerkProgress,&LA2[104].PerkProgress,&LA[105].PerkProgress,&LA2[105].PerkProgress,&LA[106].PerkProgress,&LA2[106].PerkProgress,&LA[107].PerkProgress,&LA2[107].PerkProgress,&LA[108].PerkProgress,&LA2[108].PerkProgress,&LA[109].PerkProgress,&LA2[109].PerkProgress,&LA[110].PerkProgress,&LA2[110].PerkProgress,&LA[111].PerkProgress,&LA2[111].PerkProgress,&LA[112].PerkProgress,&LA2[112].PerkProgress,&LA[113].PerkProgress,&LA2[113].PerkProgress,&LA[114].PerkProgress,&LA2[114].PerkProgress,&LA[115].PerkProgress,&LA2[115].PerkProgress,&LA[116].PerkProgress,&LA2[116].PerkProgress,&LA[117].PerkProgress,&LA2[117].PerkProgress,&LA[118].PerkProgress,&LA2[118].PerkProgress,&LA[119].PerkProgress,&LA2[119].PerkProgress,&LA[120].PerkProgress,&LA2[120].PerkProgress,&LA[121].PerkProgress,&LA2[121].PerkProgress,&LA[122].PerkProgress,&LA2[122].PerkProgress,&LA[123].PerkProgress,&LA2[123].PerkProgress,&LA[124].PerkProgress,&LA2[124].PerkProgress,&LA[125].PerkProgress,&LA2[125].PerkProgress);
412 for (int x = 0;x < PERKCOUNT;x++)
413 {
414 if (LA2[x].PerkProgress == LA[x].PerkProgress)
415 Current->PlayerPerkList[x].PerkProgress = LA[x].PerkProgress;
416 else if (PerkSystemPerkTypeNodeList[x].ResetOnFail)
417 Current->PlayerPerkList[x].PerkProgress = 0;
418 if (PerkSystemPerkTypeNodeList[x].UnlockCost == LA[x].PerkProgress)
419 {
420 Current->PlayerPerkList[x].HasPerk = true;
421 if (PerkSystemPerkTypeNodeList[x].PerkID)
422 Current->UnlockedPerks++;
423 }
424 if (PerkSystemPerkTypeNodeList[x].UnlockCost < Current->PlayerPerkList[x].PerkProgress)
425 Current->PlayerPerkList[x].PerkProgress = PerkSystemPerkTypeNodeList[x].UnlockCost;
426 }
427 }
428 fclose(LoadPerks);
429 }
430 HasLoaded = true;
431 }
432};
433
434PerkSystemPerkTypeList PerkTypeSystem = PerkSystemPerkTypeList();
435PlayerPerksNodeControlSystem PlayerPerkSystemControl = PlayerPerksNodeControlSystem();
436bool CheckIfPlayerHasPerkUnlocked(GameObject *obj,int PerkID)
437{
438 if (PlayerPerkSystemControl.CheckIfPlayerHasPerkUnlocked(obj,PerkID))
439 return true;
440 return false;
441}
442bool PerkSystemIncreasePlayerPerkUnlockAmount(GameObject *obj,int PerkID,unsigned int IncreaseAmount)
443{
444 return PlayerPerkSystemControl.IncreasePlayerPerkUnlockAmount(obj,PerkID,IncreaseAmount);
445}
446void AddPerkTypes()
447{
448 PerkTypeSystem.Clean_Up();
449 for (int x = 0;x < 105;x++)
450 if (x != 61 && x != 63)
451 PerkTypeSystem.AddAPerkType(x,"N/A",1000000,false,false,false,PerkUnusable,0,"N/A");
452 PerkTypeSystem.AddAPerkType(61,"To The Moon and Beyond",26,false,false,true,PerkWeapon,1,"Your reward for defending Earth!");
453 PerkTypeSystem.AddAPerkType(63,"Gamer",10,false,false,false,PerkWeapon,1,"Buying Floppy Disks gives you Golden Floppy Disks instead.");
454 PerkTypeSystem.AddAPerkType(105,"Extra Life Ability",5,false,false,false,PerkUnusable,0,"You have unlocked the Extra Life ability.");
455 PerkTypeSystem.AddAPerkType(106,"Hyperdrive Ability",10,false,false,false,PerkUnusable,0,"You have unlocked the Hyperdrive ability.");
456 PerkTypeSystem.AddAPerkType(107,"Double Points Ability",25,false,false,false,PerkUnusable,0,"You have unlocked the Double Points ability.");
457 PerkTypeSystem.AddAPerkType(108,"Rapid Energy Regen Ability",25,false,false,false,PerkUnusable,0,"You have unlocked the Rapid Energy Regen ability.");
458 PerkTypeSystem.AddAPerkType(109,"Weapons Upgrade Ability",25,false,false,false,PerkUnusable,0,"You have unlocked the Weapons Upgrade ability.");
459 PerkTypeSystem.AddAPerkType(110,"Drone Ability",50,false,false,false,PerkUnusable,0,"You have unlocked the Drone ability.");
460 PerkTypeSystem.AddAPerkType(111,"High Yield Warhead Ability",50,false,false,false,PerkUnusable,0,"You have unlocked the High Yield Warhead ability.");
461 PerkTypeSystem.AddAPerkType(112,"SOS Beacon Ability",25,false,false,false,PerkUnusable,0,"You have unlocked the SOS Beacon ability.");
462 PerkTypeSystem.AddAPerkType(113,"Drone Swarm Ability",25,false,false,false,PerkUnusable,0,"You have unlocked the Drone Swarm ability.");
463 for (int x = 114;x < PERKCOUNT;x++)
464 PerkTypeSystem.AddAPerkType(x,"N/A",1000000,false,false,false,PerkUnusable,0,"N/A");
465
466 PerkTypeSystem.Finalize_Perks();
467 PerkSystemPerkTypeList::USEABLEPERKCOUNT = 0;
468 for (int x = 0;x < PERKCOUNT;x++)
469 if (PerkSystemPerkTypeNodeList[x].PerkID)
470 PerkSystemPerkTypeList::USEABLEPERKCOUNT++;
471}
472
473
474struct RenCometBustersScoreSystem
475{
476 int difficulty;
477public:
478 #define RCMTBHIGHSCORELISTCOUNT 61
479 struct CMTBHighScoresNode
480 {
481 char PlayerName[256];
482 unsigned long PlayTime;
483 unsigned long RoundsPlayed;
484 unsigned long Deaths;
485 unsigned long CometSmall;
486 unsigned long CometMedium;
487 unsigned long CometLarge;
488 unsigned long CometHuge;
489 unsigned long TheMoon;
490 unsigned long UFO;
491 unsigned long Mine;
492 unsigned long OtherPlayers;
493 unsigned long HighestScore;
494 unsigned long TotalScore;
495 unsigned int HighestLevel;
496 unsigned long TotalComets;
497 unsigned long HEWPowerups;
498 unsigned long HEWUsed;
499 unsigned long RoundsFired;
500 unsigned long TeamHighestLevel;
501 unsigned long GrantedOtherPlayersLives;
502 unsigned long ReceivedOtherPlayersLives;
503 unsigned long CargoShip;
504 unsigned long NewLivesAcquired;
505 unsigned long ObjectsRammed;
506 unsigned long SOSBeacons;
507 unsigned long PowerPowerups;
508 unsigned long ExtraLifePowerups;
509 unsigned long UsedSOSBeacons;
510 unsigned long PointPowerups;
511 unsigned long PowerupPoints;
512 unsigned long PickedUpDrone;
513 unsigned long UsedDrones;
514 unsigned long DroneKills;
515 unsigned long DronesKilled;
516 unsigned long DronePoints;
517 unsigned long RegenPowerups;
518 unsigned long DoublePointsPowerups;
519 unsigned long DoublePointsPoints;
520 unsigned long DeerPowerups;
521 unsigned long TimeCloaked;
522 unsigned long ShipCloakedCount;
523 unsigned long TimeShielded;
524 unsigned long ShieldRaisedCount;
525 unsigned long RanOutOfPowerCount;
526 unsigned long CargoShipScore;
527 unsigned long CargoShipKills;
528 unsigned long JumpsUsed;
529 unsigned long PickedUpDroneSwarm;
530 unsigned long UsedDronesSwarm;
531 unsigned long TimeDisrupted;
532 unsigned long UpgadedWeaponPowerups;
533 unsigned long UpgadedWeaponTime;
534 unsigned long HighestCleanScore;
535 unsigned long HighestCleanTeamScore;
536 unsigned int HighestCleanLevel;
537 unsigned int HighestCleanTeamLevel;
538 unsigned long HighestTeamScore;
539 unsigned long LevelsPlayedWithPerks;
540 unsigned long LevelsPlayedWithOutPerks;
541 unsigned long LevelsPlayedWithPerksAsATeam;
542 unsigned long LevelsPlayedWithOutPerksAsATeam;
543 JmgUtility::GenericDateTime LastPlayTime;
544 CMTBHighScoresNode *next;
545 CMTBHighScoresNode(void)
546 {
547 sprintf(PlayerName,"\0");
548 PlayTime = 0;
549 RoundsPlayed = 0;
550 Deaths = 0;
551 CometSmall = 0;
552 CometMedium = 0;
553 CometLarge = 0;
554 CometHuge = 0;
555 TheMoon = 0;
556 UFO = 0;
557 Mine = 0;
558 OtherPlayers = 0;
559 HighestScore = 0;
560 TotalScore = 0;
561 HighestLevel = 0;
562 TotalComets = 0;
563 HEWPowerups = 0;
564 HEWUsed = 0;
565 RoundsFired = 0;
566 TeamHighestLevel = 0;
567 GrantedOtherPlayersLives = 0;
568 ReceivedOtherPlayersLives = 0;
569 CargoShip = 0;
570 NewLivesAcquired = 0;
571 ObjectsRammed = 0;
572 SOSBeacons = 0;
573 PowerPowerups = 0;
574 ExtraLifePowerups = 0;
575 UsedSOSBeacons = 0;
576 PointPowerups = 0;
577 PowerupPoints = 0;
578 PickedUpDrone = 0;
579 UsedDrones = 0;
580 DroneKills = 0;
581 DronesKilled = 0;
582 DronePoints = 0;
583 RegenPowerups = 0;
584 DoublePointsPowerups = 0;
585 DoublePointsPoints = 0;
586 DeerPowerups = 0;
587 TimeCloaked = 0;
588 ShipCloakedCount = 0;
589 TimeShielded = 0;
590 ShieldRaisedCount = 0;
591 RanOutOfPowerCount = 0;
592 CargoShipScore = 0;
593 CargoShipKills = 0;
594 JumpsUsed = 0;
595 PickedUpDroneSwarm = 0;
596 UsedDronesSwarm = 0;
597 TimeDisrupted = 0;
598 UpgadedWeaponPowerups = 0;
599 UpgadedWeaponTime = 0;
600 HighestCleanScore = 0;
601 HighestCleanTeamScore = 0;
602 HighestCleanLevel = 0;
603 HighestCleanTeamLevel = 0;
604 HighestTeamScore = 0;
605 LevelsPlayedWithPerks = 0;
606 LevelsPlayedWithOutPerks = 0;
607 LevelsPlayedWithPerksAsATeam = 0;
608 LevelsPlayedWithOutPerksAsATeam = 0;
609 LastPlayTime = JmgUtility::GenericDateTime();
610 next = NULL;
611 }
612 };
613private:
614 CMTBHighScoresNode *CMTBHighScoresNodeList;
615 CMTBHighScoresNode *CMTBHighScoresNodeEmptyNode;
616 CMTBHighScoresNode *CMTBPlayerHighScoreNodes[128];
617 struct PlayersInGameNode
618 {
619 char PlayerName[256];
620 PlayersInGameNode *next;
621 };
622 PlayersInGameNode *PlayersInGameNodeList;
623 void AddPlayerToInGameList(CMTBHighScoresNode *Node)
624 {
625 if (!Node)
626 return;
627 if (!PlayersInGameNodeList)
628 {
629 PlayersInGameNodeList = new PlayersInGameNode;
630 sprintf(PlayersInGameNodeList->PlayerName,"%s",Node->PlayerName);
631 PlayersInGameNodeList->next = NULL;
632 Node->RoundsPlayed++;
633 return;
634 }
635 PlayersInGameNode *Current = PlayersInGameNodeList;
636 while (Current)
637 {
638 if (!_stricmp(Current->PlayerName,Node->PlayerName))
639 return;
640 if (!Current->next)
641 {
642 Current->next = new PlayersInGameNode;
643 sprintf(Current->next->PlayerName,"%s",Node->PlayerName);
644 Current->next->next = NULL;
645 Node->RoundsPlayed++;
646 return;
647 }
648 Current = Current->next;
649 }
650 }
651
652 void LoadHighestScores()
653 {
654 if (!CMTBHighScoresNodeList)
655 return;
656 for (int x = 0;x < RCMTBHIGHSCORELISTCOUNT;x++)
657 {
658 CMTBHighScoresNode *Current = CMTBHighScoresNodeList,*Best = NULL;
659 while (Current)
660 {
661 Best = CompareHighScoreNodes(Best,Current,x);
662 Current = Current->next;
663 }
664 sprintf(HighScoreHolderName[x],"%s",Best->PlayerName);
665 }
666 }
667
668 CMTBHighScoresNode *FindOrAddPlayerMAHighScoreNode(const char *PlayerName)
669 {
670 if (!CMTBHighScoresNodeList)
671 {
672 CMTBHighScoresNodeList = new CMTBHighScoresNode();
673 sprintf(CMTBHighScoresNodeList->PlayerName,"%s",PlayerName);
674 return CMTBHighScoresNodeList;
675 }
676 CMTBHighScoresNode *Current = CMTBHighScoresNodeList;
677 while (Current)
678 {
679 if (!_stricmp(Current->PlayerName,PlayerName))
680 return Current;
681 if (!Current->next)
682 {
683 Current->next = new CMTBHighScoresNode();
684 Current = Current->next;
685 sprintf(Current->PlayerName,"%s",PlayerName);
686 return Current;
687 }
688 Current = Current->next;
689 }
690 return NULL;
691 }
692
693public:
694 RenCometBustersScoreSystem()
695 {
696 CMTBHighScoresNodeList = NULL;
697 CMTBHighScoresNodeEmptyNode = NULL;
698 for (int x = 0;x < 128;x++)
699 CMTBPlayerHighScoreNodes[x] = NULL;
700 PlayersInGameNodeList = NULL;
701 };
702
703 char HighScoreHolderName[RCMTBHIGHSCORELISTCOUNT][128];
704 CMTBHighScoresNode *Get_Current_Player_Score_Node(int PlayerID)
705 {
706 const char *PlayerName = Get_Player_Name_By_ID(PlayerID);
707 if (!PlayerName)
708 {
709 if (!CMTBHighScoresNodeEmptyNode)
710 CMTBHighScoresNodeEmptyNode = new CMTBHighScoresNode();
711 return CMTBHighScoresNodeEmptyNode;
712 }
713 if (!CMTBPlayerHighScoreNodes[PlayerID])
714 {
715 CMTBPlayerHighScoreNodes[PlayerID] = FindOrAddPlayerMAHighScoreNode(PlayerName);
716 AddPlayerToInGameList(CMTBPlayerHighScoreNodes[PlayerID]);
717 }
718 else if (_stricmp(CMTBPlayerHighScoreNodes[PlayerID]->PlayerName,PlayerName))
719 {
720 CMTBPlayerHighScoreNodes[PlayerID] = FindOrAddPlayerMAHighScoreNode(PlayerName);
721 AddPlayerToInGameList(CMTBPlayerHighScoreNodes[PlayerID]);
722 }
723 return CMTBPlayerHighScoreNodes[PlayerID];
724 }
725
726 void Cleanup()
727 {
728 if (CMTBHighScoresNodeEmptyNode)
729 {
730 delete CMTBHighScoresNodeEmptyNode;
731 CMTBHighScoresNodeEmptyNode = NULL;
732 }
733 for (int x = 0;x < 128;x++)
734 {
735 if (CMTBPlayerHighScoreNodes[x])
736 CMTBPlayerHighScoreNodes[x] = NULL;
737 }
738 if (CMTBHighScoresNodeList)
739 {
740 CMTBHighScoresNode *temp,*die;
741 temp = CMTBHighScoresNodeList;
742 while (temp != NULL)
743 {
744 die = temp;
745 temp = temp->next;
746 delete die;
747 }
748 CMTBHighScoresNodeList = NULL;
749 }
750 if (PlayersInGameNodeList)
751 {
752 PlayersInGameNode *temp,*die;
753 temp = PlayersInGameNodeList;
754 while (temp != NULL)
755 {
756 die = temp;
757 temp = temp->next;
758 delete die;
759 }
760 PlayersInGameNodeList = NULL;
761 }
762 }
763
764 void SaveData()
765 {
766 FILE *SaveScores;
767 FILE *SaveScores2;
768 char FileName[256];
769 char FileNameTmp[256];
770 char SavePath[256];
771 sprintf(SavePath, "%sSave\\", Get_File_Path());
772 sprintf(FileNameTmp,"%sBetaCMBTPlayerRecords.tmp",SavePath);
773 SaveScores = fopen(FileNameTmp,"w");
774 switch (difficulty)
775 {
776 case 0:sprintf(FileName,"%sBetaCMBTPlayerRecordsEasy.txt",SavePath);break;
777 case 1:sprintf(FileName,"%sBetaCMBTPlayerRecords.txt",SavePath);break;
778 case 2:sprintf(FileName,"%sBetaCMBTPlayerRecordsHard.txt",SavePath);break;
779 case 3:sprintf(FileName,"%sBetaCMBTPlayerRecordsDoomsday.txt",SavePath);break;
780 };
781 SaveScores2 = fopen(FileName,"w");
782 CMTBHighScoresNode *Current = CMTBHighScoresNodeList;
783 if (!SaveScores || !SaveScores2)
784 {
785 char debug[220];
786 sprintf(debug,"msg RenCometBustersScoreSystem ERROR: Could not open save files %sBetaCMBTPlayerRecords.tmp and %sCMBTPlayerRecords.txt for writting!",SavePath,SavePath);
787 Console_Input(debug);
788 if (SaveScores)
789 fclose(SaveScores);
790 if (SaveScores2)
791 fclose(SaveScores2);
792 return;
793 }
794 while (Current)
795 {
796 //CalculateKillToDeathRatio(Current);
797 char EncryptString[2048];
798 sprintf(EncryptString,"%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %lu %lu %lu %d %d %d %d %d %d %lu 0",Current->PlayTime,Current->RoundsPlayed,Current->Deaths,Current->CometSmall,Current->CometMedium,Current->CometLarge,Current->CometHuge,Current->TheMoon,Current->UFO,Current->Mine,Current->OtherPlayers,Current->HighestScore,Current->TotalScore,Current->HighestLevel,Current->TotalComets,Current->HEWPowerups,Current->HEWUsed,Current->RoundsFired,Current->TeamHighestLevel,Current->GrantedOtherPlayersLives,Current->ReceivedOtherPlayersLives,Current->CargoShip,Current->NewLivesAcquired,Current->ObjectsRammed,Current->SOSBeacons,Current->PowerPowerups,Current->ExtraLifePowerups,Current->UsedSOSBeacons,Current->PointPowerups,Current->PowerupPoints,Current->PickedUpDrone,Current->UsedDrones,Current->DroneKills,Current->DronesKilled,Current->DronePoints,Current->RegenPowerups,Current->DoublePointsPowerups,Current->DoublePointsPoints,Current->DeerPowerups,Current->TimeCloaked,Current->ShipCloakedCount,Current->TimeShielded,Current->ShieldRaisedCount,Current->RanOutOfPowerCount,Current->CargoShipScore,Current->CargoShipKills,Current->JumpsUsed,Current->PickedUpDroneSwarm,Current->UsedDronesSwarm,Current->TimeDisrupted,Current->UpgadedWeaponPowerups,Current->UpgadedWeaponTime,Current->HighestCleanScore,Current->HighestCleanTeamScore,Current->HighestCleanLevel,Current->HighestCleanTeamLevel,Current->HighestTeamScore,Current->LevelsPlayedWithPerks,Current->LevelsPlayedWithOutPerks,Current->LevelsPlayedWithPerksAsATeam,Current->LevelsPlayedWithOutPerksAsATeam,Current->LastPlayTime.day,Current->LastPlayTime.month,Current->LastPlayTime.year,Current->LastPlayTime.second,Current->LastPlayTime.minute,Current->LastPlayTime.hour,Current->LastPlayTime.lTime);
799 fprintf(SaveScores2,"%s\n%s\n",Current->PlayerName,EncryptString);
800 fprintf(SaveScores,"%s\n%s",JmgUtility::Rp2Encrypt(Current->PlayerName,25,5),JmgUtility::Rp2Encrypt2(EncryptString,Current->PlayerName[0],Current->PlayerName[1]));
801 if (Current->next)
802 fprintf(SaveScores,"\n");
803 Current = Current->next;
804 }
805 fclose(SaveScores);
806 fclose(SaveScores2);
807 switch (difficulty)
808 {
809 case 0:sprintf(FileName,"%sBetaCMBTPlayerRecordsEasy.Rp2",SavePath);break;
810 case 1:sprintf(FileName,"%sBetaCMBTPlayerRecords.Rp2",SavePath);break;
811 case 2:sprintf(FileName,"%sBetaCMBTPlayerRecordsHard.Rp2",SavePath);break;
812 case 3:sprintf(FileName,"%sBetaCMBTPlayerRecordsDoomsday.Rp2",SavePath);break;
813 };
814 remove(FileName);
815 sprintf(FileNameTmp,"%sBetaCMBTPlayerRecords.tmp",SavePath);
816 rename(FileNameTmp,FileName);
817 }
818
819 void LoadData(int setDifficulty)
820 {
821 difficulty = setDifficulty;
822 Cleanup();
823 char PlayerName[256];
824 FILE *LoadScores;
825 char FileName[256];
826 char SavePath[256];
827 sprintf(SavePath, "%sSave\\", Get_File_Path());
828 switch (difficulty)
829 {
830 case 0:sprintf(FileName,"%sBetaCMBTPlayerRecordsEasy.Rp2",SavePath);break;
831 case 1:sprintf(FileName,"%sBetaCMBTPlayerRecords.Rp2",SavePath);break;
832 case 2:sprintf(FileName,"%sBetaCMBTPlayerRecordsHard.Rp2",SavePath);break;
833 case 3:sprintf(FileName,"%sBetaCMBTPlayerRecordsDoomsday.Rp2",SavePath);break;
834 }
835 LoadScores = fopen(FileName,"r");
836 if (LoadScores)
837 {
838 while (!feof(LoadScores))
839 {
840 fgets(PlayerName,256,LoadScores);
841 int Length = strlen(PlayerName);
842 if (Length <= 0)
843 {
844 Console_Input("msg MutantAssaultHighScoreSystem::LoadData ERROR: Length is less than 1");
845 continue;
846 }
847 PlayerName[Length-1] = '\0';
848 CMTBHighScoresNode *Current = FindOrAddPlayerMAHighScoreNode(JmgUtility::Rp2Decrypt(PlayerName,25,5));
849 char DecryptString[2048];
850 fgets(DecryptString,2048,LoadScores);
851 sscanf(JmgUtility::Rp2Decrypt(DecryptString,Current->PlayerName[0],Current->PlayerName[1]),"%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %lu %lu %lu %d %d %d %d %d %d %lu",&Current->PlayTime,&Current->RoundsPlayed,&Current->Deaths,&Current->CometSmall,&Current->CometMedium,&Current->CometLarge,&Current->CometHuge,&Current->TheMoon,&Current->UFO,&Current->Mine,&Current->OtherPlayers,&Current->HighestScore,&Current->TotalScore,&Current->HighestLevel,&Current->TotalComets,&Current->HEWPowerups,&Current->HEWUsed,&Current->RoundsFired,&Current->TeamHighestLevel,&Current->GrantedOtherPlayersLives,&Current->ReceivedOtherPlayersLives,&Current->CargoShip,&Current->NewLivesAcquired,&Current->ObjectsRammed,&Current->SOSBeacons,&Current->PowerPowerups,&Current->ExtraLifePowerups,&Current->UsedSOSBeacons,&Current->PointPowerups,&Current->PowerupPoints,&Current->PickedUpDrone,&Current->UsedDrones,&Current->DroneKills,&Current->DronesKilled,&Current->DronePoints,&Current->RegenPowerups,&Current->DoublePointsPowerups,&Current->DoublePointsPoints,&Current->DeerPowerups,&Current->TimeCloaked,&Current->ShipCloakedCount,&Current->TimeShielded,&Current->ShieldRaisedCount,&Current->RanOutOfPowerCount,&Current->CargoShipScore,&Current->CargoShipKills,&Current->JumpsUsed,&Current->PickedUpDroneSwarm,&Current->UsedDronesSwarm,&Current->TimeDisrupted,&Current->UpgadedWeaponPowerups,&Current->UpgadedWeaponTime,&Current->HighestCleanScore,&Current->HighestCleanTeamScore,&Current->HighestCleanLevel,&Current->HighestCleanTeamLevel,&Current->HighestTeamScore,&Current->LevelsPlayedWithPerks,&Current->LevelsPlayedWithOutPerks,&Current->LevelsPlayedWithPerksAsATeam,&Current->LevelsPlayedWithOutPerksAsATeam,&Current->LastPlayTime.day,&Current->LastPlayTime.month,&Current->LastPlayTime.year,&Current->LastPlayTime.second,&Current->LastPlayTime.minute,&Current->LastPlayTime.hour,&Current->LastPlayTime.lTime);
852 }
853 fclose(LoadScores);
854 }
855 LoadHighestScores();
856 }
857
858 CMTBHighScoresNode *CompareHighScoreNodes(CMTBHighScoresNode *High,CMTBHighScoresNode *Current,int CompVal)
859 {
860 if (!High)
861 return Current;
862 switch (CompVal)
863 {
864 case 0:
865 return (High->RoundsPlayed >= Current->RoundsPlayed ? High : Current);
866 case 1:
867 return (High->Deaths >= Current->Deaths ? High : Current);
868 case 2:
869 return (High->CometSmall >= Current->CometSmall ? High : Current);
870 case 3:
871 return (High->CometMedium >= Current->CometMedium ? High : Current);
872 case 4:
873 return (High->CometLarge >= Current->CometLarge ? High : Current);
874 case 5:
875 return (High->CometHuge >= Current->CometHuge ? High : Current);
876 case 6:
877 return (High->TheMoon >= Current->TheMoon ? High : Current);
878 case 7:
879 return (High->UFO >= Current->UFO ? High : Current);
880 case 8:
881 return (High->Mine >= Current->Mine ? High : Current);
882 case 9:
883 return (High->OtherPlayers >= Current->OtherPlayers ? High : Current);
884 case 10:
885 return (High->HighestScore >= Current->HighestScore ? High : Current);
886 case 11:
887 return (High->TotalScore >= Current->TotalScore ? High : Current);
888 case 12:
889 return (High->HighestLevel >= Current->HighestLevel ? High : Current);
890 case 13:
891 return (High->TotalComets >= Current->TotalComets ? High : Current);
892 case 14:
893 return (High->HEWPowerups >= Current->HEWPowerups ? High : Current);
894 case 15:
895 return (High->HEWUsed >= Current->HEWUsed ? High : Current);
896 case 16:
897 return (High->RoundsFired >= Current->RoundsFired ? High : Current);
898 case 17:
899 return (High->TeamHighestLevel >= Current->TeamHighestLevel ? High : Current);
900 case 18:
901 return (High->GrantedOtherPlayersLives >= Current->GrantedOtherPlayersLives ? High : Current);
902 case 19:
903 return (High->ReceivedOtherPlayersLives >= Current->ReceivedOtherPlayersLives ? High : Current);
904 case 20:
905 return (High->CargoShip >= Current->CargoShip ? High : Current);
906 case 21:
907 return (High->NewLivesAcquired >= Current->NewLivesAcquired ? High : Current);
908 case 22:
909 return (High->ObjectsRammed >= Current->ObjectsRammed ? High : Current);
910 case 23:
911 return (High->SOSBeacons >= Current->SOSBeacons ? High : Current);
912 case 24:
913 return (High->PowerPowerups >= Current->PowerPowerups ? High : Current);
914 case 25:
915 return (High->ExtraLifePowerups >= Current->ExtraLifePowerups ? High : Current);
916 case 26:
917 return (High->UsedSOSBeacons >= Current->UsedSOSBeacons ? High : Current);
918 case 27:
919 return (High->PointPowerups >= Current->PointPowerups ? High : Current);
920 case 28:
921 return (High->PowerupPoints >= Current->PowerupPoints ? High : Current);
922 case 29:
923 return (High->PickedUpDrone >= Current->PickedUpDrone ? High : Current);
924 case 30:
925 return (High->UsedDrones >= Current->UsedDrones ? High : Current);
926 case 31:
927 return (High->DroneKills >= Current->DroneKills ? High : Current);
928 case 32:
929 return (High->DronesKilled >= Current->DronesKilled ? High : Current);
930 case 33:
931 return (High->DronePoints >= Current->DronePoints ? High : Current);
932 case 34:
933 return (High->RegenPowerups >= Current->RegenPowerups ? High : Current);
934 case 35:
935 return (High->DoublePointsPowerups >= Current->DoublePointsPowerups ? High : Current);
936 case 36:
937 return (High->DoublePointsPoints >= Current->DoublePointsPoints ? High : Current);
938 case 37:
939 return (High->DeerPowerups >= Current->DeerPowerups ? High : Current);
940 case 38:
941 return (High->TimeCloaked >= Current->TimeCloaked ? High : Current);
942 case 39:
943 return (High->ShipCloakedCount >= Current->ShipCloakedCount ? High : Current);
944 case 40:
945 return (High->TimeShielded >= Current->TimeShielded ? High : Current);
946 case 41:
947 return (High->ShieldRaisedCount >= Current->ShieldRaisedCount ? High : Current);
948 case 42:
949 return (High->RanOutOfPowerCount >= Current->RanOutOfPowerCount ? High : Current);
950 case 43:
951 return (High->CargoShipScore >= Current->CargoShipScore ? High : Current);
952 case 44:
953 return (High->CargoShipKills >= Current->CargoShipKills ? High : Current);
954 case 45:
955 return (High->JumpsUsed >= Current->JumpsUsed ? High : Current);
956 case 46:
957 return (High->PickedUpDroneSwarm >= Current->PickedUpDroneSwarm ? High : Current);
958 case 47:
959 return (High->UsedDronesSwarm >= Current->UsedDronesSwarm ? High : Current);
960 case 48:
961 return (High->TimeDisrupted >= Current->TimeDisrupted ? High : Current);
962 case 49:
963 return (High->UpgadedWeaponPowerups >= Current->UpgadedWeaponPowerups ? High : Current);
964 case 50:
965 return (High->UpgadedWeaponTime >= Current->UpgadedWeaponTime ? High : Current);
966 case 51:
967 return (High->HighestCleanScore >= Current->HighestCleanScore ? High : Current);
968 case 52:
969 return (High->HighestCleanTeamScore >= Current->HighestCleanTeamScore ? High : Current);
970 case 53:
971 return (High->HighestCleanLevel >= Current->HighestCleanLevel ? High : Current);
972 case 54:
973 return (High->HighestCleanTeamLevel >= Current->HighestCleanTeamLevel ? High : Current);
974 case 55:
975 return (High->HighestTeamScore >= Current->HighestTeamScore ? High : Current);
976 case 56:
977 return (High->LevelsPlayedWithPerks >= Current->LevelsPlayedWithPerks ? High : Current);
978 case 57:
979 return (High->LevelsPlayedWithOutPerks >= Current->LevelsPlayedWithOutPerks ? High : Current);
980 case 58:
981 return (High->LevelsPlayedWithPerksAsATeam >= Current->LevelsPlayedWithPerksAsATeam ? High : Current);
982 case 59:
983 return (High->LevelsPlayedWithOutPerksAsATeam >= Current->LevelsPlayedWithOutPerksAsATeam ? High : Current);
984 default:
985 return (High->PlayTime >= Current->PlayTime ? High : Current);
986 }
987 }
988
989 bool ReturnHighScoreNodeValue(CMTBHighScoresNode *Node,int CompVal)
990 {
991 if (!Node)
992 return false;
993 switch (CompVal)
994 {
995 case 0:
996 return Node->RoundsPlayed ? true : false;
997 case 1:
998 return Node->Deaths ? true : false;
999 case 2:
1000 return Node->CometSmall ? true : false;
1001 case 3:
1002 return Node->CometMedium ? true : false;
1003 case 4:
1004 return Node->CometLarge ? true : false;
1005 case 5:
1006 return Node->CometHuge ? true : false;
1007 case 6:
1008 return Node->TheMoon ? true : false;
1009 case 7:
1010 return Node->UFO ? true : false;
1011 case 8:
1012 return Node->Mine ? true : false;
1013 case 9:
1014 return Node->OtherPlayers ? true : false;
1015 case 10:
1016 return Node->HighestScore ? true : false;
1017 case 11:
1018 return Node->TotalScore ? true : false;
1019 case 12:
1020 return Node->HighestLevel ? true : false;
1021 case 13:
1022 return Node->TotalComets ? true : false;
1023 case 14:
1024 return Node->HEWPowerups ? true : false;
1025 case 15:
1026 return Node->HEWUsed ? true : false;
1027 case 16:
1028 return Node->RoundsFired ? true : false;
1029 case 17:
1030 return Node->TeamHighestLevel ? true : false;
1031 case 18:
1032 return Node->GrantedOtherPlayersLives ? true : false;
1033 case 19:
1034 return Node->ReceivedOtherPlayersLives ? true : false;
1035 case 20:
1036 return Node->CargoShip ? true : false;
1037 case 21:
1038 return Node->NewLivesAcquired ? true : false;
1039 case 22:
1040 return Node->ObjectsRammed ? true : false;
1041 case 23:
1042 return Node->SOSBeacons ? true : false;
1043 case 24:
1044 return Node->PowerPowerups ? true : false;
1045 case 25:
1046 return Node->ExtraLifePowerups ? true : false;
1047 case 26:
1048 return Node->UsedSOSBeacons ? true : false;
1049 case 27:
1050 return Node->PointPowerups ? true : false;
1051 case 28:
1052 return Node->PowerupPoints ? true : false;
1053 case 29:
1054 return Node->PickedUpDrone ? true : false;
1055 case 30:
1056 return Node->UsedDrones ? true : false;
1057 case 31:
1058 return Node->DroneKills ? true : false;
1059 case 32:
1060 return Node->DronesKilled ? true : false;
1061 case 33:
1062 return Node->DronePoints ? true : false;
1063 case 34:
1064 return Node->RegenPowerups ? true : false;
1065 case 35:
1066 return Node->DoublePointsPowerups ? true : false;
1067 case 36:
1068 return Node->DoublePointsPoints ? true : false;
1069 case 37:
1070 return Node->DeerPowerups ? true : false;
1071 case 38:
1072 return Node->TimeCloaked ? true : false;
1073 case 39:
1074 return Node->ShipCloakedCount ? true : false;
1075 case 40:
1076 return Node->TimeShielded ? true : false;
1077 case 41:
1078 return Node->ShieldRaisedCount ? true : false;
1079 case 42:
1080 return Node->RanOutOfPowerCount ? true : false;
1081 case 43:
1082 return Node->CargoShipScore ? true : false;
1083 case 44:
1084 return Node->CargoShipKills ? true : false;
1085 case 45:
1086 return Node->JumpsUsed ? true : false;
1087 case 46:
1088 return Node->PickedUpDroneSwarm ? true : false;
1089 case 47:
1090 return Node->UsedDronesSwarm ? true : false;
1091 case 48:
1092 return Node->TimeDisrupted ? true : false;
1093 case 49:
1094 return Node->UpgadedWeaponPowerups ? true : false;
1095 case 50:
1096 return Node->UpgadedWeaponTime ? true : false;
1097 case 51:
1098 return Node->HighestCleanScore ? true : false;
1099 case 52:
1100 return Node->HighestCleanTeamScore ? true : false;
1101 case 53:
1102 return Node->HighestCleanLevel ? true : false;
1103 case 54:
1104 return Node->HighestCleanTeamLevel ? true : false;
1105 case 55:
1106 return Node->HighestTeamScore ? true : false;
1107 case 56:
1108 return Node->LevelsPlayedWithPerks ? true : false;
1109 case 57:
1110 return Node->LevelsPlayedWithOutPerks ? true : false;
1111 case 58:
1112 return Node->LevelsPlayedWithPerksAsATeam ? true : false;
1113 case 59:
1114 return Node->LevelsPlayedWithOutPerksAsATeam ? true : false;
1115 default:
1116 return Node->PlayTime ? true : false;
1117 }
1118 }
1119
1120 char *ReturnScore(CMTBHighScoresNode *High,int CompVal)
1121 {
1122 static char RetChar[200];
1123 if (!High)
1124 return " ";
1125 switch (CompVal)
1126 {
1127 case 0:
1128 sprintf(RetChar,"Server Record: %s has played %lu rounds of Renegade Comet Busters.",High->PlayerName,High->RoundsPlayed);return RetChar;
1129 case 1:
1130 sprintf(RetChar,"Server Record: %s has lost %lu ships playing Renegade Comet Busters.",High->PlayerName,High->Deaths);return RetChar;
1131 case 2:
1132 sprintf(RetChar,"Server Record: %s has destroyed %lu small comets.",High->PlayerName,High->CometSmall);return RetChar;
1133 case 3:
1134 sprintf(RetChar,"Server Record: %s has destroyed %lu medium comets.",High->PlayerName,High->CometMedium);return RetChar;
1135 case 4:
1136 sprintf(RetChar,"Server Record: %s has destroyed %lu large comets.",High->PlayerName,High->CometLarge);return RetChar;
1137 case 5:
1138 sprintf(RetChar,"Server Record: %s has destroyed %lu huge comets.",High->PlayerName,High->CometHuge);return RetChar;
1139 case 6:
1140 sprintf(RetChar,"Server Record: %s has destroyed the moon %lu times.",High->PlayerName,High->TheMoon);return RetChar;
1141 case 7:
1142 sprintf(RetChar,"Server Record: %s has destroyed %lu UFOs.",High->PlayerName,High->UFO);return RetChar;
1143 case 8:
1144 sprintf(RetChar,"Server Record: %s has destroyed %lu Mines.",High->PlayerName,High->Mine);return RetChar;
1145 case 9:
1146 sprintf(RetChar,"Server Record: %s has killed %lu other players.",High->PlayerName,High->OtherPlayers);return RetChar;
1147 case 10:
1148 sprintf(RetChar,"Server Record: %s has scored %lu points playing Renegade Comet Busters in a single round.",High->PlayerName,High->HighestScore);return RetChar;
1149 case 11:
1150 sprintf(RetChar,"Server Record: %s has scored a total of %lu points playing Renegade Comet Busters.",High->PlayerName,High->TotalScore);return RetChar;
1151 case 12:
1152 sprintf(RetChar,"Server Record: %s has made it to level %lu in Renegade Comet Busters.",High->PlayerName,High->HighestLevel);return RetChar;
1153 case 13:
1154 sprintf(RetChar,"Server Record: %s has destroyed %lu comets total.",High->PlayerName,High->TotalComets);return RetChar;
1155 case 14:
1156 sprintf(RetChar,"Server Record: %s has acquired %lu High Yield Warhead powerups.",High->PlayerName,High->HEWPowerups);return RetChar;
1157 case 15:
1158 sprintf(RetChar,"Server Record: %s has used %lu High Yield Warheads.",High->PlayerName,High->HEWUsed);return RetChar;
1159 case 16:
1160 sprintf(RetChar,"Server Record: %s has fired a total of %lu rounds.",High->PlayerName,High->RoundsFired);return RetChar;
1161 case 17:
1162 sprintf(RetChar,"Server Record: %s has made it to level %lu through teamwork.",High->PlayerName,High->TeamHighestLevel);return RetChar;
1163 case 18:
1164 sprintf(RetChar,"Server Record: %s has given %lu lives to other players.",High->PlayerName,High->GrantedOtherPlayersLives);return RetChar;
1165 case 19:
1166 sprintf(RetChar,"Server Record: %s has received %lu lives from other players.",High->PlayerName,High->ReceivedOtherPlayersLives);return RetChar;
1167 case 20:
1168 sprintf(RetChar,"Server Record: %s has destroyed %lu cargo ships.",High->PlayerName,High->CargoShip);return RetChar;
1169 case 21:
1170 sprintf(RetChar,"Server Record: %s has acquired %lu extra lives.",High->PlayerName,High->NewLivesAcquired);return RetChar;
1171 case 22:
1172 sprintf(RetChar,"Server Record: %s has rammed %lu objects.",High->PlayerName,High->ObjectsRammed);return RetChar;
1173 case 23:
1174 sprintf(RetChar,"Server Record: %s has acquired %lu SOS Beacon powerups.",High->PlayerName,High->SOSBeacons);return RetChar;
1175 case 24:
1176 sprintf(RetChar,"Server Record: %s has acquired %lu power cell powerups.",High->PlayerName,High->PowerPowerups);return RetChar;
1177 case 25:
1178 sprintf(RetChar,"Server Record: %s has acquired %lu extra life powerups.",High->PlayerName,High->ExtraLifePowerups);return RetChar;
1179 case 26:
1180 sprintf(RetChar,"Server Record: %s has deployed %lu SOS Beacons.",High->PlayerName,High->UsedSOSBeacons);return RetChar;
1181 case 27:
1182 sprintf(RetChar,"Server Record: %s has acquired %lu points powerups.",High->PlayerName,High->PointPowerups);return RetChar;
1183 case 28:
1184 sprintf(RetChar,"Server Record: %s has %lu points from powerups.",High->PlayerName,High->PowerupPoints);return RetChar;
1185 case 29:
1186 sprintf(RetChar,"Server Record: %s has acquired %lu Drones.",High->PlayerName,High->PickedUpDrone);return RetChar;
1187 case 30:
1188 sprintf(RetChar,"Server Record: %s has launched %lu Drones.",High->PlayerName,High->UsedDrones);return RetChar;
1189 case 31:
1190 sprintf(RetChar,"Server Record: %s has destroyed %lu objects with Drones.",High->PlayerName,High->DroneKills);return RetChar;
1191 case 32:
1192 sprintf(RetChar,"Server Record: %s has destroyed %lu Drones.",High->PlayerName,High->DronesKilled);return RetChar;
1193 case 33:
1194 sprintf(RetChar,"Server Record: %s has scored %lu points with Drones.",High->PlayerName,High->DronePoints);return RetChar;
1195 case 34:
1196 sprintf(RetChar,"Server Record: %s has acquired %lu power regen powerups.",High->PlayerName,High->RegenPowerups);return RetChar;
1197 case 35:
1198 sprintf(RetChar,"Server Record: %s has acquired %lu double points powerups.",High->PlayerName,High->DoublePointsPowerups);return RetChar;
1199 case 36:
1200 sprintf(RetChar,"Server Record: %s has scored %lu points from double points powerups.",High->PlayerName,High->DoublePointsPoints);return RetChar;
1201 case 37:
1202 sprintf(RetChar,"Server Record: %s has acquired %lu hyperspace recharges.",High->PlayerName,High->DeerPowerups);return RetChar;
1203 case 38:
1204 sprintf(RetChar,"Server Record: %s has spent %.0lf minutes cloaked.",High->PlayerName,High->TimeCloaked/60.0f);return RetChar;
1205 case 39:
1206 sprintf(RetChar,"Server Record: %s has cloaked %lu times.",High->PlayerName,High->ShipCloakedCount);return RetChar;
1207 case 40:
1208 sprintf(RetChar,"Server Record: %s has spent %.0lf minutes with shields up.",High->PlayerName,High->TimeShielded/60.0f);return RetChar;
1209 case 41:
1210 sprintf(RetChar,"Server Record: %s has raised their shield %lu times.",High->PlayerName,High->ShieldRaisedCount);return RetChar;
1211 case 42:
1212 sprintf(RetChar,"Server Record: %s has ran out of power %lu times.",High->PlayerName,High->RanOutOfPowerCount);return RetChar;
1213 case 43:
1214 sprintf(RetChar,"Server Record: %s has scored %lu points by calling in Galatic Cargo Ships.",High->PlayerName,High->CargoShipScore);return RetChar;
1215 case 44:
1216 sprintf(RetChar,"Server Record: %s has destroyed %lu objects with Galatic Cargo Ships.",High->PlayerName,High->CargoShipKills);return RetChar;
1217 case 45:
1218 sprintf(RetChar,"Server Record: %s jumped out of danger %lu times.",High->PlayerName,High->JumpsUsed);return RetChar;
1219 case 46:
1220 sprintf(RetChar,"Server Record: %s has acquired %lu Drones Swarm Transmission Codes.",High->PlayerName,High->PickedUpDroneSwarm);return RetChar;
1221 case 47:
1222 sprintf(RetChar,"Server Record: %s has used %lu Drones Swarm Transmission Codes.",High->PlayerName,High->UsedDronesSwarm);return RetChar;
1223 case 48:
1224 sprintf(RetChar,"Server Record: %s has used the disrupter for %.0lf minutes.",High->PlayerName,High->TimeDisrupted/60.0f);return RetChar;
1225 case 49:
1226 sprintf(RetChar,"Server Record: %s has used the disrupter for %lu minutes.",High->PlayerName,High->UpgadedWeaponPowerups);return RetChar;
1227 case 50:
1228 sprintf(RetChar,"Server Record: %s has acquired %lu weapon upgrade powerups.",High->PlayerName,High->UpgadedWeaponPowerups);return RetChar;
1229 case 51:
1230 sprintf(RetChar,"Server Record: %s has gained a total score of %lu without any special abilities.",High->PlayerName,High->HighestCleanScore);return RetChar;
1231 case 52:
1232 sprintf(RetChar,"Server Record: %s has acquired a team score of %lu without any special abilities.",High->PlayerName,High->HighestCleanTeamScore);return RetChar;
1233 case 53:
1234 sprintf(RetChar,"Server Record: %s has made it to level %lu without any special abilities.",High->PlayerName,High->HighestCleanLevel);return RetChar;
1235 case 54:
1236 sprintf(RetChar,"Server Record: %s has made it to level %lu with teamwork and without any special abilities.",High->PlayerName,High->HighestCleanTeamLevel);return RetChar;
1237 case 55:
1238 sprintf(RetChar,"Server Record: %s has acquired a team score of %lu.",High->PlayerName,High->HighestTeamScore);return RetChar;
1239 case 56:
1240 sprintf(RetChar,"Server Record: %s has played %lu levels with special abilities.",High->PlayerName,High->LevelsPlayedWithPerks);return RetChar;
1241 case 57:
1242 sprintf(RetChar,"Server Record: %s has played %lu levels without special abilities.",High->PlayerName,High->LevelsPlayedWithOutPerks);return RetChar;
1243 case 58:
1244 sprintf(RetChar,"Server Record: %s has played %lu levels with a team using perks.",High->PlayerName,High->LevelsPlayedWithPerksAsATeam);return RetChar;
1245 case 59:
1246 sprintf(RetChar,"Server Record: %s has played %lu levels with a team not using perks.",High->PlayerName,High->LevelsPlayedWithOutPerksAsATeam);return RetChar;
1247 default:
1248 sprintf(RetChar,"Server Record: %s has played Renegade Comet Busters for %.0lf minutes on this server.",High->PlayerName,High->PlayTime/60.0f);
1249 return RetChar;
1250 }
1251 }
1252
1253 void StateHighScore()
1254 {
1255 int maxRetry = 0;
1256 int LastHighScoreList = 1;
1257 int Random = Commands->Get_Random_Int(0,RCMTBHIGHSCORELISTCOUNT+1);
1258MAStartOfHighScoreSelectProcess:
1259 if (maxRetry > 10000)
1260 return;
1261 CMTBHighScoresNode *Current = CMTBHighScoresNodeList,*Best = NULL;
1262 while (Current)
1263 {
1264 Best = CompareHighScoreNodes(Best,Current,Random);
1265 Current = Current->next;
1266 }
1267 if (!ReturnHighScoreNodeValue(Best,Random))
1268 {
1269 if (LastHighScoreList <= 5)
1270 {
1271 LastHighScoreList++;
1272 if (Random+1 < RCMTBHIGHSCORELISTCOUNT)
1273 Random++;
1274 else
1275 Random = 1;
1276 }
1277 else
1278 {
1279 LastHighScoreList = 0;
1280 Random = 0;
1281 }
1282 maxRetry++;
1283 goto MAStartOfHighScoreSelectProcess;
1284 }
1285 sprintf(HighScoreHolderName[Random],"%s",Best->PlayerName);
1286 char DisplayMessage[128];
1287 sprintf(DisplayMessage,"%s",ReturnScore(Best,Random));
1288 for (int x = 1;x < 128;x++)
1289 {
1290 GameObject *Player = Get_GameObj(x);
1291 if (Player)
1292 JmgUtility::DisplayChatMessage(Player,6,145,148,DisplayMessage);
1293 }
1294 }
1295};
1296
1297RenCometBustersScoreSystem RenCometBustersScoreControl = RenCometBustersScoreSystem();
1298
1299enum ObjectType{NormalPlayerShip=0,UFO=1,Asteroid=2,Mine=3,TheMoon=4,PlayerShield=5,UFOBoss=6,PlayerCloak=7,PlayerSuper=8,CMTPowerup=9,CargoShip=10,MineBoss=11,PlayerDrone=12,PlayerDroneShield=13,PlayerShipJumpable=14,PlayerShipJumping=15,PlayerShipDisrupter=16};
1300struct TypeObject
1301{
1302 ReferencerClass obj;
1303 float Size;
1304 float RealSize;
1305 int parentId;
1306 ObjectType Type;
1307 TypeObject(GameObject *_obj,float _SquaredSize,float _RealSize,ObjectType _Type)
1308 {
1309 obj = _obj;
1310 Size = _SquaredSize;
1311 RealSize = _RealSize;
1312 Type = _Type;
1313 parentId = 0;
1314 };
1315 TypeObject(GameObject *obj,float Size,float RealSize,ObjectType Type,int parentId)
1316 {
1317 this->obj = obj;
1318 this->Size = Size;
1319 this->RealSize = RealSize;
1320 this->Type = Type;
1321 this->parentId = parentId;
1322 };
1323};
1324
1325struct AnObject
1326{
1327 ReferencerClass Object;
1328 float Size;
1329 float RealSize;
1330 int ObjectID;
1331 ObjectType Type;
1332 int parentId;
1333 int AllowReplaceTime;
1334 struct AnObject *next;
1335 AnObject(GameObject *obj,float Size,float RealSize,ObjectType Type,int parentId)
1336 {
1337 this->AllowReplaceTime = -1;
1338 this->Object = obj;
1339 this->ObjectID = Commands->Get_ID(obj);
1340 this->Size = Size;
1341 this->RealSize = RealSize;
1342 this->Type = Type;
1343 this->AllowReplaceTime = 0;
1344 this->parentId = parentId;
1345 this->next = NULL;
1346 };
1347};
1348
1349struct RenCometBustersPlayerNode
1350{
1351 bool isReady;
1352 int NumberOfLives;
1353 ReferencerClass PlayerShip;
1354 ReferencerClass ReplacementShip;
1355 ReferencerClass SpectatorObject;
1356 int GamePlayerID;
1357 int RespawnTime;
1358 char PlayerModel[32];
1359 float Score;
1360 Vector3 DeathLocation;
1361 Vector3 OriginalLocation;
1362 int FakeSoldierID;
1363 char OriginalSkin[128];
1364 char OriginalArmor[128];
1365 int PlayerID;
1366 int HighestLevel;
1367 int SuperBombs;
1368 float LastNewLifeScore;
1369 unsigned short NotInGameTime;
1370 bool HasSOSBeacon;
1371 int Drones[2];
1372 bool DronePowerup;
1373 bool DroneSwarmPowerup;
1374 float DroneScore;
1375 int CargoWarnedCount;
1376 int CargoTotalWarnedCount;
1377 int CargoWarnDecreaseDelay;
1378 int DoublePointsTime;
1379 int CargoShipIDs[7];
1380 float CargoScore;
1381 int HyperspaceDriveCharge;
1382 int SelectedPerk;
1383 bool SecondSpace;
1384 char PlayerName[128];
1385 int kickoutOfSpecTime;
1386 int endGamePadding;
1387 Vector3 specCreateSpot;
1388 AnObject *ShipObject;
1389 RenCometBustersPlayerNode()
1390 {
1391 isReady = false;
1392 NumberOfLives = 5;
1393 PlayerShip = NULL;
1394 ReplacementShip = NULL;
1395 SpectatorObject = NULL;
1396 GamePlayerID = 0;
1397 RespawnTime = 30;
1398 Score = 0;
1399 DeathLocation = Vector3(0.0f,0.0f,0.0f);
1400 OriginalLocation = Vector3(0.0f,0.0f,0.0f);
1401 FakeSoldierID = 0;
1402 PlayerID = 0;
1403 HighestLevel = 0;
1404 SuperBombs = 0;
1405 LastNewLifeScore = 0;
1406 NotInGameTime = 0;
1407 HasSOSBeacon = false;
1408 DronePowerup = false;
1409 DroneSwarmPowerup = false;
1410 Drones[0] = Drones[1] = 0;
1411 CargoWarnedCount = 0;
1412 CargoTotalWarnedCount = 0;
1413 CargoWarnDecreaseDelay = 0;
1414 DoublePointsTime = 0;
1415 CargoScore = 0.0f;
1416 HyperspaceDriveCharge = 0;
1417 SelectedPerk = 0;
1418 SecondSpace = false;
1419 ShipObject = NULL;
1420 sprintf(PlayerName,"");
1421 for (int x = 0;x < 7;x++)
1422 CargoShipIDs[x] = 0;
1423 sprintf(PlayerModel,"\0");
1424 sprintf(OriginalSkin,"\0");
1425 sprintf(OriginalArmor,"\0");
1426 kickoutOfSpecTime = 0;
1427 endGamePadding = 0;
1428 specCreateSpot = Vector3();
1429 };
1430};
1431
1432struct RenCometBustersPlayerNode MiniGamePlayerControlSystem[MaxGamePlayerCount] = {RenCometBustersPlayerNode()};
1433
1434class RenCometBustersGameObjects
1435{
1436private:
1437 static int PrioritizeTargets[17];
1438public:
1439 struct AnObject *ObjectsList;
1440 RenCometBustersGameObjects()
1441 {
1442 ObjectsList = NULL;
1443 };
1444 ~RenCometBustersGameObjects()
1445 {
1446 if (ObjectsList)
1447 {
1448 AnObject *temp,*die;
1449 temp = ObjectsList;
1450 while (temp != NULL)
1451 {
1452 die = temp;
1453 temp = temp->next;
1454 delete die;
1455 }
1456 ObjectsList = NULL;
1457 }
1458 };
1459 RenCometBustersGameObjects &operator += (TypeObject obj)
1460 {
1461 if (!obj.obj)
1462 return *this;
1463 AnObject *Current = ObjectsList;
1464 if (!ObjectsList)
1465 {
1466 ObjectsList = new AnObject(obj.obj,obj.Size,obj.RealSize,obj.Type,obj.parentId);
1467 return *this;
1468 }
1469 while (Current)
1470 {
1471 if (Current->AllowReplaceTime == 30)
1472 {
1473 Current->AllowReplaceTime = -1;
1474 Current->Object = obj.obj;
1475 Current->ObjectID = Commands->Get_ID(obj.obj);
1476 Current->Size = obj.Size;
1477 Current->RealSize = obj.RealSize;
1478 Current->Type = obj.Type;
1479 Current->AllowReplaceTime = 0;
1480 Current->parentId = obj.parentId;
1481 return *this;
1482 }
1483 if (!Current->AllowReplaceTime && Current->Object == obj.obj)
1484 {
1485 Console_Input("msg already in list!");
1486 return *this;
1487 }
1488 if (!Current->next)
1489 {
1490 Current->next = new AnObject(obj.obj,obj.Size,obj.RealSize,obj.Type,obj.parentId);
1491 return *this;
1492 }
1493 Current = Current->next;
1494 }
1495 return *this;
1496 };
1497 RenCometBustersGameObjects &operator -= (GameObject *object)
1498 {
1499 if (!ObjectsList || !object)
1500 return *this;
1501 AnObject *Current = ObjectsList;
1502 while (Current)
1503 {
1504 if (Current->Object == object)
1505 {
1506 Current->AllowReplaceTime = 1;
1507 }
1508 Current = Current->next;
1509 }
1510 return *this;
1511 };
1512 AnObject *FindObject(GameObject *object)
1513 {
1514 if (!ObjectsList || !object)
1515 return NULL;
1516 AnObject *Current = ObjectsList;
1517 while (Current)
1518 {
1519 if (Current->Object == object)
1520 return Current;
1521 Current = Current->next;
1522 }
1523 return NULL;
1524 };
1525 AnObject *FindObjectByID(int objectID)
1526 {
1527 if (!ObjectsList || !objectID)
1528 return NULL;
1529 AnObject *Current = ObjectsList;
1530 while (Current)
1531 {
1532 if (Current->ObjectID == objectID)
1533 return Current;
1534 Current = Current->next;
1535 }
1536 return NULL;
1537 };
1538 void SpecialApplyDamage(GameObject *obj,float damage,const char *warhead,GameObject *damager)
1539 {
1540 GameObject *driver = Get_Vehicle_Driver(obj);
1541 int originalDriverTeam = driver ? Get_Player_Type(driver) : 1;
1542 Commands->Set_Player_Type(obj,-2);
1543 Commands->Set_Player_Type(driver,-2);
1544 Commands->Apply_Damage(obj,damage,warhead,damager);
1545 if (driver)
1546 Commands->Set_Player_Type(driver,originalDriverTeam);
1547 }
1548 bool DoesCollide(AnObject *Obj,AnObject *OtherObj)
1549 {
1550 if (!Obj || !OtherObj || Obj->AllowReplaceTime || OtherObj->AllowReplaceTime)
1551 return false;
1552 ReferencerClass Hitter = Obj->Object;
1553 ReferencerClass Other = OtherObj->Object;
1554 if (Obj->Type == PlayerDroneShield && OtherObj->Type == PlayerDroneShield)
1555 return false;
1556 if (OtherObj->Type == PlayerShipJumping || Obj->Type == PlayerShipJumping)
1557 return false;
1558 if (Obj->Type == CargoShip && OtherObj->Type == TheMoon)
1559 {
1560 if (JmgUtility::SimpleDistance(Commands->Get_Position(Hitter),Commands->Get_Position(Other)) <= Obj->Size+OtherObj->Size-200.0f)
1561 {
1562 Commands->Apply_Damage(Hitter,99999.9f,"BlamoKiller",Other);
1563 return true;
1564 }
1565 return false;
1566 }
1567 if (JmgUtility::SimpleDistance(Commands->Get_Position(Hitter),Commands->Get_Position(Other)) <= Obj->Size+OtherObj->Size)
1568 {
1569 if (Obj->Type == CargoShip && OtherObj->Type == CargoShip && Obj->parentId != OtherObj->parentId)
1570 {
1571 Commands->Apply_Damage(Hitter,99999.9f,"BlamoKiller",Other);
1572 Commands->Apply_Damage(Other,99999.9f,"BlamoKiller",Hitter);
1573 return true;
1574 }
1575 if (Obj->Type == TheMoon && OtherObj->Type == CargoShip)
1576 return false;
1577 if (OtherObj->Type == PlayerShipJumpable || Obj->Type == PlayerShipJumpable)
1578 {
1579 if (OtherObj->Type == PlayerShipJumpable && Commands->Get_Random(0.0f,1.0f) < 0.5f)
1580 Commands->Send_Custom_Event(Obj->Object,OtherObj->Object,77454831,0,0.0);
1581 else if (Obj->Type == PlayerShipJumpable)
1582 Commands->Send_Custom_Event(OtherObj->Object,Obj->Object,77454831,0,0);
1583 else if (OtherObj->Type == PlayerShipJumpable)
1584 Commands->Send_Custom_Event(Obj->Object,OtherObj->Object,77454831,0,0.0);
1585 return false;
1586 }
1587 if (Obj->Type == TheMoon || Obj->Type == CargoShip)
1588 {
1589 if (OtherObj->Type == PlayerShipJumpable)
1590 {
1591 Commands->Send_Custom_Event(Obj->Object,OtherObj->Object,77454831,0,0);
1592 return false;
1593 }
1594 if (OtherObj->Type == Mine || OtherObj->Type == MineBoss || OtherObj->Type == TheMoon)
1595 return false;
1596 if (OtherObj->Type == PlayerDroneShield)
1597 {
1598 Commands->Apply_Damage(Other,99999.9f,"BlamoKiller",Hitter);
1599 return true;
1600 }
1601 if (OtherObj->Type != Asteroid)
1602 Commands->Apply_Damage(Hitter,1.0f,"none",Other);
1603 if (OtherObj->Type != PlayerShield && OtherObj->Type != PlayerSuper)
1604 Commands->Apply_Damage(Other,99999.9f,"BlamoKiller",Hitter);
1605 else
1606 {
1607 Commands->Send_Custom_Event(Other,Other,7043453,25,0.0f);
1608 if (Commands->Get_Health(Hitter))
1609 return false;
1610 }
1611 }
1612 else
1613 {
1614 if (OtherObj->Type == PlayerShield && Obj->Type == PlayerShield)
1615 {
1616 Vector3 Pos = Commands->Get_Position(Obj->Object);
1617 Vector3 OtherPos = Commands->Get_Position(OtherObj->Object);
1618 Pos.X -= OtherPos.X;
1619 Pos.Y -= OtherPos.Y;
1620 float TempRotation = atan2(Pos.Y,Pos.X) * 180 / PI;
1621 Pos = Commands->Get_Position(Obj->Object);
1622 Pos.X += cos(TempRotation*PI180)*0.025f;
1623 Pos.Y += sin(TempRotation*PI180)*0.025f;
1624 TempRotation = JmgUtility::MathClampDegrees(TempRotation-180.0f);
1625 OtherPos.X += cos(TempRotation*PI180)*0.025f;
1626 OtherPos.Y += sin(TempRotation*PI180)*0.025f;
1627 GameObject *Lockdown = Commands->Create_Object("Daves Arrow",Pos);
1628 Commands->Set_Facing(Lockdown,Commands->Get_Facing(Obj->Object));
1629 Commands->Attach_To_Object_Bone(Obj->Object,Lockdown,"origin");
1630 Commands->Attach_To_Object_Bone(Obj->Object,Lockdown,"origin");
1631 Commands->Destroy_Object(Lockdown);
1632 Lockdown = Commands->Create_Object("Daves Arrow",OtherPos);
1633 Commands->Set_Facing(Lockdown,Commands->Get_Facing(OtherObj->Object));
1634 Commands->Attach_To_Object_Bone(OtherObj->Object,Lockdown,"origin");
1635 Commands->Attach_To_Object_Bone(OtherObj->Object,Lockdown,"origin");
1636 Commands->Destroy_Object(Lockdown);
1637 Commands->Send_Custom_Event(Hitter,Hitter,7043453,2142,0.0f);
1638 Commands->Send_Custom_Event(Other,Other,7043453,2142,0.0f);
1639 return false;
1640 }
1641 if (OtherObj->Type == Mine || OtherObj->Type == MineBoss)
1642 {
1643 Commands->Create_Explosion("Explosion_Drone",Commands->Get_Position(OtherObj->Object),0);
1644 Commands->Destroy_Object(OtherObj->Object);
1645 if (Obj->Type == PlayerShield || Obj->Type == PlayerDroneShield)
1646 Commands->Send_Custom_Event(Hitter,Hitter,7043453,10,0.0f);
1647 }
1648 if (Obj->Type == Mine || Obj->Type == MineBoss)
1649 {
1650 Commands->Create_Explosion("Explosion_Drone",Commands->Get_Position(Obj->Object),0);
1651 Commands->Destroy_Object(Obj->Object);
1652 if (OtherObj->Type == PlayerShield || OtherObj->Type == PlayerDroneShield)
1653 Commands->Send_Custom_Event(Other,Other,7043453,10,0.0f);
1654 }
1655 if (OtherObj->Type != PlayerShield && OtherObj->Type != PlayerSuper && OtherObj->Type != PlayerDroneShield && OtherObj->Type != TheMoon && OtherObj->Type != CargoShip)
1656 SpecialApplyDamage(Other,99999.9f,"BlamoKiller",Hitter);
1657 else
1658 if (Obj->Type == NormalPlayerShip || Obj->Type == PlayerCloak || Obj->Type == PlayerShipJumpable || Obj->Type == PlayerShipDisrupter)
1659 Commands->Send_Custom_Event(Other,Other,7043453,33,0.0f);
1660 else
1661 Commands->Send_Custom_Event(Other,Other,7043453,5,0.0f);
1662 if (Obj->Type != PlayerShield && Obj->Type != PlayerSuper && Obj->Type != PlayerDroneShield && OtherObj->Type != TheMoon)
1663 SpecialApplyDamage(Hitter,99999.9f,"BlamoKiller",Other);
1664 else
1665 if (OtherObj->Type == NormalPlayerShip || OtherObj->Type == PlayerCloak || OtherObj->Type == PlayerShipJumpable || OtherObj->Type == PlayerShipDisrupter)
1666 Commands->Send_Custom_Event(Hitter,Hitter,7043453,33,0.0f);
1667 else
1668 Commands->Send_Custom_Event(Hitter,Hitter,7043453,5,0.0f);
1669 }
1670 return true;
1671 }
1672 return false;
1673 }
1674 bool PickupPowerup(AnObject *Obj,AnObject *OtherObj)
1675 {
1676 if (!Obj || !OtherObj || Obj->AllowReplaceTime || OtherObj->AllowReplaceTime)
1677 return true;
1678 ReferencerClass Hitter = Obj->Object;
1679 ReferencerClass Other = OtherObj->Object;
1680 if (JmgUtility::SimpleDistance(Commands->Get_Position(Hitter),Commands->Get_Position(Other)) <= Obj->Size+OtherObj->Size)
1681 {
1682 Commands->Apply_Damage(Hitter,99999.9f,"BlamoKiller",Other);
1683 return true;
1684 }
1685 return false;
1686 }
1687 void UpdateCollisions()
1688 {
1689 AnObject *Current = ObjectsList;
1690 while (Current)
1691 {
1692 if (Current->AllowReplaceTime)
1693 {
1694 if (Current->AllowReplaceTime < 30 && Current->AllowReplaceTime != -1)
1695 Current->AllowReplaceTime++;
1696 }
1697 Current = Current->next;
1698 }
1699CollisionCheckStart:
1700 Current = ObjectsList;
1701UpdateCollisions:
1702 while (Current)
1703 {
1704 if (!Current->AllowReplaceTime)
1705 {
1706 if (Current->Type == CargoShip || Current->Type == TheMoon || Current->Type == NormalPlayerShip || Current->Type == PlayerShield || Current->Type == PlayerCloak || Current->Type == PlayerSuper || Current->Type == PlayerShipJumpable || Current->Type == PlayerShipDisrupter)
1707 {
1708 AnObject *OtherObjs = ObjectsList;
1709 while (OtherObjs)
1710 {
1711 if (Current->Type == CargoShip && OtherObjs->Type == CargoShip && Current->parentId != OtherObjs->parentId)
1712 DoesCollide(Current,OtherObjs);
1713 else if (Current->Type == CargoShip && OtherObjs->Type == TheMoon)
1714 DoesCollide(Current,OtherObjs);
1715 else if (!OtherObjs->AllowReplaceTime && (OtherObjs->Type != PlayerDrone && OtherObjs->Type != PlayerDroneShield) || (Current->Type == CargoShip || Current->Type == TheMoon))
1716 if (Current != OtherObjs && OtherObjs->Type != TheMoon && OtherObjs->Type != CargoShip && OtherObjs->Type != CMTPowerup)
1717 if (DoesCollide(Current,OtherObjs))
1718 goto CollisionCheckStart;
1719 OtherObjs = OtherObjs->next;
1720 }
1721 }
1722 else if (Current->Type == PlayerDrone || Current->Type == PlayerDroneShield)
1723 {
1724 AnObject *OtherObjs = ObjectsList;
1725 while (OtherObjs)
1726 {
1727 if (!OtherObjs->AllowReplaceTime && (Current != OtherObjs && OtherObjs->Type != NormalPlayerShip && OtherObjs->Type != PlayerShipJumpable && OtherObjs->Type != PlayerShield && OtherObjs->Type != PlayerCloak && OtherObjs->Type != PlayerSuper && OtherObjs->Type != CMTPowerup && OtherObjs->Type != PlayerShipDisrupter))
1728 if (DoesCollide(Current,OtherObjs))
1729 {
1730 Current = Current->next;
1731 goto UpdateCollisions;
1732 }
1733 OtherObjs = OtherObjs->next;
1734 }
1735 }
1736 else if (Current->Type == UFO || Current->Type == UFOBoss)
1737 {
1738 AnObject *OtherObjs = ObjectsList;
1739 while (OtherObjs)
1740 {
1741 if (!OtherObjs->AllowReplaceTime && (OtherObjs->Type == Mine || OtherObjs->Type == MineBoss))
1742 if (DoesCollide(Current,OtherObjs))
1743 goto CollisionCheckStart;
1744 OtherObjs = OtherObjs->next;
1745 }
1746 }
1747 else if (Current->Type == CMTPowerup)
1748 {
1749 AnObject *OtherObjs = ObjectsList;
1750 while (OtherObjs)
1751 {
1752 if (!OtherObjs->AllowReplaceTime && (OtherObjs->Type == NormalPlayerShip || OtherObjs->Type == PlayerShield || OtherObjs->Type == PlayerCloak || OtherObjs->Type == PlayerSuper || OtherObjs->Type == PlayerShipJumpable || OtherObjs->Type == PlayerShipDisrupter))
1753 if (PickupPowerup(Current,OtherObjs))
1754 goto CollisionCheckStart;
1755 OtherObjs = OtherObjs->next;
1756 }
1757 }
1758 }
1759 Current = Current->next;
1760 }
1761 }
1762 float FindNearestCollidableObject(GameObject *Obj,const Vector3 &Position)
1763 {
1764 if (!ObjectsList)
1765 return 0.0f;
1766 float MinDist = 0;
1767 AnObject *Current = ObjectsList,*Closest = NULL;
1768 while (Current)
1769 {
1770 if (!Current->AllowReplaceTime && Obj != Current->Object && Current->Type != CMTPowerup && Current->Type != PlayerDrone && Current->Type != PlayerDroneShield)
1771 {
1772 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object))-Current->Size;
1773 if (!Closest)
1774 {
1775 Closest = Current;
1776 MinDist = Dist;
1777 }
1778 else if (Dist < MinDist)
1779 {
1780 Closest = Current;
1781 MinDist = Dist;
1782 }
1783 }
1784 Current = Current->next;
1785 }
1786 return MinDist;
1787 }
1788 int AllowShipSpawn(int PlayerNumber,Vector3 SpawnSpots[MaxGamePlayerCount])
1789 {
1790 float Distance[MaxGamePlayerCount];
1791 for (int x = 0;x < MaxGamePlayerCount;x++)
1792 Distance[x] = 9999999.0f;
1793 AnObject *Current = ObjectsList;
1794 while (Current)
1795 {
1796 if (!Current->AllowReplaceTime)
1797 {
1798 float Temp = JmgUtility::SimpleDistance(SpawnSpots[PlayerNumber],Commands->Get_Position(Current->Object));
1799 if (Current->Type == TheMoon && Temp < 2626.5625f)
1800 {
1801 Distance[PlayerNumber] = 0;
1802 break;
1803 }
1804 if (Current->Object && Temp < Distance[PlayerNumber])
1805 Distance[PlayerNumber] = Temp;
1806 }
1807 Current = Current->next;
1808 }
1809 if (Distance[PlayerNumber] >= 625)
1810 return PlayerNumber;
1811 for (int x = 0;x < MaxGamePlayerCount;x++)
1812 {
1813 Current = ObjectsList;
1814 if (PlayerNumber == x)
1815 continue;
1816 while (Current)
1817 {
1818 if (!Current->AllowReplaceTime)
1819 {
1820 float Temp = JmgUtility::SimpleDistance(SpawnSpots[x],Commands->Get_Position(Current->Object));
1821 if (Current->Type == TheMoon && Temp < 2626.5625f)
1822 {
1823 Distance[x] = 0;
1824 break;
1825 }
1826 if (Temp < Distance[x])
1827 Distance[x] = Temp;
1828 }
1829 Current = Current->next;
1830 }
1831 if (Distance[x] >= 625)
1832 return x;
1833 }
1834 return MaxGamePlayerCount;
1835 }
1836 int CountType(ObjectType Type)
1837 {
1838 int Count = 0;
1839 AnObject *Current = ObjectsList;
1840 while (Current)
1841 {
1842 if (Current->AllowReplaceTime <= 0 && Current->Type == Type)
1843 Count++;
1844 Current = Current->next;
1845 }
1846 return Count;
1847 }
1848 bool CheckIfLevelComplete()
1849 {
1850 AnObject *Current = ObjectsList;
1851 while (Current)
1852 {
1853 if (Current->AllowReplaceTime <= 0 && (Current->Type == Asteroid || Current->Type == UFOBoss || Current->Type == TheMoon || Current->Type == MineBoss))
1854 return false;
1855 Current = Current->next;
1856 }
1857 return true;
1858 }
1859 void ClearAllObjects()
1860 {
1861 AnObject *Current = ObjectsList,*Temp;
1862 ObjectsList = NULL;
1863 while (Current)
1864 {
1865 Temp = Current;
1866 if (!Current->AllowReplaceTime)
1867 Commands->Apply_Damage(Current->Object,99999.99f,"BlamoKiller",0);
1868 Current = Current->next;
1869 delete Temp;
1870 }
1871 if (ObjectsList)
1872 ClearAllObjects();
1873 }
1874 void GrantScoreToKiller(GameObject *killer,float Score,ObjectType Type,int Size = 0)
1875 {
1876 if (!killer || !Score)
1877 return;
1878 GameObject *Driver = Get_Vehicle_Driver(killer);
1879 if (!Commands->Is_A_Star(Driver) && !Commands->Is_A_Star(killer))
1880 {
1881 int PresetID = Commands->Get_Preset_ID(killer);
1882 if (PresetID == PLAYERDRONE_ID)
1883 {// Killer was a player's drone
1884 int ID = Commands->Get_ID(killer);
1885 Score *= 0.1f;
1886 for (int x = 0;x < MaxGamePlayerCount;x++)
1887 for (int y = 0;y < 2;y++)
1888 if (MiniGamePlayerControlSystem[x].Drones[y] == ID)
1889 {
1890 MiniGamePlayerControlSystem[x].DroneScore += Score;
1891 RenCometBustersScoreControl.Get_Current_Player_Score_Node(MiniGamePlayerControlSystem[x].PlayerID)->DroneKills++;
1892 killer = Commands->Find_Object(MiniGamePlayerControlSystem[x].GamePlayerID);
1893 x = MaxGamePlayerCount+1;
1894 break;
1895 }
1896 }
1897 else if (PresetID == CARGOSHIPTURRET_ID)
1898 {// Killer was a Cargo Ships Turret
1899 int ID = Commands->Get_ID(killer);
1900 for (int x = 0;x < MaxGamePlayerCount;x++)
1901 for (int y = 0;y < 6;y++)
1902 if (MiniGamePlayerControlSystem[x].CargoShipIDs[y] == ID)
1903 {
1904 Score *= 0.05f;
1905 MiniGamePlayerControlSystem[x].CargoScore += Score;
1906 RenCometBustersScoreControl.Get_Current_Player_Score_Node(MiniGamePlayerControlSystem[x].PlayerID)->CargoShipKills++;
1907 killer = Commands->Find_Object(MiniGamePlayerControlSystem[x].GamePlayerID);
1908 x = MaxGamePlayerCount+1;
1909 break;
1910 }
1911 }
1912 else if (PresetID == CARGOSHIP_ID)
1913 {// Killer was a Cargo Ship
1914 int ID = Commands->Get_ID(killer);
1915 for (int x = 0;x < MaxGamePlayerCount;x++)
1916 if (MiniGamePlayerControlSystem[x].CargoShipIDs[6] == ID)
1917 {
1918 Score *= 0.025f;
1919 MiniGamePlayerControlSystem[x].CargoScore += Score;
1920 RenCometBustersScoreControl.Get_Current_Player_Score_Node(MiniGamePlayerControlSystem[x].PlayerID)->CargoShipKills++;
1921 killer = Commands->Find_Object(MiniGamePlayerControlSystem[x].GamePlayerID);
1922 break;
1923 }
1924 }
1925 }
1926 for (int x = 0;x < MaxGamePlayerCount;x++)
1927 {
1928 GameObject *Player = Commands->Find_Object(MiniGamePlayerControlSystem[x].GamePlayerID);
1929 if (!Player)
1930 continue;
1931 if (Player == killer)
1932 {
1933 if (MiniGamePlayerControlSystem[x].DoublePointsTime)
1934 {
1935 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->DoublePointsPoints += (int)Score;
1936 Score *= 2;
1937 }
1938 MiniGamePlayerControlSystem[x].Score += Score;
1939 Commands->Give_Points(Player,Score,false);
1940AddKilledObjctToPlayersScoreListSwitch:
1941 switch (Type)
1942 {
1943 case NormalPlayerShip:
1944 case PlayerShield:
1945 case PlayerCloak:
1946 case PlayerSuper:
1947 case PlayerShipJumpable:
1948 case PlayerShipDisrupter:
1949 case PlayerShipJumping:
1950 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->OtherPlayers++;break;
1951 case UFO:case UFOBoss:
1952 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->UFO++;break;
1953 case Mine:case MineBoss:
1954 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->Mine++;break;
1955 case Asteroid:
1956 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->TotalComets++;
1957 switch (Size)
1958 {
1959 case 0: RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->CometSmall++;break;
1960 case 1: RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->CometMedium++;break;
1961 case 2: RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->CometLarge++;break;
1962 default: RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->CometHuge++;break;
1963 }break;
1964 case TheMoon:
1965 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->TheMoon++;break;
1966 case CargoShip:
1967 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->CargoShip++;break;
1968 case PlayerDrone: case PlayerDroneShield:
1969 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->DronesKilled++;break;
1970 case CMTPowerup:break;
1971 }
1972 return;
1973 }
1974 if (Player == Driver)
1975 {// shield or ram kill
1976 if (MiniGamePlayerControlSystem[x].DoublePointsTime)
1977 {
1978 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->DoublePointsPoints += (int)Score;
1979 Score *= 2;
1980 }
1981 Score *= 0.5f;
1982 MiniGamePlayerControlSystem[x].Score += Score;
1983 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->ObjectsRammed++;
1984 Commands->Give_Points(Player,Score,false);
1985 goto AddKilledObjctToPlayersScoreListSwitch;
1986 }
1987 }
1988 }
1989 AnObject *FindMineTarget(GameObject *obj,int *MinDistance)
1990 {
1991 Vector3 MyPos = Commands->Get_Position(obj);
1992 float NearestDistance = 9999999.9f;
1993 AnObject *Target = NULL;
1994 ObjectType TargetType = NormalPlayerShip;
1995 AnObject *Current = ObjectsList;
1996 while (Current)
1997 {
1998 if (!Current->AllowReplaceTime && Current->Object != obj && (Current->Type != PlayerCloak && Current->Type != Asteroid && Current->Type != TheMoon && Current->Type != CMTPowerup))
1999 {
2000 float TempDistance = JmgUtility::SimpleDistance(Commands->Get_Position(Current->Object),MyPos);
2001 if (TempDistance <= 22500)
2002 {
2003 if (!Target)
2004 {
2005 Target = Current;
2006 TargetType = Current->Type;
2007 NearestDistance = TempDistance;
2008 }
2009 else
2010 {
2011 int TempPriority = PrioritizeTargets[Current->Type];
2012 if (TempPriority > PrioritizeTargets[TargetType])
2013 {
2014 Target = Current;
2015 TargetType = Current->Type;
2016 NearestDistance = TempDistance;
2017 }
2018 else if (TempPriority == PrioritizeTargets[TargetType])
2019 {
2020 if ((Current->Type == Mine || Current->Type == MineBoss) && TempDistance > NearestDistance)
2021 {
2022 Target = Current;
2023 TargetType = Current->Type;
2024 NearestDistance = TempDistance;
2025 }
2026 else if ((Current->Type != Mine && Current->Type != MineBoss) && TempDistance < NearestDistance)
2027 {
2028 Target = Current;
2029 TargetType = Current->Type;
2030 NearestDistance = TempDistance;
2031 }
2032 }
2033 }
2034 }
2035 }
2036 Current = Current->next;
2037 }
2038 if (TargetType == Mine || TargetType == MineBoss)
2039 *MinDistance = Commands->Get_Random_Int(2,6);
2040 if (Target)
2041 return Target;
2042 return NULL;
2043 }
2044 void KillInRange(GameObject *Player,const Vector3 &Position,float MinRange,float MaxRange)
2045 {
2046KillInRangeCheckStart:
2047 AnObject *Current = ObjectsList;
2048 while (Current)
2049 {
2050 if (!Current->AllowReplaceTime && (Current->Type == Asteroid || Current->Type == UFO || Current->Type == UFOBoss || Current->Type == PlayerDrone || Current->Type == Mine || Current->Type == MineBoss || Current->Type == PlayerCloak || Current->Type == NormalPlayerShip || Current->Type == PlayerShipJumpable || Current->Type == PlayerShipDisrupter))
2051 {
2052 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object));
2053 if (Dist <= MaxRange && Dist >= MinRange)
2054 {
2055 if (_stricmp(Get_Skin(Current->Object),"Blamo"))
2056 {
2057 SpecialApplyDamage(Current->Object,1.0f,"None",Player);
2058 goto KillInRangeCheckStart;
2059 }
2060 }
2061 }
2062 Current = Current->next;
2063 }
2064 }
2065 GameObject *FindObjectInRange(GameObject *Obj,const Vector3 &Position,float Range)
2066 {
2067 float MinDist = 0;
2068 AnObject *Current = ObjectsList,*Closest = NULL;
2069 while (Current)
2070 {
2071 if (!Current->AllowReplaceTime && Obj != Current->Object)
2072 {
2073 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object))-Current->Size;
2074 if (!Closest)
2075 {
2076 Closest = Current;
2077 MinDist = Dist;
2078 }
2079 else if (MinDist > Dist)
2080 {
2081 Closest = Current;
2082 MinDist = Dist;
2083 }
2084 }
2085 Current = Current->next;
2086 }
2087 if (!Closest || Range < MinDist)
2088 return NULL;
2089 return Closest->Object;
2090 }
2091 int FindDroneAvoidObjectInRange(GameObject *Obj,Vector3 *Position,float Range,float *_MinDist)
2092 {
2093 if (!ObjectsList)
2094 return 0;
2095 int ReturnID = 0;
2096 float MinDist = 0;
2097 AnObject *Current = ObjectsList;
2098 while (Current)
2099 {
2100 int TempID = Current->ObjectID;
2101 ReferencerClass Target = Current->Object;
2102 if (Target && !Current->AllowReplaceTime && (Obj != Target && Current->Type != PlayerDrone && Current->Type != PlayerDroneShield && Current->Type != CMTPowerup && Current->Type != NormalPlayerShip && Current->Type != PlayerShield && Current->Type != PlayerCloak && Current->Type != PlayerSuper && Current->Type != PlayerShipJumpable && Current->Type != PlayerShipDisrupter))
2103 {
2104 float Dist = JmgUtility::SimpleDistance(*Position,Commands->Get_Position(Target))-Current->Size;
2105 if (!ReturnID)
2106 {
2107 ReturnID = TempID;
2108 MinDist = Dist;
2109 }
2110 else if (MinDist > Dist)
2111 {
2112 ReturnID = TempID;
2113 MinDist = Dist;
2114 }
2115 }
2116 Current = Current->next;
2117 }
2118 *_MinDist = MinDist;
2119 if (Range < MinDist)
2120 return 0;
2121 return ReturnID;
2122 }
2123 GameObject *CheckForDroneTarget(GameObject *Obj,const Vector3 &Position,float *TargetSize)
2124 {
2125 if (!ObjectsList)
2126 return NULL;
2127 float MinDist = 0;
2128 AnObject *Current = ObjectsList,*Closest = NULL;
2129 while (Current)
2130 {
2131 if (!Current->AllowReplaceTime && Obj != Current->Object && Current->Type != TheMoon && Current->Type != CMTPowerup && Current->Type != CargoShip && Current->Type != PlayerDrone && Current->Type != PlayerDroneShield && Current->Type != NormalPlayerShip && Current->Type != PlayerShield && Current->Type != PlayerCloak && Current->Type != PlayerSuper && Current->Type != PlayerShipJumpable && Current->Type != PlayerShipDisrupter)
2132 {
2133 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object))-Current->Size;
2134 if (!Closest)
2135 {
2136 Closest = Current;
2137 MinDist = Dist;
2138 }
2139 else if (MinDist > Dist)
2140 {
2141 Closest = Current;
2142 MinDist = Dist;
2143 }
2144 }
2145 Current = Current->next;
2146 }
2147 if (!Closest || 2500 < MinDist)
2148 return NULL;
2149 *TargetSize = Closest->RealSize;
2150 return Closest->Object;
2151 }
2152};
2153int RenCometBustersGameObjects::PrioritizeTargets[17] = {2,2,0,1,0,3,2,0,2,0,0,1,1,3,2,0,2};
2154
2155Vector3 Random_Map_Position()
2156{
2157 int Random = Commands->Get_Random_Int(0,2);
2158 return Vector3((!Random ? (Commands->Get_Random(0.0,1.0f) < 0.5 ? 1 : -1)*Commands->Get_Random(75.0f,80.0f) : Commands->Get_Random(-80.0f,80.0f)),(Random ? (Commands->Get_Random(0.0,1.0f) < 0.5 ? 1 : -1)*Commands->Get_Random(75.0f,80.0f) : Commands->Get_Random(-80.0f,80.0f)),0.5);
2159}
2160
2161class JMG_CMTB_Main_Game_Control : public ScriptImpClass {
2162 enum MusicType{MusicNone = 0,MusicGameOver = 1,MusicNormal = 2,MusicBoss = 3};
2163 int NextLevelDelay;
2164 int UFOSpawnTime;
2165 unsigned int BabySit;
2166 MusicType CurrentMusic;
2167 int LastPlayerCount;
2168 int MaxPlayerCount;
2169 int LastCometCount;
2170 Vector3 SpawnLocations[MaxGamePlayerCount];
2171 unsigned int PlayerSOSBeaconDealy;
2172 void Created(GameObject *obj);
2173 void Timer_Expired(GameObject *obj,int number);
2174 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2175 void Destroyed(GameObject *obj);
2176 void Create_Player_Ship(GameObject *obj,int PlayerNumber);
2177 void DisableGun(GameObject *obj);
2178 void FadeMusic(const char *music);
2179public:
2180 static int MoonID;
2181 static int MoonHolderID;
2182 static bool GameInProgress;
2183 static unsigned int CMTBLevel;
2184 static unsigned int PlayerSOSBeaconID;
2185 static unsigned int DroneSwarmCount;
2186 static bool EndGameSwitchEnabled;
2187 static float DifficultyMultiplier;
2188 static float DifficultyMultiplierMine;
2189 static float DifficultyMultiplierInv;
2190};
2191int JMG_CMTB_Main_Game_Control::MoonID = 0;
2192int JMG_CMTB_Main_Game_Control::MoonHolderID = 0;
2193bool JMG_CMTB_Main_Game_Control::GameInProgress = false;
2194unsigned int JMG_CMTB_Main_Game_Control::CMTBLevel = 0;
2195unsigned int JMG_CMTB_Main_Game_Control::PlayerSOSBeaconID = 0;
2196unsigned int JMG_CMTB_Main_Game_Control::DroneSwarmCount = 0;
2197bool JMG_CMTB_Main_Game_Control::EndGameSwitchEnabled = true;
2198float JMG_CMTB_Main_Game_Control::DifficultyMultiplier = 1.0f;
2199float JMG_CMTB_Main_Game_Control::DifficultyMultiplierMine = 1.0f;
2200float JMG_CMTB_Main_Game_Control::DifficultyMultiplierInv = 1.0f;
2201
2202class JMG_CMTB_UFO_Random_Fire_Control : public ScriptImpClass {
2203 void Created(GameObject *obj);
2204 void Timer_Expired(GameObject *obj,int number);
2205 void Killed(GameObject *obj, GameObject *damager);
2206 void Destroyed(GameObject *obj);
2207};
2208
2209class JMG_CMTB_Ship_Control_Script : public ScriptImpClass {
2210 bool prepingHyperjump;
2211 int EngineDisabled;
2212 Vector3 OldPos;
2213 int PortalInID;
2214 int PortalOutID;
2215 int Power;
2216 int LastBulletCount;
2217 int ForfeitLives;
2218 AnObject *MyObject;
2219 char Animation[32];
2220 float ShieldLightUp;
2221 bool OverPoweredWeapons;
2222 unsigned short ChangingWeapons;
2223 unsigned int RapidPowerRegen;
2224 unsigned int ExtraShotActive;
2225 bool RemoveExtraShot;
2226 void Created(GameObject *obj);
2227 void Timer_Expired(GameObject *obj,int number);
2228 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2229 void Damaged(GameObject *obj,GameObject *damager,float damage);
2230 void Killed(GameObject *obj, GameObject *damager);
2231 void Destroyed(GameObject *obj);
2232 void ShieldOff(GameObject *obj);
2233 void CloakOff(GameObject *obj);
2234 bool DrainPower(GameObject *obj,int Drain = 1);
2235 void ReturnToNormalState(GameObject *obj);
2236};
2237
2238class JMG_CMTB_Comet_Script : public ScriptImpClass {
2239 void Created(GameObject *obj);
2240 void Killed(GameObject *obj, GameObject *damager);
2241 void Destroyed(GameObject *obj);
2242};
2243
2244class JMG_CMTB_Zone_Realign_Enter : public ScriptImpClass {
2245 void Entered(GameObject *obj,GameObject *enter);
2246};
2247
2248class JMG_CMTB_Spectator_Object : public ScriptImpClass {
2249 int machineNumber;
2250 int RequestLifeDelay;
2251 void Created(GameObject *obj);
2252 void Timer_Expired(GameObject *obj,int number);
2253 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2254 void SpecialAbilitiesList(GameObject *player);
2255 void ResetCurrentAbility(GameObject *player);
2256};
2257
2258class JMG_CMTB_Arcade_Machine : public ScriptImpClass {
2259 void Created(GameObject *obj);
2260 void Poked(GameObject *obj,GameObject *poker);
2261};
2262
2263class JMG_CMTB_Fake_Player_Attach_Script : public ScriptImpClass {
2264 void Created(GameObject *obj);
2265 void Timer_Expired(GameObject *obj,int number);
2266 void Killed(GameObject *obj, GameObject *damager);
2267};
2268
2269class JMG_CMTB_Renegade_Code : public ScriptImpClass {
2270 void Created(GameObject *obj);
2271 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2272};
2273
2274class JMG_CMTB_Motion_Mine : public ScriptImpClass {
2275 AnObject *LastTargetObject;
2276 Vector3 lastTargetSpot;
2277 bool movingToLastSeenSpot;
2278 bool NewRandom;
2279 float Speed;
2280 int FollowObjectID;
2281 Vector3 LastPosition;
2282 int ArriveDistance;
2283 Vector3 TargetPos;
2284 unsigned int NewTarget;
2285 int StuckCount;
2286 void Created(GameObject *obj);
2287 void Timer_Expired(GameObject *obj,int number);
2288 void Killed(GameObject *obj, GameObject *damager);
2289 void Destroyed(GameObject *obj);
2290 float Clamp_Value(float Value,float Min,float Max);
2291};
2292
2293class JMG_CMTB_The_Moon_Script : public ScriptImpClass {
2294 bool SpawnPoints[16];
2295 float lastHealth;
2296 void Created(GameObject *obj);
2297 void Timer_Expired(GameObject *obj,int number);
2298 void Damaged(GameObject *obj,GameObject *damager,float damage);
2299 void Killed(GameObject *obj, GameObject *damager);
2300 void Destroyed(GameObject *obj);
2301 bool EnableSpawnPositions(GameObject *obj);
2302};
2303
2304class JMG_CMTB_Ship_Super_Weapon : public ScriptImpClass {
2305 float LastDistance;
2306 void Created(GameObject *obj);
2307 void Timer_Expired(GameObject *obj,int number);
2308};
2309
2310class JMG_CMTB_Powerup_Script : public ScriptImpClass {
2311 int TimeRemaining;
2312 void Created(GameObject *obj);
2313 void Timer_Expired(GameObject *obj,int number);
2314 void Killed(GameObject *obj, GameObject *damager);
2315 void Destroyed(GameObject *obj);
2316};
2317
2318class JMG_CMTB_Cargo_Ship_Script : public ScriptImpClass {
2319 int ShipCollideID[7];
2320 int AnimationControllerID;
2321 int Turrets[6];
2322 void Created(GameObject *obj);
2323 void Timer_Expired(GameObject *obj,int number);
2324 void Damaged(GameObject *obj,GameObject *damager,float damage);
2325 void Killed(GameObject *obj, GameObject *damager);
2326 void Destroyed(GameObject *obj);
2327 void CreateShipCollision(GameObject *obj,int index,const char *boneName,float size);
2328};
2329
2330class JMG_CMTB_Cargo_Ship_Turret : public ScriptImpClass {
2331 float MissAmount;
2332 bool PrimaryFire;
2333 int HuntingPlayer;
2334 float NearestDistance;
2335 int EnemyID;
2336 bool ReaimRequired;
2337 Vector3 LastPosition[3];
2338 int GiveUpTime;
2339 int FireWeapons;
2340 void Created(GameObject *obj);
2341 void Enemy_Seen(GameObject *obj,GameObject *seen);
2342 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2343 void Timer_Expired(GameObject *obj,int number);
2344 void Destroyed(GameObject *obj);
2345 float SafeDiv(float Number1,float Number2);
2346 void EndAttack(GameObject *obj);
2347 bool CheckIfInTargetableRange(GameObject *obj,const Vector3 &Pos);
2348};
2349
2350class JMG_CMTB_Player_Drone : public ScriptImpClass {
2351 enum AI_State{DroneIdle=0,DroneGuarding=1,DroneAvoiding=2,DroneAttacking=3,DroneReturning=4};
2352 int AIStatePriorities[5];
2353 bool ShieldOverride;
2354 AnObject *MyObject;
2355 AI_State MyState;
2356 AI_State LastState;
2357 Vector3 LastPosition;
2358 Vector3 TargetPos;
2359 int TargetID;
2360 int LastTargetID;
2361 int StuckCount;
2362 int NewTargetTime;
2363 int AvoidObjectID;
2364 int StateTimeOutTime;
2365 int SearchTimeDelay;
2366 int Power;
2367 float AvoidDegree;
2368 float AvoidDistance;
2369 bool PrimaryFire;
2370 bool LastPrimaryFire;
2371 float FollowAngle;
2372 int ExtremeStuckCount;
2373 float TargetSize;
2374 float CurrentSpeed;
2375 float ShieldLightUp;
2376 char myAnimation[32];
2377 void Created(GameObject *obj);
2378 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2379 void Timer_Expired(GameObject *obj,int number);
2380 void Killed(GameObject *obj, GameObject *damager);
2381 void Destroyed(GameObject *obj);
2382 float Clamp_Value(float Value,float Min,float Max);
2383 bool ChangeState(AI_State NewState);
2384 void Drone_Action_Complete(GameObject *obj);
2385 void AI_Update(GameObject *obj,bool Reset = false);
2386 void Drone_Attack(GameObject *obj);
2387 void Position_At_Player(GameObject *obj);
2388 void ShieldOff(GameObject *obj);
2389 void ShieldOn(GameObject *obj);
2390public:
2391 JMG_CMTB_Player_Drone()
2392 {
2393 MyObject = NULL;
2394 }
2395};
2396
2397class JMG_Create_Ship_On_Poke : public ScriptImpClass {
2398 int ShipID;
2399 int YourID;
2400 const char *armor;
2401 int BotID;
2402 int cango;
2403 int ViewingBoxID;
2404 const char *Your3DModel;
2405 void Created(GameObject *obj);
2406 void Poked(GameObject *obj,GameObject *poker);
2407 //void Custom(GameObject *obj,int message,int param,GameObject *sender);
2408 void Timer_Expired(GameObject *obj, int number);
2409};
2410
2411class JMG_Advanced_Bounce_Zone : public ScriptImpClass {
2412 void Entered(GameObject *obj,GameObject *enter);
2413};
2414
2415class JMG_Ship_Random_Hyperspace : public ScriptImpClass {
2416 const char *OriginalModel;
2417 int Has_Recived_Message;
2418 void Created(GameObject *obj);
2419 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2420 void Timer_Expired(GameObject *obj, int number);
2421};
2422
2423class JMG_Random_Music : public ScriptImpClass {
2424 int songnumber;
2425 void Created(GameObject *obj);
2426 void Timer_Expired(GameObject *obj, int number);
2427};
2428
2429
2430class JMG_Ship_Weapon : public ScriptImpClass {
2431 int newtotal;
2432 int Ammo;
2433 int cangainammo;
2434 int Currentammo;
2435 int ammocheck;
2436 void Created(GameObject *obj);
2437 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2438 void Timer_Expired(GameObject *obj, int number);
2439};
2440
2441class JMG_Return_Custom_When_Shot : public ScriptImpClass {
2442 void Damaged(GameObject *obj,GameObject *damager,float damage);
2443};
2444
2445class JMG_Cronie_AI : public ScriptImpClass {
2446 int target;
2447 void Created(GameObject *obj);
2448 //void Action_Complete(GameObject *obj,int action,ActionCompleteReason reason);
2449 void Enemy_Seen(GameObject *obj,GameObject *seen);
2450 void Timer_Expired(GameObject *obj,int number);
2451};
2452
2453class JMG_Kill_Self_And_Sender_On_Custom : public ScriptImpClass {
2454 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2455};
2456
2457class JMG_Ship_Shield_Control_Script : public ScriptImpClass {
2458 int ison;
2459 int ObjID;
2460 void Created(GameObject *obj);
2461 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2462 void Killed(GameObject *obj, GameObject *damager);
2463 //void Timer_Expired(GameObject *obj,int number);
2464};
2465
2466class JMG_Kill_Self_And_Sender_On_Custom_Ship : public ScriptImpClass {
2467 int canbekilled;
2468 void Created(GameObject *obj);
2469 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2470};
2471
2472class JMG_Ship_Shield_Script : public ScriptImpClass {
2473 const char *ShieldModel;
2474 int LastSenderID;
2475 int ReccentlyDamaged;
2476 void Created(GameObject *obj);
2477 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2478 void Timer_Expired(GameObject *obj,int number);
2479 void Damaged(GameObject *obj,GameObject *damager,float damage);
2480};
2481
2482class JMG_Renetbusters_Object : public ScriptImpClass {
2483 void Custom(GameObject *obj,int message,int param,GameObject *sender);
2484};
2485
2486class JMG_New_Ship_Weapon_Control_System : public ScriptImpClass {
2487 void Damaged(GameObject *obj,GameObject *damager,float damage);
2488};
2489
2490class JMG_Comet_Control_Script : public ScriptImpClass {
2491 void Created(GameObject *obj);
2492 void Timer_Expired(GameObject *obj,int number);
2493 void Killed(GameObject *obj, GameObject *damager);
2494};
2495
2496class JMG_Attach_And_Remove : public ScriptImpClass {
2497 void Created(GameObject *obj);
2498 void Timer_Expired(GameObject *obj,int number);
2499};
2500
2501
2502class JMG_User_Auto_Enter_Ship : public ScriptImpClass {
2503 void Created(GameObject *obj);
2504 void Timer_Expired(GameObject *obj, int number);
2505};
2506
2507class JMG_Apply_Damage_On_Timer : public ScriptImpClass {
2508 void Created(GameObject *obj);
2509 void Timer_Expired(GameObject *obj,int number);
2510};
2511
2512class JMG_CMTB_Vehicle_Face_Turret : public ScriptImpClass {
2513 int davesArrowId;
2514 void Created(GameObject *obj);
2515 void Timer_Expired(GameObject *obj, int number);
2516 void Destroyed(GameObject *obj);
2517};
2518
2519class JMG_CMTB_Poke_End_Map : public ScriptImpClass {
2520 int time;
2521 int startDelay;
2522 void Created(GameObject *obj);
2523 void Poked(GameObject *obj,GameObject *poker);
2524 void Timer_Expired(GameObject *obj, int number);
2525 void FlipSwitch(GameObject *obj,float frame);
2526};
2527
2528class JMG_CMTB_Poke_Change_Difficulty : public ScriptImpClass {
2529 int difficulty;
2530 void Created(GameObject *obj);
2531 void Poked(GameObject *obj,GameObject *poker);
2532};
2533
2534class JMG_CMTB_Cargo_Ship_Child_Script : public ScriptImpClass {
2535 void Killed(GameObject *obj, GameObject *damager);
2536};