This commit is contained in:
Pan 2019-03-17 22:02:12 +13:00
parent 25128eaa78
commit 7a94718937
9 changed files with 89 additions and 52 deletions

View File

@ -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);

View File

@ -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)))){

View File

@ -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;

View File

@ -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;
}

View File

@ -320,7 +320,7 @@ public class defenseManagerAI {
needGunTurret = true;
}
if(!missileTurretAlreadyInQueue && majorThreatLocation.x != 0) {
if(!missileTurretAlreadyInQueue && majorThreatLocation.x != 0 && mainPlayerForceSize !=0) {
needMissileTurret = true;
}

View File

@ -121,11 +121,6 @@ public class enemyCommander {
theMicroManagementAI.processAI();
//}
}
}

View File

@ -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

View File

@ -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){

View File

@ -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;
}