mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
parent
36cc1766a4
commit
202a02568b
11 changed files with 308 additions and 26 deletions
|
|
@ -1,7 +1,7 @@
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Constants
|
||||
const DEFAULT_NETWORKED_MAP = "Oasis XI";
|
||||
const DEFAULT_OFFLINE_MAP = "Punjab III";
|
||||
const DEFAULT_OFFLINE_MAP = "Punjab 3";
|
||||
|
||||
// TODO: Move these somewhere like simulation\data\game_types.json, Atlas needs them too
|
||||
const VICTORY_TEXT = ["Conquest", "None"];
|
||||
|
|
@ -179,6 +179,16 @@ function initMain()
|
|||
updateGameAttributes();
|
||||
}
|
||||
};
|
||||
|
||||
getGUIObjectByName("enableCheats").onPress = function()
|
||||
{ // Update attributes so other players can see change
|
||||
g_GameAttributes.settings.CheatsEnabled = this.checked;
|
||||
|
||||
if (!g_IsInGuiUpdate)
|
||||
{
|
||||
updateGameAttributes();
|
||||
}
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -207,13 +217,27 @@ function initMain()
|
|||
getGUIObjectByName("startGame").enabled = false;
|
||||
}
|
||||
|
||||
// Set up offline-only bits:
|
||||
// Set up multiplayer/singleplayer bits:
|
||||
if (!g_IsNetworked)
|
||||
{
|
||||
getGUIObjectByName("chatPanel").hidden = true;
|
||||
getGUIObjectByName("enableCheats").checked = true;
|
||||
g_GameAttributes.settings.CheatsEnabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
getGUIObjectByName("enableCheatsDesc").hidden = false;
|
||||
getGUIObjectByName("enableCheats").checked = false;
|
||||
g_GameAttributes.settings.CheatsEnabled = false;
|
||||
if (g_IsController)
|
||||
{
|
||||
getGUIObjectByName("enableCheats").hidden = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
getGUIObjectByName("enableCheatsText").hidden = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Settings for all possible player slots
|
||||
var boxSpacing = 32;
|
||||
for (var i = 0; i < MAX_PLAYERS; ++i)
|
||||
|
|
@ -245,12 +269,13 @@ function initMain()
|
|||
updateGameAttributes();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Set events
|
||||
var civ = getGUIObjectByName("playerCiv["+i+"]");
|
||||
civ.onSelectionChange = function()
|
||||
{ // Update civ
|
||||
if (this.selected != -1)
|
||||
if ((this.selected != -1)&&(g_GameAttributes.mapType !== "scenario"))
|
||||
{
|
||||
g_GameAttributes.settings.PlayerData[playerSlot].Civ = this.list_data[this.selected];
|
||||
}
|
||||
|
|
@ -617,7 +642,8 @@ function selectMapType(type)
|
|||
g_GameAttributes.mapPath = "maps/random/";
|
||||
g_GameAttributes.settings = {
|
||||
PlayerData: g_DefaultPlayerData.slice(0, 4),
|
||||
Seed: Math.floor(Math.random() * 65536)
|
||||
Seed: Math.floor(Math.random() * 65536),
|
||||
CheatsEnabled: g_GameAttributes.settings.CheatsEnabled
|
||||
};
|
||||
break;
|
||||
|
||||
|
|
@ -801,16 +827,19 @@ function onGameAttributesChange()
|
|||
var victoryCondition = getGUIObjectByName("victoryCondition");
|
||||
var lockTeams = getGUIObjectByName("lockTeams");
|
||||
var mapSize = getGUIObjectByName("mapSize");
|
||||
var enableCheats = getGUIObjectByName("enableCheats");
|
||||
|
||||
var numPlayersText= getGUIObjectByName("numPlayersText");
|
||||
var mapSizeText = getGUIObjectByName("mapSizeText");
|
||||
var revealMapText = getGUIObjectByName("revealMapText");
|
||||
var victoryConditionText = getGUIObjectByName("victoryConditionText");
|
||||
var lockTeamsText = getGUIObjectByName("lockTeamsText");
|
||||
|
||||
var enableCheatsText = getGUIObjectByName("enableCheatsText");
|
||||
|
||||
var sizeIdx = (g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes.default);
|
||||
var victoryIdx = (VICTORY_DATA.indexOf(mapSettings.GameType) != -1 ? VICTORY_DATA.indexOf(mapSettings.GameType) : VICTORY_DEFAULTIDX);
|
||||
|
||||
enableCheats.checked = (g_GameAttributes.settings.CheatsEnabled === undefined || !g_GameAttributes.settings.CheatsEnabled ? false : true)
|
||||
enableCheatsText.caption = (enableCheats.checked ? "Yes" : "No");
|
||||
// Handle map type specific logic
|
||||
switch (g_GameAttributes.mapType)
|
||||
{
|
||||
|
|
@ -915,7 +944,7 @@ function onGameAttributesChange()
|
|||
var pTeam = getGUIObjectByName("playerTeam["+i+"]");
|
||||
var pTeamText = getGUIObjectByName("playerTeamText["+i+"]");
|
||||
var pColor = getGUIObjectByName("playerColour["+i+"]");
|
||||
|
||||
|
||||
// Player data / defaults
|
||||
var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {};
|
||||
var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {};
|
||||
|
|
@ -927,7 +956,7 @@ function onGameAttributesChange()
|
|||
|
||||
var team = getSetting(pData, pDefs, "Team");
|
||||
var civ = getSetting(pData, pDefs, "Civ");
|
||||
|
||||
|
||||
// For clients or scenarios, hide some player dropdowns
|
||||
if (!g_IsController || g_GameAttributes.mapType == "scenario")
|
||||
{
|
||||
|
|
@ -935,7 +964,6 @@ function onGameAttributesChange()
|
|||
pCiv.hidden = true;
|
||||
pTeamText.hidden = false;
|
||||
pTeam.hidden = true;
|
||||
|
||||
// Set text values
|
||||
if (civ == "random")
|
||||
{
|
||||
|
|
@ -953,7 +981,6 @@ function onGameAttributesChange()
|
|||
pCiv.hidden = false;
|
||||
pTeamText.hidden = true;
|
||||
pTeam.hidden = false;
|
||||
|
||||
// Set dropdown values
|
||||
pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0);
|
||||
pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0;
|
||||
|
|
|
|||
|
|
@ -120,6 +120,19 @@
|
|||
|
||||
</object>
|
||||
|
||||
<object size="20 463.8 11% 615" name="enableCheatsDesc" hidden="true">
|
||||
<object size="0 0 100% 32">
|
||||
<object size="0 0 100% 100%" type="text" style="RightLabelText">Cheats:</object>
|
||||
</object>
|
||||
</object>
|
||||
|
||||
<object size="10.9% 463.8 28% 615">
|
||||
<object size="0 0 100% 32">
|
||||
<object name="enableCheatsText" size="0 0 100% 100%" type="text" style="LeftLabelText" hidden="true"/>
|
||||
<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."/>
|
||||
</object>
|
||||
</object>
|
||||
|
||||
<!-- Map Preview -->
|
||||
<object type="image" sprite="BackgroundIndentFillDark" name="gamePreviewBox" size="100%-425 58 100%-25 358">
|
||||
<object type="image" sprite="snMapPreview" size="1 1 399 299" name="mapPreview"/>
|
||||
|
|
@ -143,8 +156,9 @@
|
|||
<object size="0 60 100% 88">
|
||||
<object size="0 0 100% 100%" type="text" style="RightLabelText">Victory condition:</object>
|
||||
</object>
|
||||
|
||||
</object>
|
||||
|
||||
|
||||
<!-- Second Column -->
|
||||
<object size="41% 0 94% 50%">
|
||||
|
||||
|
|
@ -173,6 +187,7 @@
|
|||
</object>
|
||||
|
||||
<!-- Third Column -->
|
||||
|
||||
<object size="0 40% 42.3% 100%">
|
||||
<object size="0 0 100% 32">
|
||||
<object size="0 0 100% 100%" type="text" style="RightLabelText">Reveal map:</object>
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ const NOTIFICATION_TIMEOUT = 10000;
|
|||
const MAX_NUM_NOTIFICATION_LINES = 3;
|
||||
var notifications = [];
|
||||
var notificationsTimers = [];
|
||||
var cheatList = parseJSONData("simulation/data/cheats.json").Cheats;
|
||||
|
||||
// Notifications
|
||||
function handleNotifications()
|
||||
|
|
@ -174,13 +175,37 @@ function submitChatInput()
|
|||
{
|
||||
var input = getGUIObjectByName("chatInput");
|
||||
var text = input.caption;
|
||||
var isCheat = false;
|
||||
if (text.length)
|
||||
{
|
||||
if (g_IsNetworked)
|
||||
Engine.SendNetworkChat(text);
|
||||
else
|
||||
addChatMessage({ "type": "message", "guid": "local", "text": text });
|
||||
var n = g_PlayerAssignments["local"].player;
|
||||
for (var i = 0; i < cheatList.length; i++)
|
||||
{
|
||||
if (text.indexOf(cheatList[i].Name)>-1)
|
||||
{
|
||||
if (cheatList[i].IsNumeric)
|
||||
{
|
||||
var number = text.substr(cheatList[i].Name.length+1, text.length-1).valueOf();
|
||||
if (!(number > 0))
|
||||
number=cheatList[i].DefaultNumber;
|
||||
}
|
||||
else
|
||||
{
|
||||
var number = undefined;
|
||||
}
|
||||
Engine.PostNetworkCommand({"type": "cheat", "action": cheatList[i].Action, "number": number , "selected": g_Selection.toList(), "templates": cheatList[i].Templates, "player": n});
|
||||
isCheat = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isCheat)
|
||||
{
|
||||
if (g_IsNetworked)
|
||||
Engine.SendNetworkChat(text);
|
||||
else
|
||||
addChatMessage({ "type": "message", "guid": "local", "text": text });
|
||||
}
|
||||
input.caption = ""; // Clear chat input
|
||||
}
|
||||
|
||||
|
|
@ -216,9 +241,9 @@ function addChatMessage(msg, playerAssignments)
|
|||
}
|
||||
|
||||
var message = escapeText(msg.text);
|
||||
|
||||
|
||||
var formatted;
|
||||
|
||||
|
||||
switch (msg.type)
|
||||
{
|
||||
case "connect":
|
||||
|
|
|
|||
|
|
@ -49,7 +49,8 @@ Cost.prototype.GetPopBonus = function()
|
|||
|
||||
Cost.prototype.GetBuildTime = function()
|
||||
{
|
||||
var buildTime = +this.template.BuildTime;
|
||||
var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
|
||||
var buildTime = (+this.template.BuildTime) * cmpPlayer.cheatTimeMultiplier;
|
||||
var cmpTechnologyManager = QueryOwnerInterface(this.entity, IID_TechnologyManager);
|
||||
if (cmpTechnologyManager)
|
||||
buildTime = cmpTechnologyManager.ApplyModifications("Cost/BuildTime", buildTime, this.entity);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ Player.prototype.Init = function()
|
|||
this.startCam = undefined;
|
||||
this.controlAllUnits = false;
|
||||
this.isAI = false;
|
||||
this.cheatsEnabled = true;
|
||||
this.cheatTimeMultiplier = 1;
|
||||
};
|
||||
|
||||
Player.prototype.SetPlayerID = function(id)
|
||||
|
|
@ -405,4 +407,15 @@ Player.prototype.OnPlayerDefeated = function()
|
|||
cmpGUIInterface.PushNotification(notification);
|
||||
};
|
||||
|
||||
|
||||
Player.prototype.SetCheatEnabled = function(flag)
|
||||
{
|
||||
this.cheatsEnabled = flag;
|
||||
}
|
||||
|
||||
Player.prototype.GetCheatEnabled = function(flag)
|
||||
{
|
||||
return this.cheatsEnabled;
|
||||
}
|
||||
|
||||
Engine.RegisterComponentType(IID_Player, "Player", Player);
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ ProductionQueue.prototype.AddBatch = function(templateName, type, count, metadat
|
|||
|
||||
// Apply a time discount to larger batches.
|
||||
// TODO: work out what equation we should use here.
|
||||
var timeMult = Math.pow(count, 0.7);
|
||||
var timeMult = Math.pow(count, 0.7) * cmpPlayer.cheatTimeMultiplier;
|
||||
|
||||
// We need the costs after tech modifications
|
||||
// Obviously we don't have the entities yet, so we must use template data
|
||||
|
|
@ -233,7 +233,7 @@ ProductionQueue.prototype.AddBatch = function(templateName, type, count, metadat
|
|||
if (!template)
|
||||
return;
|
||||
|
||||
var time = template.researchTime;
|
||||
var time = template.researchTime * CheatTimeMultiplier();
|
||||
|
||||
var cost = {};
|
||||
for each (var r in ["food", "wood", "stone", "metal"])
|
||||
|
|
|
|||
|
|
@ -245,6 +245,8 @@ ResourceGatherer.prototype.PerformGather = function(target)
|
|||
*/
|
||||
ResourceGatherer.prototype.GetTargetGatherRate = function(target)
|
||||
{
|
||||
var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
|
||||
|
||||
var cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply);
|
||||
if (!cmpResourceSupply)
|
||||
return 0;
|
||||
|
|
@ -255,9 +257,9 @@ ResourceGatherer.prototype.GetTargetGatherRate = function(target)
|
|||
|
||||
var rate;
|
||||
if (type.specific && rates[type.generic+"."+type.specific])
|
||||
rate = rates[type.generic+"."+type.specific];
|
||||
rate = rates[type.generic+"."+type.specific] / cmpPlayer.cheatTimeMultiplier;
|
||||
else
|
||||
rate = rates[type.generic];
|
||||
rate = rates[type.generic] / cmpPlayer.cheatTimeMultiplier;
|
||||
|
||||
return (rate || 0);
|
||||
};
|
||||
|
|
|
|||
79
binaries/data/mods/public/simulation/data/cheats.json
Normal file
79
binaries/data/mods/public/simulation/data/cheats.json
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
{
|
||||
"Cheats":
|
||||
[
|
||||
{
|
||||
"Name": "i want pizza",
|
||||
"Action": "addfood",
|
||||
"IsNumeric": true,
|
||||
"DefaultNumber": 1000
|
||||
},
|
||||
{
|
||||
"Name": "bring me my axe",
|
||||
"Action": "addwood",
|
||||
"IsNumeric": true,
|
||||
"DefaultNumber": 1000
|
||||
},
|
||||
{
|
||||
"Name": "your money or your life",
|
||||
"Action": "addmetal",
|
||||
"IsNumeric": true,
|
||||
"DefaultNumber": 1000
|
||||
},
|
||||
{
|
||||
"Name": "i see a mountain here",
|
||||
"Action": "addstone",
|
||||
"IsNumeric": true,
|
||||
"DefaultNumber": 1000
|
||||
},
|
||||
{
|
||||
"Name": "jame jam",
|
||||
"Action": "revealmap",
|
||||
"IsNumeric": false
|
||||
},
|
||||
{
|
||||
"Name": "the hive master",
|
||||
"Action": "maxpopulation",
|
||||
"IsNumeric": false
|
||||
},
|
||||
{
|
||||
"Name": "TARDIS",
|
||||
"Action": "changemaxpopulation",
|
||||
"IsNumeric": false
|
||||
},
|
||||
{
|
||||
"Name": "iwanttopwnthem",
|
||||
"Action": "createunits",
|
||||
"IsNumeric": true,
|
||||
"DefaultNumber": 1,
|
||||
"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"]
|
||||
},
|
||||
{
|
||||
"Name": "wololo",
|
||||
"Action": "convertunit",
|
||||
"IsNumeric": false
|
||||
},
|
||||
{
|
||||
"Name": "black death",
|
||||
"Action": "killunits",
|
||||
"IsNumeric": false
|
||||
},
|
||||
{
|
||||
"Name": "exodia",
|
||||
"Action": "defeatplayer",
|
||||
"IsNumeric": true,
|
||||
"DefaultNumber": 2
|
||||
},
|
||||
{
|
||||
"Name": "i am too busy",
|
||||
"Action": "fastactions",
|
||||
"IsNumeric": false
|
||||
},
|
||||
{
|
||||
"Name": "how do you turn this on?",
|
||||
"Action": "createunits",
|
||||
"IsNumeric": true,
|
||||
"DefaultNumber": 1,
|
||||
"Templates": ["other/plane"]
|
||||
}
|
||||
]
|
||||
}
|
||||
113
binaries/data/mods/public/simulation/helpers/Cheat.js
Normal file
113
binaries/data/mods/public/simulation/helpers/Cheat.js
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
|
||||
|
||||
function Cheat(input)
|
||||
{
|
||||
//computing the neccessary components
|
||||
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
||||
if (!cmpPlayerMan || input.player < 0)
|
||||
return;
|
||||
var playerEnt = cmpPlayerMan.GetPlayerByID(input.player);
|
||||
if (playerEnt == INVALID_ENTITY)
|
||||
return;
|
||||
var cmpPlayer = Engine.QueryInterface(playerEnt, IID_Player);
|
||||
if (!cmpPlayer)
|
||||
return;
|
||||
if (cmpPlayer.GetCheatEnabled())
|
||||
{
|
||||
if (input.action == "addfood")
|
||||
{
|
||||
cmpPlayer.AddResource("food", input.number);
|
||||
}
|
||||
else if (input.action == "addwood")
|
||||
{
|
||||
cmpPlayer.AddResource("wood", input.number);
|
||||
}
|
||||
else if (input.action == "addmetal")
|
||||
{
|
||||
cmpPlayer.AddResource("metal", input.number);
|
||||
}
|
||||
else if (input.action == "addstone")
|
||||
{
|
||||
cmpPlayer.AddResource("stone", input.number);
|
||||
}
|
||||
else if (input.action == "revealmap")
|
||||
{
|
||||
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
|
||||
cmpRangeManager.SetLosRevealAll(-1, true);
|
||||
}
|
||||
else if (input.action == "maxpopulation")
|
||||
{
|
||||
cmpPlayer.popBonuses += 500;
|
||||
}
|
||||
else if (input.action == "changemaxpopulation")
|
||||
{
|
||||
//this changes the max population limit
|
||||
cmpPlayer.maxPop = 500;
|
||||
}
|
||||
else if (input.action == "convertunit")
|
||||
{
|
||||
for each (var ent in input.selected)
|
||||
{
|
||||
var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
|
||||
cmpOwnership.SetOwner(cmpPlayer.playerID);
|
||||
}
|
||||
}
|
||||
else if (input.action == "killunits")
|
||||
{
|
||||
for each (var ent in input.selected)
|
||||
{
|
||||
var cmpHealth = Engine.QueryInterface(ent, IID_Health);
|
||||
if (cmpHealth)
|
||||
cmpHealth.Kill();
|
||||
else
|
||||
Engine.DestroyEntity(ent);
|
||||
}
|
||||
}
|
||||
else if (input.action == "defeatplayer")
|
||||
{
|
||||
var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
||||
if (!cmpPlayerMan)
|
||||
return;
|
||||
var playerEnt = cmpPlayerMan.GetPlayerByID(input.number);
|
||||
if (playerEnt == INVALID_ENTITY)
|
||||
return;
|
||||
Engine.PostMessage(playerEnt, MT_PlayerDefeated, { "playerId": input.number } );
|
||||
}
|
||||
else if (input.action == "createunits")
|
||||
{
|
||||
//the player must select a building that can train units for this.
|
||||
var cmpProductionQueue = Engine.QueryInterface(input.selected[0], IID_ProductionQueue);
|
||||
if (!cmpProductionQueue)
|
||||
return;
|
||||
for (var i = 0; i < input.number; i++)
|
||||
{
|
||||
cmpProductionQueue.SpawnUnits (input.templates[i%(input.templates.length)],1, null);
|
||||
}
|
||||
}
|
||||
else if (input.action == "fastactions")
|
||||
{
|
||||
if (cmpPlayer.cheatTimeMultiplier == 1)
|
||||
{
|
||||
cmpPlayer.cheatTimeMultiplier = 0.01;
|
||||
}
|
||||
else
|
||||
{
|
||||
cmpPlayer.cheatTimeMultiplier = 1;
|
||||
}
|
||||
}
|
||||
//AI only
|
||||
else if (input.action == "changespeed")
|
||||
{
|
||||
cmpPlayer.cheatTimeMultiplier = input.number;
|
||||
}
|
||||
if (cmpPlayer.name.indexOf(" the Cheater")==-1)
|
||||
cmpPlayer.name = cmpPlayer.name + " the Cheater";
|
||||
}
|
||||
else
|
||||
{
|
||||
var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
|
||||
cmpGuiInterface.PushNotification({"type": "chat", "player": input.player, "message": "Cheats are disbaled in this match"});
|
||||
}
|
||||
}
|
||||
|
||||
Engine.RegisterGlobal("Cheat", Cheat);
|
||||
|
|
@ -31,12 +31,16 @@ function ProcessCommand(player, cmd)
|
|||
case "debug-print":
|
||||
print(cmd.message);
|
||||
break;
|
||||
|
||||
|
||||
case "chat":
|
||||
var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
|
||||
cmpGuiInterface.PushNotification({"type": "chat", "player": player, "message": cmd.message});
|
||||
break;
|
||||
|
||||
case "cheat":
|
||||
Cheat(cmd);
|
||||
break;
|
||||
|
||||
case "quit":
|
||||
// Let the AI exit the game for testing purposes
|
||||
var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
|
||||
|
|
|
|||
|
|
@ -13,11 +13,14 @@ function InitGame(settings)
|
|||
var cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager);
|
||||
for (var i = 0; i < settings.PlayerData.length; ++i)
|
||||
{
|
||||
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i+1), IID_Player);
|
||||
if (!settings.CheatsEnabled)
|
||||
cmpPlayer.SetCheatStatus(false);
|
||||
if (settings.PlayerData[i] && settings.PlayerData[i].AI && settings.PlayerData[i].AI != "")
|
||||
{
|
||||
cmpAIManager.AddPlayer(settings.PlayerData[i].AI, i+1);
|
||||
var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(i+1), IID_Player);
|
||||
cmpPlayer.SetAI(true);
|
||||
cmpPlayer.SetCheatEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue