include "aiHunterCore.xs"; extern int upID = -1; rule checkForFailedAttacks active minInterval 10 { if(gFailedAttacks >= 2) { kbAdjustResourceByID(cMyID, cResourceGold, 200); kbAdjustResourceByID(cMyID, cResourceFood, 200); kbAdjustResourceByID(cMyID, cResourceWood, 200); aiEcho("checkForFailedAttacks: granting resources because of too many failed attacks"); } } void main() { kbLookAtAllUnitsOnMap(); upID = kbUnitPickCreate("Unit Picker"); //Default init. kbUnitPickResetAll(upID); kbUnitPickSetPreferenceWeight(upID, 1.0); kbUnitPickSetCombatEfficiencyWeight(upID, 1.0); kbUnitPickSetCostWeight(upID, 0.0); //Desired number units types, buildings. kbUnitPickSetDesiredNumberUnitTypes(upID, 7, 1, true); //Min/Max units and Min/Max pop. kbUnitPickSetMinimumNumberUnits(upID, 55); // Sets "need" level on attack plans kbUnitPickSetMaximumNumberUnits(upID, 128); // 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, -1); // Not sure what this does... kbUnitPickSetMaximumPop(upID, -1); // half that for secondary, 1/4 for tertiary, etc. //Default to land units. kbUnitPickSetEnemyPlayerID(upID, gPlayerIDToAttack); kbUnitPickSetAttackUnitType(upID, cUnitTypeLogicalTypeLandMilitary); kbUnitPickSetGoalCombatEfficiencyType(upID, cUnitTypeLogicalTypeLandMilitary); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractInfantry, 0.75); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractArtillery, 1.0); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractCavalry, 0.7); kbUnitPickSetPreferenceFactor(upID, cUnitTypeAbstractArcher, 0.75); kbUnitPickRun(upID); } rule updateUnitPickerManually active minInterval 15 { //setUnitPickerPreference(gLandUnitPicker); kbUnitPickResetResults(upID); kbUnitPickResetCombatEfficiencyTypes(upID); kbUnitPickGetCombatEfficiencyTypes(upID, gPlayerIDToAttack); int unitTypes = kbUnitPickRun(upID); int desiredUnitTypes = kbUnitPickGetDesiredNumberUnitTypes(upID); aiEcho("UNITTYPES " + desiredUnitTypes); if(unitTypes < desiredUnitTypes) desiredUnitTypes = unitTypes; int unitCount = kbUnitPickGetMaximumNumberUnits(upID); for(i = 0; < desiredUnitTypes) { int id = kbUnitPickGetResult(upID, i); //aiEcho("updateUnitPicker: unit id " + id); int existingPlan = aiPlanGetIDByTypeAndVariableType(cPlanTrain, cTrainPlanUnitType, id, true); // maintain plan for this type doesn't exist if(existingPlan == -1) { aiEcho("updateUnitPicker: creating maintain plan for " + id); int planID = aiPlanCreate(kbGetProtoUnitName(id) + "Maintain", cPlanTrain); aiPlanSetMilitary(planID, true); aiPlanSetEscrowID(planID, cEmergencyEscrowID); //Unit type. aiPlanSetVariableInt(planID, cTrainPlanUnitType, 0, id); //Number. aiPlanSetVariableInt(planID, cTrainPlanNumberToMaintain, 0, unitCount / (i + 1)); // Batch size aiPlanSetVariableInt(planID, cTrainPlanBatchSize, 0, 1); aiPlanSetActive(planID); } else { aiPlanSetVariableInt(existingPlan, cTrainPlanNumberToMaintain, 0, unitCount / (i + 1)); } } }