import empire_ai.DiplomacyAI; class DiplomacyAction : DiplomacyAI, Action { BasicAI@ ai; DiplomacyAction(BasicAI@ ai) { @this.ai = ai; } DiplomacyAction(BasicAI@ ai, SaveFile& file) { @this.ai = ai; load(file); } void save(BasicAI@, SaveFile& file) { save(file); } string get_state() const { return "DiplomacyAI"; } Empire@ get_empire() { return ai.empire; } uint get_allyMask() { return ai.allyMask; } int64 get_hash() const { return int64(ACT_Diplomacy) << ACT_BIT_OFFSET; } ActionType get_actionType() const { return ACT_Diplomacy; } int getStanding(Empire@ emp) { auto@ rel = ai.getRelation(emp); return rel.standing; } void print(const string& str) { ::print(empire.name+": "+str); } Object@ considerOwnedPlanets(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; Object@ hw = ai.empire.Homeworld; if(hw !is null && hw.valid && hw.owner is empire) { double w = hook.consider(this, targets, vote, card, hw); if(w != 0.0) { @best = hw; bestW = w; } } auto@ reso = getRandomResource(randomi(0, 3)); if(reso !is null) { auto@ list = ai.planetsByResource[reso.id]; for(uint i = 0, cnt = list.length; i < cnt; ++i) { Object@ pl = list.planets[i]; double w = hook.consider(this, targets, vote, card, pl); if(w > bestW) { bestW = w; @best = pl; } } } return best; } Object@ considerImportantPlanets(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; Object@ hw = ai.empire.Homeworld; if(hw !is null && hw.valid && hw.owner is empire) { double w = hook.consider(this, targets, vote, card, hw); if(w != 0.0) { @best = hw; bestW = w; } } auto@ reso = getRandomResource(randomi(2, 3)); if(reso !is null) { auto@ list = ai.planetsByResource[reso.id]; for(uint i = 0, cnt = list.length; i < cnt; ++i) { Object@ pl = list.planets[i]; double w = hook.consider(this, targets, vote, card, pl); if(w > bestW) { bestW = w; @best = pl; } } } return best; } Object@ considerOwnedSystems(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; Object@ hw = ai.empire.Homeworld; if(hw !is null && hw.valid && hw.owner is empire) { Region@ reg = hw.region; if(reg !is null) { double w = hook.consider(this, targets, vote, card, reg); if(w != 0.0) { @best = reg; bestW = w; } } } auto@ reso = getRandomResource(randomi(0, 3)); if(reso !is null) { auto@ list = ai.planetsByResource[reso.id]; for(uint i = 0, cnt = list.length; i < cnt; ++i) { Object@ pl = list.planets[i]; Region@ reg = pl.region; if(reg !is null) { double w = hook.consider(this, targets, vote, card, reg); if(w > bestW) { bestW = w; @best = reg; } } } } return best; } Object@ considerImportantSystems(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; Object@ hw = ai.empire.Homeworld; if(hw !is null && hw.valid && hw.owner is empire) { Region@ reg = hw.region; if(reg !is null) { double w = hook.consider(this, targets, vote, card, reg); if(w != 0.0) { @best = reg; bestW = w; } } } auto@ reso = getRandomResource(randomi(2, 3)); if(reso !is null) { auto@ list = ai.planetsByResource[reso.id]; for(uint i = 0, cnt = list.length; i < cnt; ++i) { Object@ pl = list.planets[i]; Region@ reg = pl.region; if(reg !is null) { double w = hook.consider(this, targets, vote, card, reg); if(w > bestW) { bestW = w; @best = reg; } } } } return best; } void markProtecting(Object@ obj) { @ai.protect = null; } Object@ considerDefendingSystems(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; auto@ sys = ai.protect; if(sys is null) return null; uint friendMask = empire.mask | allyMask; if((sys.planetMask & sys.region.ContestedMask) & empire.mask != 0) { double w = hook.consider(this, targets, vote, card, sys.region); if(w > bestW) { bestW = w; @best = sys.region; } } return best; } Object@ considerDefendingPlanets(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; auto@ sys = ai.protect; if(sys is null) return null; uint friendMask = empire.mask | allyMask; if((sys.planetMask & sys.region.ContestedMask) & empire.mask != 0) { for(uint p = 0, pcnt = sys.planets.length; p < pcnt; ++p) { Object@ pl = sys.planets[p]; double w = hook.consider(this, targets, vote, card, pl); if(w > bestW) { bestW = w; @best = sys.region; } } } return best; } Object@ considerEnemySystems(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; uint enemies = enemiesMask(); for(uint n = 0; n < 5; ++n) { auto@ fromSys = ai.ourSystems[randomi(0,ai.ourSystems.length-1)]; for(uint adj = 0, adjCnt = fromSys.system.adjacent.length; adj < adjCnt; ++adj) { auto@ otherSys = getSystem(fromSys.system.adjacent[adj]); Object@ other = otherSys.object; if(otherSys.object.PlanetsMask & enemies == 0) continue; double w = hook.consider(this, targets, vote, card, other); if(w > bestW) { bestW = w; @best = other; } } } return best; } Object@ considerEnemyPlanets(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; uint enemies = enemiesMask(); for(uint n = 0; n < 5; ++n) { auto@ fromSys = ai.ourSystems[randomi(0,ai.ourSystems.length-1)]; for(uint adj = 0, adjCnt = fromSys.system.adjacent.length; adj < adjCnt; ++adj) { auto@ otherSys = getSystem(fromSys.system.adjacent[adj]); Object@ other = otherSys.object; if(otherSys.object.PlanetsMask & enemies == 0) continue; auto@ stored = ai.findSystem(otherSys.object); if(stored is null) continue; uint off = randomi(0,stored.planets.length-1); for(uint i = 0, cnt = stored.planets.length; i < cnt; ++i) { Object@ pl = stored.planets[(i+off) % cnt]; if(pl.owner.mask & enemies != 0) { double w = hook.consider(this, targets, vote, card, other); if(w > bestW) { bestW = w; @best = other; } } } } } return best; } Object@ considerFleets(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; Object@ flt = empire.getStrongestFleet(); if(flt !is null) { double w = hook.consider(this, targets, vote, card, flt); if(w != 0.0) { @best = flt; bestW = w; } } return best; } Object@ considerEnemyFleets(const CardAI& hook, Targets& targets, VoteState@ vote = null, const InfluenceCard@ card = null) { double bestW = 0.0; Object@ best; Empire@ ofEmp = getEmpire(randomi(0, getEmpireCount()-1)); if(empire.isHostile(ofEmp)) { Object@ flt = ai.empire.getStrongestFleet(); if(flt !is null && flt.isVisibleTo(ai.empire)) { double w = hook.consider(this, targets, vote, card, flt); if(w != 0.0) { @best = flt; bestW = w; } } } return best; } //Returns true if the action is finished uint nextStep = 0; bool perform(BasicAI@ ai) { summarize(); switch(nextStep++ % 3) { case 0: buyCards(); break; case 1: considerActions(); break; case 2: considerVotes(); break; } return false; } void postLoad(BasicAI@ ai) { } }; Action@ loadDiplomacyAI(BasicAI@ ai, SaveFile& file) { return DiplomacyAction(ai, file); } Action@ createDiplomacyAI(BasicAI@ ai) { return DiplomacyAction(ai); }