//============================================================================== /* C:\work\Spartan\main\age4\age4-dev\age4w\ai\CORE\Age2_BarracksRush_Hardcore.xs This file is auto-generated. Edits will be lost when the file is regenerated. */ //============================================================================== include "aiHeader.xs"; // Gets global vars, function forward declarations include "aiUtil.xs"; // Misc. shared AI utility functions include "aiEcon.xs"; // All of the AI's econ functionality include "aiMilitary.xs"; // All of the AI's military functionality include "aiNavy.xs"; // All of the AI's naval functionality include "aiEventHandlers.xs"; // Event handler methods for the AI include "aiMain.xs"; // The bulk of the AI include "aiSkirmish.xs"; // Skirmish Hall specific overrides extern float priestBias = 0.0; //============================================================================== // initUnitPicker() // // Initialize the unit picker and give it a set of units to try and build. // This is for land units only. //============================================================================== mutable int initUnitPicker(string name="BUG", int numberTypes=1, int minUnits=10, int maxUnits=20, int minPop=-1, int maxPop=-1, int numberBuildings=1, bool guessEnemyUnitType=false) { //aiEcho("Initializing unit picker"); // Ensure that we have a most hated enemy when we start this plan mostHatedEnemy(); //Create it. int upID=kbUnitPickCreate(name); if (upID < 0) return(-1); //Default init. //aiEcho("kbUnitPickResetAll " + upID); kbUnitPickResetAll(upID); kbUnitPickSetPreferenceWeight(upID, 1.0); kbUnitPickSetCombatEfficiencyWeight(upID, 1.0); kbUnitPickSetCostWeight(upID, 0.0); //Desired number units types, buildings. kbUnitPickSetDesiredNumberUnitTypes(upID, numberTypes, numberBuildings, true); //Min/Max units and Min/Max pop. kbUnitPickSetMinimumNumberUnits(upID, minUnits); // Sets "need" level on attack plans kbUnitPickSetMaximumNumberUnits(upID, maxUnits); // Sets "max" level on attack plans, sets "numberToMaintain" on train plans for primary unit, // half that for secondary, 1/4 for tertiary, etc. kbUnitPickSetMinimumPop(upID, minPop); // Not sure what this does... kbUnitPickSetMaximumPop(upID, maxPop); // If set, overrides maxNumberUnits for how many of the primary unit to maintain. //Default to land units. kbUnitPickSetEnemyPlayerID(upID, aiGetMostHatedPlayerID()); kbUnitPickSetAttackUnitType(upID, cUnitTypeLogicalTypeLandPickerChoice); kbUnitPickSetGoalCombatEfficiencyType(upID, cUnitTypeLogicalTypeLandPickerTarget); aiEcho("ASLKDJALSDKJALSKD"); kbUnitPickSetDefaultCombatEfficiency(upID, cUnitTypeAbstractPriest, priestBias); setUnitPickerPreference(upID); // Set generic preferences for this civ //Done. return(upID); } //============================================================================== /* preInit() This function is called in main() before any of the normal initialization happens. Use it to override default values of variables as needed for personality or scenario effects. */ //============================================================================== void preInit(void) { // check for default selection aiEcho("preInit() RANDOM starting."); // 0 - 4, very easy to very hard btDifficulty = aiGetSiegeBias(); // 0 = rush, 1 = balanced, 2 = techramp/room, 3 = turtle btStrategy = gRandomStrategy; // 0 = conquest, 1 = standard, 2 = wonder btVictoryCondition = aiGetCavalryBias(); aiEcho("VICTORY: " + btVictoryCondition); computeRushBoomFromSettings(); printAISettings(); setDefaultAIVariables(); } rule randomFocusBiases active minInterval 3 { float temp = (gRandomInfantryBias - 100); btBiasInf = temp / 100.0; temp = (gRandomCavalryBias - 100); btBiasCav = temp / 100.0; temp = (gRandomRangedBias - 100); btBiasArcher = temp / 100.0; temp = (gRandomSiegeBias - 100); btBiasArt = temp / 100.0; priestBias = gRandomPriestBias; priestBias = priestBias / 10.0; if(priestBias >= 0.9) { btBiasInf = -0.65; btBiasArcher = -0.55; btBiasCav = -0.55; btBiasArt = -0.75; } aiEcho("Biases: Inf - " + btBiasInf + ", Cav - " + btBiasCav + ", Arch - " + btBiasArcher + ", Siege - " + btBiasArt + ", Priest: " + priestBias); setUnitPickerPreference(gLandUnitPicker); xsDisableSelf(); } //============================================================================== /* postInit() This function is called in main() after the normal initialization is complete. Use it to override settings and decisions made by the startup logic. */ //============================================================================== void postInit(void) { aiEcho("postInit() starting."); skirmishPostInit(); } //============================================================================== // rule autoExploreEnemyBases // // Cheat and show the AI where all of the enemy bases are. //============================================================================== rule autoExploreEnemyBases active minInterval 5 { float totalTime = xsGetTime() / 1000.0; static bool revealed = false; if (btRevealEnemyBases == false) { xsDisableSelf(); return; } if (totalTime >= cTimeToRevealEnemyBases) { if (revealed == false) { Vector pos = aiCheatReveal(); if (xsVectorIsValid(pos)) { findEnemyBase(pos); } revealed = true; } else { aiCheatUnreveal(); xsDisableSelf(); } } } //============================================================================== // setupBuildingInfo() // // Called when we age up--setup the buildings we want for the current age. This // controls the forecast values and what the AI attempts to build automatically. // Some things (like farms and dropsites) are built elsewhere, even though // they're listed in here (for forecast info) //============================================================================== void setupBuildingInfo() { // Create arrays if needed initializeAndClearBuildingArrays(); int templeID = cUnitTypeUnitTypeBldgTemple; if(kbGetCiv()==gPersianCivID) { templeID = cUnitTypeUnitTypeBldgAcademy; } int currentVillCount = getVillagerCountForBuildOrder(); int bt = 0; int offset = 0; switch (kbGetAge()) { case cAge1: { break; } case cAge2: { if(btDifficulty > cStrongDifficulty) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgBarracks); offset = addBuildingToList(bt, currentVillCount / (15 - (btBiasInf * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); if(kbGetCiv() != gEgyptianCivID) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgArcheryRange); offset = addBuildingToList(bt, currentVillCount / (18 - (btBiasArcher * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); } bt = kbFindBuilding(cUnitTypeUnitTypeBldgStables); offset = addBuildingToList(bt, currentVillCount / (20 - (btBiasCav * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); } else if(btDifficulty > cWeakDifficulty) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgBarracks); offset = addBuildingToList(bt, currentVillCount / (20 - (btBiasInf * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); if(kbGetCiv() != gEgyptianCivID) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgArcheryRange); offset = addBuildingToList(bt, currentVillCount / (21 - (btBiasArcher * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); } bt = kbFindBuilding(cUnitTypeUnitTypeBldgStables); offset = addBuildingToList(bt, currentVillCount / (22 - (btBiasCav * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); } else { bt = kbFindBuilding(cUnitTypeUnitTypeBldgBarracks); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateEarly, true, offset); if(kbGetCiv() != gEgyptianCivID) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgArcheryRange); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateMid, true, offset); } bt = kbFindBuilding(cUnitTypeUnitTypeBldgStables); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateMid, true, offset); } break; } default: { if(btDifficulty > cStrongDifficulty) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgBarracks); offset = addBuildingToList(bt, currentVillCount / (15 - (btBiasInf * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); if(kbGetCiv() != gEgyptianCivID) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgArcheryRange); offset = addBuildingToList(bt, currentVillCount / (17 - (btBiasArcher * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); } // ensure some immortal camps get placed for Persians if(kbGetCiv() == gPersianCivID) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgTemple); offset = addBuildingToList(bt, currentVillCount / 17, cMilitaryEscrowID, cAgeStateEarly, true, offset); } bt = kbFindBuilding(cUnitTypeUnitTypeBldgStables); offset = addBuildingToList(bt, currentVillCount / (18 - (btBiasCav * 5)), cMilitaryEscrowID, cAgeStateEarly, true, offset); bt = kbFindBuilding(cUnitTypeUnitTypeBldgSiegeWorkshop); offset = addBuildingToList(bt, currentVillCount / (20 - (btBiasArt * 5)), cMilitaryEscrowID, cAgeStateMid, true, offset); if(priestBias > 0.5) { bt = kbFindBuilding(templeID); offset = addBuildingToList(bt, currentVillCount / 20, cMilitaryEscrowID, cAgeStateEarly, true, offset); } } else if(btDifficulty > cWeakDifficulty) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgBarracks); offset = addBuildingToList(bt, currentVillCount / 20, cMilitaryEscrowID, cAgeStateEarly, true, offset); if(kbGetCiv() != gEgyptianCivID) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgArcheryRange); offset = addBuildingToList(bt, currentVillCount / 21, cMilitaryEscrowID, cAgeStateEarly, true, offset); } bt = kbFindBuilding(cUnitTypeUnitTypeBldgStables); offset = addBuildingToList(bt, currentVillCount / 22, cMilitaryEscrowID, cAgeStateEarly, true, offset); bt = kbFindBuilding(cUnitTypeUnitTypeBldgSiegeWorkshop); offset = addBuildingToList(bt, currentVillCount / 25, cMilitaryEscrowID, cAgeStateLate, true, offset); if(priestBias > 0.5) { bt = kbFindBuilding(templeID); offset = addBuildingToList(bt, currentVillCount / 25, cMilitaryEscrowID, cAgeStateEarly, true, offset); } } else { bt = kbFindBuilding(cUnitTypeUnitTypeBldgBarracks); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateEarly, true, offset); if(kbGetCiv() != gEgyptianCivID) { bt = kbFindBuilding(cUnitTypeUnitTypeBldgArcheryRange); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateMid, true, offset); } bt = kbFindBuilding(cUnitTypeUnitTypeBldgStables); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateMid, true, offset); bt = kbFindBuilding(cUnitTypeUnitTypeBldgSiegeWorkshop); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateLate, true, offset); if(priestBias > 0.5) { bt = kbFindBuilding(templeID); offset = addBuildingToList(bt, 1, cMilitaryEscrowID, cAgeStateMid, true, offset); } } break; } } setupStandardBuildingInfo(offset, currentVillCount); } //============================================================================== // setUnitPickerPreference() // // Updates the unit picker biases. //============================================================================== void setUnitPickerPreference(int upID = -1) { // Add the main unit lines if (upID < 0) return; setBalancedUnitPreference(upID); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractInfantry, 0.5 + (btBiasInf / 2.0)); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractArtillery, 0.5 + (btBiasArt / 2.0)); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractCavalry, 0.5 + (btBiasCav / 2.0)); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractArcher, 0.5 + (btBiasArcher / 2.0)); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractPriest, priestBias); }