14bool IsRenegadeServer =
true;
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
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};
31struct PerkSystemPerkTypeNode
35 PerkTypeCategories Category;
37 char Description[512];
38 unsigned int UnlockCost;
39 bool MultiplyUnlockCost;
43 void AddDescription(
const char *String)
45 if (strlen(String) <= 256)
46 sprintf(Description,
"%s",String);
50 sprintf(msg,
"msg Perk %d's Description is too long!",PerkID);
56PerkSystemPerkTypeNode PerkSystemPerkTypeNodeList[PERKCOUNT];
58class PerkSystemPerkTypeList
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;
69 int PerkTypeCategoryCounts[PERKCATEGORIES];
71 static int USEABLEPERKCOUNT;
72 PerkSystemPerkTypeList()
76 void AddAPerkType(
int PerkID,
const char *Name,
unsigned int UnlockCost,
bool MultiplyUnlockCost,
bool ResetOnFail,
bool RequiresOrder,PerkTypeCategories Category,
int MaxPerkUse,
const char *Description)
78 if (PerkSystemPerkTypeNodeList[PerkID].Category != INVALID)
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");
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;
100 void Finalize_Perks()
102 for (
int x = 0;x < PERKCOUNT;x++)
103 PerkSystemPerkTypeNodeList[x].CategoryPerkID = (PerkTypeCategoryCounts[PerkSystemPerkTypeNodeList[x].Category] = (PerkTypeCategoryCounts[PerkSystemPerkTypeNodeList[x].Category]+1));
106int PerkSystemPerkTypeList::USEABLEPERKCOUNT = 0;
109struct PlayerPerkDataNode
112 unsigned int PerkProgress;
120struct PlayerPerksDataNode
122 char PlayerName[128];
124 PlayerPerkDataNode PlayerPerkList[PERKCOUNT];
125 PlayerPerksDataNode *next;
126 PlayerPerksDataNode()
129 for (
int x = 0;x < PERKCOUNT;x++)
130 PlayerPerkList[x] = PlayerPerkDataNode();
134PlayerPerksDataNode *PlayerPerkListNodes[128] = {NULL};
136class PlayerPerksNodeControlSystem
140 PlayerPerksDataNode *PlayerPerksDataNodeList;
141 PlayerPerksDataNode *AddAPlayerPerkNode(PlayerPerksDataNode *Node,
const char *PlayerName,PlayerPerkDataNode PPerkList[])
143 sprintf(Node->PlayerName,
"%s",PlayerName);
144 for (
int x = 0;x < PERKCOUNT;x++)
146 Node->PlayerPerkList[x].HasPerk = PPerkList[x].HasPerk;
147 Node->PlayerPerkList[x].PerkProgress = PPerkList[x].PerkProgress;
149 Node->UnlockedPerks = 0;
153 PlayerPerksDataNode *GetPlayerPerkList(
const char *PlayerName)
155 if (!PlayerPerksDataNodeList)
157 PlayerPerkDataNode PPerkList[PERKCOUNT] = {PlayerPerkDataNode()};
158 PlayerPerksDataNodeList = AddAPlayerPerkNode(
new PlayerPerksDataNode,PlayerName,PPerkList);
159 return PlayerPerksDataNodeList;
161 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
164 if (!_stricmp(Current->PlayerName,PlayerName))
168 PlayerPerkDataNode PPerkList[PERKCOUNT] = {PlayerPerkDataNode()};
169 Current->next = AddAPlayerPerkNode(
new PlayerPerksDataNode,PlayerName,PPerkList);
170 return Current->next;
172 Current = Current->next;
176 void AddPlayerToPerkList(
const char *PlayerName,PlayerPerkDataNode PPerkList[])
178 if (!PlayerPerksDataNodeList)
180 PlayerPerksDataNodeList = AddAPlayerPerkNode(
new PlayerPerksDataNode,PlayerName,PPerkList);
183 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
186 if (!_stricmp(Current->PlayerName,PlayerName))
190 Current->next = AddAPlayerPerkNode(
new PlayerPerksDataNode,PlayerName,PPerkList);
193 Current = Current->next;
198 PlayerPerksNodeControlSystem()
201 for (
int x = 0;x < 128;x++)
202 PlayerPerkListNodes[x] = NULL;
203 PlayerPerksDataNodeList = NULL;
205 void FindPlayerPerkList(GameObject *obj,
int DisplayMessage)
207 if (!Commands->Is_A_Star(obj))
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);
214 bool IncreasePlayerPerkUnlockAmount(GameObject *obj,
int PerkID,
unsigned int IncreaseAmount)
216 if (!Commands->Is_A_Star(obj))
218 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
219 if (!PlayerPerkListNodes[PlayerID])
221 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].HasPerk)
223 if (PerkSystemPerkTypeNodeList[PerkID].RequiresOrder)
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;
230 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = IncreaseAmount;
232 else if (PerkSystemPerkTypeNodeList[PerkID].MultiplyUnlockCost)
233 if (!PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress)
234 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = IncreaseAmount;
236 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress *= IncreaseAmount;
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)
241 GameObject *Player = Get_GameObj(PlayerID);
245 if (PerkSystemPerkTypeNodeList[PerkID].Category != PerkUnusable)
247 sprintf(perkmsg,
"You have unlocked the %s perk!",PerkSystemPerkTypeNodeList[PerkID].Name);
248 JmgUtility::DisplayChatMessage(Player,230,230,0,perkmsg);
250 JmgUtility::DisplayChatMessage(Player,230,230,0,PerkSystemPerkTypeNodeList[PerkID].Description);
251 Create_2D_WAV_Sound_Player(Player,
"sysmsg.wav");
253 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = PerkSystemPerkTypeNodeList[PerkID].UnlockCost;
254 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].HasPerk =
true;
255 PlayerPerkListNodes[PlayerID]->UnlockedPerks++;
257 else if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress > PerkSystemPerkTypeNodeList[PerkID].UnlockCost && PerkSystemPerkTypeNodeList[PerkID].ResetOnFail)
259 PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress = 0;
264 void ResetPerkProgress(
int PerkID)
266 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
269 if (Current->PlayerPerkList[PerkID].HasPerk)
271 Current->UnlockedPerks--;
272 Current->PlayerPerkList[PerkID].HasPerk =
false;
274 Current->PlayerPerkList[PerkID].PerkProgress = 0;
275 Current = Current->next;
278 int GetPlayerPerkUnlockAmount(GameObject *obj,
int PerkID)
280 if (!Commands->Is_A_Star(obj))
282 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
283 if (!PlayerPerkListNodes[PlayerID])
285 return PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].PerkProgress;
287 int GetPlayerUnlockedPerkCountByCategory(GameObject *obj,
int Category)
289 if (!Commands->Is_A_Star(obj))
291 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
292 if (!PlayerPerkListNodes[PlayerID])
295 for (
int x = 0;x < PERKCOUNT;x++)
296 if (PerkSystemPerkTypeNodeList[x].Category == Category)
297 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[x].HasPerk)
301 bool CheckForAnyUnlockedPerks(GameObject *obj)
303 if (!Commands->Is_A_Star(obj))
305 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
306 if (!PlayerPerkListNodes[PlayerID])
308 for (
int x = 0;x < PERKCOUNT;x++)
309 if (PerkSystemPerkTypeNodeList[x].Category != INVALID)
310 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[x].HasPerk)
314 bool CheckIfPlayerHasPerkUnlocked(GameObject *obj,
int PerkID)
316 if (!Commands->Is_A_Star(obj))
318 int PlayerID = JmgUtility::JMG_Get_Player_ID(obj);
319 if (!PlayerPerkListNodes[PlayerID])
321 if (PlayerPerkListNodes[PlayerID]->PlayerPerkList[PerkID].HasPerk)
325 void ClearPerksList()
328 for (
int x = 0;x < 128;x++)
329 PlayerPerkListNodes[x] = NULL;
330 PlayerPerksDataNode *Current = PlayerPerksDataNodeList,*Temp = NULL;
334 Current = Current->next;
337 PlayerPerksDataNodeList = NULL;
343 Console_Input(
"msg PlayerPerksNodeControlSystem ERROR: Saved blocked!");
346 char filePath[256], tempPath[256];
347 sprintf(filePath,
"%sSave",Get_File_Path());
349 sprintf(tempPath,
"%sSave\\BetaRp2PlayerPerks.tmp",Get_File_Path());
350 FILE *SavePerks = fopen(tempPath,
"w");
353 PlayerPerksDataNode *Current = PlayerPerksDataNodeList;
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]));
362 fprintf(SavePerks,
"\n");
363 Current = Current->next;
366 sprintf(tempPath,
"%sSave\\BetaRp2PlayerPerks.tmp",Get_File_Path());
367 sprintf(filePath,
"%sSave\\BetaRp2PlayerPerks.Rp2",Get_File_Path());
369 rename(tempPath,filePath);
370 sprintf(tempPath,
"%sSave\\BetaRp2PlayerPerks.txt",Get_File_Path());
371 FILE *SavePerks2 = fopen(tempPath,
"w");
372 Current = PlayerPerksDataNodeList;
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;
387 sprintf(loadPath,
"%sSave\\BetaRp2PlayerPerks.Rp2",Get_File_Path());
388 FILE *LoadPerks = fopen(loadPath,
"r");
391 while (!feof(LoadPerks))
393 char PlayerName[256];
394 fgets(PlayerName,256,LoadPerks);
395 int Length = strlen(PlayerName);
398 Console_Input(
"msg PlayerPerksNodeControlSystem::LoadData ERROR: Length is less than 1");
399 char DecryptString[2048];
400 fgets(DecryptString,2048,LoadPerks);
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++)
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)
420 Current->PlayerPerkList[x].HasPerk =
true;
421 if (PerkSystemPerkTypeNodeList[x].PerkID)
422 Current->UnlockedPerks++;
424 if (PerkSystemPerkTypeNodeList[x].UnlockCost < Current->PlayerPerkList[x].PerkProgress)
425 Current->PlayerPerkList[x].PerkProgress = PerkSystemPerkTypeNodeList[x].UnlockCost;
434PerkSystemPerkTypeList PerkTypeSystem = PerkSystemPerkTypeList();
435PlayerPerksNodeControlSystem PlayerPerkSystemControl = PlayerPerksNodeControlSystem();
436bool CheckIfPlayerHasPerkUnlocked(GameObject *obj,
int PerkID)
438 if (PlayerPerkSystemControl.CheckIfPlayerHasPerkUnlocked(obj,PerkID))
442bool PerkSystemIncreasePlayerPerkUnlockAmount(GameObject *obj,
int PerkID,
unsigned int IncreaseAmount)
444 return PlayerPerkSystemControl.IncreasePlayerPerkUnlockAmount(obj,PerkID,IncreaseAmount);
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");
466 PerkTypeSystem.Finalize_Perks();
467 PerkSystemPerkTypeList::USEABLEPERKCOUNT = 0;
468 for (
int x = 0;x < PERKCOUNT;x++)
469 if (PerkSystemPerkTypeNodeList[x].PerkID)
470 PerkSystemPerkTypeList::USEABLEPERKCOUNT++;
474struct RenCometBustersScoreSystem
478 #define RCMTBHIGHSCORELISTCOUNT 61
479 struct CMTBHighScoresNode
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;
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)
547 sprintf(PlayerName,
"\0");
566 TeamHighestLevel = 0;
567 GrantedOtherPlayersLives = 0;
568 ReceivedOtherPlayersLives = 0;
570 NewLivesAcquired = 0;
574 ExtraLifePowerups = 0;
584 DoublePointsPowerups = 0;
585 DoublePointsPoints = 0;
588 ShipCloakedCount = 0;
590 ShieldRaisedCount = 0;
591 RanOutOfPowerCount = 0;
595 PickedUpDroneSwarm = 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();
614 CMTBHighScoresNode *CMTBHighScoresNodeList;
615 CMTBHighScoresNode *CMTBHighScoresNodeEmptyNode;
616 CMTBHighScoresNode *CMTBPlayerHighScoreNodes[128];
617 struct PlayersInGameNode
619 char PlayerName[256];
620 PlayersInGameNode *next;
622 PlayersInGameNode *PlayersInGameNodeList;
623 void AddPlayerToInGameList(CMTBHighScoresNode *Node)
627 if (!PlayersInGameNodeList)
629 PlayersInGameNodeList =
new PlayersInGameNode;
630 sprintf(PlayersInGameNodeList->PlayerName,
"%s",Node->PlayerName);
631 PlayersInGameNodeList->next = NULL;
632 Node->RoundsPlayed++;
635 PlayersInGameNode *Current = PlayersInGameNodeList;
638 if (!_stricmp(Current->PlayerName,Node->PlayerName))
642 Current->next =
new PlayersInGameNode;
643 sprintf(Current->next->PlayerName,
"%s",Node->PlayerName);
644 Current->next->next = NULL;
645 Node->RoundsPlayed++;
648 Current = Current->next;
652 void LoadHighestScores()
654 if (!CMTBHighScoresNodeList)
656 for (
int x = 0;x < RCMTBHIGHSCORELISTCOUNT;x++)
658 CMTBHighScoresNode *Current = CMTBHighScoresNodeList,*Best = NULL;
661 Best = CompareHighScoreNodes(Best,Current,x);
662 Current = Current->next;
664 sprintf(HighScoreHolderName[x],
"%s",Best->PlayerName);
668 CMTBHighScoresNode *FindOrAddPlayerMAHighScoreNode(
const char *PlayerName)
670 if (!CMTBHighScoresNodeList)
672 CMTBHighScoresNodeList =
new CMTBHighScoresNode();
673 sprintf(CMTBHighScoresNodeList->PlayerName,
"%s",PlayerName);
674 return CMTBHighScoresNodeList;
676 CMTBHighScoresNode *Current = CMTBHighScoresNodeList;
679 if (!_stricmp(Current->PlayerName,PlayerName))
683 Current->next =
new CMTBHighScoresNode();
684 Current = Current->next;
685 sprintf(Current->PlayerName,
"%s",PlayerName);
688 Current = Current->next;
694 RenCometBustersScoreSystem()
696 CMTBHighScoresNodeList = NULL;
697 CMTBHighScoresNodeEmptyNode = NULL;
698 for (
int x = 0;x < 128;x++)
699 CMTBPlayerHighScoreNodes[x] = NULL;
700 PlayersInGameNodeList = NULL;
703 char HighScoreHolderName[RCMTBHIGHSCORELISTCOUNT][128];
704 CMTBHighScoresNode *Get_Current_Player_Score_Node(
int PlayerID)
706 const char *PlayerName = Get_Player_Name_By_ID(PlayerID);
709 if (!CMTBHighScoresNodeEmptyNode)
710 CMTBHighScoresNodeEmptyNode =
new CMTBHighScoresNode();
711 return CMTBHighScoresNodeEmptyNode;
713 if (!CMTBPlayerHighScoreNodes[PlayerID])
715 CMTBPlayerHighScoreNodes[PlayerID] = FindOrAddPlayerMAHighScoreNode(PlayerName);
716 AddPlayerToInGameList(CMTBPlayerHighScoreNodes[PlayerID]);
718 else if (_stricmp(CMTBPlayerHighScoreNodes[PlayerID]->PlayerName,PlayerName))
720 CMTBPlayerHighScoreNodes[PlayerID] = FindOrAddPlayerMAHighScoreNode(PlayerName);
721 AddPlayerToInGameList(CMTBPlayerHighScoreNodes[PlayerID]);
723 return CMTBPlayerHighScoreNodes[PlayerID];
728 if (CMTBHighScoresNodeEmptyNode)
730 delete CMTBHighScoresNodeEmptyNode;
731 CMTBHighScoresNodeEmptyNode = NULL;
733 for (
int x = 0;x < 128;x++)
735 if (CMTBPlayerHighScoreNodes[x])
736 CMTBPlayerHighScoreNodes[x] = NULL;
738 if (CMTBHighScoresNodeList)
740 CMTBHighScoresNode *temp,*die;
741 temp = CMTBHighScoresNodeList;
748 CMTBHighScoresNodeList = NULL;
750 if (PlayersInGameNodeList)
752 PlayersInGameNode *temp,*die;
753 temp = PlayersInGameNodeList;
760 PlayersInGameNodeList = NULL;
769 char FileNameTmp[256];
771 sprintf(SavePath,
"%sSave\\", Get_File_Path());
772 sprintf(FileNameTmp,
"%sBetaCMBTPlayerRecords.tmp",SavePath);
773 SaveScores = fopen(FileNameTmp,
"w");
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;
781 SaveScores2 = fopen(FileName,
"w");
782 CMTBHighScoresNode *Current = CMTBHighScoresNodeList;
783 if (!SaveScores || !SaveScores2)
786 sprintf(debug,
"msg RenCometBustersScoreSystem ERROR: Could not open save files %sBetaCMBTPlayerRecords.tmp and %sCMBTPlayerRecords.txt for writting!",SavePath,SavePath);
787 Console_Input(debug);
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]));
802 fprintf(SaveScores,
"\n");
803 Current = Current->next;
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;
815 sprintf(FileNameTmp,
"%sBetaCMBTPlayerRecords.tmp",SavePath);
816 rename(FileNameTmp,FileName);
819 void LoadData(
int setDifficulty)
821 difficulty = setDifficulty;
823 char PlayerName[256];
827 sprintf(SavePath,
"%sSave\\", Get_File_Path());
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;
835 LoadScores = fopen(FileName,
"r");
838 while (!feof(LoadScores))
840 fgets(PlayerName,256,LoadScores);
841 int Length = strlen(PlayerName);
844 Console_Input(
"msg MutantAssaultHighScoreSystem::LoadData ERROR: Length is less than 1");
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);
858 CMTBHighScoresNode *CompareHighScoreNodes(CMTBHighScoresNode *High,CMTBHighScoresNode *Current,
int CompVal)
865 return (High->RoundsPlayed >= Current->RoundsPlayed ? High : Current);
867 return (High->Deaths >= Current->Deaths ? High : Current);
869 return (High->CometSmall >= Current->CometSmall ? High : Current);
871 return (High->CometMedium >= Current->CometMedium ? High : Current);
873 return (High->CometLarge >= Current->CometLarge ? High : Current);
875 return (High->CometHuge >= Current->CometHuge ? High : Current);
877 return (High->TheMoon >= Current->TheMoon ? High : Current);
879 return (High->UFO >= Current->UFO ? High : Current);
881 return (High->Mine >= Current->Mine ? High : Current);
883 return (High->OtherPlayers >= Current->OtherPlayers ? High : Current);
885 return (High->HighestScore >= Current->HighestScore ? High : Current);
887 return (High->TotalScore >= Current->TotalScore ? High : Current);
889 return (High->HighestLevel >= Current->HighestLevel ? High : Current);
891 return (High->TotalComets >= Current->TotalComets ? High : Current);
893 return (High->HEWPowerups >= Current->HEWPowerups ? High : Current);
895 return (High->HEWUsed >= Current->HEWUsed ? High : Current);
897 return (High->RoundsFired >= Current->RoundsFired ? High : Current);
899 return (High->TeamHighestLevel >= Current->TeamHighestLevel ? High : Current);
901 return (High->GrantedOtherPlayersLives >= Current->GrantedOtherPlayersLives ? High : Current);
903 return (High->ReceivedOtherPlayersLives >= Current->ReceivedOtherPlayersLives ? High : Current);
905 return (High->CargoShip >= Current->CargoShip ? High : Current);
907 return (High->NewLivesAcquired >= Current->NewLivesAcquired ? High : Current);
909 return (High->ObjectsRammed >= Current->ObjectsRammed ? High : Current);
911 return (High->SOSBeacons >= Current->SOSBeacons ? High : Current);
913 return (High->PowerPowerups >= Current->PowerPowerups ? High : Current);
915 return (High->ExtraLifePowerups >= Current->ExtraLifePowerups ? High : Current);
917 return (High->UsedSOSBeacons >= Current->UsedSOSBeacons ? High : Current);
919 return (High->PointPowerups >= Current->PointPowerups ? High : Current);
921 return (High->PowerupPoints >= Current->PowerupPoints ? High : Current);
923 return (High->PickedUpDrone >= Current->PickedUpDrone ? High : Current);
925 return (High->UsedDrones >= Current->UsedDrones ? High : Current);
927 return (High->DroneKills >= Current->DroneKills ? High : Current);
929 return (High->DronesKilled >= Current->DronesKilled ? High : Current);
931 return (High->DronePoints >= Current->DronePoints ? High : Current);
933 return (High->RegenPowerups >= Current->RegenPowerups ? High : Current);
935 return (High->DoublePointsPowerups >= Current->DoublePointsPowerups ? High : Current);
937 return (High->DoublePointsPoints >= Current->DoublePointsPoints ? High : Current);
939 return (High->DeerPowerups >= Current->DeerPowerups ? High : Current);
941 return (High->TimeCloaked >= Current->TimeCloaked ? High : Current);
943 return (High->ShipCloakedCount >= Current->ShipCloakedCount ? High : Current);
945 return (High->TimeShielded >= Current->TimeShielded ? High : Current);
947 return (High->ShieldRaisedCount >= Current->ShieldRaisedCount ? High : Current);
949 return (High->RanOutOfPowerCount >= Current->RanOutOfPowerCount ? High : Current);
951 return (High->CargoShipScore >= Current->CargoShipScore ? High : Current);
953 return (High->CargoShipKills >= Current->CargoShipKills ? High : Current);
955 return (High->JumpsUsed >= Current->JumpsUsed ? High : Current);
957 return (High->PickedUpDroneSwarm >= Current->PickedUpDroneSwarm ? High : Current);
959 return (High->UsedDronesSwarm >= Current->UsedDronesSwarm ? High : Current);
961 return (High->TimeDisrupted >= Current->TimeDisrupted ? High : Current);
963 return (High->UpgadedWeaponPowerups >= Current->UpgadedWeaponPowerups ? High : Current);
965 return (High->UpgadedWeaponTime >= Current->UpgadedWeaponTime ? High : Current);
967 return (High->HighestCleanScore >= Current->HighestCleanScore ? High : Current);
969 return (High->HighestCleanTeamScore >= Current->HighestCleanTeamScore ? High : Current);
971 return (High->HighestCleanLevel >= Current->HighestCleanLevel ? High : Current);
973 return (High->HighestCleanTeamLevel >= Current->HighestCleanTeamLevel ? High : Current);
975 return (High->HighestTeamScore >= Current->HighestTeamScore ? High : Current);
977 return (High->LevelsPlayedWithPerks >= Current->LevelsPlayedWithPerks ? High : Current);
979 return (High->LevelsPlayedWithOutPerks >= Current->LevelsPlayedWithOutPerks ? High : Current);
981 return (High->LevelsPlayedWithPerksAsATeam >= Current->LevelsPlayedWithPerksAsATeam ? High : Current);
983 return (High->LevelsPlayedWithOutPerksAsATeam >= Current->LevelsPlayedWithOutPerksAsATeam ? High : Current);
985 return (High->PlayTime >= Current->PlayTime ? High : Current);
989 bool ReturnHighScoreNodeValue(CMTBHighScoresNode *Node,
int CompVal)
996 return Node->RoundsPlayed ? true :
false;
998 return Node->Deaths ? true :
false;
1000 return Node->CometSmall ? true :
false;
1002 return Node->CometMedium ? true :
false;
1004 return Node->CometLarge ? true :
false;
1006 return Node->CometHuge ? true :
false;
1008 return Node->TheMoon ? true :
false;
1010 return Node->UFO ? true :
false;
1012 return Node->Mine ? true :
false;
1014 return Node->OtherPlayers ? true :
false;
1016 return Node->HighestScore ? true :
false;
1018 return Node->TotalScore ? true :
false;
1020 return Node->HighestLevel ? true :
false;
1022 return Node->TotalComets ? true :
false;
1024 return Node->HEWPowerups ? true :
false;
1026 return Node->HEWUsed ? true :
false;
1028 return Node->RoundsFired ? true :
false;
1030 return Node->TeamHighestLevel ? true :
false;
1032 return Node->GrantedOtherPlayersLives ? true :
false;
1034 return Node->ReceivedOtherPlayersLives ? true :
false;
1036 return Node->CargoShip ? true :
false;
1038 return Node->NewLivesAcquired ? true :
false;
1040 return Node->ObjectsRammed ? true :
false;
1042 return Node->SOSBeacons ? true :
false;
1044 return Node->PowerPowerups ? true :
false;
1046 return Node->ExtraLifePowerups ? true :
false;
1048 return Node->UsedSOSBeacons ? true :
false;
1050 return Node->PointPowerups ? true :
false;
1052 return Node->PowerupPoints ? true :
false;
1054 return Node->PickedUpDrone ? true :
false;
1056 return Node->UsedDrones ? true :
false;
1058 return Node->DroneKills ? true :
false;
1060 return Node->DronesKilled ? true :
false;
1062 return Node->DronePoints ? true :
false;
1064 return Node->RegenPowerups ? true :
false;
1066 return Node->DoublePointsPowerups ? true :
false;
1068 return Node->DoublePointsPoints ? true :
false;
1070 return Node->DeerPowerups ? true :
false;
1072 return Node->TimeCloaked ? true :
false;
1074 return Node->ShipCloakedCount ? true :
false;
1076 return Node->TimeShielded ? true :
false;
1078 return Node->ShieldRaisedCount ? true :
false;
1080 return Node->RanOutOfPowerCount ? true :
false;
1082 return Node->CargoShipScore ? true :
false;
1084 return Node->CargoShipKills ? true :
false;
1086 return Node->JumpsUsed ? true :
false;
1088 return Node->PickedUpDroneSwarm ? true :
false;
1090 return Node->UsedDronesSwarm ? true :
false;
1092 return Node->TimeDisrupted ? true :
false;
1094 return Node->UpgadedWeaponPowerups ? true :
false;
1096 return Node->UpgadedWeaponTime ? true :
false;
1098 return Node->HighestCleanScore ? true :
false;
1100 return Node->HighestCleanTeamScore ? true :
false;
1102 return Node->HighestCleanLevel ? true :
false;
1104 return Node->HighestCleanTeamLevel ? true :
false;
1106 return Node->HighestTeamScore ? true :
false;
1108 return Node->LevelsPlayedWithPerks ? true :
false;
1110 return Node->LevelsPlayedWithOutPerks ? true :
false;
1112 return Node->LevelsPlayedWithPerksAsATeam ? true :
false;
1114 return Node->LevelsPlayedWithOutPerksAsATeam ? true :
false;
1116 return Node->PlayTime ? true :
false;
1120 char *ReturnScore(CMTBHighScoresNode *High,
int CompVal)
1122 static char RetChar[200];
1128 sprintf(RetChar,
"Server Record: %s has played %lu rounds of Renegade Comet Busters.",High->PlayerName,High->RoundsPlayed);
return RetChar;
1130 sprintf(RetChar,
"Server Record: %s has lost %lu ships playing Renegade Comet Busters.",High->PlayerName,High->Deaths);
return RetChar;
1132 sprintf(RetChar,
"Server Record: %s has destroyed %lu small comets.",High->PlayerName,High->CometSmall);
return RetChar;
1134 sprintf(RetChar,
"Server Record: %s has destroyed %lu medium comets.",High->PlayerName,High->CometMedium);
return RetChar;
1136 sprintf(RetChar,
"Server Record: %s has destroyed %lu large comets.",High->PlayerName,High->CometLarge);
return RetChar;
1138 sprintf(RetChar,
"Server Record: %s has destroyed %lu huge comets.",High->PlayerName,High->CometHuge);
return RetChar;
1140 sprintf(RetChar,
"Server Record: %s has destroyed the moon %lu times.",High->PlayerName,High->TheMoon);
return RetChar;
1142 sprintf(RetChar,
"Server Record: %s has destroyed %lu UFOs.",High->PlayerName,High->UFO);
return RetChar;
1144 sprintf(RetChar,
"Server Record: %s has destroyed %lu Mines.",High->PlayerName,High->Mine);
return RetChar;
1146 sprintf(RetChar,
"Server Record: %s has killed %lu other players.",High->PlayerName,High->OtherPlayers);
return RetChar;
1148 sprintf(RetChar,
"Server Record: %s has scored %lu points playing Renegade Comet Busters in a single round.",High->PlayerName,High->HighestScore);
return RetChar;
1150 sprintf(RetChar,
"Server Record: %s has scored a total of %lu points playing Renegade Comet Busters.",High->PlayerName,High->TotalScore);
return RetChar;
1152 sprintf(RetChar,
"Server Record: %s has made it to level %lu in Renegade Comet Busters.",High->PlayerName,High->HighestLevel);
return RetChar;
1154 sprintf(RetChar,
"Server Record: %s has destroyed %lu comets total.",High->PlayerName,High->TotalComets);
return RetChar;
1156 sprintf(RetChar,
"Server Record: %s has acquired %lu High Yield Warhead powerups.",High->PlayerName,High->HEWPowerups);
return RetChar;
1158 sprintf(RetChar,
"Server Record: %s has used %lu High Yield Warheads.",High->PlayerName,High->HEWUsed);
return RetChar;
1160 sprintf(RetChar,
"Server Record: %s has fired a total of %lu rounds.",High->PlayerName,High->RoundsFired);
return RetChar;
1162 sprintf(RetChar,
"Server Record: %s has made it to level %lu through teamwork.",High->PlayerName,High->TeamHighestLevel);
return RetChar;
1164 sprintf(RetChar,
"Server Record: %s has given %lu lives to other players.",High->PlayerName,High->GrantedOtherPlayersLives);
return RetChar;
1166 sprintf(RetChar,
"Server Record: %s has received %lu lives from other players.",High->PlayerName,High->ReceivedOtherPlayersLives);
return RetChar;
1168 sprintf(RetChar,
"Server Record: %s has destroyed %lu cargo ships.",High->PlayerName,High->CargoShip);
return RetChar;
1170 sprintf(RetChar,
"Server Record: %s has acquired %lu extra lives.",High->PlayerName,High->NewLivesAcquired);
return RetChar;
1172 sprintf(RetChar,
"Server Record: %s has rammed %lu objects.",High->PlayerName,High->ObjectsRammed);
return RetChar;
1174 sprintf(RetChar,
"Server Record: %s has acquired %lu SOS Beacon powerups.",High->PlayerName,High->SOSBeacons);
return RetChar;
1176 sprintf(RetChar,
"Server Record: %s has acquired %lu power cell powerups.",High->PlayerName,High->PowerPowerups);
return RetChar;
1178 sprintf(RetChar,
"Server Record: %s has acquired %lu extra life powerups.",High->PlayerName,High->ExtraLifePowerups);
return RetChar;
1180 sprintf(RetChar,
"Server Record: %s has deployed %lu SOS Beacons.",High->PlayerName,High->UsedSOSBeacons);
return RetChar;
1182 sprintf(RetChar,
"Server Record: %s has acquired %lu points powerups.",High->PlayerName,High->PointPowerups);
return RetChar;
1184 sprintf(RetChar,
"Server Record: %s has %lu points from powerups.",High->PlayerName,High->PowerupPoints);
return RetChar;
1186 sprintf(RetChar,
"Server Record: %s has acquired %lu Drones.",High->PlayerName,High->PickedUpDrone);
return RetChar;
1188 sprintf(RetChar,
"Server Record: %s has launched %lu Drones.",High->PlayerName,High->UsedDrones);
return RetChar;
1190 sprintf(RetChar,
"Server Record: %s has destroyed %lu objects with Drones.",High->PlayerName,High->DroneKills);
return RetChar;
1192 sprintf(RetChar,
"Server Record: %s has destroyed %lu Drones.",High->PlayerName,High->DronesKilled);
return RetChar;
1194 sprintf(RetChar,
"Server Record: %s has scored %lu points with Drones.",High->PlayerName,High->DronePoints);
return RetChar;
1196 sprintf(RetChar,
"Server Record: %s has acquired %lu power regen powerups.",High->PlayerName,High->RegenPowerups);
return RetChar;
1198 sprintf(RetChar,
"Server Record: %s has acquired %lu double points powerups.",High->PlayerName,High->DoublePointsPowerups);
return RetChar;
1200 sprintf(RetChar,
"Server Record: %s has scored %lu points from double points powerups.",High->PlayerName,High->DoublePointsPoints);
return RetChar;
1202 sprintf(RetChar,
"Server Record: %s has acquired %lu hyperspace recharges.",High->PlayerName,High->DeerPowerups);
return RetChar;
1204 sprintf(RetChar,
"Server Record: %s has spent %.0lf minutes cloaked.",High->PlayerName,High->TimeCloaked/60.0f);
return RetChar;
1206 sprintf(RetChar,
"Server Record: %s has cloaked %lu times.",High->PlayerName,High->ShipCloakedCount);
return RetChar;
1208 sprintf(RetChar,
"Server Record: %s has spent %.0lf minutes with shields up.",High->PlayerName,High->TimeShielded/60.0f);
return RetChar;
1210 sprintf(RetChar,
"Server Record: %s has raised their shield %lu times.",High->PlayerName,High->ShieldRaisedCount);
return RetChar;
1212 sprintf(RetChar,
"Server Record: %s has ran out of power %lu times.",High->PlayerName,High->RanOutOfPowerCount);
return RetChar;
1214 sprintf(RetChar,
"Server Record: %s has scored %lu points by calling in Galatic Cargo Ships.",High->PlayerName,High->CargoShipScore);
return RetChar;
1216 sprintf(RetChar,
"Server Record: %s has destroyed %lu objects with Galatic Cargo Ships.",High->PlayerName,High->CargoShipKills);
return RetChar;
1218 sprintf(RetChar,
"Server Record: %s jumped out of danger %lu times.",High->PlayerName,High->JumpsUsed);
return RetChar;
1220 sprintf(RetChar,
"Server Record: %s has acquired %lu Drones Swarm Transmission Codes.",High->PlayerName,High->PickedUpDroneSwarm);
return RetChar;
1222 sprintf(RetChar,
"Server Record: %s has used %lu Drones Swarm Transmission Codes.",High->PlayerName,High->UsedDronesSwarm);
return RetChar;
1224 sprintf(RetChar,
"Server Record: %s has used the disrupter for %.0lf minutes.",High->PlayerName,High->TimeDisrupted/60.0f);
return RetChar;
1226 sprintf(RetChar,
"Server Record: %s has used the disrupter for %lu minutes.",High->PlayerName,High->UpgadedWeaponPowerups);
return RetChar;
1228 sprintf(RetChar,
"Server Record: %s has acquired %lu weapon upgrade powerups.",High->PlayerName,High->UpgadedWeaponPowerups);
return RetChar;
1230 sprintf(RetChar,
"Server Record: %s has gained a total score of %lu without any special abilities.",High->PlayerName,High->HighestCleanScore);
return RetChar;
1232 sprintf(RetChar,
"Server Record: %s has acquired a team score of %lu without any special abilities.",High->PlayerName,High->HighestCleanTeamScore);
return RetChar;
1234 sprintf(RetChar,
"Server Record: %s has made it to level %lu without any special abilities.",High->PlayerName,High->HighestCleanLevel);
return RetChar;
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;
1238 sprintf(RetChar,
"Server Record: %s has acquired a team score of %lu.",High->PlayerName,High->HighestTeamScore);
return RetChar;
1240 sprintf(RetChar,
"Server Record: %s has played %lu levels with special abilities.",High->PlayerName,High->LevelsPlayedWithPerks);
return RetChar;
1242 sprintf(RetChar,
"Server Record: %s has played %lu levels without special abilities.",High->PlayerName,High->LevelsPlayedWithOutPerks);
return RetChar;
1244 sprintf(RetChar,
"Server Record: %s has played %lu levels with a team using perks.",High->PlayerName,High->LevelsPlayedWithPerksAsATeam);
return RetChar;
1246 sprintf(RetChar,
"Server Record: %s has played %lu levels with a team not using perks.",High->PlayerName,High->LevelsPlayedWithOutPerksAsATeam);
return RetChar;
1248 sprintf(RetChar,
"Server Record: %s has played Renegade Comet Busters for %.0lf minutes on this server.",High->PlayerName,High->PlayTime/60.0f);
1253 void StateHighScore()
1256 int LastHighScoreList = 1;
1257 int Random = Commands->Get_Random_Int(0,RCMTBHIGHSCORELISTCOUNT+1);
1258MAStartOfHighScoreSelectProcess:
1259 if (maxRetry > 10000)
1261 CMTBHighScoresNode *Current = CMTBHighScoresNodeList,*Best = NULL;
1264 Best = CompareHighScoreNodes(Best,Current,Random);
1265 Current = Current->next;
1267 if (!ReturnHighScoreNodeValue(Best,Random))
1269 if (LastHighScoreList <= 5)
1271 LastHighScoreList++;
1272 if (Random+1 < RCMTBHIGHSCORELISTCOUNT)
1279 LastHighScoreList = 0;
1283 goto MAStartOfHighScoreSelectProcess;
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++)
1290 GameObject *Player = Get_GameObj(x);
1292 JmgUtility::DisplayChatMessage(Player,6,145,148,DisplayMessage);
1297RenCometBustersScoreSystem RenCometBustersScoreControl = RenCometBustersScoreSystem();
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};
1302 ReferencerClass obj;
1307 TypeObject(GameObject *_obj,
float _SquaredSize,
float _RealSize,ObjectType _Type)
1310 Size = _SquaredSize;
1311 RealSize = _RealSize;
1315 TypeObject(GameObject *obj,
float Size,
float RealSize,ObjectType Type,
int parentId)
1319 this->RealSize = RealSize;
1321 this->parentId = parentId;
1327 ReferencerClass Object;
1333 int AllowReplaceTime;
1334 struct AnObject *next;
1335 AnObject(GameObject *obj,
float Size,
float RealSize,ObjectType Type,
int parentId)
1337 this->AllowReplaceTime = -1;
1339 this->ObjectID = Commands->Get_ID(obj);
1341 this->RealSize = RealSize;
1343 this->AllowReplaceTime = 0;
1344 this->parentId = parentId;
1349struct RenCometBustersPlayerNode
1353 ReferencerClass PlayerShip;
1354 ReferencerClass ReplacementShip;
1355 ReferencerClass SpectatorObject;
1358 char PlayerModel[32];
1360 Vector3 DeathLocation;
1361 Vector3 OriginalLocation;
1363 char OriginalSkin[128];
1364 char OriginalArmor[128];
1368 float LastNewLifeScore;
1369 unsigned short NotInGameTime;
1373 bool DroneSwarmPowerup;
1375 int CargoWarnedCount;
1376 int CargoTotalWarnedCount;
1377 int CargoWarnDecreaseDelay;
1378 int DoublePointsTime;
1379 int CargoShipIDs[7];
1381 int HyperspaceDriveCharge;
1384 char PlayerName[128];
1385 int kickoutOfSpecTime;
1387 Vector3 specCreateSpot;
1388 AnObject *ShipObject;
1389 RenCometBustersPlayerNode()
1394 ReplacementShip = NULL;
1395 SpectatorObject = NULL;
1399 DeathLocation = Vector3(0.0f,0.0f,0.0f);
1400 OriginalLocation = Vector3(0.0f,0.0f,0.0f);
1405 LastNewLifeScore = 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;
1416 HyperspaceDriveCharge = 0;
1418 SecondSpace =
false;
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;
1428 specCreateSpot = Vector3();
1432struct RenCometBustersPlayerNode MiniGamePlayerControlSystem[MaxGamePlayerCount] = {RenCometBustersPlayerNode()};
1434class RenCometBustersGameObjects
1437 static int PrioritizeTargets[17];
1439 struct AnObject *ObjectsList;
1440 RenCometBustersGameObjects()
1444 ~RenCometBustersGameObjects()
1448 AnObject *temp,*die;
1450 while (temp != NULL)
1459 RenCometBustersGameObjects &operator += (TypeObject obj)
1463 AnObject *Current = ObjectsList;
1466 ObjectsList =
new AnObject(obj.obj,obj.Size,obj.RealSize,obj.Type,obj.parentId);
1471 if (Current->AllowReplaceTime == 30)
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;
1483 if (!Current->AllowReplaceTime && Current->Object == obj.obj)
1485 Console_Input(
"msg already in list!");
1490 Current->next =
new AnObject(obj.obj,obj.Size,obj.RealSize,obj.Type,obj.parentId);
1493 Current = Current->next;
1497 RenCometBustersGameObjects &operator -= (GameObject *
object)
1499 if (!ObjectsList || !
object)
1501 AnObject *Current = ObjectsList;
1504 if (Current->Object ==
object)
1506 Current->AllowReplaceTime = 1;
1508 Current = Current->next;
1512 AnObject *FindObject(GameObject *
object)
1514 if (!ObjectsList || !
object)
1516 AnObject *Current = ObjectsList;
1519 if (Current->Object ==
object)
1521 Current = Current->next;
1525 AnObject *FindObjectByID(
int objectID)
1527 if (!ObjectsList || !objectID)
1529 AnObject *Current = ObjectsList;
1532 if (Current->ObjectID == objectID)
1534 Current = Current->next;
1538 void SpecialApplyDamage(GameObject *obj,
float damage,
const char *warhead,GameObject *damager)
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);
1546 Commands->Set_Player_Type(driver,originalDriverTeam);
1548 bool DoesCollide(AnObject *Obj,AnObject *OtherObj)
1550 if (!Obj || !OtherObj || Obj->AllowReplaceTime || OtherObj->AllowReplaceTime)
1552 ReferencerClass Hitter = Obj->Object;
1553 ReferencerClass Other = OtherObj->Object;
1554 if (Obj->Type == PlayerDroneShield && OtherObj->Type == PlayerDroneShield)
1556 if (OtherObj->Type == PlayerShipJumping || Obj->Type == PlayerShipJumping)
1558 if (Obj->Type == CargoShip && OtherObj->Type == TheMoon)
1560 if (JmgUtility::SimpleDistance(Commands->Get_Position(Hitter),Commands->Get_Position(Other)) <= Obj->Size+OtherObj->Size-200.0f)
1562 Commands->Apply_Damage(Hitter,99999.9f,
"BlamoKiller",Other);
1567 if (JmgUtility::SimpleDistance(Commands->Get_Position(Hitter),Commands->Get_Position(Other)) <= Obj->Size+OtherObj->Size)
1569 if (Obj->Type == CargoShip && OtherObj->Type == CargoShip && Obj->parentId != OtherObj->parentId)
1571 Commands->Apply_Damage(Hitter,99999.9f,
"BlamoKiller",Other);
1572 Commands->Apply_Damage(Other,99999.9f,
"BlamoKiller",Hitter);
1575 if (Obj->Type == TheMoon && OtherObj->Type == CargoShip)
1577 if (OtherObj->Type == PlayerShipJumpable || Obj->Type == PlayerShipJumpable)
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);
1587 if (Obj->Type == TheMoon || Obj->Type == CargoShip)
1589 if (OtherObj->Type == PlayerShipJumpable)
1591 Commands->Send_Custom_Event(Obj->Object,OtherObj->Object,77454831,0,0);
1594 if (OtherObj->Type == Mine || OtherObj->Type == MineBoss || OtherObj->Type == TheMoon)
1596 if (OtherObj->Type == PlayerDroneShield)
1598 Commands->Apply_Damage(Other,99999.9f,
"BlamoKiller",Hitter);
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);
1607 Commands->Send_Custom_Event(Other,Other,7043453,25,0.0f);
1608 if (Commands->Get_Health(Hitter))
1614 if (OtherObj->Type == PlayerShield && Obj->Type == PlayerShield)
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);
1641 if (OtherObj->Type == Mine || OtherObj->Type == MineBoss)
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);
1648 if (Obj->Type == Mine || Obj->Type == MineBoss)
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);
1655 if (OtherObj->Type != PlayerShield && OtherObj->Type != PlayerSuper && OtherObj->Type != PlayerDroneShield && OtherObj->Type != TheMoon && OtherObj->Type != CargoShip)
1656 SpecialApplyDamage(Other,99999.9f,
"BlamoKiller",Hitter);
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);
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);
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);
1668 Commands->Send_Custom_Event(Hitter,Hitter,7043453,5,0.0f);
1674 bool PickupPowerup(AnObject *Obj,AnObject *OtherObj)
1676 if (!Obj || !OtherObj || Obj->AllowReplaceTime || OtherObj->AllowReplaceTime)
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)
1682 Commands->Apply_Damage(Hitter,99999.9f,
"BlamoKiller",Other);
1687 void UpdateCollisions()
1689 AnObject *Current = ObjectsList;
1692 if (Current->AllowReplaceTime)
1694 if (Current->AllowReplaceTime < 30 && Current->AllowReplaceTime != -1)
1695 Current->AllowReplaceTime++;
1697 Current = Current->next;
1700 Current = ObjectsList;
1704 if (!Current->AllowReplaceTime)
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)
1708 AnObject *OtherObjs = ObjectsList;
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;
1722 else if (Current->Type == PlayerDrone || Current->Type == PlayerDroneShield)
1724 AnObject *OtherObjs = ObjectsList;
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))
1730 Current = Current->next;
1731 goto UpdateCollisions;
1733 OtherObjs = OtherObjs->next;
1736 else if (Current->Type == UFO || Current->Type == UFOBoss)
1738 AnObject *OtherObjs = ObjectsList;
1741 if (!OtherObjs->AllowReplaceTime && (OtherObjs->Type == Mine || OtherObjs->Type == MineBoss))
1742 if (DoesCollide(Current,OtherObjs))
1743 goto CollisionCheckStart;
1744 OtherObjs = OtherObjs->next;
1747 else if (Current->Type == CMTPowerup)
1749 AnObject *OtherObjs = ObjectsList;
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;
1759 Current = Current->next;
1762 float FindNearestCollidableObject(GameObject *Obj,
const Vector3 &Position)
1767 AnObject *Current = ObjectsList,*Closest = NULL;
1770 if (!Current->AllowReplaceTime && Obj != Current->Object && Current->Type != CMTPowerup && Current->Type != PlayerDrone && Current->Type != PlayerDroneShield)
1772 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object))-Current->Size;
1778 else if (Dist < MinDist)
1784 Current = Current->next;
1788 int AllowShipSpawn(
int PlayerNumber,Vector3 SpawnSpots[MaxGamePlayerCount])
1790 float Distance[MaxGamePlayerCount];
1791 for (
int x = 0;x < MaxGamePlayerCount;x++)
1792 Distance[x] = 9999999.0f;
1793 AnObject *Current = ObjectsList;
1796 if (!Current->AllowReplaceTime)
1798 float Temp = JmgUtility::SimpleDistance(SpawnSpots[PlayerNumber],Commands->Get_Position(Current->Object));
1799 if (Current->Type == TheMoon && Temp < 2626.5625f)
1801 Distance[PlayerNumber] = 0;
1804 if (Current->Object && Temp < Distance[PlayerNumber])
1805 Distance[PlayerNumber] = Temp;
1807 Current = Current->next;
1809 if (Distance[PlayerNumber] >= 625)
1810 return PlayerNumber;
1811 for (
int x = 0;x < MaxGamePlayerCount;x++)
1813 Current = ObjectsList;
1814 if (PlayerNumber == x)
1818 if (!Current->AllowReplaceTime)
1820 float Temp = JmgUtility::SimpleDistance(SpawnSpots[x],Commands->Get_Position(Current->Object));
1821 if (Current->Type == TheMoon && Temp < 2626.5625f)
1826 if (Temp < Distance[x])
1829 Current = Current->next;
1831 if (Distance[x] >= 625)
1834 return MaxGamePlayerCount;
1836 int CountType(ObjectType Type)
1839 AnObject *Current = ObjectsList;
1842 if (Current->AllowReplaceTime <= 0 && Current->Type == Type)
1844 Current = Current->next;
1848 bool CheckIfLevelComplete()
1850 AnObject *Current = ObjectsList;
1853 if (Current->AllowReplaceTime <= 0 && (Current->Type == Asteroid || Current->Type == UFOBoss || Current->Type == TheMoon || Current->Type == MineBoss))
1855 Current = Current->next;
1859 void ClearAllObjects()
1861 AnObject *Current = ObjectsList,*Temp;
1866 if (!Current->AllowReplaceTime)
1867 Commands->Apply_Damage(Current->Object,99999.99f,
"BlamoKiller",0);
1868 Current = Current->next;
1874 void GrantScoreToKiller(GameObject *killer,
float Score,ObjectType Type,
int Size = 0)
1876 if (!killer || !Score)
1878 GameObject *Driver = Get_Vehicle_Driver(killer);
1879 if (!Commands->Is_A_Star(Driver) && !Commands->Is_A_Star(killer))
1881 int PresetID = Commands->Get_Preset_ID(killer);
1882 if (PresetID == PLAYERDRONE_ID)
1884 int ID = Commands->Get_ID(killer);
1886 for (
int x = 0;x < MaxGamePlayerCount;x++)
1887 for (
int y = 0;y < 2;y++)
1888 if (MiniGamePlayerControlSystem[x].Drones[y] == ID)
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;
1897 else if (PresetID == CARGOSHIPTURRET_ID)
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)
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;
1912 else if (PresetID == CARGOSHIP_ID)
1914 int ID = Commands->Get_ID(killer);
1915 for (
int x = 0;x < MaxGamePlayerCount;x++)
1916 if (MiniGamePlayerControlSystem[x].CargoShipIDs[6] == ID)
1919 MiniGamePlayerControlSystem[x].CargoScore += Score;
1920 RenCometBustersScoreControl.Get_Current_Player_Score_Node(MiniGamePlayerControlSystem[x].PlayerID)->CargoShipKills++;
1921 killer = Commands->Find_Object(MiniGamePlayerControlSystem[x].GamePlayerID);
1926 for (
int x = 0;x < MaxGamePlayerCount;x++)
1928 GameObject *Player = Commands->Find_Object(MiniGamePlayerControlSystem[x].GamePlayerID);
1931 if (Player == killer)
1933 if (MiniGamePlayerControlSystem[x].DoublePointsTime)
1935 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->DoublePointsPoints += (int)Score;
1938 MiniGamePlayerControlSystem[x].Score += Score;
1939 Commands->Give_Points(Player,Score,
false);
1940AddKilledObjctToPlayersScoreListSwitch:
1943 case NormalPlayerShip:
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;
1956 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->TotalComets++;
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;
1965 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->TheMoon++;
break;
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;
1974 if (Player == Driver)
1976 if (MiniGamePlayerControlSystem[x].DoublePointsTime)
1978 RenCometBustersScoreControl.Get_Current_Player_Score_Node(Get_Player_ID(Player))->DoublePointsPoints += (
int)Score;
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;
1989 AnObject *FindMineTarget(GameObject *obj,
int *MinDistance)
1991 Vector3 MyPos = Commands->Get_Position(obj);
1992 float NearestDistance = 9999999.9f;
1993 AnObject *Target = NULL;
1994 ObjectType TargetType = NormalPlayerShip;
1995 AnObject *Current = ObjectsList;
1998 if (!Current->AllowReplaceTime && Current->Object != obj && (Current->Type != PlayerCloak && Current->Type != Asteroid && Current->Type != TheMoon && Current->Type != CMTPowerup))
2000 float TempDistance = JmgUtility::SimpleDistance(Commands->Get_Position(Current->Object),MyPos);
2001 if (TempDistance <= 22500)
2006 TargetType = Current->Type;
2007 NearestDistance = TempDistance;
2011 int TempPriority = PrioritizeTargets[Current->Type];
2012 if (TempPriority > PrioritizeTargets[TargetType])
2015 TargetType = Current->Type;
2016 NearestDistance = TempDistance;
2018 else if (TempPriority == PrioritizeTargets[TargetType])
2020 if ((Current->Type == Mine || Current->Type == MineBoss) && TempDistance > NearestDistance)
2023 TargetType = Current->Type;
2024 NearestDistance = TempDistance;
2026 else if ((Current->Type != Mine && Current->Type != MineBoss) && TempDistance < NearestDistance)
2029 TargetType = Current->Type;
2030 NearestDistance = TempDistance;
2036 Current = Current->next;
2038 if (TargetType == Mine || TargetType == MineBoss)
2039 *MinDistance = Commands->Get_Random_Int(2,6);
2044 void KillInRange(GameObject *Player,
const Vector3 &Position,
float MinRange,
float MaxRange)
2046KillInRangeCheckStart:
2047 AnObject *Current = ObjectsList;
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))
2052 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object));
2053 if (Dist <= MaxRange && Dist >= MinRange)
2055 if (_stricmp(Get_Skin(Current->Object),
"Blamo"))
2057 SpecialApplyDamage(Current->Object,1.0f,
"None",Player);
2058 goto KillInRangeCheckStart;
2062 Current = Current->next;
2065 GameObject *FindObjectInRange(GameObject *Obj,
const Vector3 &Position,
float Range)
2068 AnObject *Current = ObjectsList,*Closest = NULL;
2071 if (!Current->AllowReplaceTime && Obj != Current->Object)
2073 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object))-Current->Size;
2079 else if (MinDist > Dist)
2085 Current = Current->next;
2087 if (!Closest || Range < MinDist)
2089 return Closest->Object;
2091 int FindDroneAvoidObjectInRange(GameObject *Obj,Vector3 *Position,
float Range,
float *_MinDist)
2097 AnObject *Current = ObjectsList;
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))
2104 float Dist = JmgUtility::SimpleDistance(*Position,Commands->Get_Position(Target))-Current->Size;
2110 else if (MinDist > Dist)
2116 Current = Current->next;
2118 *_MinDist = MinDist;
2119 if (Range < MinDist)
2123 GameObject *CheckForDroneTarget(GameObject *Obj,
const Vector3 &Position,
float *TargetSize)
2128 AnObject *Current = ObjectsList,*Closest = NULL;
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)
2133 float Dist = JmgUtility::SimpleDistance(Position,Commands->Get_Position(Current->Object))-Current->Size;
2139 else if (MinDist > Dist)
2145 Current = Current->next;
2147 if (!Closest || 2500 < MinDist)
2149 *TargetSize = Closest->RealSize;
2150 return Closest->Object;
2153int RenCometBustersGameObjects::PrioritizeTargets[17] = {2,2,0,1,0,3,2,0,2,0,0,1,1,3,2,0,2};
2155Vector3 Random_Map_Position()
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);
2161class JMG_CMTB_Main_Game_Control :
public ScriptImpClass {
2162 enum MusicType{MusicNone = 0,MusicGameOver = 1,MusicNormal = 2,MusicBoss = 3};
2165 unsigned int BabySit;
2166 MusicType CurrentMusic;
2167 int LastPlayerCount;
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);
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;
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;
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);
2209class JMG_CMTB_Ship_Control_Script :
public ScriptImpClass {
2210 bool prepingHyperjump;
2216 int LastBulletCount;
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);
2238class JMG_CMTB_Comet_Script :
public ScriptImpClass {
2239 void Created(GameObject *obj);
2240 void Killed(GameObject *obj, GameObject *damager);
2241 void Destroyed(GameObject *obj);
2244class JMG_CMTB_Zone_Realign_Enter :
public ScriptImpClass {
2245 void Entered(GameObject *obj,GameObject *enter);
2248class JMG_CMTB_Spectator_Object :
public ScriptImpClass {
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);
2258class JMG_CMTB_Arcade_Machine :
public ScriptImpClass {
2259 void Created(GameObject *obj);
2260 void Poked(GameObject *obj,GameObject *poker);
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);
2269class JMG_CMTB_Renegade_Code :
public ScriptImpClass {
2270 void Created(GameObject *obj);
2271 void Custom(GameObject *obj,
int message,
int param,GameObject *sender);
2274class JMG_CMTB_Motion_Mine :
public ScriptImpClass {
2275 AnObject *LastTargetObject;
2276 Vector3 lastTargetSpot;
2277 bool movingToLastSeenSpot;
2281 Vector3 LastPosition;
2284 unsigned int NewTarget;
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);
2293class JMG_CMTB_The_Moon_Script :
public ScriptImpClass {
2294 bool SpawnPoints[16];
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);
2304class JMG_CMTB_Ship_Super_Weapon :
public ScriptImpClass {
2306 void Created(GameObject *obj);
2307 void Timer_Expired(GameObject *obj,
int number);
2310class JMG_CMTB_Powerup_Script :
public ScriptImpClass {
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);
2318class JMG_CMTB_Cargo_Ship_Script :
public ScriptImpClass {
2319 int ShipCollideID[7];
2320 int AnimationControllerID;
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);
2330class JMG_CMTB_Cargo_Ship_Turret :
public ScriptImpClass {
2334 float NearestDistance;
2337 Vector3 LastPosition[3];
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);
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;
2357 Vector3 LastPosition;
2364 int StateTimeOutTime;
2365 int SearchTimeDelay;
2368 float AvoidDistance;
2370 bool LastPrimaryFire;
2372 int ExtremeStuckCount;
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);
2391 JMG_CMTB_Player_Drone()
2397class JMG_Create_Ship_On_Poke :
public ScriptImpClass {
2404 const char *Your3DModel;
2405 void Created(GameObject *obj);
2406 void Poked(GameObject *obj,GameObject *poker);
2408 void Timer_Expired(GameObject *obj,
int number);
2411class JMG_Advanced_Bounce_Zone :
public ScriptImpClass {
2412 void Entered(GameObject *obj,GameObject *enter);
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);
2423class JMG_Random_Music :
public ScriptImpClass {
2425 void Created(GameObject *obj);
2426 void Timer_Expired(GameObject *obj,
int number);
2430class JMG_Ship_Weapon :
public ScriptImpClass {
2436 void Created(GameObject *obj);
2437 void Custom(GameObject *obj,
int message,
int param,GameObject *sender);
2438 void Timer_Expired(GameObject *obj,
int number);
2441class JMG_Return_Custom_When_Shot :
public ScriptImpClass {
2442 void Damaged(GameObject *obj,GameObject *damager,
float damage);
2445class JMG_Cronie_AI :
public ScriptImpClass {
2447 void Created(GameObject *obj);
2449 void Enemy_Seen(GameObject *obj,GameObject *seen);
2450 void Timer_Expired(GameObject *obj,
int number);
2453class JMG_Kill_Self_And_Sender_On_Custom :
public ScriptImpClass {
2454 void Custom(GameObject *obj,
int message,
int param,GameObject *sender);
2457class JMG_Ship_Shield_Control_Script :
public ScriptImpClass {
2460 void Created(GameObject *obj);
2461 void Custom(GameObject *obj,
int message,
int param,GameObject *sender);
2462 void Killed(GameObject *obj, GameObject *damager);
2466class JMG_Kill_Self_And_Sender_On_Custom_Ship :
public ScriptImpClass {
2468 void Created(GameObject *obj);
2469 void Custom(GameObject *obj,
int message,
int param,GameObject *sender);
2472class JMG_Ship_Shield_Script :
public ScriptImpClass {
2473 const char *ShieldModel;
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);
2482class JMG_Renetbusters_Object :
public ScriptImpClass {
2483 void Custom(GameObject *obj,
int message,
int param,GameObject *sender);
2486class JMG_New_Ship_Weapon_Control_System :
public ScriptImpClass {
2487 void Damaged(GameObject *obj,GameObject *damager,
float damage);
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);
2496class JMG_Attach_And_Remove :
public ScriptImpClass {
2497 void Created(GameObject *obj);
2498 void Timer_Expired(GameObject *obj,
int number);
2502class JMG_User_Auto_Enter_Ship :
public ScriptImpClass {
2503 void Created(GameObject *obj);
2504 void Timer_Expired(GameObject *obj,
int number);
2507class JMG_Apply_Damage_On_Timer :
public ScriptImpClass {
2508 void Created(GameObject *obj);
2509 void Timer_Expired(GameObject *obj,
int number);
2512class JMG_CMTB_Vehicle_Face_Turret :
public ScriptImpClass {
2514 void Created(GameObject *obj);
2515 void Timer_Expired(GameObject *obj,
int number);
2516 void Destroyed(GameObject *obj);
2519class JMG_CMTB_Poke_End_Map :
public ScriptImpClass {
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);
2528class JMG_CMTB_Poke_Change_Difficulty :
public ScriptImpClass {
2530 void Created(GameObject *obj);
2531 void Poked(GameObject *obj,GameObject *poker);
2534class JMG_CMTB_Cargo_Ship_Child_Script :
public ScriptImpClass {
2535 void Killed(GameObject *obj, GameObject *damager);