1
0
forked from 0ad/0ad

# Minor AI fixes.

Avoid script errors on Miletus.
Use pre-existing female citizens as workers.
Fix autostart.

This was SVN commit r8999.
This commit is contained in:
Ykkrosh 2011-02-27 19:20:36 +00:00
parent b15ea0691f
commit cb0e322a61
7 changed files with 55 additions and 14 deletions

View File

@ -102,6 +102,18 @@ var EconomyManager = Class({
return bestType;
},
reassignRolelessUnits: function(gameState)
{
var roleless = gameState.getOwnEntitiesWithRole(undefined);
roleless.forEach(function(ent) {
if (ent.hasClass("Worker"))
ent.setMetadata("role", "worker");
else
ent.setMetadata("role", "unknown");
});
},
reassignIdleWorkers: function(gameState, planGroups)
{
var self = this;
@ -197,6 +209,8 @@ var EconomyManager = Class({
update: function(gameState, planGroups)
{
this.reassignRolelessUnits(gameState);
this.buildMoreBuildings(gameState, planGroups);
this.trainMoreWorkers(gameState, planGroups);

View File

@ -4,11 +4,21 @@ var BuildingConstructionPlan = Class({
{
this.type = gameState.applyCiv(type);
this.cost = new Resources(gameState.getTemplate(this.type).cost());
var template = gameState.getTemplate(this.type);
if (!template)
{
this.invalidTemplate = true;
return;
}
this.cost = new Resources(template.cost());
},
canExecute: function(gameState)
{
if (this.invalidTemplate)
return false;
// TODO: verify numeric limits etc
var builders = gameState.findBuilders(this.type);

View File

@ -6,12 +6,22 @@ var UnitTrainingPlan = Class({
this.amount = amount;
this.metadata = metadata;
this.cost = new Resources(gameState.getTemplate(this.type).cost());
var template = gameState.getTemplate(this.type);
if (!template)
{
this.invalidTemplate = true;
return;
}
this.cost = new Resources(template.cost());
this.cost.multiply(amount); // (assume no batch discount)
},
canExecute: function(gameState)
{
if (this.invalidTemplate)
return false;
// TODO: we should probably check pop caps
var trainers = gameState.findTrainers(this.type);

View File

@ -85,6 +85,7 @@ Identity.prototype.Schema =
"<value>Town</value>" +
"<value>City</value>" +
"<value>ConquestCritical</value>" +
"<value>Worker</value>" +
"<value a:help='Primary weapon type'>Bow</value>" + // TODO: what are these used for?
"<value a:help='Primary weapon type'>Javelin</value>" +
"<value a:help='Primary weapon type'>Spear</value>" +

View File

@ -10,7 +10,7 @@ function InitGame(settings)
var cmpAIManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AIManager);
for (var i = 0; i < settings.PlayerData.length; ++i)
{
if (settings.PlayerData[i].AI != "")
if (settings.PlayerData[i] && settings.PlayerData[i].AI != "")
cmpAIManager.AddPlayer(settings.PlayerData[i].AI, i+1);
}
}

View File

@ -4,6 +4,7 @@
<GenericName>Female Citizen</GenericName>
<History>Women in the ancient world took on a variety of roles - from leadership (Celts) to servant (Greeks). Women are hard workers, the economic backbone of any civilisation. In history, it was typical when all the males (capable of fighting) were killed for the females, children, and elderly to be sold as slaves.</History>
<Tooltip>Gather resources, build civic structures, and inspire nearby males to work faster.</Tooltip>
<Classes datatype="tokens">Worker</Classes>
</Identity>
<Cost>
<Resources>

View File

@ -968,36 +968,41 @@ static bool Autostart(const CmdLineArgs& args)
ScriptInterface& scriptInterface = g_Game->GetSimulation2()->GetScriptInterface();
CScriptValRooted attrs;
scriptInterface.Eval("({})", attrs);
scriptInterface.SetProperty(attrs.get(), "mapType", std::string("scenario"), false);
scriptInterface.SetProperty(attrs.get(), "map", std::string(autostartMap), false);
scriptInterface.SetProperty(attrs.get(), "mapType", std::string("scenario"));
scriptInterface.SetProperty(attrs.get(), "map", std::string(autostartMap));
// Set attrs.settings = { AIs: [...] }:
// Set attrs.settings = { PlayerData: [ { AI: ... }, ... ] }:
/*
* Handle command-line options for AI:
* -autostart-ai=1:dummybot -autostart-ai=2:dummybot -- adds the dummybot AI to players 1 and 2
*/
CScriptValRooted ais;
scriptInterface.Eval("([])", ais);
CScriptVal playerData;
scriptInterface.Eval("([])", playerData);
if (args.Has("autostart-ai"))
{
std::vector<CStr> aiArgs = args.GetMultiple("autostart-ai");
for (size_t i = 0; i < aiArgs.size(); ++i)
{
int player = aiArgs[i].BeforeFirst(":").ToInt();
CScriptVal player;
scriptInterface.Eval("({})", player);
int playerID = aiArgs[i].BeforeFirst(":").ToInt();
CStr name = aiArgs[i].AfterFirst(":");
scriptInterface.SetPropertyInt(ais.get(), player, std::string(name), false);
scriptInterface.SetProperty(player.get(), "AI", std::string(name));
scriptInterface.SetPropertyInt(playerData.get(), playerID-1, player);
}
}
CScriptValRooted settings;
CScriptVal settings;
scriptInterface.Eval("({})", settings);
scriptInterface.SetProperty(settings.get(), "AIs", ais, false);
scriptInterface.SetProperty(attrs.get(), "settings", settings, false);
scriptInterface.SetProperty(settings.get(), "PlayerData", playerData);
scriptInterface.SetProperty(attrs.get(), "settings", settings);
CScriptValRooted mpInitData;
CScriptVal mpInitData;
g_GUI->GetScriptInterface().Eval("({isNetworked:true, playerAssignments:{}})", mpInitData);
g_GUI->GetScriptInterface().SetProperty(mpInitData.get(), "attribs",
CScriptVal(g_GUI->GetScriptInterface().CloneValueFromOtherContext(scriptInterface, attrs.get())), false);