Files
2018-07-17 14:15:37 +02:00

1271 lines
32 KiB
ActionScript

#priority init 1501
import maps;
#section game
import dialogue;
#section all
#section server
import object_creation;
import influence;
import tile_resources;
import scenario;
from influence import InfluenceStore;
from influence_global import influenceLock, cardStack, deck, nextStackId, StackInfluenceCard;
import systems;
import map_loader;
#section all
Tutorial _map;
class Tutorial : Map {
Tutorial() {
super();
isListed = false;
isScenario = true;
}
#section server
void prepareSystem(SystemData@ data, SystemDesc@ desc) {
@data.homeworlds = null;
Map::prepareSystem(data, desc);
}
bool canHaveHomeworld(SystemData@ data, Empire@ emp) {
return false;
}
void preGenerate() {
Map::preGenerate();
radius = 40000;
}
void placeSystems() {
loadMap("maps/Tutorial/map.txt").generate(this);
}
void modSettings(GameSettings& settings) {
settings.empires.length = 2;
settings.empires[0].name = locale::TUT_PLAYER_EMP;
settings.empires[1].name = locale::TUT_ENEMY_EMP;
settings.empires[1].shipset = "Gevron";
settings.empires[1].type = ET_NoAI;
config::ENABLE_UNIQUE_SPREADS = 0.0;
config::DISABLE_STARTING_FLEETS = 1.0;
config::ENABLE_DREAD_PIRATE = 0.0;
config::ENABLE_INFLUENCE_EVENTS = 0.0;
config::START_EXPLORED_MAP = 1.0;
}
void enemyPlanet(uint systemId, uint planetId) {
auto@ sys = systemData[systemId];
auto@ planet = sys.planets[planetId];
planet.addPopulation(1.0);
@planet.owner = enemyEmp;
}
Empire@ enemyEmp;
const SystemDesc@ lihls;
const SystemDesc@ yingmow;
Planet@ spacewood;
bool ownsSpacewood = false;
void spawnPlayerFleet() {
auto@ leaderDsg = playerEmpire.getDesign("Battleship");
auto@ sup1Dsg = playerEmpire.getDesign("Beamship");
auto@ sup2Dsg = playerEmpire.getDesign("Heavy Gunship");
auto@ sup3Dsg = playerEmpire.getDesign("Missile Boat");
vec3d pos = systemData[0].position + vec3d(200, 0, 900);
Ship@ leader = createShip(pos, leaderDsg, playerEmpire, free=true);
leader.name = locale::TUT_FLAGSHIP_NAME;
leader.setHoldPosition(true);
playerEmpire.registerFleet(leader);
for(uint i = 0; i < 25; ++i)
createShip(pos, sup1Dsg, playerEmpire, leader);
for(uint i = 0; i < 25; ++i)
createShip(pos, sup2Dsg, playerEmpire, leader);
for(uint i = 0; i < 25; ++i)
createShip(pos, sup3Dsg, playerEmpire, leader);
}
void spawnEnemyFleet(const vec3d& pos, const string& base = "Battleship", uint supBase = 25, bool aggro = false) {
auto@ leaderDsg = enemyEmp.getDesign(base);
auto@ sup1Dsg = enemyEmp.getDesign("Beamship");
auto@ sup2Dsg = enemyEmp.getDesign("Heavy Gunship");
auto@ sup3Dsg = enemyEmp.getDesign("Missile Boat");
Ship@ leader = createShip(pos, leaderDsg, enemyEmp, free=true);
if(!aggro)
leader.setHoldPosition(true);
for(uint i = 0; i < supBase; ++i)
createShip(pos, sup1Dsg, enemyEmp, leader);
for(uint i = 0; i < supBase; ++i)
createShip(pos, sup2Dsg, enemyEmp, leader);
for(uint i = 0; i < supBase; ++i)
createShip(pos, sup3Dsg, enemyEmp, leader);
}
void init() {
@enemyEmp = getEmpire(1);
@lihls = systems[1];
@yingmow = systems[3];
@spacewood = systemData[1].planets[0];
playerEmpire.setHostile(enemyEmp, true);
playerEmpire.Victory = -3;
enemyEmp.Victory = -3;
enemyEmp.setHostile(playerEmpire, true);
playerEmpire.ContactMask.value = int(~0);
initDialogue();
}
void postInit() {
@enemyEmp = getEmpire(1);
@lihls = systems[1];
@yingmow = systems[3];
@spacewood = systemData[1].planets[0];
//Player influence
{
playerEmpire.modInfluence(+50);
auto@ type = getInfluenceCardType("AnnexSystem");
InfluenceCard@ card = type.create();
cast<InfluenceStore>(playerEmpire.InfluenceManager).addCard(playerEmpire, card);
}
//Player FTL
playerEmpire.modFTLStored(+250);
//Set up planets
enemyPlanet(2, 3);
enemyPlanet(3, 1);
enemyPlanet(3, 2);
enemyPlanet(3, 3);
systemData[3].planets[1].exportResource(0, systemData[3].planets[3]);
systemData[3].planets[2].exportResource(0, systemData[3].planets[3]);
//Set up initial fleets
spawnPlayerFleet();
Orbital@ orb = createOrbital(systemData[0].position + vec3d(600, 0, 200), getOrbitalModule("GateCore"), enemyEmp);
orb.modMaxHealth(-5500);
orb.modMaxArmor(-2500);
spawnEnemyFleet(systemData[0].position + vec3d(700, 0, 250), "Dreadnaught", 5);
spawnEnemyFleet(systemData[0].position + vec3d(500, 0, 150), "Dreadnaught", 5);
//Defenses for phasite
{
auto@ enemySup = enemyEmp.getDesign("Beamship");
vec3d pos = systemData[2].planets[3].position;
for(uint i = 0; i < 20; ++i)
createShip(pos, enemySup, enemyEmp, systemData[2].planets[3]);
}
guiDialogueAction(CURRENT_PLAYER, "Tutorial.Tutorial::ZoomFleet");
}
void initDialogue() {
//Prepare dialogue
Dialogue("TUT_INTRO")
.onPass(GUIAction("Tutorial.Tutorial::HideGUI"));
Dialogue("TUT_INTRO2");
Dialogue("TUT_INTRO3");
Dialogue("TUT_CAM")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckPan"))
.checker(2, GUIChecker("Tutorial.Tutorial::CheckZoom"))
.checker(3, GUIChecker("Tutorial.Tutorial::CheckRotate"));
Dialogue("TUT_TIME")
.onPass(GUIAction("Tutorial.Tutorial::ShowTime"));
Dialogue("TUT_SCAN")
.checker(1, CheckFleetSelect())
.checker(2, CheckFleetAttack())
.checker(3, CheckDestroyGate());
Dialogue("TUT_FTL");
Dialogue("TUT_FTL2")
.objectiveKeybind(1, KB_FTL)
.checker(1, CheckSystemArrive())
.onPass(GUIAction("Tutorial.Tutorial::ShowFTL"))
.onComplete(GainSpacewood(this));
Dialogue("TUT_ARRIVE");
Dialogue("TUT_RES");
Dialogue("TUT_LEVEL");
Dialogue("TUT_LEVEL2");
Dialogue("TUT_EXPAND")
.checker(1, CheckColonizeFood())
.checker(2, CheckExportFood())
.checker(3, CheckColonizeTier1())
.checker(4, CheckExportTier1());
Dialogue("TUT_LEVELREQS");
Dialogue("TUT_IMPORT1")
.checker(1, CheckLevel1());
Dialogue("TUT_IMPORT2")
.checker(1, CheckLevel2());
Dialogue("TUT_EXPAND_SUCC")
.onPass(GUIAction("Tutorial.Tutorial::ShowPlanets"));
Dialogue("TUT_BUDGET")
.onPass(GUIAction("Tutorial.Tutorial::ShowMoney"));
Dialogue("TUT_BUDGET2");
Dialogue("TUT_BUILD")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckPlanetOverlay", spacewood))
.checker(2, CheckBuildScout()) ;
Dialogue("TUT_BUILD2")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckNoOverlay"))
.checker(2, GUIChecker("Tutorial.Tutorial::CheckFleetOverlay"))
.checker(3, CheckReinforceFleet())
.checker(4, CheckScoutFinished());
Dialogue("TUT_SCOUT")
.checker(1, CheckScouted());
Dialogue("TUT_CONQ")
.checker(1, CheckFleetMoved())
.checker(2, CheckDefenseKilled())
.checker(3, CheckCaptured());
Dialogue("TUT_CAPT")
.checker(1, CheckPhasiteImport())
.onPass(GUIAction("Tutorial.Tutorial::ShowQuickbars"));
Dialogue("TUT_PRES");
Dialogue("TUT_BLD")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckPlanetOverlay", spacewood))
.checker(2, GUIChecker("Tutorial.Tutorial::CheckBuildingsList"))
.checker(3, CheckResearchComplex())
.onComplete(GainResearchRate());
Dialogue("TUT_RSC")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckResearchTab"))
.checker(2, CheckResearchArmoring())
.checker(3, CheckResearchBulkhead())
.onPass(GUIAction("Tutorial.Tutorial::ShowResearch"));
Dialogue("TUT_DSG")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckDesignEdit"))
.onPass(GUIAction("Tutorial.Tutorial::ShowDesigns"));
Dialogue("TUT_DSG2");
Dialogue("TUT_DSG3")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckDesignArmor"));
Dialogue("TUT_DSG4")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckDesignBulkhead"))
.checker(2, GUIChecker("Tutorial.Tutorial::CheckDesignSaved"));
Dialogue("TUT_FLT")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckPlanetOverlay", spacewood))
.checker(2, CheckBuildCarrier())
.checker(3, CheckAddBeamships())
.checker(4, CheckAddSupports())
.checker(5, CheckFinishCarrier())
.onComplete(GainEnergy());
Dialogue("TUT_ENG")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckArtifactTarget"))
.checker(2, CheckArtifactEquip())
.onPass(GUIAction("Tutorial.Tutorial::ShowEnergy"));
Dialogue("TUT_INF")
.onPass(GUIAction("Tutorial.Tutorial::ShowInfluence"));
Dialogue("TUT_INF2")
.onPass(GUIAction("Tutorial.Tutorial::ShowInfluenceTab"));
Dialogue("TUT_INF3")
.checker(1, CheckBuySpy())
.checker(2, CheckActivateSpy())
.onComplete(ShowSpySystem());
Dialogue("TUT_INF4");
Dialogue("TUT_SPY")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckViewSpy"));
Dialogue("TUT_ANNEX")
.checker(1, CheckStartVote());
Dialogue("TUT_VOTE");
Dialogue("TUT_VOTE2")
.onComplete(EnemyPlayRhetoric());
Dialogue("TUT_VOTE3")
.checker(1, CheckPlayNegotiate())
.checker(2, CheckWinVote());
Dialogue("TUT_ANNEX2");
Dialogue("TUT_DEFCORE")
.checker(1, GUIChecker("Tutorial.Tutorial::CheckPlanetOverlay", spacewood))
.checker(2, GUIChecker("Tutorial.Tutorial::CheckOrbitalsList"))
.checker(3, GUIChecker("Tutorial.Tutorial::CheckTargetDefPlat"))
.checker(4, CheckOrbitalPlaced())
.onComplete(GainDefenseGen(this));
Dialogue("TUT_DEFPROJ")
.onPass(GUIAction("Tutorial.Tutorial::ShowDefense"))
.checker(1, CheckDefenseProject())
.checker(2, CheckMoveFleet());
Dialogue("TUT_DEF")
.onPass(GUIAction("Tutorial.Tutorial::ShowTabStuff"))
.proceedWith(locale::ENTER_COMBAT)
.onComplete(SpawnAttackFleets(this));
Dialogue("TUT_DEF2")
.checker(1, CheckDefeatEnemies());
Dialogue("TUT_FINAL")
.proceedWith(locale::CLOSE)
.onPass(GUIAction("Tutorial.Tutorial::ShowWiki"));
}
bool initialized = false;
void tick(double time) {
if(!initialized && !isLoadedSave) {
initialized = true;
postInit();
}
//Make sure there's always a spy in the stack
{
Lock lck(influenceLock);
auto@ spyType = getInfluenceCardType("Spy");
bool found = false;
for(uint i = 1, cnt = cardStack.length; i < cnt; ++i) {
if(cardStack[i].type is spyType) {
found = true;
break;
}
}
if(!found && (deck.length == 0 || deck.last.type !is spyType)) {
StackInfluenceCard card;
card.id = nextStackId++;
spyType.generate(card);
@card.targets.fill("target").emp = enemyEmp;
deck.insertLast(card);
}
}
}
void save(SaveFile& file) {
file << enemyEmp;
file << spacewood;
file << ownsSpacewood;
saveDialoguePosition(file);
}
void load(SaveFile& file) {
file >> enemyEmp;
file >> spacewood;
file >> ownsSpacewood;
@enemyEmp = getEmpire(1);
@lihls = getSystem(1);
@yingmow = getSystem(3);
initDialogue();
loadDialoguePosition(file);
}
#section all
};
#section server
from orders import OrderType;
import planets.PlanetSurface;
import research;
import constructible;
import statuses;
import influence;
import influence_global;
class GainSpacewood : DialogueAction {
Tutorial@ tut;
GainSpacewood(Tutorial@ tut) { @this.tut = tut; }
void call() {
@tut.spacewood.owner = playerEmpire;
tut.spacewood.addPopulation(3.0);
tut.ownsSpacewood = true;
@playerEmpire.Homeworld = tut.spacewood;
}
}
class GainDefenseGen : DialogueAction {
Tutorial@ tut;
GainDefenseGen(Tutorial@ tut) { @this.tut = tut; }
void call() {
tut.spacewood.modResource(TR_Defense, +10);
}
}
class SpawnAttackFleets : DialogueAction {
Tutorial@ tut;
SpawnAttackFleets(Tutorial@ tut) { @this.tut = tut; }
void call() {
for(uint i = 0; i < 3; ++i) {
vec3d pos = tut.yingmow.position;
vec2d offset = random2d(tut.yingmow.radius - 150.0);
pos.x += offset.x;
pos.z += offset.y;
tut.spawnEnemyFleet(pos, "Dreadnaught", 5, aggro=true);
}
}
};
class GainResearchRate : DialogueAction {
void call() {
playerEmpire.generatePoints(900);
playerEmpire.modResearchRate(+2.0);
}
};
class GainEnergy : DialogueAction {
void call() {
playerEmpire.modEnergyStored(+500);
}
};
class ShowSpySystem : DialogueAction {
void call() {
getSystem(3).object.grantVision(playerEmpire);
}
};
class EnemyPlayRhetoric : DialogueAction {
void call() {
Empire@ enemy = getEmpire(1);
auto@ votes = getActiveInfluenceVotes();
InfluenceVoteStub@ stub;
for(uint i = 0, cnt = votes.length; i < cnt; ++i) {
if(votes[i].type.ident == "AnnexSystem")
@stub = votes[i];
}
if(stub is null)
return;
Lock lock(influenceLock);
auto@ type = getInfluenceCardType("Rhetoric");
InfluenceCard@ card = type.create();
int id = cast<InfluenceStore>(enemy.InfluenceManager).addCard(enemy, card);
Targets targets = card.targets;
targets.fill("VoteSide").side = false;
enemy.modInfluence(+100);
playInfluenceCard_server(enemy, id, targets, stub.id);
}
};
class CheckFleetSelect : ObjectiveCheck {
bool check() {
return playerEmpire.fleets[0].selected;
}
};
class CheckFleetAttack : ObjectiveCheck {
bool check() {
//Either the player issued the attack order, or has already destroyed everything in the system
return playerEmpire.fleets[0].hasOrder(OT_Attack) || (getSystem(0).object.BasicVisionMask & getEmpire(1).mask == 0);
}
};
class CheckDestroyGate : ObjectiveCheck {
bool check() {
return !getEmpire(1).hasStargates() || getSystem(0).object.BasicVisionMask & getEmpire(1).mask == 0;
}
};
class CheckSystemArrive : ObjectiveCheck {
bool check() {
return getSystem(1).object.BasicVisionMask & playerEmpire.mask != 0;
}
};
class CheckColonizeNeeds : ObjectiveCheck {
bool check() {
bool hasLevel1 = false, hasFood = false;
for(uint i = 0, cnt = systemCount; i < cnt; ++i) {
Region@ reg = getSystem(i).object;
if(reg.BasicVisionMask & playerEmpire.mask == 0)
continue;
for(uint j = 0, jcnt = reg.planetCount; j < jcnt; ++j) {
auto@ pl = reg.planets[j];
if(pl.owner is playerEmpire && pl.population >= 1.0) {
auto@ r = getResource(pl.primaryResourceType);
if(r.level == 1)
hasLevel1 = true;
else if(r.cls !is null && r.cls is getResourceClass("Food"))
hasFood = true;
}
}
if(hasLevel1 && hasFood)
return true;
}
return false;
}
};
class CheckColonizeFood : ObjectiveCheck {
bool check() {
bool hasFood = false;
for(uint i = 0, cnt = systemCount; i < cnt; ++i) {
Region@ reg = getSystem(i).object;
if(reg.BasicVisionMask & playerEmpire.mask == 0)
continue;
for(uint j = 0, jcnt = reg.planetCount; j < jcnt; ++j) {
auto@ pl = reg.planets[j];
if(pl is playerEmpire.Homeworld)
continue;
if(pl.owner is playerEmpire && pl.population >= 1.0) {
auto@ r = getResource(pl.primaryResourceType);
if(r.cls !is null && r.cls is getResourceClass("Food"))
return true;
}
}
}
return false;
}
};
class CheckColonizeTier1 : ObjectiveCheck {
bool check() {
bool hasFood = false;
for(uint i = 0, cnt = systemCount; i < cnt; ++i) {
Region@ reg = getSystem(i).object;
if(reg.BasicVisionMask & playerEmpire.mask == 0)
continue;
for(uint j = 0, jcnt = reg.planetCount; j < jcnt; ++j) {
auto@ pl = reg.planets[j];
if(pl.owner is playerEmpire && pl.population >= 1.0) {
auto@ r = getResource(pl.primaryResourceType);
if(r.level == 1)
return true;
}
}
}
return false;
}
};
class CheckExportFood : ObjectiveCheck {
bool check() {
bool hasFood = false;
for(uint i = 0, cnt = systemCount; i < cnt; ++i) {
Region@ reg = getSystem(i).object;
if(reg.BasicVisionMask & playerEmpire.mask == 0)
continue;
for(uint j = 0, jcnt = reg.planetCount; j < jcnt; ++j) {
auto@ pl = reg.planets[j];
if(pl is playerEmpire.Homeworld)
continue;
if(pl.owner is playerEmpire && pl.population >= 1.0) {
auto@ r = getResource(pl.primaryResourceType);
if(r.cls !is null && r.cls is getResourceClass("Food")) {
if(pl.nativeResourceDestination[0] is playerEmpire.Homeworld)
return true;
}
}
}
}
return false;
}
};
class CheckExportTier1 : ObjectiveCheck {
bool check() {
bool hasFood = false;
for(uint i = 0, cnt = systemCount; i < cnt; ++i) {
Region@ reg = getSystem(i).object;
if(reg.BasicVisionMask & playerEmpire.mask == 0)
continue;
for(uint j = 0, jcnt = reg.planetCount; j < jcnt; ++j) {
auto@ pl = reg.planets[j];
if(pl.owner is playerEmpire && pl.population >= 1.0) {
auto@ r = getResource(pl.primaryResourceType);
if(r.level == 1) {
if(pl.nativeResourceDestination[0] is playerEmpire.Homeworld)
return true;
}
}
}
}
return false;
}
};
class CheckLevel1 : ObjectiveCheck {
bool check() {
Region@ reg = getSystem(1).object;
Planet@ pl = reg.planets[1];
if(pl.owner is playerEmpire && pl.resourceLevel == 1)
return true;
@reg = getSystem(3).object;
@pl = reg.planets[3];
if(pl.owner is playerEmpire && pl.resourceLevel == 1)
return true;
return false;
}
};
class CheckLevel2 : ObjectiveCheck {
bool check() {
Region@ reg = getSystem(1).object;
Planet@ pl = reg.planets[0];
if(pl.owner is playerEmpire && pl.resourceLevel == 2)
return true;
return false;
}
};
class CheckBuildScout : ObjectiveCheck {
bool check() {
Planet@ hw = playerEmpire.Homeworld;
if(hw.constructionCount != 0 && hw.constructionName[0] == "Scout")
return true;
return false;
}
};
class CheckReinforceFleet : ObjectiveCheck {
bool check() {
return playerEmpire.fleets[0].hasOrderedSupports;
}
};
class CheckScoutFinished : ObjectiveCheck {
bool check() {
for(uint i = 0, cnt = playerEmpire.fleetCount; i < cnt; ++i) {
Ship@ ship = cast<Ship>(playerEmpire.fleets[i]);
if(ship !is null && ship.blueprint.design.name == "Scout")
return true;
}
return false;
}
};
class CheckScouted : ObjectiveCheck {
bool check() {
return getSystem(2).object.BasicVisionMask & playerEmpire.mask != 0;
}
};
class CheckFleetMoved : ObjectiveCheck {
bool check() {
return playerEmpire.fleets[0].region is getSystem(2).object;
}
};
class CheckDefenseKilled : ObjectiveCheck {
bool check() {
auto@ pl = getSystem(2).object.planets[3];
return pl.supportCount == 0 || pl.owner is playerEmpire;
}
};
class CheckCaptured : ObjectiveCheck {
bool check() {
return getSystem(2).object.planets[3].owner is playerEmpire;
}
};
class CheckPhasiteImport : ObjectiveCheck {
bool check() {
return getSystem(2).object.planets[3].nativeResourceDestination[0] is playerEmpire.Homeworld;
}
};
class CheckResearchComplex : ObjectiveCheck {
bool check() {
Planet@ hw = playerEmpire.Homeworld;
PlanetSurface surface;
receive(hw.getPlanetSurface(), surface);
for(uint i = 0, cnt = surface.buildings.length; i < cnt; ++i) {
if(surface.buildings[i].type.ident == "ResearchComplex")
return true;
}
return false;
}
};
class CheckResearchArmoring : ObjectiveCheck {
TechnologyNode node;
bool check() {
receive(playerEmpire.getTechnologyNode(vec2i(-1,1)), node);
return node.unlocked;
}
};
class CheckResearchBulkhead : ObjectiveCheck {
TechnologyNode node;
bool check() {
receive(playerEmpire.getTechnologyNode(vec2i(0,2)), node);
return node.unlocked;
}
};
class CheckBuildCarrier : ObjectiveCheck {
bool check() {
Planet@ hw = playerEmpire.Homeworld;
if(hw.constructionCount != 0 && hw.constructionName[0] == "Heavy Carrier")
return true;
return false;
}
};
class CheckAddBeamships : ObjectiveCheck {
bool check() {
Planet@ hw = playerEmpire.Homeworld;
if(hw.constructionCount == 0 || hw.constructionName[0] != "Heavy Carrier")
return true;
Constructible cons;
receive(hw.getConstructionQueue(1), cons);
for(uint i = 0, cnt = cons.groups.length; i < cnt; ++i) {
if(cons.groups[i].dsg.name == "Beamship")
return true;
}
return false;
}
};
class CheckAddSupports : ObjectiveCheck {
bool check() {
Planet@ hw = playerEmpire.Homeworld;
if(hw.constructionCount == 0 || hw.constructionName[0] != "Heavy Carrier")
return true;
Constructible cons;
receive(hw.getConstructionQueue(1), cons);
for(uint i = 0, cnt = cons.groups.length; i < cnt; ++i) {
if(cons.groups[i].dsg.name != "Beamship")
return true;
}
return false;
}
};
class CheckFinishCarrier : ObjectiveCheck {
bool check() {
for(uint i = 1, cnt = playerEmpire.fleetCount; i < cnt; ++i) {
Ship@ ship = cast<Ship>(playerEmpire.fleets[i]);
if(ship !is null && ship.blueprint.design.name == "Heavy Carrier")
return true;
}
return false;
}
};
class CheckArtifactEquip : ObjectiveCheck {
bool check() {
auto@ status = getStatusType("PowerCell");
for(uint i = 0, cnt = playerEmpire.fleetCount; i < cnt; ++i) {
Ship@ ship = cast<Ship>(playerEmpire.fleets[i]);
if(ship is null)
continue;
if(ship.hasStatuses && ship.hasStatusEffect(status.id))
return true;
}
return false;
}
};
class CheckBuySpy : ObjectiveCheck {
bool check() {
array<InfluenceCard> cards;
cards.syncFrom(playerEmpire.getInfluenceCards());
for(uint i = 0, cnt = cards.length; i < cnt; ++i) {
if(cards[i].type.ident == "Spy")
return true;
}
return false;
}
};
class CheckActivateSpy : ObjectiveCheck {
bool check() {
auto@ effects = getActiveInfluenceEffects();
for(uint i = 0, cnt = effects.length; i < cnt; ++i) {
if(effects[i].type.ident == "Spy")
return true;
}
return false;
}
};
class CheckStartVote : ObjectiveCheck {
bool check() {
if(getEmpire(1).TotalPlanets.value == 0)
return true;
auto@ votes = getActiveInfluenceVotes();
for(uint i = 0, cnt = votes.length; i < cnt; ++i) {
if(votes[i].type.ident == "AnnexSystem")
return true;
}
return false;
}
};
class CheckPlayNegotiate : ObjectiveCheck {
bool check() {
auto@ votes = getActiveInfluenceVotes();
InfluenceVoteStub@ stub;
for(uint i = 0, cnt = votes.length; i < cnt; ++i) {
if(votes[i].type.ident == "AnnexSystem")
@stub = votes[i];
}
if(stub is null)
return true;
Lock lock(influenceLock);
auto@ vote = getInfluenceVoteByID(stub.id);
if(vote.currentTime < -120.0)
vote.currentTime = -120.0;
for(uint i = 0, cnt = vote.events.length; i < cnt; ++i) {
auto@ evt = vote.events[i];
if(evt.cardEvent !is null && evt.cardEvent.card.type.ident == "Negotiate")
return true;
}
return false;
}
};
class CheckWinVote : ObjectiveCheck {
double startTime = 0.0;
bool start() {
startTime = gameTime;
return true;
}
bool check() {
auto@ votes = getActiveInfluenceVotes();
InfluenceVoteStub@ stub;
for(uint i = 0, cnt = votes.length; i < cnt; ++i) {
if(votes[i].type.ident == "AnnexSystem")
@stub = votes[i];
}
if(stub is null)
return true;
Lock lock(influenceLock);
auto@ vote = getInfluenceVoteByID(stub.id);
if(vote.currentTime < -120.0)
vote.currentTime = -120.0;
if(gameTime > startTime + 30.0) {
startTime = INFINITY;
Empire@ enemy = getEmpire(1);
auto@ type = getInfluenceCardType("Negotiate");
InfluenceCard@ card = type.create();
int id = cast<InfluenceStore>(enemy.InfluenceManager).addCard(enemy, card);
Targets targets = card.targets;
targets.fill("VoteSide").side = false;
playInfluenceCard_server(enemy, id, targets, stub.id);
}
return false;
}
};
class CheckOrbitalPlaced : ObjectiveCheck {
bool check() {
Planet@ hw = playerEmpire.Homeworld;
if(hw.constructionCount != 0 && hw.constructionName[0] == "Defense Platform")
return true;
return false;
}
};
class CheckDefenseProject : ObjectiveCheck {
bool check() {
return playerEmpire.isDefending(getSystem(3).object);
}
};
class CheckMoveFleet : ObjectiveCheck {
bool check() {
bool moved = false, created = false;
for(uint i = 1, cnt = playerEmpire.fleetCount; i < cnt; ++i) {
Ship@ ship = cast<Ship>(playerEmpire.fleets[i]);
if(ship is null)
continue;
if(ship.blueprint.design.name == "Defense Platform") {
created = true;
}
else if(ship.region is getSystem(3).object)
moved = true;
}
return moved && created;
}
};
class CheckDefeatEnemies : ObjectiveCheck {
double startTime = 0.0;
bool start() {
startTime = gameTime;
return true;
}
bool check() {
if(gameTime < startTime + 5.0)
return false;
return getEmpire(1).fleetCount == 0;
}
};
#section gui
from tabs.tabbar import tabBar, globalBar, closeTab, tabs, newTab, ActiveTab;
from tabs.GlobalBar import GlobalBar;
from tabs.GalaxyTab import GalaxyTab;
from tabs.PlanetsTab import createPlanetsTab;
from tabs.ResearchTab import createResearchTab, ResearchTab;
from tabs.DiplomacyTab import createDiplomacyTab;
from community.Home import createCommunityHome;
from tabs.DesignOverviewTab import createDesignOverviewTab;
from tabs.DesignEditorTab import DesignEditor;
from navigation.SmartCamera import CAM_PANNED, CAM_ZOOMED, CAM_ROTATED;
from overlays.PlanetInfoBar import PlanetInfoBar;
from overlays.Supports import SupportOverlay;
from overlays.Construction import OrbitalTarget;
from targeting.targeting import mode;
from targeting.ObjectTarget import AbilityTargetObject, ObjectMode;
from targeting.PointTarget import PointTargetMode;
from overlays.TimeDisplay import ShowTimeDisplay;
class HideGUI : DialogueAction {
void call() {
//Global bar
auto@ gbar = cast<GlobalBar>(globalBar);
gbar.budget.visible = false;
gbar.energy.visible = false;
gbar.defense.visible = false;
gbar.ftl.visible = false;
gbar.influence.visible = false;
gbar.research.visible = false;
//Tab bar
tabBar.goButton.visible = false;
tabBar.newButton.visible = false;
tabBar.homeButton.visible = false;
for(uint i = 1, cnt = tabs.length; i < cnt; ++i)
closeTab(tabs[1]);
tabs[0].locked = true;
//Quickbar
auto@ gtab = cast<GalaxyTab>(tabs[0]);
gtab.quickbar.visible = false;
//Hide the timer
ShowTimeDisplay = false;
}
};
class ZoomFleet : DialogueAction {
void call() {
auto@ gtab = cast<GalaxyTab>(tabs[0]);
gtab.zoomTo(playerEmpire.fleets[0]);
}
};
class ShowTime : DialogueAction {
void call() {
ShowTimeDisplay = true;
}
};
class ShowFTL : DialogueAction {
void call() {
auto@ gbar = cast<GlobalBar>(globalBar);
gbar.ftl.visible = true;
}
};
class ShowPlanets : DialogueAction {
void call() {
//Show planets tab
newTab(createPlanetsTab());
tabs[1].locked = true;
}
};
class ShowMoney : DialogueAction {
void call() {
auto@ gbar = cast<GlobalBar>(globalBar);
gbar.budget.visible = true;
}
};
class ShowQuickbars : DialogueAction {
void call() {
//Show planets quickbars
auto@ gtab = cast<GalaxyTab>(tabs[0]);
gtab.quickbar.visible = true;
gtab.quickbar.modes[0].closed = true;
gtab.quickbar.modes[11].closed = true;
gtab.quickbar.quickButton.visible = false;
}
};
class ShowResearch : DialogueAction {
void call() {
auto@ gbar = cast<GlobalBar>(globalBar);
gbar.research.visible = true;
newTab(createResearchTab());
tabs[2].locked = true;
}
};
class ShowDesigns : DialogueAction {
void call() {
newTab(createDesignOverviewTab());
tabs[3].locked = true;
}
};
class ShowEnergy : DialogueAction {
void call() {
auto@ gbar = cast<GlobalBar>(globalBar);
gbar.energy.visible = true;
auto@ gtab = cast<GalaxyTab>(tabs[0]);
gtab.quickbar.modes[11].closed = false;
}
};
class ShowDefense : DialogueAction {
void call() {
auto@ gbar = cast<GlobalBar>(globalBar);
gbar.defense.visible = true;
}
};
class ShowInfluence : DialogueAction {
void call() {
auto@ gbar = cast<GlobalBar>(globalBar);
gbar.influence.visible = true;
}
};
class ShowInfluenceTab : DialogueAction {
void call() {
newTab(createDiplomacyTab());
tabs[4].locked = true;
}
};
class ShowTabStuff : DialogueAction {
void call() {
tabBar.goButton.visible = true;
tabBar.newButton.visible = true;
tabBar.homeButton.visible = true;
for(uint i = 0; i < 5; ++i)
tabs[i].locked = false;
auto@ gtab = cast<GalaxyTab>(tabs[0]);
gtab.quickbar.modes[0].closed = false;
gtab.quickbar.quickButton.visible = true;
}
};
class ShowWiki : DialogueAction {
void call() {
newTab(createCommunityHome());
}
};
class CheckPan : GuiObjectiveCheck {
bool start() {
CAM_PANNED = false;
return true;
}
bool check() {
return CAM_PANNED;
}
};
class CheckZoom : GuiObjectiveCheck {
bool start() {
CAM_ZOOMED = false;
return true;
}
bool check() {
return CAM_ZOOMED;
}
};
class CheckRotate : GuiObjectiveCheck {
bool start() {
CAM_ROTATED = false;
return true;
}
bool check() {
return CAM_ROTATED;
}
};
class CheckPlanetOverlay : GuiObjectiveCheck {
bool check() {
auto@ gtab = cast<GalaxyTab>(tabs[0]);
if(gtab !is ActiveTab)
return false;
auto@ ibar = cast<PlanetInfoBar>(gtab.infoBar);
if(ibar is null)
return false;
if(ibar.overlay is null || !ibar.overlay.visible)
return false;
return ibar.overlay.obj is obj;
}
};
class CheckBuildingsList : GuiObjectiveCheck {
bool check() {
auto@ gtab = cast<GalaxyTab>(tabs[0]);
if(gtab !is ActiveTab)
return false;
auto@ ibar = cast<PlanetInfoBar>(gtab.infoBar);
if(ibar is null)
return false;
if(ibar.overlay is null || !ibar.overlay.visible)
return false;
return ibar.overlay.construction.buildingsList.visible;
}
};
class CheckOrbitalsList : GuiObjectiveCheck {
bool check() {
auto@ gtab = cast<GalaxyTab>(tabs[0]);
if(gtab !is ActiveTab)
return false;
auto@ ibar = cast<PlanetInfoBar>(gtab.infoBar);
if(ibar is null)
return false;
if(ibar.overlay is null || !ibar.overlay.visible)
return false;
return ibar.overlay.construction.orbitalsList.visible;
}
};
class CheckNoOverlay : GuiObjectiveCheck {
bool check() {
auto@ gtab = cast<GalaxyTab>(tabs[0]);
if(gtab !is ActiveTab)
return false;
return gtab.infoBar is null || !gtab.infoBar.showingManage;
}
};
class CheckFleetOverlay : GuiObjectiveCheck {
bool check() {
auto@ gtab = cast<GalaxyTab>(tabs[0]);
if(gtab !is ActiveTab)
return false;
auto@ overlay = cast<SupportOverlay>(gtab.overlay);
if(overlay is null || !overlay.visible)
return false;
return true;
}
};
class CheckResearchTab : GuiObjectiveCheck {
bool check() {
return cast<ResearchTab>(ActiveTab) !is null;
}
};
class CheckDesignEdit : GuiObjectiveCheck {
bool check() {
auto@ tab = cast<DesignEditor>(ActiveTab);
if(tab is null)
return false;
if(tab.originalDesign is null)
return false;
return tab.originalDesign.name == "Heavy Carrier";
}
};
class CheckDesignArmor : GuiObjectiveCheck {
uint armor = 0;
bool start() {
armor = 0;
auto@ dsg = playerEmpire.getDesign("Heavy Carrier");
for(uint i = 0, cnt = dsg.subsystemCount; i < cnt; ++i) {
auto@ sys = dsg.subsystems[i];
if(sys.type is subsystem::PlateArmor)
armor += sys.hexCount;
}
return true;
}
bool check() {
auto@ tab = cast<DesignEditor>(ActiveTab);
if(tab is null)
return false;
if(tab.originalDesign is null)
return false;
if(tab.originalDesign.name != "Heavy Carrier")
return false;
uint curArmor = 0;
auto@ dsg = tab.design;
for(uint i = 0, cnt = dsg.subsystemCount; i < cnt; ++i) {
auto@ sys = dsg.subsystems[i];
if(sys.type is subsystem::PlateArmor)
curArmor += sys.hexCount;
}
return curArmor >= armor+3;
}
};
class CheckDesignBulkhead : GuiObjectiveCheck {
bool check() {
auto@ tab = cast<DesignEditor>(ActiveTab);
if(tab is null)
return false;
if(tab.originalDesign is null)
return false;
if(tab.originalDesign.name != "Heavy Carrier")
return false;
auto@ dsg = tab.design;
for(uint i = 0, cnt = dsg.subsystemCount; i < cnt; ++i) {
auto@ sys = dsg.subsystems[i];
for(uint n = 0, ncnt = sys.hexCount; n < ncnt; ++n) {
if(sys.module(n).id == "Bulkhead")
return true;
}
}
return false;
}
};
class CheckDesignSaved : GuiObjectiveCheck {
bool check() {
return playerEmpire.getDesign("Heavy Carrier").revision > 1;
}
};
class CheckArtifactTarget : GuiObjectiveCheck {
bool check() {
auto@ tg = cast<ObjectMode>(mode);
if(tg is null)
return false;
auto@ to = cast<AbilityTargetObject>(tg.targ);
if(to is null)
return false;
if(!to.abl.obj.isArtifact)
return false;
return true;
}
};
class CheckTargetDefPlat : GuiObjectiveCheck {
bool check() {
auto@ tg = cast<PointTargetMode>(mode);
if(tg is null)
return false;
auto@ to = cast<OrbitalTarget>(tg.targ);
if(to is null)
return false;
if(to.dsg is null)
return false;
return to.dsg.name == "Defense Platform";
}
};
class CheckViewSpy : GuiObjectiveCheck {
bool check() {
auto@ gtab = cast<GalaxyTab>(tabs[0]);
return gtab.title == "Yingmow";
}
};
#section all