forked from 0ad/0ad
179 lines
4.5 KiB
JavaScript
179 lines
4.5 KiB
JavaScript
Engine.IncludeModule("common-api");
|
|
|
|
var PETRA = (function() {
|
|
var m = {};
|
|
|
|
// "local" global variables for stuffs that will need a unique ID
|
|
// Note that since order of loading is alphabetic, this means this file must go before any other file using them.
|
|
m.playerGlobals = [];
|
|
|
|
m.PetraBot = function PetraBot(settings)
|
|
{
|
|
API3.BaseAI.call(this, settings);
|
|
|
|
this.playedTurn = 0;
|
|
this.elapsedTime = 0;
|
|
|
|
this.uniqueIDs = {
|
|
"armies": 0,
|
|
"bases": 1, // base manager ID starts at one because "0" means "no base" on the map
|
|
"plans": 0, // training/building/research plans
|
|
"transports": 1 // transport plans start at 1 because 0 might be used as none
|
|
};
|
|
|
|
this.Config = new m.Config(settings.difficulty);
|
|
|
|
this.savedEvents = {};
|
|
};
|
|
|
|
m.PetraBot.prototype = new API3.BaseAI();
|
|
|
|
m.PetraBot.prototype.CustomInit = function(gameState, sharedScript)
|
|
{
|
|
if (this.isDeserialized)
|
|
{
|
|
this.turn = this.data.turn;
|
|
this.playedTurn = this.data.playedTurn;
|
|
this.elapsedTime = this.data.elapsedTime;
|
|
this.myIndex = this.data.myIndex;
|
|
this.savedEvents = this.data.savedEvents;
|
|
for (let key in this.savedEvents)
|
|
{
|
|
for (let i in this.savedEvents[key])
|
|
{
|
|
if (!this.savedEvents[key][i].entityObj)
|
|
continue;
|
|
let evt = this.savedEvents[key][i];
|
|
let evtmod = {};
|
|
for (let keyevt in evt)
|
|
{
|
|
evtmod[keyevt] = evt[keyevt];
|
|
evtmod.entityObj = new API3.Entity(gameState.sharedScript, evt.entityObj);
|
|
this.savedEvents[key][i] = evtmod;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.Config.Deserialize(this.data.config);
|
|
|
|
this.queueManager = new m.QueueManager(this.Config, {});
|
|
this.queueManager.Deserialize(gameState, this.data.queueManager);
|
|
this.queues = this.queueManager.queues;
|
|
|
|
this.HQ = new m.HQ(this.Config);
|
|
this.HQ.init(gameState, this.queues, true);
|
|
this.HQ.Deserialize(gameState, this.data.HQ);
|
|
|
|
this.uniqueIDs = this.data.uniqueIDs;
|
|
this.isDeserialized = false;
|
|
this.data = undefined;
|
|
|
|
this.HQ.start(gameState, true);
|
|
}
|
|
else
|
|
{
|
|
this.Config.setConfig(gameState);
|
|
|
|
// this.queues can only be modified by the queue manager or things will go awry.
|
|
this.queues = {};
|
|
for (var i in this.Config.priorities)
|
|
this.queues[i] = new m.Queue();
|
|
|
|
this.queueManager = new m.QueueManager(this.Config, this.queues);
|
|
|
|
this.HQ = new m.HQ(this.Config);
|
|
|
|
var myKeyEntities = gameState.getOwnEntities().filter(API3.Filters.byClass("CivCentre"));
|
|
if (myKeyEntities.length == 0)
|
|
myKeyEntities = gameState.getOwnEntities();
|
|
this.myIndex = this.accessibility.getAccessValue(myKeyEntities.toEntityArray()[0].position());
|
|
|
|
this.HQ.init(gameState, this.queues);
|
|
|
|
this.HQ.start(gameState);
|
|
}
|
|
};
|
|
|
|
m.PetraBot.prototype.OnUpdate = function(sharedScript)
|
|
{
|
|
if (this.gameFinished)
|
|
return;
|
|
|
|
for (var i in this.events)
|
|
{
|
|
if (i == "AIMetadata" || i == "RangeUpdate") // not used inside petra
|
|
continue;
|
|
if(this.savedEvents[i] !== undefined)
|
|
this.savedEvents[i] = this.savedEvents[i].concat(this.events[i]);
|
|
else
|
|
this.savedEvents[i] = this.events[i];
|
|
}
|
|
|
|
// Run the update every n turns, offset depending on player ID to balance the load
|
|
this.elapsedTime = this.gameState.getTimeElapsed() / 1000;
|
|
if ((this.turn + this.player) % 8 == 5)
|
|
{
|
|
Engine.ProfileStart("PetraBot bot (player " + this.player +")");
|
|
|
|
this.playedTurn++;
|
|
|
|
if (this.gameState.getOwnEntities().length === 0)
|
|
{
|
|
Engine.ProfileStop();
|
|
return; // With no entities to control the AI cannot do anything
|
|
}
|
|
|
|
this.HQ.update(this.gameState, this.queues, this.savedEvents);
|
|
|
|
this.queueManager.update(this.gameState);
|
|
|
|
for (var i in this.savedEvents)
|
|
this.savedEvents[i] = [];
|
|
|
|
Engine.ProfileStop();
|
|
}
|
|
|
|
this.turn++;
|
|
};
|
|
|
|
m.PetraBot.prototype.Serialize = function()
|
|
{
|
|
let savedEvents = {};
|
|
for (let key in this.savedEvents)
|
|
{
|
|
savedEvents[key] = this.savedEvents[key].slice();
|
|
for (let i in savedEvents[key])
|
|
{
|
|
if (!savedEvents[key][i].entityObj)
|
|
continue;
|
|
let evt = savedEvents[key][i];
|
|
let evtmod = {};
|
|
for (let keyevt in evt)
|
|
evtmod[keyevt] = evt[keyevt];
|
|
evtmod.entityObj = evt.entityObj._entity;
|
|
savedEvents[key][i] = evtmod;
|
|
}
|
|
}
|
|
|
|
return {
|
|
"uniqueIDs": this.uniqueIDs,
|
|
"turn": this.turn,
|
|
"playedTurn": this.playedTurn,
|
|
"elapsedTime": this.elapsedTime,
|
|
"myIndex": this.myIndex,
|
|
"savedEvents": savedEvents,
|
|
"config": this.Config.Serialize(),
|
|
"queueManager": this.queueManager.Serialize(),
|
|
"HQ": this.HQ.Serialize()
|
|
};
|
|
};
|
|
|
|
m.PetraBot.prototype.Deserialize = function(data, sharedScript)
|
|
{
|
|
this.isDeserialized = true;
|
|
this.data = data;
|
|
};
|
|
|
|
return m;
|
|
}());
|