From ac98f5895531dc5bcc1532f58b380dc55d7260c9 Mon Sep 17 00:00:00 2001 From: Pan Date: Sat, 4 May 2019 23:03:14 +1200 Subject: [PATCH] home --- core/AssetManager.java | 16 ++++++++-------- core/mainThread.java | 4 ++-- enemyAI/baseExpensionAI.java | 15 +++++++-------- enemyAI/combatManagerAI.java | 2 +- enemyAI/defenseManagerAI.java | 2 +- enemyAI/economyManagerAI.java | 12 ++++++------ enemyAI/mapAwarenessAI.java | 2 +- enemyAI/microManagementAI.java | 9 ++++++++- enemyAI/unitProductionAI.java | 21 +++++++++++++++------ entity/gunTurret.java | 2 +- entity/missileTurret.java | 2 +- entity/stealthTank.java | 12 ++++++++---- gui/gameMenu.java | 2 +- particles/rocket.java | 14 +++++++++----- 14 files changed, 69 insertions(+), 46 deletions(-) diff --git a/core/AssetManager.java b/core/AssetManager.java index f0409cb..2cb1a6e 100644 --- a/core/AssetManager.java +++ b/core/AssetManager.java @@ -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)); } } diff --git a/core/mainThread.java b/core/mainThread.java index f5cefb7..f12ca45 100644 --- a/core/mainThread.java +++ b/core/mainThread.java @@ -506,7 +506,7 @@ public class mainThread extends JFrame implements KeyListener, ActionListener, M sleepTime = 0; - while(System.currentTimeMillis()-lastDraw= 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; } diff --git a/enemyAI/combatManagerAI.java b/enemyAI/combatManagerAI.java index 0868227..54a9195 100644 --- a/enemyAI/combatManagerAI.java +++ b/enemyAI/combatManagerAI.java @@ -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; diff --git a/enemyAI/defenseManagerAI.java b/enemyAI/defenseManagerAI.java index 08743e9..b001515 100644 --- a/enemyAI/defenseManagerAI.java +++ b/enemyAI/defenseManagerAI.java @@ -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; diff --git a/enemyAI/economyManagerAI.java b/enemyAI/economyManagerAI.java index 7aab876..fb00815 100644 --- a/enemyAI/economyManagerAI.java +++ b/enemyAI/economyManagerAI.java @@ -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; + } } } diff --git a/enemyAI/mapAwarenessAI.java b/enemyAI/mapAwarenessAI.java index 6b10759..55d55d6 100644 --- a/enemyAI/mapAwarenessAI.java +++ b/enemyAI/mapAwarenessAI.java @@ -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 diff --git a/enemyAI/microManagementAI.java b/enemyAI/microManagementAI.java index 06b5bf9..a764cc9 100644 --- a/enemyAI/microManagementAI.java +++ b/enemyAI/microManagementAI.java @@ -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; diff --git a/enemyAI/unitProductionAI.java b/enemyAI/unitProductionAI.java index 53774e2..c712922 100644 --- a/enemyAI/unitProductionAI.java +++ b/enemyAI/unitProductionAI.java @@ -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; diff --git a/entity/gunTurret.java b/entity/gunTurret.java index 063b3ba..85b2811 100644 --- a/entity/gunTurret.java +++ b/entity/gunTurret.java @@ -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; diff --git a/entity/missileTurret.java b/entity/missileTurret.java index 6df235b..e9d2aba 100644 --- a/entity/missileTurret.java +++ b/entity/missileTurret.java @@ -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; diff --git a/entity/stealthTank.java b/entity/stealthTank.java index 40176ab..74170b1 100644 --- a/entity/stealthTank.java +++ b/entity/stealthTank.java @@ -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 } diff --git a/gui/gameMenu.java b/gui/gameMenu.java index b43ee25..52a2c42 100644 --- a/gui/gameMenu.java +++ b/gui/gameMenu.java @@ -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(); diff --git a/particles/rocket.java b/particles/rocket.java index 55fe248..14c9147 100644 --- a/particles/rocket.java +++ b/particles/rocket.java @@ -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;