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[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[2] = new goldMine(2f,-0.515f, 28.25f, 52500);
goldMines[3] = new goldMine(26f,-0.515f, 3.5f, 52500);
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);
goldMines[6] = new goldMine(15.75f,-0.515f, 18f, 52500);
goldMines[7] = new goldMine(16.25f,-0.515f, 12.25f, 52500);
//create trees from bitmap
@ -241,19 +241,19 @@ public class AssetManager {
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);
//addHeavyTank(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);
//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;
//lightTank.tileCheckList_player = lightTank.generateTileCheckList(6);
//addLightTank(l);
//addStealthTank(l);
//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;
while(System.currentTimeMillis()-lastDraw<frameInterval){
/*while(System.currentTimeMillis()-lastDraw<frameInterval){
try {
Thread.sleep(1);
@ -515,7 +515,7 @@ public class mainThread extends JFrame implements KeyListener, ActionListener, M
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}*/

View File

@ -52,6 +52,9 @@ public class baseExpensionAI {
lastExpansionLocation = 7;
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 ||
(!hasRefineryNearTheGoldmine(mainThread.ec.theEconomyManagerAI.preferedGoldMine) && !hasConstructionYardNearGoldMine(mainThread.ec.theEconomyManagerAI.preferedGoldMine)) ||
(mainThread.ec.theEconomyManagerAI.preferedGoldMine == expensionGoldMine && !hasConstructionYardNearGoldMine(expensionGoldMine) && !hasRefineryNearTheGoldmine(expensionGoldMine)))){
int numberOfMCVOnQueue = 0;
@ -171,17 +176,11 @@ public class baseExpensionAI {
numberOfMCVOnQueue += mainThread.theAssetManager.factories[i].numOfMCVOnQueue;
}
}
if(numberOfMCVOnQueue == 0 && theBaseInfo.canBuildMCV){
for(int i = 0; i < mainThread.theAssetManager.factories.length; i++){
if(mainThread.theAssetManager.factories[i] != null && mainThread.theAssetManager.factories[i].teamNo != 0){
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].cancelBuilding();
mainThread.theAssetManager.factories[i].buildMCV();
break;
}

View File

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

View File

@ -421,7 +421,7 @@ public class defenseManagerAI {
if(distanceToThreat > d + missileTurret.attackRange)
d = distanceToThreat - missileTurret.attackRange;
if(distanceToThreat < 2.2)
d = 1.25f;
d = 1f;
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;

View File

@ -157,14 +157,14 @@ public class economyManagerAI {
//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.
if(theBaseInfo.numberOfRefinery > 0 && numberOfharvesters < 4){
if(numberOfharvesters/theBaseInfo.numberOfRefinery < 2){
if(theBaseInfo.numberOfRefinery > 0 && numberOfharvesters < 6){
if(numberOfharvesters < theBaseInfo.numberOfRefinery + 2){
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].isIdle()){
mainThread.theAssetManager.factories[i].buildHarvester();
break;
}
mainThread.theAssetManager.factories[i].cancelBuilding();
mainThread.theAssetManager.factories[i].buildHarvester();
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);
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
&& mainThread.ec.theMapAwarenessAI.numberOfTechCenter_player >0

View File

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

View File

@ -110,7 +110,7 @@ public class unitProductionAI {
}
if(z != 999999) {
rallyPoint.set(x - 2.5f, 0, z - 2f);
rallyPoint.set(x - 2.25f, 0, z - 1.75f);
if(frameAI < 240) {
rallyPoint.set(mainThread.theAssetManager.goldMines[5].centre);
@ -165,19 +165,28 @@ public class unitProductionAI {
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);
if( b1 || b2){
currentProductionOrder = produceRocketTank;
}else if(theBaseInfo.canBuildHeavyTank &&
(playerHasMostlyHeavyAndStealthTanks ||
}else if(theBaseInfo.canBuildHeavyTank && !playerHasMostlyHeavyTanks &&
(playerHasMostlyHeavyAndStealthTanks || (frameAI > timeToBuildHeavyTank && numberOfHeavyTanks_AI < 3) ||
!playerHasManyLightTanksButNoHeavyTank
&& !playerHasMostlyLightTanks
&& !(numberOfHeavyTanks_player == 0 && maxNumberOfStealthTanks_playerInLastFiveMinutes < 3 && frameAI > 600)
&& !(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;
}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;
}else{
currentProductionOrder = produceLightTank;

View File

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

View File

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

View File

@ -1183,8 +1183,10 @@ public class stealthTank extends solidObject{
myDamageModified=(int)(myDamage*2);
}else if(targetObject.type==1 || targetObject.type==6){
myDamageModified=(int)(myDamage*1.75);
}else if(targetObject.type == 7 || targetObject.type > 100 || targetObject.type == 2 || targetObject.type == 3){
myDamageModified=(int)(myDamage*0.4);
}else if(targetObject.type > 100 || targetObject.type == 2 || targetObject.type == 3){
myDamageModified=(int)(myDamage*0.3);
}else if(targetObject.type == 7) {
myDamageModified=(int)(myDamage*0.3);
}
//damage and alert target unit
@ -1310,8 +1312,10 @@ public class stealthTank extends solidObject{
}else if(targetObject.type==6){
myDamageModified=(int)(myDamage*1.75);
}else if(secondaryTargets[i].type == 7 || targetObject.type == 2 || targetObject.type == 3){
myDamageModified=(int)(myDamage*0.4);
}else if(targetObject.type == 2 || targetObject.type == 3){
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"
+ "\"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 + 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"
+ " 1/4 ").toCharArray();

View File

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