Ticket #1555: cheats.6.patch
File cheats.6.patch, 21.6 KB (added by , 12 years ago) |
---|
-
gui/gamesetup/gamesetup.js
43 43 44 44 var g_MapFilters = []; 45 45 46 var g_PlayerColours = []; 47 46 48 // To prevent the display locking up while we load the map metadata, 47 49 // we'll start with a 'loading' message and switch to the main screen in the 48 50 // tick handler … … 179 181 updateGameAttributes(); 180 182 } 181 183 }; 184 185 getGUIObjectByName("enableCheats").onPress = function() 186 { // Update attributes so other players can see change 187 g_GameAttributes.settings.CheatsEnabled = this.checked; 188 189 if (!g_IsInGuiUpdate) 190 { 191 updateGameAttributes(); 192 } 193 }; 182 194 } 183 195 else 184 196 { … … 207 219 getGUIObjectByName("startGame").enabled = false; 208 220 } 209 221 210 // Set up offline-onlybits:222 // Set up multiplayer/singleplayer bits: 211 223 if (!g_IsNetworked) 212 224 { 213 225 getGUIObjectByName("chatPanel").hidden = true; 226 getGUIObjectByName("enableCheats").checked = true; 227 g_GameAttributes.settings.CheatsEnabled = true; 214 228 } 215 216 229 else 230 { 231 getGUIObjectByName("enableCheatsDesc").hidden = false; 232 getGUIObjectByName("enableCheats").checked = false; 233 g_GameAttributes.settings.CheatsEnabled = false; 234 if (g_IsController) 235 { 236 getGUIObjectByName("enableCheats").hidden = false; 237 } 238 else 239 { 240 getGUIObjectByName("enableCheatsText").hidden = false; 241 } 242 } 217 243 // Settings for all possible player slots 218 244 var boxSpacing = 32; 219 245 for (var i = 0; i < MAX_PLAYERS; ++i) … … 245 271 updateGameAttributes(); 246 272 } 247 273 }; 274 275 // populate color dropdowns 276 g_PlayerColours = [{ "r": 46, "g": 46, "b": 200 }, { "r": 150, "g": 20, "b": 20 }, { "r": 50, "g": 165, "b": 5 }, { "r": 230, "g": 230, "b": 75 }, { "r": 50, "g": 170, "b": 170 }, { "r": 160, "g": 80, "b": 200 }, { "r": 235, "g": 120, "b": 20 }, { "r": 64, "g": 64, "b": 64 }, { "r": 230, "g": 60, "b": 105 }]; 277 var colorSelect = getGUIObjectByName("playerColourSelect["+i+"]"); 278 colorSelect.list = ["[color=\"46 46 200 255\"]Blue", "[color=\"150 20 20 255\"]Red", "[color=\"50 165 5 255\"]Green", "[color=\"230 230 75 255\"]Yellow", 279 "[color=\"50 170 170 255\"]Cyan", "[color=\"160 80 200 255\"]Purple", "[color=\"235 120 20 255\"]Orange", "[color=\"64 64 64 255\"]Gray", "[color=\"230 60 105 255\"]Fandango"]; 280 colorSelect.list_data = [0,1,2,3,4,5,6,7,8]; 281 colorSelect.selected = i; 282 colorSelect.onSelectionChange = function() 283 { // Update color 284 var numPlayers = g_GameAttributes.settings.PlayerData.length; 285 var used = 0; 286 for (var o = 0; o < numPlayers; o++) 287 { 288 if (g_PlayerColours[this.list_data[this.selected]] == g_GameAttributes.settings.PlayerData[o].Colour) 289 { 290 ++used; 291 break; 292 } 293 } 294 if (!used) 295 if (this.selected != -1) 296 { 297 g_GameAttributes.settings.PlayerData[playerSlot].Colour = g_PlayerColours[this.list_data[this.selected]]; 298 } 248 299 300 if (!g_IsInGuiUpdate) 301 { 302 updateGameAttributes(); 303 } 304 }; 305 249 306 // Set events 250 307 var civ = getGUIObjectByName("playerCiv["+i+"]"); 251 308 civ.onSelectionChange = function() 252 309 { // Update civ 253 if ( this.selected != -1)310 if ((this.selected != -1)&&(g_GameAttributes.mapType !== "scenario")) 254 311 { 255 312 g_GameAttributes.settings.PlayerData[playerSlot].Civ = this.list_data[this.selected]; 256 313 } … … 617 674 g_GameAttributes.mapPath = "maps/random/"; 618 675 g_GameAttributes.settings = { 619 676 PlayerData: g_DefaultPlayerData.slice(0, 4), 620 Seed: Math.floor(Math.random() * 65536) 677 Seed: Math.floor(Math.random() * 65536), 678 CheatsEnabled: g_GameAttributes.settings.CheatsEnabled 621 679 }; 622 680 break; 623 681 … … 801 859 var victoryCondition = getGUIObjectByName("victoryCondition"); 802 860 var lockTeams = getGUIObjectByName("lockTeams"); 803 861 var mapSize = getGUIObjectByName("mapSize"); 862 var enableCheats = getGUIObjectByName("enableCheats"); 804 863 805 864 var numPlayersText= getGUIObjectByName("numPlayersText"); 806 865 var mapSizeText = getGUIObjectByName("mapSizeText"); 807 866 var revealMapText = getGUIObjectByName("revealMapText"); 808 867 var victoryConditionText = getGUIObjectByName("victoryConditionText"); 809 868 var lockTeamsText = getGUIObjectByName("lockTeamsText"); 810 869 var enableCheatsText = getGUIObjectByName("enableCheatsText"); 870 811 871 var sizeIdx = (g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes.default); 812 872 var victoryIdx = (VICTORY_DATA.indexOf(mapSettings.GameType) != -1 ? VICTORY_DATA.indexOf(mapSettings.GameType) : VICTORY_DEFAULTIDX); 813 873 enableCheats.checked = (g_GameAttributes.settings.CheatsEnabled === undefined || !g_GameAttributes.settings.CheatsEnabled ? false : true) 874 enableCheatsText.caption = (enableCheats.checked ? "Yes" : "No"); 814 875 // Handle map type specific logic 815 876 switch (g_GameAttributes.mapType) 816 877 { … … 877 938 victoryConditionText.hidden = false; 878 939 lockTeamsText.hidden = false; 879 940 941 for (var i = 0; i < MAX_PLAYERS; ++i) 942 { 943 944 } 880 945 // Update map preview 881 946 getGUIObjectByName("mapPreview").sprite = "stretched:session/icons/mappreview/" + getMapPreview(mapName); 882 947 numPlayersText.caption = numPlayers; … … 915 980 var pTeam = getGUIObjectByName("playerTeam["+i+"]"); 916 981 var pTeamText = getGUIObjectByName("playerTeamText["+i+"]"); 917 982 var pColor = getGUIObjectByName("playerColour["+i+"]"); 918 983 var pColorSelect = getGUIObjectByName("playerColourSelect["+i+"]") 984 919 985 // Player data / defaults 920 986 var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {}; 921 987 var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {}; … … 927 993 928 994 var team = getSetting(pData, pDefs, "Team"); 929 995 var civ = getSetting(pData, pDefs, "Civ"); 930 996 var colour = getSetting(pData, pDefs, "Colour"); 997 931 998 // For clients or scenarios, hide some player dropdowns 932 999 if (!g_IsController || g_GameAttributes.mapType == "scenario") 933 1000 { … … 935 1002 pCiv.hidden = true; 936 1003 pTeamText.hidden = false; 937 1004 pTeam.hidden = true; 938 1005 pColorSelect.hidden = true; 939 1006 // Set text values 940 1007 if (civ == "random") 941 1008 { … … 953 1020 pCiv.hidden = false; 954 1021 pTeamText.hidden = true; 955 1022 pTeam.hidden = false; 956 1023 pColorSelect.hidden = false; 957 1024 // Set dropdown values 1025 pColorSelect.selected = (colour ? (g_PlayerColours.indexOf(colour)+1 ? g_PlayerColours.indexOf(colour) : i) : i); 958 1026 pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0); 959 1027 pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0; 960 1028 } -
gui/gamesetup/gamesetup.xml
59 59 <repeat count="8"> 60 60 <object name="playerBox[n]" size="0 0 100% 32" hidden="true"> 61 61 <object name="playerColour[n]" type="image" size="0 0 100% 100%"/> 62 <object name="playerName[n]" type="text" style="CenteredLabelText" size="0 2 25% 30"/> 63 <object name="playerAssignment[n]" type="dropdown" style="StoneDropDown" size="25%+10 2 50% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/> 64 <object name="playerConfig[n]" type="button" style="StoneButton" size="50%+10 6 50%+35 26" 62 <object name="playerName[n]" type="text" style="CenteredLabelText" size="0 2 22% 30"/> 63 <object name="playerColourSelect[n]" type="dropdown" style="StoneDropDown" size="20%+10 2 35% 30" tooltip_style="onscreenToolTip" tooltip="Select color."/> 64 <object name="playerAssignment[n]" type="dropdown" style="StoneDropDown" size="35%+10 2 54% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/> 65 <object name="playerConfig[n]" type="button" style="StoneButton" size="54%+10 6 54%+35 26" 65 66 tooltip_style="onscreenToolTip" 66 67 tooltip="Configure AI settings." 67 68 >C</object> 68 <object name="playerCiv[n]" type="dropdown" style="StoneDropDown" size="5 0%+45 2 85% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/>69 <object name="playerCivText[n]" type="text" style="CenteredLabelText" size="5 0%+45 0 85% 30"/>69 <object name="playerCiv[n]" type="dropdown" style="StoneDropDown" size="54%+45 2 85% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/> 70 <object name="playerCivText[n]" type="text" style="CenteredLabelText" size="52%+45 0 85% 30"/> 70 71 <object name="playerTeam[n]" type="dropdown" style="StoneDropDown" size="85%+10 2 100%-10 30" tooltip_style="onscreenToolTip" tooltip="Select player's team."/> 71 72 <object name="playerTeamText[n]" type="text" style="CenteredLabelText" size="85%+10 0 100%-10 100%"/> 72 73 </object> … … 120 121 121 122 </object> 122 123 124 <object size="20 463.8 11% 615" name="enableCheatsDesc" hidden="true"> 125 <object size="0 0 100% 32"> 126 <object size="0 0 100% 100%" type="text" style="RightLabelText">Cheats:</object> 127 </object> 128 </object> 129 130 <object size="10.9% 463.8 28% 615"> 131 <object size="0 0 100% 32"> 132 <object name="enableCheatsText" size="0 0 100% 100%" type="text" style="LeftLabelText" hidden="true"/> 133 <object name="enableCheats" size="0 50%-8 16 50%+8" type="checkbox" style="StoneCrossBox" hidden="true" tooltip_style="onscreenToolTip" tooltip="Toggle the usability of cheats."/> 134 </object> 135 </object> 136 123 137 <!-- Map Preview --> 124 138 <object type="image" sprite="BackgroundIndentFillDark" name="gamePreviewBox" size="100%-425 58 100%-25 358"> 125 139 <object type="image" sprite="snMapPreview" size="1 1 399 299" name="mapPreview"/> … … 143 157 <object size="0 60 100% 88"> 144 158 <object size="0 0 100% 100%" type="text" style="RightLabelText">Victory condition:</object> 145 159 </object> 160 146 161 </object> 147 162 148 163 <!-- Second Column --> 149 164 <object size="41% 0 94% 50%"> 150 165 … … 173 188 </object> 174 189 175 190 <!-- Third Column --> 191 176 192 <object size="0 40% 42.3% 100%"> 177 193 <object size="0 0 100% 32"> 178 194 <object size="0 0 100% 100%" type="text" style="RightLabelText">Reveal map:</object> -
gui/session/messages.js
9 9 const MAX_NUM_NOTIFICATION_LINES = 3; 10 10 var notifications = []; 11 11 var notificationsTimers = []; 12 var cheatList = parseJSONData("simulation/data/cheats.json").Cheats; 12 13 13 14 // Notifications 14 15 function handleNotifications() … … 159 160 { 160 161 var input = getGUIObjectByName("chatInput"); 161 162 var text = input.caption; 163 var isCheat = false; 162 164 if (text.length) 163 165 { 164 if (g_IsNetworked) 165 Engine.SendNetworkChat(text); 166 else 167 addChatMessage({ "type": "message", "guid": "local", "text": text }); 166 var n = g_PlayerAssignments["local"].player; 167 for (var i = 0; i < cheatList.length; i++) 168 { 169 if (text.indexOf(cheatList[i].Name)>-1) 170 { 171 if (cheatList[i].IsNumeric) 172 { 173 var number = text.substr(cheatList[i].Name.length+1, text.length-1).valueOf(); 174 if (!(number > 0)) 175 number=cheatList[i].DefaultNumber; 176 } 177 else 178 { 179 var number = undefined; 180 } 181 Engine.PostNetworkCommand({"type": "cheat", "action": cheatList[i].Action, "number": number , "selected": g_Selection.toList(), "templates": cheatList[i].Templates, "player": n}); 182 isCheat = true; 183 break; 184 } 185 } 168 186 187 if (!isCheat) 188 { 189 if (g_IsNetworked) 190 Engine.SendNetworkChat(text); 191 else 192 addChatMessage({ "type": "message", "guid": "local", "text": text }); 193 } 169 194 input.caption = ""; // Clear chat input 170 195 } 171 196 … … 195 220 } 196 221 197 222 var message = escapeText(msg.text); 198 223 199 224 var formatted; 200 225 201 226 switch (msg.type) 202 227 { 203 228 case "connect": -
simulation/components/Cost.js
49 49 50 50 Cost.prototype.GetBuildTime = function() 51 51 { 52 var buildTime = +this.template.BuildTime; 52 var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player); 53 var buildTime = (+this.template.BuildTime) * cmpPlayer.cheatTimeMultiplier; 53 54 var cmpTechnologyManager = QueryOwnerInterface(this.entity, IID_TechnologyManager); 54 55 if (cmpTechnologyManager) 55 56 buildTime = cmpTechnologyManager.ApplyModifications("Cost/BuildTime", buildTime, this.entity); -
simulation/components/Player.js
29 29 this.startCam = undefined; 30 30 this.controlAllUnits = false; 31 31 this.isAI = false; 32 this.cheatsEnabled = true; 33 this.cheatTimeMultiplier = 1; 32 34 }; 33 35 34 36 Player.prototype.SetPlayerID = function(id) … … 397 399 } 398 400 }; 399 401 402 403 Player.prototype.SetCheatEnabled = function(flag) 404 { 405 this.cheatsEnabled = flag; 406 } 407 408 Player.prototype.GetCheatEnabled = function(flag) 409 { 410 return this.cheatsEnabled; 411 } 412 400 413 Engine.RegisterComponentType(IID_Player, "Player", Player); -
simulation/components/ProductionQueue.js
185 185 186 186 // Apply a time discount to larger batches. 187 187 // TODO: work out what equation we should use here. 188 var timeMult = Math.pow(count, 0.7) ;188 var timeMult = Math.pow(count, 0.7) * cmpPlayer.cheatTimeMultiplier; 189 189 190 190 // We need the costs after tech modifications 191 191 // Obviously we don't have the entities yet, so we must use template data … … 233 233 if (!template) 234 234 return; 235 235 236 var time = template.researchTime ;236 var time = template.researchTime * CheatTimeMultiplier(); 237 237 238 238 var cost = {}; 239 239 for each (var r in ["food", "wood", "stone", "metal"]) -
simulation/components/ResourceGatherer.js
245 245 */ 246 246 ResourceGatherer.prototype.GetTargetGatherRate = function(target) 247 247 { 248 var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player); 249 248 250 var cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply); 249 251 if (!cmpResourceSupply) 250 252 return 0; … … 255 257 256 258 var rate; 257 259 if (type.specific && rates[type.generic+"."+type.specific]) 258 rate = rates[type.generic+"."+type.specific] ;260 rate = rates[type.generic+"."+type.specific] / cmpPlayer.cheatTimeMultiplier; 259 261 else 260 rate = rates[type.generic] ;262 rate = rates[type.generic] / cmpPlayer.cheatTimeMultiplier; 261 263 262 264 return (rate || 0); 263 265 }; -
simulation/data/cheats.json
1 { 2 "Cheats": 3 [ 4 { 5 "Name": "i want pizza", 6 "Action": "addfood", 7 "IsNumeric": true, 8 "DefaultNumber": 1000 9 }, 10 { 11 "Name": "bring me my axe", 12 "Action": "addwood", 13 "IsNumeric": true, 14 "DefaultNumber": 1000 15 }, 16 { 17 "Name": "your money or your life", 18 "Action": "addmetal", 19 "IsNumeric": true, 20 "DefaultNumber": 1000 21 }, 22 { 23 "Name": "i see a mountain here", 24 "Action": "addstone", 25 "IsNumeric": true, 26 "DefaultNumber": 1000 27 }, 28 { 29 "Name": "jame jam", 30 "Action": "revealmap", 31 "IsNumeric": false 32 }, 33 { 34 "Name": "the hive master", 35 "Action": "maxpopulation", 36 "IsNumeric": false 37 }, 38 { 39 "Name": "TARDIS", 40 "Action": "changemaxpopulation", 41 "IsNumeric": false 42 }, 43 { 44 "Name": "iwanttopwnthem", 45 "Action": "createunits", 46 "IsNumeric": true, 47 "DefaultNumber": 1, 48 "Templates": ["units/cart_hero_hamilcar", "units/cart_hero_hannibal", "units/cart_hero_maharbal", "units/rome_hero_marcellus", "units/rome_hero_maximus", "units/rome_hero_scipio", "units/pers_hero_cyrus", "units/pers_hero_darius", "units/pers_hero_xerxes"] 49 }, 50 { 51 "Name": "wololo", 52 "Action": "convertunit", 53 "IsNumeric": false 54 }, 55 { 56 "Name": "black death", 57 "Action": "killunits", 58 "IsNumeric": false 59 }, 60 { 61 "Name": "hehehehehehehehe", 62 "Action": "defeatplayer", 63 "IsNumeric": true, 64 "DefaultNumber": 2 65 }, 66 { 67 "Name": "pandoras box", 68 "Action": "controlallunits", 69 "IsNumeric": false 70 }, 71 { 72 "Name": "i am too busy", 73 "Action": "fastactions", 74 "IsNumeric": false 75 }, 76 { 77 "Name": "how do you turn this on?", 78 "Action": "createunits", 79 "IsNumeric": true, 80 "DefaultNumber": 1, 81 "Templates": ["other/plane"] 82 } 83 ] 84 } -
simulation/helpers/Cheat.js
1 2 3 function Cheat(input) 4 { 5 //computing the neccessary components 6 var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 7 if (!cmpPlayerMan || input.player < 0) 8 return; 9 var playerEnt = cmpPlayerMan.GetPlayerByID(input.player); 10 if (playerEnt == INVALID_ENTITY) 11 return; 12 var cmpPlayer = Engine.QueryInterface(playerEnt, IID_Player); 13 if (!cmpPlayer) 14 return; 15 if (cmpPlayer.GetCheatEnabled()) 16 { 17 if (input.action == "addfood") 18 { 19 cmpPlayer.AddResource("food", input.number); 20 } 21 else if (input.action == "addwood") 22 { 23 cmpPlayer.AddResource("wood", input.number); 24 } 25 else if (input.action == "addmetal") 26 { 27 cmpPlayer.AddResource("metal", input.number); 28 } 29 else if (input.action == "addstone") 30 { 31 cmpPlayer.AddResource("stone", input.number); 32 } 33 else if (input.action == "revealmap") 34 { 35 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 36 cmpRangeManager.SetLosRevealAll(-1, true); 37 } 38 else if (input.action == "maxpopulation") 39 { 40 cmpPlayer.popBonuses += 500; 41 } 42 else if (input.action == "changemaxpopulation") 43 { 44 //this changes the max population limit 45 cmpPlayer.maxPop = 500; 46 } 47 else if (input.action == "controlallunits") 48 { 49 cmpPlayer.SetControlAllUnits(true); 50 } 51 else if (input.action == "convertunit") 52 { 53 for each (var ent in input.selected) 54 { 55 var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership); 56 cmpOwnership.SetOwner(cmpPlayer.playerID); 57 } 58 } 59 else if (input.action == "killunits") 60 { 61 for each (var ent in input.selected) 62 { 63 var cmpHealth = Engine.QueryInterface(ent, IID_Health); 64 if (cmpHealth) 65 cmpHealth.Kill(); 66 else 67 Engine.DestroyEntity(ent); 68 } 69 } 70 else if (input.action == "defeatplayer") 71 { 72 var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 73 if (!cmpPlayerMan) 74 return; 75 var playerEnt = cmpPlayerMan.GetPlayerByID(input.number); 76 if (playerEnt == INVALID_ENTITY) 77 return; 78 Engine.PostMessage(playerEnt, MT_PlayerDefeated, { "playerId": input.number } ); 79 } 80 else if (input.action == "createunits") 81 { 82 //the player must select a building that can train units for this. 83 var cmpProductionQueue = Engine.QueryInterface(input.selected[0], IID_ProductionQueue); 84 if (!cmpProductionQueue) 85 return; 86 for (var i = 0; i < input.number; i++) 87 { 88 cmpProductionQueue.SpawnUnits (input.templates[i%(input.templates.length)],1, null); 89 } 90 } 91 else if (input.action == "fastactions") 92 { 93 if (cmpPlayer.cheatTimeMultiplier == 1) 94 { 95 cmpPlayer.cheatTimeMultiplier = 0.01; 96 } 97 else 98 { 99 cmpPlayer.cheatTimeMultiplier = 1; 100 } 101 } 102 //AI only 103 else if (input.action == "changespeed") 104 { 105 cmpPlayer.cheatTimeMultiplier = input.number; 106 } 107 if (cmpPlayer.name.indexOf(" the Cheater")==-1) 108 cmpPlayer.name = cmpPlayer.name + " the Cheater"; 109 } 110 else 111 { 112 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 113 cmpGuiInterface.PushNotification({"type": "chat", "player": input.player, "message": "Cheats are disbaled in this match"}); 114 } 115 } 116 117 Engine.RegisterGlobal("Cheat", Cheat); 118 No newline at end of file -
simulation/helpers/Commands.js
31 31 case "debug-print": 32 32 print(cmd.message); 33 33 break; 34 34 35 35 case "chat": 36 36 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 37 37 cmpGuiInterface.PushNotification({"type": "chat", "player": player, "message": cmd.message}); 38 38 break; 39 39 40 case "cheat": 41 Cheat(cmd); 42 break; 43 40 44 case "quit": 41 45 // Let the AI exit the game for testing purposes 42 46 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); -
simulation/helpers/InitGame.js
13 13 var cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager); 14 14 for (var i = 0; i < settings.PlayerData.length; ++i) 15 15 { 16 var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i+1), IID_Player); 17 if (!settings.CheatsEnabled) 18 cmpPlayer.SetCheatStatus(false); 16 19 if (settings.PlayerData[i] && settings.PlayerData[i].AI && settings.PlayerData[i].AI != "") 17 20 { 18 21 cmpAIManager.AddPlayer(settings.PlayerData[i].AI, i+1); 19 var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i+1), IID_Player);20 22 cmpPlayer.SetAI(true); 23 cmpPlayer.SetCheatEnabled(true); 21 24 } 22 25 } 23 26 }