From 7a947189377b3585642be8b9e5de7533b12d0b97 Mon Sep 17 00:00:00 2001 From: Pan Date: Sun, 17 Mar 2019 22:02:12 +1300 Subject: [PATCH] home --- core/AssetManager.java | 20 ++++++++++---------- enemyAI/baseExpensionAI.java | 32 +++++++++++++++++++++++++++++--- enemyAI/buildingManagerAI.java | 30 ++++++++++++++++-------------- enemyAI/combatManagerAI.java | 22 ++++++++++++++++------ enemyAI/defenseManagerAI.java | 2 +- enemyAI/enemyCommander.java | 5 ----- enemyAI/mapAwarenessAI.java | 5 ++++- enemyAI/unitProductionAI.java | 17 +++++++++-------- entity/communicationCenter.java | 8 ++++---- 9 files changed, 89 insertions(+), 52 deletions(-) diff --git a/core/AssetManager.java b/core/AssetManager.java index a90cc24..652fa07 100644 --- a/core/AssetManager.java +++ b/core/AssetManager.java @@ -192,14 +192,14 @@ public class AssetManager { //Heavy tank regen 3000 - goldMines[0] = new goldMine(2f,-0.515f, 1.25f, 30000); - goldMines[1] = new goldMine(9.5f,-0.515f, 5.5f, 30000); - goldMines[2] = new goldMine(2f,-0.515f, 28.25f, 40000); - goldMines[3] = new goldMine(26f,-0.515f, 3.5f, 40000); - goldMines[4] = new goldMine(29.75f,-0.515f, 30f, 30000); - goldMines[5] = new goldMine(22.5f,-0.515f, 25.5f, 30000); - goldMines[6] = new goldMine(15.5f,-0.515f, 17.75f, 50000); - goldMines[7] = new goldMine(16.5f,-0.515f, 12.5f, 50000); + goldMines[0] = new goldMine(2f,-0.515f, 1.25f, 45000); + goldMines[1] = new goldMine(9.5f,-0.515f, 5.5f, 45000); + goldMines[2] = new goldMine(2f,-0.515f, 28.25f, 50000); + goldMines[3] = new goldMine(26f,-0.515f, 3.5f, 50000); + goldMines[4] = new goldMine(29.75f,-0.515f, 30f, 45000); + goldMines[5] = new goldMine(22.5f,-0.515f, 25.5f, 45000); + goldMines[6] = new goldMine(15.75f,-0.515f, 18f, 55000); + goldMines[7] = new goldMine(16.25f,-0.515f, 12.25f, 55000); //create trees from bitmap @@ -251,8 +251,8 @@ public class AssetManager { for(int i = 0; i < 10; i ++){ for(int j = 0; j < 6; j++){ - lightTank l = new lightTank(new vector(i*0.25f+ 1.125f,-0.3f, 17.375f - 0.25f*j), 90, 0); - addLightTank(l); + //lightTank l = new lightTank(new vector(i*0.25f+ 1.125f,-0.3f, 17.375f - 0.25f*j), 90, 0); + //addLightTank(l); //l.hasMultiShotUpgrade = true; //lightTank l = new lightTank(new vector(i*0.25f + 1.125f,-0.3f, 0.5f + 18.625f + j*0.25f), 90, 0); diff --git a/enemyAI/baseExpensionAI.java b/enemyAI/baseExpensionAI.java index b8e0881..37ce303 100644 --- a/enemyAI/baseExpensionAI.java +++ b/enemyAI/baseExpensionAI.java @@ -9,6 +9,7 @@ import entity.*; public class baseExpensionAI { public baseInfo theBaseInfo; public int[] expensionPiorityList; + public boolean expensionListRerolled; public stealthTank[] scouts; public constructionVehicle myMCV; public boolean isExpanding; @@ -53,9 +54,21 @@ public class baseExpensionAI { public void processAI(){ - frameAI++; + if(frameAI > 750 && frameAI < 1000 && !expensionListRerolled) { + //if the AI has smaller force than player when it's time to grab a third base, use the less aggressive base expansion route + if(mainThread.ec.theCombatManagerAI.checkIfAIHasBiggerForce(1) == false) { + int randomeNumber = gameData.getRandom(); + if(randomeNumber < 512) + expensionPiorityList = new int[]{5,2,3,6,7}; + else + expensionPiorityList = new int[]{5,3,2,6,7}; + expensionListRerolled = true; + } + + } + if(goldMines == null) goldMines = mainThread.theAssetManager.goldMines; @@ -126,11 +139,24 @@ public class baseExpensionAI { } } + + boolean playerHasLessUnits = mainThread.ec.theCombatManagerAI.checkIfAIHasBiggerForce(0.85f); + int lowGoldmineThreshold = 17500; - if(mainThread.ec.theEconomyManagerAI.preferedGoldMine == mainThread.theAssetManager.goldMines[4]) - lowGoldmineThreshold = 12500; + if(playerHasLessUnits) { + lowGoldmineThreshold = 25000; + + if(mainThread.ec.theEconomyManagerAI.preferedGoldMine == mainThread.theAssetManager.goldMines[4]) + lowGoldmineThreshold = 30000; + + if(mainThread.ec.theEconomyManagerAI.preferedGoldMine == mainThread.theAssetManager.goldMines[5]) + lowGoldmineThreshold = 20000; + } + + + if(myMCV == null && expensionGoldMine.goldDeposite >= 17500 && (mainThread.ec.theEconomyManagerAI.preferedGoldMine.goldDeposite < lowGoldmineThreshold || (mainThread.ec.theEconomyManagerAI.preferedGoldMine == expensionGoldMine && !hasConstructionYardNearGoldMine(expensionGoldMine) && !hasRefineryNearTheGoldmine(expensionGoldMine)))){ diff --git a/enemyAI/buildingManagerAI.java b/enemyAI/buildingManagerAI.java index 5345255..ad63a9f 100644 --- a/enemyAI/buildingManagerAI.java +++ b/enemyAI/buildingManagerAI.java @@ -108,17 +108,7 @@ public class buildingManagerAI { if(theBaseInfo.canBuildRefinery == false || theBaseInfo.lowPower || (theBaseInfo.currentPowerConsumption >= (theBaseInfo.currentPowerLevel - 500) && theBaseInfo.currentCredit > 500 && theBaseInfo.numberOfPowerPlant >=2 && frameIndex > 300)){ addBuildingToQueue(101); } - - //build a gun turret if there is a need for it - if(theBaseInfo.canBuildGunTurret && mainThread.ec.theDefenseManagerAI.needGunTurret) { - addBuildingToQueue(200); - } - - //build missile turret if there is a need for it - if(theBaseInfo.canBuildMissileTurret && mainThread.ec.theDefenseManagerAI.needMissileTurret) { - addBuildingToQueue(199); - } - + //build a refinery center if there isn't any if(theBaseInfo.numberOfRefinery == 0 && theBaseInfo.canBuildRefinery){ addBuildingToQueue(102); @@ -137,6 +127,11 @@ public class buildingManagerAI { } + //build a gun turret if there is a need for it + if(theBaseInfo.canBuildGunTurret && mainThread.ec.theDefenseManagerAI.needGunTurret) { + addBuildingToQueue(200); + } + //build an addtional factory if we have enough harvester to sustain the production if(mainThread.ec.theEconomyManagerAI.numberOfharvesters/2 > theBaseInfo.numberOfFactory && theBaseInfo.canBuildFactory && theBaseInfo.numberOfFactory < 2 && theBaseInfo.currentCredit > 1300){ addBuildingToQueue(105); @@ -152,8 +147,15 @@ public class buildingManagerAI { addBuildingToQueue(107); } + + //build missile turret if there is a need for it + if(theBaseInfo.canBuildMissileTurret && mainThread.ec.theDefenseManagerAI.needMissileTurret) { + addBuildingToQueue(199); + } + + //build more factory if we have plenty of money in the bank - if(theBaseInfo.currentCredit > 2200 && theBaseInfo.canBuildFactory && theBaseInfo.numberOfFactory <= mainThread.ec.theEconomyManagerAI.numberOfharvesters/2){ + if(theBaseInfo.currentCredit > 2200 && theBaseInfo.canBuildFactory && theBaseInfo.numberOfFactory < 4 && theBaseInfo.numberOfFactory <= mainThread.ec.theEconomyManagerAI.numberOfharvesters/2){ addBuildingToQueue(105); } @@ -632,9 +634,9 @@ public class buildingManagerAI { return 100; else if(buildingType == 199) { if(communicationCenter.rapidfireResearched_enemy) - return 275; + return 300; else - return 200; + return 250; }else if(buildingType == 107) return 400; return 0; diff --git a/enemyAI/combatManagerAI.java b/enemyAI/combatManagerAI.java index e504d12..bba9c48 100644 --- a/enemyAI/combatManagerAI.java +++ b/enemyAI/combatManagerAI.java @@ -151,10 +151,10 @@ public class combatManagerAI { int targetPlayerExpension = mainThread.ec.theMapAwarenessAI.targetPlayerExpension; if(frameAI > attackTime) { - if(targetPlayerExpension == 2 || targetPlayerExpension == 4 || targetPlayerExpension == 6 || targetPlayerExpension == 7) - shouldAttack = checkIfAIHasBiggerForce(1.2f); - else + if(targetPlayerExpension == 0 || targetPlayerExpension == 1 || targetPlayerExpension == 6 || targetPlayerExpension == 7) shouldAttack = checkIfAIHasBiggerForce(0.9f); + else + shouldAttack = checkIfAIHasBiggerForce(1.2f); } @@ -374,6 +374,8 @@ public class combatManagerAI { } } + System.out.println(staticDefenseAhead + " " + attackPosition); + //send units to attack-move to target position if(!playerHasBecomeStrongerThanAIDuringMarching && !frontalTroopIverwhelmed && (unNeutralizedEntity != null || distanceToTarget > 2)){ @@ -416,6 +418,17 @@ public class combatManagerAI { distanceToTarget = attackDirection.getLength(); attackDirection.unit(); } + + //make sure the attack position is a valid point on the map + if(attackPosition.x < 1.5) + attackPosition.x = 1.5f; + if(attackPosition.x > 30.5) + attackPosition.x = 30.5f; + if(attackPosition.y < 1.5) + attackPosition.y = 1.5f; + if(attackPosition.y > 30.5) + attackPosition.y = 30.5f; + everyoneAttackTargetPosition(); }else{ @@ -675,9 +688,6 @@ public class combatManagerAI { //System.out.println("unrevealedPlayerForceStrength" + unrevealedPlayerForceStrength + " " + "enemyAIForceStrength " + enemyAIForceStrength + " " + "playerForceStrength" + playerForceStrength); return enemyAIForceStrength > 0 && playerForceStrength/enemyAIForceStrength < ratio; - - - } diff --git a/enemyAI/defenseManagerAI.java b/enemyAI/defenseManagerAI.java index c6f1f3b..a0ffacf 100644 --- a/enemyAI/defenseManagerAI.java +++ b/enemyAI/defenseManagerAI.java @@ -320,7 +320,7 @@ public class defenseManagerAI { needGunTurret = true; } - if(!missileTurretAlreadyInQueue && majorThreatLocation.x != 0) { + if(!missileTurretAlreadyInQueue && majorThreatLocation.x != 0 && mainPlayerForceSize !=0) { needMissileTurret = true; } diff --git a/enemyAI/enemyCommander.java b/enemyAI/enemyCommander.java index 62195c9..1703d59 100644 --- a/enemyAI/enemyCommander.java +++ b/enemyAI/enemyCommander.java @@ -121,11 +121,6 @@ public class enemyCommander { theMicroManagementAI.processAI(); //} - - - - - } } diff --git a/enemyAI/mapAwarenessAI.java b/enemyAI/mapAwarenessAI.java index b9911cd..487c850 100644 --- a/enemyAI/mapAwarenessAI.java +++ b/enemyAI/mapAwarenessAI.java @@ -47,6 +47,7 @@ public class mapAwarenessAI { public boolean playerDoesntHaveMassHeavyTanks; public boolean playerIsRushingLightTank; public boolean playerHasManyLightTanksButNoHeavyTank; + public boolean playerHasMostlyHeavyAndStealthTanks; public solidObject[] mapAsset; public boolean[] visionMap; @@ -453,6 +454,8 @@ public class mapAwarenessAI { playerIsRushingLightTank = mainThread.frameIndex/30 > 300 && mainThread.frameIndex/30 < 600 && ((playerLikelyCanNotProduceHighTierUnits && numberOfStealthTanks_player < 3) || playerHasMostlyLightTanks); + playerHasMostlyHeavyAndStealthTanks = (maxNumberOfStealthTanks_playerInLastFiveMinutes >=2 ) && (float)(numberOfHeavyTanks_player + numberOfStealthTanks_player)/(numberOfLightTanks_player + numberOfRocketTanks_player + numberOfStealthTanks_player + numberOfHeavyTanks_player) > 0.8f; + //advanced counting of player units if(numberOfStealthTanks_player > maxNumberOfStealthTanks_playerInLastFiveMinutes) { @@ -506,7 +509,7 @@ public class mapAwarenessAI { //check if there are any player's structure around each gold mine. for(int i = 0; i < goldMines.length; i++){ - playerExpensionInfo[i] = findplayexpensionDefenseScore(goldMines[i], 3); + playerExpensionInfo[i] = findplayexpensionDefenseScore(goldMines[i], 4); } //compute the target player expansion defense score diff --git a/enemyAI/unitProductionAI.java b/enemyAI/unitProductionAI.java index 489ef4e..6bb08be 100644 --- a/enemyAI/unitProductionAI.java +++ b/enemyAI/unitProductionAI.java @@ -137,6 +137,7 @@ public class unitProductionAI { } } + //make decision on what unit to produce int numberOfPlayerGunTurrets= mainThread.ec.theMapAwarenessAI.numberOfGunTurret_player; int numberOfPlayerMissileTurrets= mainThread.ec.theMapAwarenessAI.numberOfMissileTurret_player; @@ -152,15 +153,17 @@ public class unitProductionAI { boolean playerLikelyCanNotProduceHighTierUnits = mainThread.ec.theMapAwarenessAI.playerLikelyCanNotProduceHighTierUnits; boolean playerDoesntHaveMassHeavyTanks = mainThread.ec.theMapAwarenessAI.playerDoesntHaveMassHeavyTanks; boolean playerHasManyLightTanksButNoHeavyTank = mainThread.ec.theMapAwarenessAI.playerHasManyLightTanksButNoHeavyTank; + boolean playerHasMostlyHeavyAndStealthTanks = mainThread.ec.theMapAwarenessAI.playerHasMostlyHeavyAndStealthTanks; if((numberOfRocketTanks_AI < 2 && frameAI > 300 ) || numberOfRocketTanks_AI < numberOfPlayerGunTurrets + numberOfPlayerMissileTurrets*1.5 || (gameData.getRandom() > 925 && !playerHasMostlyLightTanks)){ currentProductionOrder = produceRocketTank; - }else if(theBaseInfo.canBuildHeavyTank - && !playerHasManyLightTanksButNoHeavyTank + }else if(theBaseInfo.canBuildHeavyTank && + playerHasMostlyHeavyAndStealthTanks || + (!playerHasManyLightTanksButNoHeavyTank && !playerHasMostlyLightTanks && !(numberOfHeavyTanks_player == 0 && maxNumberOfStealthTanks_playerInLastFiveMinutes < 3 && mainThread.frameIndex/30 > 600) && !(playerHasMostlyHeavyTanks && numberOfStealthTanks_player < numberOfHeavyTanks_AI*2) - && (playIsRushingHighTierUnits || gameData.getRandom() > 985 || maxNumberOfStealthTanks_playerInLastFiveMinutes*4 > numberOfHeavyTanks_AI || (mainThread.frameIndex/30 > 400 && mainThread.frameIndex/30 < 600 && numberOfPlayerGunTurrets + numberOfPlayerMissileTurrets+ numberOfLightTanks_player + numberOfRocketTanks_player + numberOfHeavyTanks_player*5 < 5))){ + && (playIsRushingHighTierUnits || gameData.getRandom() > 985 || maxNumberOfStealthTanks_playerInLastFiveMinutes*4 > numberOfHeavyTanks_AI || (mainThread.frameIndex/30 > 400 && mainThread.frameIndex/30 < 600 && numberOfPlayerGunTurrets + numberOfPlayerMissileTurrets+ numberOfLightTanks_player + numberOfRocketTanks_player + numberOfHeavyTanks_player*5 < 5)))){ currentProductionOrder = produceHeavyTank; }else if(theBaseInfo.canBuildStealthTank && (playerHasMostlyLightTanks || playerLikelyCanNotProduceHighTierUnits || playerDoesntHaveMassHeavyTanks) && !playerHasMostlyHeavyTanks){ currentProductionOrder = produceStealthTank; @@ -169,11 +172,9 @@ public class unitProductionAI { } - //make decision on what tech to research - if(mainThread.ec.theBuildingManagerAI.theBaseInfo.numberOfCommunicationCenter > 0) { - if(mainThread.ec.theDefenseManagerAI.needMissileTurret && theBaseInfo.currentCredit > 500) { + if(mainThread.ec.theDefenseManagerAI.needMissileTurret || theBaseInfo.currentCredit > 1500) { if(!communicationCenter.rapidfireResearched_enemy) { if(communicationCenter.rapidfireResearchProgress_enemy == 255){ communicationCenter.researchRapidfire(1); @@ -183,7 +184,7 @@ public class unitProductionAI { } } - if(mainThread.ec.theBuildingManagerAI.theBaseInfo.numberOfTechCenter > 0){ + if(mainThread.ec.theBuildingManagerAI.theBaseInfo.numberOfTechCenter > 0 && ((numberOfLightTanks_player + numberOfStealthTanks_player> 8) || theBaseInfo.currentCredit > 2000 || numberOfStealthTanks_AI > 6)){ //Immediately start stealth tank upgrades when a tech center is built if(!techCenter.stealthTankResearched_enemy){ @@ -214,7 +215,7 @@ public class unitProductionAI { System.out.println("should make Rocket tank now----------------"); - if(numberOfRocketTanks_AI > 5 && theBaseInfo.currentCredit > 750){ + if(numberOfRocketTanks_AI > 2 && theBaseInfo.currentCredit > 750 && (numberOfPlayerGunTurrets > 0 || numberOfPlayerMissileTurrets > 0)){ if(!techCenter.rocketTankResearched_enemy){ if(techCenter.lightTankResearchProgress_enemy >= 240 && techCenter.stealthTankResearchProgress_enemy >= 240 && techCenter.rocketTankResearchProgress_enemy >= 240 && techCenter.heavyTankResearchProgress_enemy >= 240){ diff --git a/entity/communicationCenter.java b/entity/communicationCenter.java index a3a4bea..310668f 100644 --- a/entity/communicationCenter.java +++ b/entity/communicationCenter.java @@ -967,8 +967,8 @@ public class communicationCenter extends solidObject{ }else{ if(harvesterSpeedResearchProgress_enemy < 240){ - if(mainThread.pc.theBaseInfo.currentCredit >0){ - mainThread.pc.theBaseInfo.currentCredit--; + if(mainThread.ec.theBaseInfo.currentCredit >0){ + mainThread.ec.theBaseInfo.currentCredit--; creditSpentOnResearching_enemy++; harvesterSpeedResearchProgress_enemy = 240 * creditSpentOnResearching_enemy/1500; } @@ -982,8 +982,8 @@ public class communicationCenter extends solidObject{ } if(rapidfireResearchProgress_enemy < 240){ - if(mainThread.pc.theBaseInfo.currentCredit >0){ - mainThread.pc.theBaseInfo.currentCredit--; + if(mainThread.ec.theBaseInfo.currentCredit >0){ + mainThread.ec.theBaseInfo.currentCredit--; creditSpentOnResearching_enemy++; rapidfireResearchProgress_enemy = 240 * creditSpentOnResearching_enemy/1500; }