rule forwardBaseManager inactive group tcComplete minInterval 30 { if ((cvOkToBuild == false) || (cvOkToBuildForts == false) || (aiTreatyActive() == true)) return; int fortUnitID = -1; int buildingQuery = -1; int numberFound = 0; int numberMilitaryBuildings = 0; int buildingID = -1; int numFortresses = kbUnitCount(cMyID, cUnitTypeFortFrontier, cUnitStateABQ); vector location = cInvalidVector; //if (btOffenseDefense >= 0.0) location = selectForwardBaseLocation(); int planID = -1; planID = aiPlanGetIDByTypeAndVariableType(cPlanBuild, cBuildPlanBuildingTypeID, cUnitTypeFortFrontier); switch (gForwardBaseState) { case cForwardBaseStateNone: { // Check if we should go to state Building if (kbUnitCount(cMyID, cUnitTypeFortWagon, cUnitStateAlive) > 0) //if (numFortresses < kbGetBuildLimit(cMyID, cUnitTypeFortFrontier)) { // Yes. // get the fort wagon, start a build plan, keep it defended if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 99); // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); //if (kbUnitCount(cMyID, cUnitTypeFortWagon, cUnitStateAlive) > 0) aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeFortWagon, 1, 1, 1); /*else if ((cMyCiv == cCivDEAmericans) && (kbGetAge() >= cAge3)) aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypedeGeneral, 1, 1, 1); else if (kbTechGetStatus(cTechHCXPNationalRedoubt) == cTechStatusActive) aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeMusketeer, 1, 8, 8); else if ((kbTechGetStatus(cTechHCXPUnlockFort2) == cTechStatusActive) || (kbTechGetStatus(cTechHCXPUnlockFort2German) == cTechStatusActive)) aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeExplorer, 1, 1, 1);*/ // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); // Chat to my allies sendStatement(cPlayerRelationAlly, cAICommPromptToAllyIWillBuildMilitaryBase, gForwardBaseLocation); gForwardBaseState = cForwardBaseStateBuilding; aiEcho(" "); aiEcho(" BUILDING FORWARD BASE, MOVING DEFEND PLANS TO COVER."); aiEcho(" PLANNED LOCATION IS " + gForwardBaseLocation); aiEcho(" "); if (gDefenseReflex == false) endDefenseReflex(); // Causes it to move to the new location } else if (numFortresses < kbGetBuildLimit(cMyID, cUnitTypeFortFrontier) && (planID < 0)) { if ((cMyCiv == cCivDEAmericans) && (kbGetAge() >= cAge3)) { if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); if ((kbGetAge() == cvMaxAge) || (gRevolutionType != 0)) { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 95); } else { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 40); } // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypedeGeneral, 1, 1, 1); // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); // Chat to my allies sendStatement(cPlayerRelationAlly, cAICommPromptToAllyIWillBuildMilitaryBase, gForwardBaseLocation); gForwardBaseState = cForwardBaseStateBuilding; aiEcho(" "); aiEcho(" BUILDING FORWARD BASE, MOVING DEFEND PLANS TO COVER."); aiEcho(" PLANNED LOCATION IS " + gForwardBaseLocation); aiEcho(" "); if (gDefenseReflex == false) endDefenseReflex(); // Causes it to move to the new location } else if (kbTechGetStatus(cTechHCXPNationalRedoubt) == cTechStatusActive) { if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); if ((kbGetAge() == cvMaxAge) || (gRevolutionType != 0)) { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 95); } else { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 40); } // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeMusketeer, 1, 8, 8); // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); // Chat to my allies sendStatement(cPlayerRelationAlly, cAICommPromptToAllyIWillBuildMilitaryBase, gForwardBaseLocation); gForwardBaseState = cForwardBaseStateBuilding; aiEcho(" "); aiEcho(" BUILDING FORWARD BASE, MOVING DEFEND PLANS TO COVER."); aiEcho(" PLANNED LOCATION IS " + gForwardBaseLocation); aiEcho(" "); if (gDefenseReflex == false) endDefenseReflex(); // Causes it to move to the new location } else if ((kbTechGetStatus(cTechHCXPUnlockFort2) == cTechStatusActive) || (kbTechGetStatus(cTechHCXPUnlockFort2German) == cTechStatusActive)) { if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); if ((kbGetAge() == cvMaxAge) || (gRevolutionType != 0)) { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 95); } else { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 40); } // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeExplorer, 1, 1, 1); // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); // Chat to my allies sendStatement(cPlayerRelationAlly, cAICommPromptToAllyIWillBuildMilitaryBase, gForwardBaseLocation); gForwardBaseState = cForwardBaseStateBuilding; aiEcho(" "); aiEcho(" BUILDING FORWARD BASE, MOVING DEFEND PLANS TO COVER."); aiEcho(" PLANNED LOCATION IS " + gForwardBaseLocation); aiEcho(" "); if (gDefenseReflex == false) endDefenseReflex(); // Causes it to move to the new location } } break; } case cForwardBaseStateBuilding: { fortUnitID = getUnitByLocation(cUnitTypeFortFrontier, cMyID, cUnitStateAlive, gForwardBaseLocation, 100.0); if (fortUnitID < 0) { // check for other military buildings. buildingQuery = createSimpleUnitQuery(cUnitTypeMilitaryBuilding, cMyID, cUnitStateAlive, gForwardBaseLocation, 100.0); numberFound = kbUnitQueryExecute(buildingQuery); numberMilitaryBuildings = xsArrayGetSize(gMilitaryBuildings); for (i = 0; < numberFound) { buildingID = kbUnitQueryGetResult(buildingQuery, i); for (j = 0; < numberMilitaryBuildings) { if (kbUnitIsType(buildingID, xsArrayGetInt(gMilitaryBuildings, j)) == true) { fortUnitID = buildingID; break; } } if (fortUnitID >= 0) break; } } if (fortUnitID >= 0) { // Building exists and is complete, go to state Active if (kbUnitGetBaseID(fortUnitID) >= 0) { // Base has been created for it. gForwardBaseState = cForwardBaseStateActive; gForwardBaseID = kbUnitGetBaseID(fortUnitID); gForwardBaseLocation = kbUnitGetPosition(fortUnitID); gForwardBaseUpTime = xsGetTime(); gForwardBaseShouldDefend = kbUnitIsType(fortUnitID, cUnitTypeFortFrontier); aiEcho("Forward base location is " + gForwardBaseLocation + ", Base ID is " + gForwardBaseID + ", Unit ID is " + fortUnitID); // Tell the attack goal where to go. // aiPlanSetBaseID(gMainAttackGoal, gForwardBaseID); aiEcho(" "); aiEcho(" FORWARD BASE COMPLETED, GOING TO STATE ACTIVE, MOVING ATTACK GOAL."); aiEcho(" "); } else { aiEcho(" "); aiEcho(" FORT COMPLETE, WAITING FOR FORWARD BASE ID."); aiEcho(" "); } } else // Check if plan still exists. If not, go back to state 'none'. { if (aiPlanGetState(gForwardBaseBuildPlan) < 0) { // It failed? gForwardBaseState = cForwardBaseStateNone; gForwardBaseLocation = cInvalidVector; gForwardBaseID = -1; gForwardBaseBuildPlan = -1; gForwardBaseShouldDefend = false; aiEcho(" "); aiEcho(" FORWARD BASE PLAN FAILED, RETURNING TO STATE NONE."); aiEcho(" "); } } break; } case cForwardBaseStateActive: { // Normal state. If fort is destroyed and base overrun, bail. fortUnitID = getUnitByLocation(cUnitTypeFortFrontier, cMyID, cUnitStateAlive, gForwardBaseLocation, 50.0); if (fortUnitID < 0) { // check for other military buildings. buildingQuery = createSimpleUnitQuery(cUnitTypeMilitaryBuilding, cMyID, cUnitStateAlive, gForwardBaseLocation, 100.0); numberFound = kbUnitQueryExecute(buildingQuery); numberMilitaryBuildings = xsArrayGetSize(gMilitaryBuildings); for (i = 0; < numberFound) { buildingID = kbUnitQueryGetResult(buildingQuery, i); for (j = 0; < numberMilitaryBuildings) { if (kbUnitIsType(buildingID, xsArrayGetInt(gMilitaryBuildings, j)) == true) { fortUnitID = buildingID; break; } } if (fortUnitID >= 0) break; } } if (fortUnitID < 0) { // Fort is missing, is base still OK? if (((gDefenseReflexBaseID == gForwardBaseID) && (gDefenseReflexPaused == true)) || (kbBaseGetNumberUnits(cMyID, gForwardBaseID, cPlayerRelationSelf, cUnitTypeBuilding) < 1)) // Forward base under attack and overwhelmed, or gone. { // No, not OK. Get outa Dodge. gForwardBaseState = cForwardBaseStateNone; gForwardBaseID = -1; gForwardBaseLocation = cInvalidVector; gForwardBaseShouldDefend = false; // Tell the attack goal to go back to the main base. // aiPlanSetBaseID(gMainAttackGoal, kbBaseGetMainID(cMyID)); endDefenseReflex(); aiEcho(" "); aiEcho(" ABANDONING FORWARD BASE, RETREATING TO MAIN BASE."); aiEcho(" "); } } break; } } if (((gForwardBaseState == cForwardBaseStateActive) || (gForwardBaseState == cForwardBaseStateBuilding)) && (numFortresses < kbGetBuildLimit(cMyID, cUnitTypeFortFrontier))) { if (kbUnitCount(cMyID, cUnitTypeFortWagon, cUnitStateAlive) > 0) { // Yes. // get the fort wagon, start a build plan, keep it defended if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 99); // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeFortWagon, 1, 1, 1); // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); // Chat to my allies sendStatement(cPlayerRelationAlly, cAICommPromptToAllyIWillBuildMilitaryBase, gForwardBaseLocation); gForwardBaseState = cForwardBaseStateBuilding; aiEcho(" "); aiEcho(" BUILDING FORWARD BASE, MOVING DEFEND PLANS TO COVER."); aiEcho(" PLANNED LOCATION IS " + gForwardBaseLocation); aiEcho(" "); if (gDefenseReflex == false) endDefenseReflex(); // Causes it to move to the new location } else if ((cMyCiv == cCivDEAmericans) && (kbGetAge() >= cAge3) && (planID < 0)) { if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); if ((kbGetAge() == cvMaxAge) || (gRevolutionType != 0)) { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 95); } else { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 40); } // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypedeGeneral, 1, 1, 1); // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); } else if (kbTechGetStatus(cTechHCXPNationalRedoubt) == cTechStatusActive && (planID < 0)) { if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); if ((kbGetAge() == cvMaxAge) || (gRevolutionType != 0)) { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 95); } else { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 40); } // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeMusketeer, 1, 8, 8); // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); } else if (planID < 0) { if ((kbTechGetStatus(cTechHCXPUnlockFort2) == cTechStatusActive) || (kbTechGetStatus(cTechHCXPUnlockFort2German) == cTechStatusActive)) { if (location == cInvalidVector) { createSimpleBuildPlan(cUnitTypeFortFrontier, 1, 99, true, cMilitaryEscrowID, kbBaseGetMainID(cMyID), 1); return; } gForwardBaseLocation = location; gForwardBaseBuildPlan = aiPlanCreate("Fort build plan ", cPlanBuild); aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanBuildingTypeID, 0, cUnitTypeFortFrontier); if ((kbGetAge() == cvMaxAge) || (gRevolutionType != 0)) { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 95); } else { aiPlanSetDesiredPriority(gForwardBaseBuildPlan, 40); } // Military aiPlanSetMilitary(gForwardBaseBuildPlan, true); aiPlanSetEconomy(gForwardBaseBuildPlan, false); aiPlanSetEscrowID(gForwardBaseBuildPlan, cMilitaryEscrowID); aiPlanAddUnitType(gForwardBaseBuildPlan, cUnitTypeExplorer, 1, 1, 1); // Instead of base ID or areas, use a center position aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanCenterPosition, 0, location); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanCenterPositionDistance, 0, 50.0); // Weight it to stay very close to center point. aiPlanSetVariableVector(gForwardBaseBuildPlan, cBuildPlanInfluencePosition, 0, location); // Position influence for center aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionDistance, 0, 50.0); // 100m range. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluencePositionValue, 0, 100.0); // 100 points for center aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluencePositionFalloff, 0, cBPIFalloffLinear); // Linear slope falloff // Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 32.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, 300.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffLinear); // Cliff falloff// Add position influence for nearby towers aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitTypeID, 0, cUnitTypeFortFrontier); // Don't build anywhere near another fort. aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitDistance, 0, 18.0); aiPlanSetVariableFloat(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitValue, 0, -200.0); // -20 points per fort aiPlanSetVariableInt(gForwardBaseBuildPlan, cBuildPlanInfluenceUnitFalloff, 0, cBPIFalloffNone); aiPlanSetActive(gForwardBaseBuildPlan); } } } }