Cheats ... fixes #1555.

This was SVN commit r12284.
This commit is contained in:
Spahbod 2012-08-05 14:01:05 +00:00
parent 36cc1766a4
commit 202a02568b
11 changed files with 308 additions and 26 deletions

View file

@ -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;

View file

@ -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>

View file

@ -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":

View file

@ -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);

View file

@ -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);

View file

@ -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"])

View file

@ -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);
};

View 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"]
}
]
}

View 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);

View file

@ -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);

View file

@ -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);
}
}
}