This commit is contained in:
Pan 2019-05-04 23:03:14 +12:00
parent 2a751e6e5d
commit ac98f58955
14 changed files with 69 additions and 46 deletions

View File

@ -106,12 +106,12 @@ public class AssetManager {
goldMines = new goldMine[16]; goldMines = new goldMine[16];
goldMines[0] = new goldMine(2f,-0.515f, 1.25f, 45000); goldMines[0] = new goldMine(2f,-0.515f, 1.25f, 45000);
goldMines[1] = new goldMine(9.5f,-0.515f, 5.5f, 45000); goldMines[1] = new goldMine(9.5f,-0.515f, 5.5f, 45000);
goldMines[2] = new goldMine(2f,-0.515f, 28.25f, 50000); goldMines[2] = new goldMine(2f,-0.515f, 28.25f, 52500);
goldMines[3] = new goldMine(26f,-0.515f, 3.5f, 50000); goldMines[3] = new goldMine(26f,-0.515f, 3.5f, 52500);
goldMines[4] = new goldMine(29.75f,-0.515f, 30f, 45000); goldMines[4] = new goldMine(29.75f,-0.515f, 30f, 45000);
goldMines[5] = new goldMine(22.5f,-0.515f, 25.5f, 45000); goldMines[5] = new goldMine(22.5f,-0.515f, 25.5f, 45000);
goldMines[6] = new goldMine(15.75f,-0.515f, 18f, 55000); goldMines[6] = new goldMine(15.75f,-0.515f, 18f, 52500);
goldMines[7] = new goldMine(16.25f,-0.515f, 12.25f, 55000); goldMines[7] = new goldMine(16.25f,-0.515f, 12.25f, 52500);
//create trees from bitmap //create trees from bitmap
@ -241,19 +241,19 @@ public class AssetManager {
for(int i = 0; i < 10; i ++){ for(int i = 0; i < 10; i ++){
for(int j = 0; j < 1; j++){ for(int j = 0; j < 6; j++){
//heavyTank l = new heavyTank(new vector(i*0.25f+ 1.125f,-0.3f, 17.375f - 0.25f*j), 90, 0); //heavyTank l = new heavyTank(new vector(i*0.25f+ 1.125f,-0.3f, 17.375f - 0.25f*j), 90, 0);
//addHeavyTank(l); //addHeavyTank(l);
//l.hasMultiShotUpgrade = true; //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); //stealthTank l = new stealthTank(new vector(i*0.25f + 1.125f,-0.3f, 0.5f + 18.625f + j*0.25f), 90, 0);
//l.attackRange = 1.99f; //l.attackRange = 1.99f;
//lightTank.tileCheckList_player = lightTank.generateTileCheckList(6); //lightTank.tileCheckList_player = lightTank.generateTileCheckList(6);
//addLightTank(l); //addStealthTank(l);
//if(j == 0 && i == 0) //if(j == 0 && i == 0)
//addGunTurret(new gunTurret(i*0.25f -0.125f + 28, -0.65f, 0.25f + 28.125f + j*0.25f, 1)); //addMissileTurret(new missileTurret(i*0.25f -0.125f + 1, -0.65f, 0.25f + 17.125f + j*0.25f, 0));
} }
} }

View File

@ -506,7 +506,7 @@ public class mainThread extends JFrame implements KeyListener, ActionListener, M
sleepTime = 0; sleepTime = 0;
while(System.currentTimeMillis()-lastDraw<frameInterval){ /*while(System.currentTimeMillis()-lastDraw<frameInterval){
try { try {
Thread.sleep(1); Thread.sleep(1);
@ -515,7 +515,7 @@ public class mainThread extends JFrame implements KeyListener, ActionListener, M
// TODO Auto-generated catch block // TODO Auto-generated catch block
e1.printStackTrace(); e1.printStackTrace();
} }
} }*/

View File

@ -52,6 +52,9 @@ public class baseExpensionAI {
lastExpansionLocation = 7; lastExpansionLocation = 7;
lowGoldmineThreshold = 22500; lowGoldmineThreshold = 22500;
System.out.println(expensionPiorityList[1]);
} }
@ -162,7 +165,9 @@ public class baseExpensionAI {
} }
} }
if(myMCV == null && expensionGoldMine.goldDeposite >= 17500 && (mainThread.ec.theEconomyManagerAI.preferedGoldMine.goldDeposite < lowGoldmineThreshold || if(myMCV == null && expensionGoldMine.goldDeposite >= 17500 && (mainThread.ec.theEconomyManagerAI.preferedGoldMine.goldDeposite < lowGoldmineThreshold ||
(!hasRefineryNearTheGoldmine(mainThread.ec.theEconomyManagerAI.preferedGoldMine) && !hasConstructionYardNearGoldMine(mainThread.ec.theEconomyManagerAI.preferedGoldMine)) ||
(mainThread.ec.theEconomyManagerAI.preferedGoldMine == expensionGoldMine && !hasConstructionYardNearGoldMine(expensionGoldMine) && !hasRefineryNearTheGoldmine(expensionGoldMine)))){ (mainThread.ec.theEconomyManagerAI.preferedGoldMine == expensionGoldMine && !hasConstructionYardNearGoldMine(expensionGoldMine) && !hasRefineryNearTheGoldmine(expensionGoldMine)))){
int numberOfMCVOnQueue = 0; int numberOfMCVOnQueue = 0;
@ -172,16 +177,10 @@ public class baseExpensionAI {
} }
} }
if(numberOfMCVOnQueue == 0 && theBaseInfo.canBuildMCV){ if(numberOfMCVOnQueue == 0 && theBaseInfo.canBuildMCV){
for(int i = 0; i < mainThread.theAssetManager.factories.length; i++){ for(int i = 0; i < mainThread.theAssetManager.factories.length; i++){
if(mainThread.theAssetManager.factories[i] != null && mainThread.theAssetManager.factories[i].teamNo != 0){ if(mainThread.theAssetManager.factories[i] != null && mainThread.theAssetManager.factories[i].teamNo != 0){
mainThread.theAssetManager.factories[i].cancelBuilding();
mainThread.theAssetManager.factories[i].cancelItemFromProductionQueue(factory.lightTankType);
mainThread.theAssetManager.factories[i].cancelItemFromProductionQueue(factory.rocketTankType);
mainThread.theAssetManager.factories[i].cancelItemFromProductionQueue(factory.stealthTankType);
mainThread.theAssetManager.factories[i].cancelItemFromProductionQueue(factory.heavyTankType);
mainThread.theAssetManager.factories[i].buildMCV(); mainThread.theAssetManager.factories[i].buildMCV();
break; break;
} }

View File

@ -69,7 +69,7 @@ public class combatManagerAI {
public combatManagerAI(){ public combatManagerAI(){
this.theBaseInfo = mainThread.ec.theBaseInfo; this.theBaseInfo = mainThread.ec.theBaseInfo;
standardAttackTime = 550; standardAttackTime = 600;
rushAttackTime = 250 + gameData.getRandom()/4; rushAttackTime = 250 + gameData.getRandom()/4;
goldMines = mainThread.theAssetManager.goldMines; goldMines = mainThread.theAssetManager.goldMines;

View File

@ -421,7 +421,7 @@ public class defenseManagerAI {
if(distanceToThreat > d + missileTurret.attackRange) if(distanceToThreat > d + missileTurret.attackRange)
d = distanceToThreat - missileTurret.attackRange; d = distanceToThreat - missileTurret.attackRange;
if(distanceToThreat < 2.2) if(distanceToThreat < 2.2)
d = 1.25f; d = 1f;
missileTurretDeployLocation.x = constructionYards[i].centre.x + (threatX - constructionYards[i].centre.x)/distanceToThreat*d; missileTurretDeployLocation.x = constructionYards[i].centre.x + (threatX - constructionYards[i].centre.x)/distanceToThreat*d;
missileTurretDeployLocation.z = constructionYards[i].centre.z + (threatZ - constructionYards[i].centre.z)/distanceToThreat*d; missileTurretDeployLocation.z = constructionYards[i].centre.z + (threatZ - constructionYards[i].centre.z)/distanceToThreat*d;

View File

@ -157,14 +157,14 @@ public class economyManagerAI {
//the ration between harvester and refinery should be 2:1 //the ration between harvester and refinery should be 2:1
//economyManager has a higher priority than combat manager AI, so the enemy AI will always queue harvester first if lost any. //economyManager has a higher priority than combat manager AI, so the enemy AI will always queue harvester first if lost any.
if(theBaseInfo.numberOfRefinery > 0 && numberOfharvesters < 4){ if(theBaseInfo.numberOfRefinery > 0 && numberOfharvesters < 6){
if(numberOfharvesters/theBaseInfo.numberOfRefinery < 2){ if(numberOfharvesters < theBaseInfo.numberOfRefinery + 2){
for(int i = 0; i < mainThread.theAssetManager.factories.length; i++){ for(int i = 0; i < mainThread.theAssetManager.factories.length; i++){
if(mainThread.theAssetManager.factories[i] != null && mainThread.theAssetManager.factories[i].teamNo != 0){ if(mainThread.theAssetManager.factories[i] != null && mainThread.theAssetManager.factories[i].teamNo != 0){
if(mainThread.theAssetManager.factories[i].isIdle()){ mainThread.theAssetManager.factories[i].cancelBuilding();
mainThread.theAssetManager.factories[i].buildHarvester(); mainThread.theAssetManager.factories[i].buildHarvester();
break; break;
}
} }
} }
} }

View File

@ -450,7 +450,7 @@ public class mapAwarenessAI {
playerHasMostlyLightTanks = (numberOfLightTanks_player > 5 && lightTankRatio > 0.8f) || (frameAI < 420 && numberOfLightTanks_player > 1 && lightTankRatio >= 0.75f); playerHasMostlyLightTanks = (numberOfLightTanks_player > 5 && lightTankRatio > 0.8f) || (frameAI < 420 && numberOfLightTanks_player > 1 && lightTankRatio >= 0.75f);
playerHasMostlyHeavyTanks = numberOfHeavyTanks_player > 1 && (float)(numberOfHeavyTanks_player)/(totalNumberOfPlayerUnits) > 0.6f; playerHasMostlyHeavyTanks = numberOfHeavyTanks_player > 1 && (float)(numberOfHeavyTanks_player)/(totalNumberOfPlayerUnits) > 0.6f;
playerHasManyLightTanksButNoHeavyTank = lightTankRatio > 0.5 && lightTankRatio <=0.8 && numberOfHeavyTanks_player < 3; playerHasManyLightTanksButNoHeavyTank = lightTankRatio > 0.5 && numberOfHeavyTanks_player < 3;
playIsRushingHighTierUnits = mainThread.gameFrame/30 > 250 && mainThread.gameFrame/30 < 400 playIsRushingHighTierUnits = mainThread.gameFrame/30 > 250 && mainThread.gameFrame/30 < 400
&& mainThread.ec.theMapAwarenessAI.numberOfTechCenter_player >0 && mainThread.ec.theMapAwarenessAI.numberOfTechCenter_player >0

View File

@ -154,15 +154,22 @@ public class microManagementAI {
float myRange= unitInCombatRadius[i].attackRange * unitInCombatRadius[i].attackRange; float myRange= unitInCombatRadius[i].attackRange * unitInCombatRadius[i].attackRange;
solidObject target = null; solidObject target = null;
solidObject currentTarget = unitInCombatRadius[i].targetObject;
int targetHP = 99999; int targetHP = 99999;
int level = 0; int level = 0;
if(currentTarget != null) {
level = currentTarget.level;
}
float distanceToDesination = 99999; float distanceToDesination = 99999;
for(int j=0; j < numberOfPlayerUnitsOnMinimap; j++){ for(int j=0; j < numberOfPlayerUnitsOnMinimap; j++){
if(playerUnitInMinimap[j] != null && playerUnitInMinimap[j].currentHP > 0){ if(playerUnitInMinimap[j] != null && playerUnitInMinimap[j].currentHP > 0){
if((playerUnitInMinimap[j].getMaxHp() / playerUnitInMinimap[j].currentHP > 4 && !(unitInCombatRadius[i].targetObject!= null && unitInCombatRadius[i].targetObject.currentHP < playerUnitInMinimap[j].currentHP)) || playerUnitInMinimap[j].level > level){ if(((playerUnitInMinimap[j].getMaxHp() / playerUnitInMinimap[j].currentHP >= 4) && !(currentTarget != null && currentTarget.currentHP < playerUnitInMinimap[j].currentHP)) || playerUnitInMinimap[j].level > level){
x1 = playerUnitInMinimap[j].centre.x; x1 = playerUnitInMinimap[j].centre.x;
x2 = unitInCombatRadius[i].centre.x; x2 = unitInCombatRadius[i].centre.x;
z1 = playerUnitInMinimap[j].centre.z; z1 = playerUnitInMinimap[j].centre.z;

View File

@ -110,7 +110,7 @@ public class unitProductionAI {
} }
if(z != 999999) { if(z != 999999) {
rallyPoint.set(x - 2.5f, 0, z - 2f); rallyPoint.set(x - 2.25f, 0, z - 1.75f);
if(frameAI < 240) { if(frameAI < 240) {
rallyPoint.set(mainThread.theAssetManager.goldMines[5].centre); rallyPoint.set(mainThread.theAssetManager.goldMines[5].centre);
@ -165,19 +165,28 @@ public class unitProductionAI {
boolean playerHasMostlyHeavyAndStealthTanks = mainThread.ec.theMapAwarenessAI.playerHasMostlyHeavyAndStealthTanks; boolean playerHasMostlyHeavyAndStealthTanks = mainThread.ec.theMapAwarenessAI.playerHasMostlyHeavyAndStealthTanks;
boolean b1 = (numberOfRocketTanks_AI < 3 && (frameAI > 400 || frameAI > 170 && frameAI < 240 && mainThread.ec.theMapAwarenessAI.numberOfConstructionYard_player > 0) && !playerHasMostlyLightTanks); int timeToBuildHeavyTank = 400;
int timeToBuildStealthTank = 200;
if(mainThread.ec.theMapAwarenessAI.canRushPlayer) {
//when AI decides to rush the player, then dont build higher tier units so it can mass produce light tanks
timeToBuildHeavyTank = 500;
timeToBuildStealthTank = 500;
}
boolean b1 = (numberOfRocketTanks_AI < 3 && !playerHasMostlyHeavyTanks && (frameAI > 400 || frameAI > 170 && frameAI < 240 && mainThread.ec.theMapAwarenessAI.numberOfConstructionYard_player > 0) && !playerHasMostlyLightTanks);
boolean b2 = (numberOfRocketTanks_AI < numberOfPlayerGunTurrets + numberOfPlayerMissileTurrets*1.5); boolean b2 = (numberOfRocketTanks_AI < numberOfPlayerGunTurrets + numberOfPlayerMissileTurrets*1.5);
if( b1 || b2){ if( b1 || b2){
currentProductionOrder = produceRocketTank; currentProductionOrder = produceRocketTank;
}else if(theBaseInfo.canBuildHeavyTank && }else if(theBaseInfo.canBuildHeavyTank && !playerHasMostlyHeavyTanks &&
(playerHasMostlyHeavyAndStealthTanks || (playerHasMostlyHeavyAndStealthTanks || (frameAI > timeToBuildHeavyTank && numberOfHeavyTanks_AI < 3) ||
!playerHasManyLightTanksButNoHeavyTank !playerHasManyLightTanksButNoHeavyTank
&& !playerHasMostlyLightTanks && !playerHasMostlyLightTanks
&& !(numberOfHeavyTanks_player == 0 && maxNumberOfStealthTanks_playerInLastFiveMinutes < 3 && frameAI > 600) && !(numberOfHeavyTanks_player == 0 && maxNumberOfStealthTanks_playerInLastFiveMinutes < 3 && frameAI > 600)
&& !(playerHasMostlyHeavyTanks && numberOfStealthTanks_player < numberOfHeavyTanks_AI*2) && !(playerHasMostlyHeavyTanks && numberOfStealthTanks_player < numberOfHeavyTanks_AI*2)
&& (playIsRushingHighTierUnits || maxNumberOfStealthTanks_playerInLastFiveMinutes*4 > numberOfHeavyTanks_AI || (frameAI > 400 && frameAI < 500 && numberOfPlayerGunTurrets + numberOfPlayerMissileTurrets+ numberOfLightTanks_player + numberOfRocketTanks_player + numberOfHeavyTanks_player*5 < 5)))){ && (playIsRushingHighTierUnits || maxNumberOfStealthTanks_playerInLastFiveMinutes*4 > numberOfHeavyTanks_AI))){
currentProductionOrder = produceHeavyTank; currentProductionOrder = produceHeavyTank;
}else if(theBaseInfo.canBuildStealthTank && (playerHasMostlyLightTanks || playerLikelyCanNotProduceHighTierUnits || playerDoesntHaveMassHeavyTanks) && !playerHasMostlyHeavyTanks && (frameAI > 450 || numberOfLightTanks_player > 8)){ }else if(theBaseInfo.canBuildStealthTank && !playerHasMostlyHeavyTanks && !(numberOfStealthTanksControlledByCombatAI >= 8 && frameAI < 600) && !(numberOfStealthTanksControlledByCombatAI >= 16 && frameAI > 600)
&& (playerHasMostlyLightTanks || playerLikelyCanNotProduceHighTierUnits || playerDoesntHaveMassHeavyTanks) && !playerHasMostlyHeavyTanks && (frameAI > timeToBuildStealthTank || numberOfLightTanks_player > 8)){
currentProductionOrder = produceStealthTank; currentProductionOrder = produceStealthTank;
}else{ }else{
currentProductionOrder = produceLightTank; currentProductionOrder = produceLightTank;

View File

@ -55,7 +55,7 @@ public class gunTurret extends solidObject{
public int turretAngleDelta, accumulatedDelta; public int turretAngleDelta, accumulatedDelta;
public int turretTurnRate = 8; public int turretTurnRate = 8;
public int myAttackCooldown= 25; public int myAttackCooldown= 24;
public int attackCoolDown; public int attackCoolDown;
public vector firingPosition; public vector firingPosition;

View File

@ -510,7 +510,7 @@ public class missileTurret extends solidObject{
exposedCountDown --; exposedCountDown --;
if(overCharge) if(overCharge)
myAttackCooldown = 10; myAttackCooldown = 9;
//mark itself on obstacle map //mark itself on obstacle map
mainThread.gridMap.currentObstacleMap[tileIndex[0]] = false; mainThread.gridMap.currentObstacleMap[tileIndex[0]] = false;

View File

@ -1183,8 +1183,10 @@ public class stealthTank extends solidObject{
myDamageModified=(int)(myDamage*2); myDamageModified=(int)(myDamage*2);
}else if(targetObject.type==1 || targetObject.type==6){ }else if(targetObject.type==1 || targetObject.type==6){
myDamageModified=(int)(myDamage*1.75); myDamageModified=(int)(myDamage*1.75);
}else if(targetObject.type == 7 || targetObject.type > 100 || targetObject.type == 2 || targetObject.type == 3){ }else if(targetObject.type > 100 || targetObject.type == 2 || targetObject.type == 3){
myDamageModified=(int)(myDamage*0.4); myDamageModified=(int)(myDamage*0.3);
}else if(targetObject.type == 7) {
myDamageModified=(int)(myDamage*0.3);
} }
//damage and alert target unit //damage and alert target unit
@ -1310,8 +1312,10 @@ public class stealthTank extends solidObject{
}else if(targetObject.type==6){ }else if(targetObject.type==6){
myDamageModified=(int)(myDamage*1.75); myDamageModified=(int)(myDamage*1.75);
}else if(secondaryTargets[i].type == 7 || targetObject.type == 2 || targetObject.type == 3){ }else if(targetObject.type == 2 || targetObject.type == 3){
myDamageModified=(int)(myDamage*0.4); myDamageModified=(int)(myDamage*0.3);
}else if(secondaryTargets[i].type == 7) {
myDamageModified=0; //heavy tank is immue to secondary attack
} }

View File

@ -90,7 +90,7 @@ public class gameMenu {
+ "\"a\" -- Force attack a unit. If no unit is under the cursor, then the selected units will \nbe set to attack move to the cursor location.\n\n" + "\"a\" -- Force attack a unit. If no unit is under the cursor, then the selected units will \nbe set to attack move to the cursor location.\n\n"
+ "\"h\" -- stop current action for the selected unit(s).\n\n" + "\"h\" -- stop current action for the selected unit(s).\n\n"
+ "\"Ctrl + number\" -- Create a control group and assigned the number to the group.\n\n" + "\"Ctrl + number\" -- Create a control group and assigned the number to the group.\n\n"
+ "\"Ctrl + Left Click\" -- Add/Remove the a unit to/from the selected units.\n\n" + "\"Ctrl + Left Click\" -- Add/Remove a unit to/from the selected units.\n\n"
+ "\"Ctrl + Mouse Drag\" -- Add units in the dragging box to the selected units.\n\n\n" + "\"Ctrl + Mouse Drag\" -- Add units in the dragging box to the selected units.\n\n\n"
+ " 1/4 ").toCharArray(); + " 1/4 ").toCharArray();

View File

@ -100,7 +100,7 @@ public class rocket {
return; return;
distanceToTarget = (float)Math.sqrt((target.centre.x - centre.x) * (target.centre.x - centre.x) + (target.centre.z - centre.z) * (target.centre.z - centre.z)); distanceToTarget = (float)Math.sqrt((target.centre.x - centre.x) * (target.centre.x - centre.x) + (target.centre.z - centre.z) * (target.centre.z - centre.z));
if(distanceToTarget <= 0.06){ if(distanceToTarget <= 0.065){
//spawn an explosion at the end of the rocket life //spawn an explosion at the end of the rocket life
float[] tempFloat = mainThread.theAssetManager.explosionInfo[mainThread.theAssetManager.explosionCount]; float[] tempFloat = mainThread.theAssetManager.explosionInfo[mainThread.theAssetManager.explosionCount];
@ -168,11 +168,15 @@ public class rocket {
if(attacker.type == 199) {
if(speed < 0.1)
speed*=1.5f;
}else {
if(speed < 0.1)
speed*=1.4f;
}
if(speed < 0.1)
speed*=1.4f;
distanceTravelled+=speed; distanceTravelled+=speed;