From d5bca3626e6716f4b26616be0f57e04b56fbf606 Mon Sep 17 00:00:00 2001 From: aeonios Date: Thu, 14 Nov 2019 00:06:28 -0500 Subject: [PATCH] -Set initial capacity for all the lists used for passing arguments to custom commands to reduce the rate of garbage generation. -Inverted the loops in arraygraphics and bytearraygraphics to run row major. -More fiddling with eco. -Switch on/off state to use the custom command. --- src/zkgbai/ZKGraphBasedAI.java | 21 +-------- src/zkgbai/economy/EconomyManager.java | 16 +++---- src/zkgbai/economy/Factory.java | 3 +- src/zkgbai/economy/FactoryManager.java | 46 ++++++++++--------- src/zkgbai/kgbutil/ArrayGraphics.java | 34 +++++++------- src/zkgbai/kgbutil/ByteArrayGraphics.java | 30 ++++++------ src/zkgbai/kgbutil/TerrainAnalyzer.java | 2 +- src/zkgbai/military/MilitaryManager.java | 40 ++++++++-------- .../fighterhandlers/BomberHandler.java | 7 ++- src/zkgbai/military/unitwrappers/Bomber.java | 2 +- src/zkgbai/military/unitwrappers/Coward.java | 2 +- .../military/unitwrappers/ShieldSquad.java | 26 +++++++---- 12 files changed, 114 insertions(+), 115 deletions(-) diff --git a/src/zkgbai/ZKGraphBasedAI.java b/src/zkgbai/ZKGraphBasedAI.java index 4bf5369..9ccd1e6 100644 --- a/src/zkgbai/ZKGraphBasedAI.java +++ b/src/zkgbai/ZKGraphBasedAI.java @@ -224,16 +224,7 @@ public int luaMessage(java.lang.String inData){ @Override public int update(int frame) { - if (slave) { - /*if (frame % 30 == 0) { - // give away income from communism when merged with another AI instance. - Resource metal = callback.getResources().get(0); - Resource energy = callback.getResources().get(1); - callback.getEconomy().sendResource(metal, callback.getEconomy().getIncome(metal), mergeTarget); - callback.getEconomy().sendResource(energy, callback.getEconomy().getIncome(energy), mergeTarget); - }*/ - return 0; - } + if (slave) return 0; if (frame == 0){ say("glhf!"); @@ -302,15 +293,7 @@ public int update(int frame) { @Override public int message(int player, String message) { if (!slave && message.equals("kgbdebug")){ - for (Enemy e: warManager.getTargets()){ - if (e.isPorc){ - marker(e.position, e.ud.getHumanName()); - } - } - /*for (Worker w:ecoManager.workers.values()){ - //marker(w.getPos(), w.getTask() == null ? "no task" : w.getTask().toString()); - marker(w.getPos(), w.isGreedy ? "greedy" : "non-greedy"); - }*/ + say("Mobile BP: " + facManager.mobileBP + " Income: " + ecoManager.effectiveIncomeMetal + " Income + Reclaim Bonus: " + (ecoManager.effectiveIncomeMetal + (ecoManager.getReclaimValue() / ((2f + 20f * graphManager.territoryFraction) * 25f)))); } for (Module module : modules) { diff --git a/src/zkgbai/economy/EconomyManager.java b/src/zkgbai/economy/EconomyManager.java index f48a668..6450a53 100644 --- a/src/zkgbai/economy/EconomyManager.java +++ b/src/zkgbai/economy/EconomyManager.java @@ -299,7 +299,7 @@ public int update(int frame) { adjustedIncome = (staticIncome/(1 + (ai.mergedAllies))) + ((1f + ai.mergedAllies) * (frame/1800f)); if (fusions.size() > 3) { - ArrayList params = new ArrayList<>(); + ArrayList params = new ArrayList<>(1); if (!fusionTasks.isEmpty()) { params.add(1f); for (Unit u : superWeps) { @@ -335,7 +335,8 @@ public int update(int frame) { } } } - float eratio = (eFac ? 1.5f : 1f) + (graphManager.territoryFraction + (graphManager.territoryFraction * graphManager.territoryFraction)) / 2f; + float eratio = 2f + fusions.size(); + //float eratio = (eFac ? 1.5f : 1f) + (graphManager.territoryFraction + (graphManager.territoryFraction * graphManager.territoryFraction)) / 2f; hardEstalled = (maxStorage > 1f && energy < Math.min(effectiveIncomeEnergy * (1f + graphManager.territoryFraction), maxStorage/2f)) || staticIncome > effectiveIncomeEnergy; estalled = hardEstalled || rawMexIncome * eratio > effectiveIncomeEnergy; if (maxStorage > 1f && hardEstalled && metal/maxStorage > 0.5f) energyReclaim = true; @@ -822,7 +823,7 @@ public int unitIdle(Unit u) { if (newWorkers.contains(u.getUnitId()) && u.getCurrentCommands().isEmpty()){ Worker w = new Worker(u); workers.put(w.id, w); - if (workers.size() > 1 + ai.mergedAllies && (greed < 2 || greed < ((workers.size() - commanders.size())) * Math.min(1f - graphManager.territoryFraction, 1f))){ + if (workers.size() > 1 + ai.mergedAllies && (greed < 2 || greed < (workers.size() - commanders.size()) * Math.min(1f - graphManager.territoryFraction, 1f))){ w.isGreedy = true; greed++; } @@ -885,7 +886,7 @@ private void checkNanos(){ } private void setEcoPriorities(){ - List params = new ArrayList<>(); + List params = new ArrayList<>(1); if (!hardEstalled && !graphManager.eminentTerritory && adjustedIncome < 20f){ params.add(2f); }else { @@ -2429,7 +2430,7 @@ private void morphSparrow(){ if (best != null){ sparrow = best; radars.remove(sparrow); - List params = new ArrayList<>(); + List params = new ArrayList<>(1); params.add((float) callback.getUnitDefByName("planelightscout").getUnitDefId()); sparrow.executeCustomCommand(CMD_MORPH, params, (short) 0, Integer.MAX_VALUE); params.clear(); @@ -2447,7 +2448,7 @@ void createEnergyTask(Worker worker){ ConstructionTask ct; // for solars - if (((solars.size() + solarTasks.size()) < Math.round(rawMexIncome/2f) || Math.random() > 0.35) + if (((solars.size() + solarTasks.size()) < Math.round(rawMexIncome/2f) || Math.random() > 0.25) && callback.getMap().getElevationAt(position.x, position.z) > 0){ if (position == null){ return; @@ -2831,9 +2832,6 @@ public int compare(Feature o1, Feature o2) { } public float getReclaimValue(){ - if (effectiveIncome < 20f){ - return 0f; - } if (lastRCValueFrame == 0 || frame - lastRCValueFrame > 300){ reclaimValue = 0; lastRCValueFrame = frame; diff --git a/src/zkgbai/economy/Factory.java b/src/zkgbai/economy/Factory.java index a1e1a54..a341a85 100644 --- a/src/zkgbai/economy/Factory.java +++ b/src/zkgbai/economy/Factory.java @@ -47,7 +47,8 @@ public Factory(Unit u, boolean firstFac){ } if (defName.equals("factorytank")){ - scoutAllowance = 2; + scoutAllowance = 1; + raiderSpam = 0; } if (defName.equals("factorygunship")){ diff --git a/src/zkgbai/economy/FactoryManager.java b/src/zkgbai/economy/FactoryManager.java index 7afa05a..22f4154 100644 --- a/src/zkgbai/economy/FactoryManager.java +++ b/src/zkgbai/economy/FactoryManager.java @@ -395,7 +395,8 @@ public int unitFinished(Unit unit) { newUnits.remove(unit.getUnitId()); String defName = unit.getDef().getName(); if (!unitTypes.AAs.contains(defName)){ - fighterValue += Math.min(unit.getDef().getCost(m), unitTypes.heavies.contains(defName) ? 500f: 350f)/(unitTypes.arties.contains(defName) ? 2f : 1f); + //fighterValue += Math.min(unit.getDef().getCost(m), unitTypes.heavies.contains(defName) ? 500f: 350f)/(unitTypes.arties.contains(defName) ? 2f : 1f); + fighterValue += unit.getDef().getCost(m); } armyValue += unit.getDef().getCost(m)/2f; } @@ -453,7 +454,8 @@ public int unitDestroyed(Unit unit, Unit attacker) { newUnits.remove(unit.getUnitId()); armyValue -= unit.getDef().getCost(m)/2f; }else if (def.getSpeed() > 0 && !def.isAbleToFly() && !unitTypes.AAs.contains(defName)){ - fighterValue -= Math.min(unit.getDef().getCost(m), unitTypes.heavies.contains(defName) ? 500f: 350f)/(unitTypes.arties.contains(defName) ? 2f : 1f); + //fighterValue -= Math.min(unit.getDef().getCost(m), unitTypes.heavies.contains(defName) ? 500f: 350f)/(unitTypes.arties.contains(defName) ? 2f : 1f); + fighterValue -= unit.getDef().getCost(m); armyValue -= unit.getDef().getCost(m); }else if (unitTypes.AAs.contains(defName)){ numAAs--; @@ -731,15 +733,12 @@ private Boolean needWorkers(Factory fac){ float reclaimValue = economyManager.getReclaimValue(); - //float territoryMod = Math.min(0.25f, graphManager.territoryFraction/2f); - //float fv = (fighterValue * (facType == "factorytank" ? Math.min(0.6f, 1.25f * graphManager.territoryFraction) : Math.min(0.5f, graphManager.territoryFraction))) + Math.min(fighterValue * territoryMod, reclaimValue/2f); - float income = economyManager.effectiveIncomeMetal /*+ Math.min(20f, reclaimValue/(2f * fac.costPerBP)) + (5f * economyManager.fusions.size())*/; + float income = economyManager.effectiveIncomeMetal + (reclaimValue / ((2f + 20f * graphManager.territoryFraction) * fac.costPerBP)); int workerDeficit = Math.round((income - mobileBP)/fac.workerBP); - if (workerDeficit > 0 && - (fighterValue > workerValue || numWorkers == 0 - || (economyManager.adjustedIncome > 15f && economyManager.metal/economyManager.maxStorage > 0.8f && economyManager.energy/economyManager.maxStorage > 0.5f && economyManager.maxStorage > 0.5f && workerDeficit > -3)) - || (earlyWorker && numWorkers < 2) + if ((workerDeficit > 0 && fighterValue > workerValue || numWorkers == 0) + || (economyManager.adjustedIncome > 15f && economyManager.metal/economyManager.maxStorage > 0.8f /*&& economyManager.energy/economyManager.maxStorage > 0.5f */&& economyManager.maxStorage > 0.5f && workerDeficit > -1) + || (earlyWorker && numWorkers < 2 * (1 + ai.mergedAllies)) ) { return true; }else if (((fac.raiderSpam >= 0 && scoutBudget == 0 && fac.expensiveRaiderSpam >= 0) && numWorkers < 2 * (1 + ai.mergedAllies))){ @@ -773,7 +772,7 @@ private String getCloaky(Factory fac) { return "cloakheavyraid"; } - if (fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "cloakaa"; } @@ -860,7 +859,7 @@ private String getShields(Factory fac) { if (fac.smallRaiderSpam) fac.smallRaiderSpam = false; - if (fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2f) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "shieldaa"; } @@ -922,7 +921,7 @@ private String getAmphs(Factory fac) { return "amphraid"; } - if (fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2f) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "amphaa"; } @@ -998,7 +997,7 @@ private String getLV(Factory fac) { return "vehcapture"; } - if (fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2f) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "vehaa"; } @@ -1060,16 +1059,16 @@ private String getHovers(Factory fac) { return "hoverarty"; } - if (fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "hoveraa"; } if (!highprio && Math.random() > (warManager.sniperSightings.isEmpty() ? 0.9 + Math.min(0.05f, graphManager.territoryFraction/10f) : 0.85)){ fac.raiderSpam -= Math.min(8, Math.max(4, (int) Math.floor(economyManager.adjustedIncome/5f))); } - if (Math.random() > 0.85) { + /*if (Math.random() > 0.85) { fac.expensiveRaiderSpam -= (int) Math.min(6, Math.max(2, Math.floor(economyManager.adjustedIncome / 10f))) + 1; - } + }*/ if (Math.random() < graphManager.territoryFraction){ fac.expensiveRaiderSpam--; @@ -1103,15 +1102,20 @@ private String getTanks(Factory fac) { return "tankraid"; } + if (!fac.smallRaiderSpam){ + fac.smallRaiderSpam = true; + fac.expensiveRaiderSpam = -5; + } + if (fac.expensiveRaiderSpam < 0){ fac.expensiveRaiderSpam++; - if (Math.random() > 0.5) fac.scoutAllowance = Math.min(fac.maxScoutAllowance, fac.scoutAllowance + 1); + //if (Math.random() > 0.5) fac.scoutAllowance = Math.min(fac.maxScoutAllowance, fac.scoutAllowance + 1); return "tankheavyraid"; } fac.scoutAllowance = Math.min(fac.maxScoutAllowance, fac.scoutAllowance + 1); - if (fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "tankaa"; } @@ -1127,7 +1131,7 @@ private String getTanks(Factory fac) { double rand = Math.random(); if (economyManager.adjustedIncome < 35 && !graphManager.eminentTerritory) { fac.expensiveRaiderSpam -= 2; - if (numBanishers > numReapers || warManager.enemyHeavyPorcValue > 850 * numReapers){ + if (numBanishers > numReapers || warManager.enemyHeavyPorcValue > 850f * numReapers){ fac.expensiveRaiderSpam--; return "tankassault"; }else { @@ -1167,7 +1171,7 @@ private String getSpiders(Factory fac) { return "spiderscout"; } - if (fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "spideraa"; } @@ -1215,7 +1219,7 @@ private String getGunship(Factory fac){ return "gunshipcon"; } - if (graphManager.eminentTerritory && fighterValue > AAvalue && Math.random() < Math.min(1f, graphManager.territoryFraction * 2) * (1f - AAvalue/warManager.maxEnemyAirValue)){ + if (graphManager.eminentTerritory && fighterValue > AAvalue && Math.random() > (AAvalue/warManager.maxEnemyAirValue) * (AAvalue/warManager.maxEnemyAirValue)){ return "gunshipaa"; } diff --git a/src/zkgbai/kgbutil/ArrayGraphics.java b/src/zkgbai/kgbutil/ArrayGraphics.java index 9d835f2..27b7588 100644 --- a/src/zkgbai/kgbutil/ArrayGraphics.java +++ b/src/zkgbai/kgbutil/ArrayGraphics.java @@ -29,16 +29,17 @@ public void paintCircle(int cx, int cy, int radius, int intensity){ int radsq = radius * radius; - for (int x = beginX; x < endX; x++) { - int dX = (cx - x); - int dxSq = dX*dX; - - for (int y = beginY; y < endY; y++) { - int dY = (cy - y); - int dySq = dY*dY; - + for (int y = beginY; y < endY; y++) { + int dY = (cy - y); + int dySq = dY*dY; + int ypos = (y * width); + + for (int x = beginX; x < endX; x++) { + int dX = (cx - x); + int dxSq = dX*dX; + int sum = dxSq + dySq; - int index = (y * width) + x; + int index = ypos + x; if(sum <= radsq) { data[index] += intensity; @@ -59,16 +60,17 @@ public void unpaintCircle(int cx, int cy, int radius, int intensity){ int radsq = radius * radius; - for (int x = beginX; x < endX; x++) { - int dX = (cx - x); - int dxSq = dX*dX; + for (int y = beginY; y < endY; y++) { + int dY = (cy - y); + int dySq = dY*dY; + int ypos = (y * width); - for (int y = beginY; y < endY; y++) { - int dY = (cy - y); - int dySq = dY*dY; + for (int x = beginX; x < endX; x++) { + int dX = (cx - x); + int dxSq = dX*dX; int sum = dxSq + dySq; - int index = (y * width) + x; + int index = ypos + x; if(sum <= radsq) { data[index] = (short) Math.max(data[index] - intensity, 0); diff --git a/src/zkgbai/kgbutil/ByteArrayGraphics.java b/src/zkgbai/kgbutil/ByteArrayGraphics.java index b5f8255..b0a3f02 100644 --- a/src/zkgbai/kgbutil/ByteArrayGraphics.java +++ b/src/zkgbai/kgbutil/ByteArrayGraphics.java @@ -29,16 +29,17 @@ public void paintCircle(int cx, int cy, int radius, int intensity){ int radsq = radius * radius; - for (int x = beginX; x < endX; x++) { - int dX = (cx - x); - int dxSq = dX*dX; + for (int y = beginY; y < endY; y++) { + int dY = (cy - y); + int dySq = dY*dY; + int ypos = (y * width); - for (int y = beginY; y < endY; y++) { - int dY = (cy - y); - int dySq = dY*dY; + for (int x = beginX; x < endX; x++) { + int dX = (cx - x); + int dxSq = dX*dX; int sum = dxSq + dySq; - int index = (y * width) + x; + int index = ypos + x; if(sum <= radsq) { data[index] += intensity; @@ -59,16 +60,17 @@ public void unpaintCircle(int cx, int cy, int radius, int intensity){ int radsq = radius * radius; - for (int x = beginX; x < endX; x++) { - int dX = (cx - x); - int dxSq = dX*dX; + for (int y = beginY; y < endY; y++) { + int dY = (cy - y); + int dySq = dY*dY; + int ypos = (y * width); - for (int y = beginY; y < endY; y++) { - int dY = (cy - y); - int dySq = dY*dY; + for (int x = beginX; x < endX; x++) { + int dX = (cx - x); + int dxSq = dX*dX; int sum = dxSq + dySq; - int index = (y * width) + x; + int index = ypos + x; if(sum <= radsq) { data[index] = (byte) Math.max(data[index] - intensity, 0); diff --git a/src/zkgbai/kgbutil/TerrainAnalyzer.java b/src/zkgbai/kgbutil/TerrainAnalyzer.java index 5cc9233..ddeff10 100644 --- a/src/zkgbai/kgbutil/TerrainAnalyzer.java +++ b/src/zkgbai/kgbutil/TerrainAnalyzer.java @@ -50,7 +50,7 @@ private void populateFacList(){ if (veh.result){ log(taMsg + "Veh path check succeeded, enabling veh!"); initialFacList.add("factoryveh"); - //if (veh.avgCostRatio < 1.2f) initialFacList.add("factorytank"); // fuck tanks. Kodachi nerf and dart buff have made them unplayable. + if (veh.avgCostRatio < 1.2f) initialFacList.add("factorytank"); // fuck tanks. Kodachi nerf and dart buff have made them unplayable. initialFacList.add("factoryhover"); } diff --git a/src/zkgbai/military/MilitaryManager.java b/src/zkgbai/military/MilitaryManager.java index ae23827..d4b944e 100644 --- a/src/zkgbai/military/MilitaryManager.java +++ b/src/zkgbai/military/MilitaryManager.java @@ -97,10 +97,11 @@ public class MilitaryManager extends Module { Set newUnits = new HashSet<>(); Set unbuiltPorcs = new HashSet<>(); - static int CMD_DONT_FIRE_AT_RADAR = 38372; - static int CMD_AIR_STRAFE = 39381; - static int CMD_AP_FLY_STATE = 34569; - static int CMD_UNIT_AI = 36214; + static final int CMD_DONT_FIRE_AT_RADAR = 38372; + static final int CMD_AIR_STRAFE = 39381; + static final int CMD_AP_FLY_STATE = 34569; + static final int CMD_UNIT_AI = 36214; + static final int CMD_WANT_ONOFF = 35667; // unit and weapon def IDs for unitDamaged. int wolvMineID = 0; @@ -244,7 +245,9 @@ public int unitFinished(Unit unit){ // Deactivate outlaws so they don't destroy reclaim if (defName.equals("shieldriot")){ - unit.setOn(false, (short) 0, Integer.MAX_VALUE); + List params = new ArrayList<>(1); + params.add(0f); + unit.executeCustomCommand(CMD_WANT_ONOFF, params, (short) 0, Integer.MAX_VALUE); } if (defName.equals("staticnuke")){ @@ -310,7 +313,7 @@ public int unitIdle(Unit unit) { // enable snipers and penetrators to shoot radar dots if (defName.equals("cloaksnipe") || defName.equals("hoverarty")){ - ArrayList params = new ArrayList<>(); + ArrayList params = new ArrayList<>(1); params.add((float) 0); unit.executeCustomCommand(CMD_DONT_FIRE_AT_RADAR, params, (short) 0, Integer.MAX_VALUE); unit.setMoveState(1, (short) 0, Integer.MAX_VALUE); @@ -318,7 +321,7 @@ public int unitIdle(Unit unit) { // disable air strafe for brawlers if (defName.equals("gunshipheavyskirm")){ - ArrayList params = new ArrayList<>(); + ArrayList params = new ArrayList<>(1); params.add((float) 0); unit.executeCustomCommand(CMD_AIR_STRAFE, params, (short) 0, Integer.MAX_VALUE); } @@ -382,7 +385,7 @@ public int unitIdle(Unit unit) { }else if(unitTypes.loners.contains(defName)) { if (defName.equals("vehsupport") || defName.equals("spidercrabe")) { unit.setMoveState(0, (short) 0, Integer.MAX_VALUE); - ArrayList params = new ArrayList<>(); + ArrayList params = new ArrayList<>(1); params.add((float) 1); unit.executeCustomCommand(CMD_UNIT_AI, params, (short) 0, Integer.MAX_VALUE); } else { @@ -393,7 +396,7 @@ public int unitIdle(Unit unit) { }else if (unitTypes.arties.contains(defName)){ if (defName.equals("vehheavyarty") || defName.equals("tankarty") || defName.equals("striderarty") || defName.equals("tankheavyarty")){ unit.setMoveState(0, (short) 0, Integer.MAX_VALUE); - ArrayList params = new ArrayList<>(); + ArrayList params = new ArrayList<>(1); params.add((float) 1); unit.executeCustomCommand(CMD_UNIT_AI, params, (short) 0, Integer.MAX_VALUE); }else{ @@ -412,7 +415,7 @@ public int unitIdle(Unit unit) { }else if (unitTypes.sappers.contains(defName)){ unit.setMoveState(2, (short) 0, Integer.MAX_VALUE); unit.setFireState(2, (short) 0, Integer.MAX_VALUE); - ArrayList params = new ArrayList<>(); + ArrayList params = new ArrayList<>(1); params.add((float) 0); unit.executeCustomCommand(CMD_UNIT_AI, params, (short) 0, Integer.MAX_VALUE); unit.fight(getRadialPoint(graphManager.getAllyCenter(), 800f), (short) 0, Integer.MAX_VALUE); @@ -928,7 +931,6 @@ private void paintThreatMap(){ threatGraphics.clear(); aaThreatGraphics.clear(); riotGraphics.clear(); - scytheGraphics.clear(); for (Enemy t : targets.values()) { int effectivePower = (int) t.getDanger(); @@ -936,9 +938,6 @@ private void paintThreatMap(){ int x = Math.round(position.x / 64f); int y = Math.round(position.z / 64f); - if (!t.identified || t.ud == null || !t.ud.isAbleToFly()) { - scytheGraphics.paintCircle(x, y, 4, 1); - } if (position != null && t.ud != null && effectivePower > 0 @@ -994,13 +993,17 @@ private void paintThreatMap(){ enemyPorcGraphics.clear(); raiderValueGraphics.clear(); + scytheGraphics.clear(); // Update porc threat and loot value for raiders. for (Enemy t : targets.values()) { - if (!t.identified || t.ud == null || (!t.isWorker && !t.isStatic) || t.isCom) continue; AIFloat3 position = t.position; int x = Math.round(position.x / 64f); int y = Math.round(position.z / 64f); int r; + if (!t.identified || t.ud == null || !t.ud.isAbleToFly()) { + scytheGraphics.paintCircle(x, y, 4, 1); + } + if (!t.identified || t.ud == null || (!t.isWorker && !t.isStatic) || t.isCom) continue; float value = t.value / 10f; if (t.isPorc){ value /= 2f; @@ -1142,7 +1145,7 @@ private void updateTargets() { if (defName.equals("dronelight") || defName.equals("droneheavyslow") || defName.equals("dronecarry")){ enemyAirValue += 25f; }else { - enemyAirValue += t.ud.getBuildTime(); + enemyAirValue += t.ud.getCost(m); } }else if (t.unit.getRulesParamFloat("comm_level", 0f) > 3f){ enemyHasTrollCom = true; @@ -1153,9 +1156,8 @@ private void updateTargets() { } } } - if (enemyAirValue > maxEnemyAirValue){ - maxEnemyAirValue = enemyAirValue; - } + + maxEnemyAirValue = Math.max(enemyAirValue, maxEnemyAirValue); ArrayList deadMarkers = new ArrayList(); for(TargetMarker tm:targetMarkers){ diff --git a/src/zkgbai/military/fighterhandlers/BomberHandler.java b/src/zkgbai/military/fighterhandlers/BomberHandler.java index 5ca8187..d89baae 100644 --- a/src/zkgbai/military/fighterhandlers/BomberHandler.java +++ b/src/zkgbai/military/fighterhandlers/BomberHandler.java @@ -117,9 +117,9 @@ private void assignBombers(){ continue; } - if (b.targetMissing() /*|| warManager.getAAThreat(b.target.position) > activeBombers.size()/4f*/){ + if (b.targetMissing()){ swap.add(b); - readyBombers.add(b); + unarmedBombers.add(b); b.flyTo(graphManager.getAllyCenter()); }else{ b.bomb(); @@ -128,7 +128,6 @@ private void assignBombers(){ activeBombers.removeAll(swap); // have all unarmed bombers reload/heal themselves. - List params = new ArrayList(); for (Bomber b:unarmedBombers) { if (!graphManager.isEnemyTerritory(b.getPos())) { b.findPad(); @@ -144,7 +143,7 @@ private void assignBombers(){ while (!targets.isEmpty() && !readyBombers.isEmpty()){ Enemy e = targets.poll(); int neededBombers = (int) (Math.ceil(e.ud.getHealth()/800f) + (e.isImportant ? 1 : 0)); - if (neededBombers > readyBombers.size() /*|| !pathfinder.isAssaultReachable(readyBombers.peek().getUnit(), e.position, 1.5f)*/) continue; + if (neededBombers > readyBombers.size()) continue; while (neededBombers > 0){ Bomber b = readyBombers.poll(); b.target = e; diff --git a/src/zkgbai/military/unitwrappers/Bomber.java b/src/zkgbai/military/unitwrappers/Bomber.java index 9b12a3c..06bf992 100644 --- a/src/zkgbai/military/unitwrappers/Bomber.java +++ b/src/zkgbai/military/unitwrappers/Bomber.java @@ -67,7 +67,7 @@ public void flyTo(AIFloat3 pos){ public void findPad(){ if (unit.getHealth() < unit.getMaxHealth() || unit.getRulesParamFloat("noammo", 0.0f) > 0) { - List params = new ArrayList(); + List params = new ArrayList(0); unit.executeCustomCommand(CMD_FIND_PAD, params, (short) 0, Integer.MAX_VALUE); } } diff --git a/src/zkgbai/military/unitwrappers/Coward.java b/src/zkgbai/military/unitwrappers/Coward.java index 492c1a8..ad204f6 100644 --- a/src/zkgbai/military/unitwrappers/Coward.java +++ b/src/zkgbai/military/unitwrappers/Coward.java @@ -69,7 +69,7 @@ public void retreatTo(AIFloat3 pos){ } public void findPad(){ - List params = new ArrayList(); + List params = new ArrayList(0); unit.executeCustomCommand(CMD_FIND_PAD, params, (short) 0, Integer.MAX_VALUE); } diff --git a/src/zkgbai/military/unitwrappers/ShieldSquad.java b/src/zkgbai/military/unitwrappers/ShieldSquad.java index d6f4da7..e055d3d 100644 --- a/src/zkgbai/military/unitwrappers/ShieldSquad.java +++ b/src/zkgbai/military/unitwrappers/ShieldSquad.java @@ -17,6 +17,7 @@ public class ShieldSquad extends Squad { static final int CMD_ORBIT = 13923; static final int CMD_ORBIT_DRAW = 13924; static final int CMD_WANTED_SPEED = 38825; + static final int CMD_WANT_ONOFF = 35667; static final short OPTION_SHIFT_KEY = 32; public Fighter leader; private int leaderWeight; @@ -58,7 +59,11 @@ public void addUnit(Fighter f){ if (defID == felonID) numFelons++; - if (defID == lawID) f.getUnit().setOn(true, (short) 0, Integer.MAX_VALUE); + if (defID == lawID){ + List params = new ArrayList<>(1); + params.add(1f); + f.getUnit().executeCustomCommand(CMD_WANT_ONOFF, params, (short) 0, Integer.MAX_VALUE); + } if (defID != aspisID) { for (Weapon w : f.getUnit().getWeapons()) { @@ -76,14 +81,14 @@ public void addUnit(Fighter f){ f.getUnit().setMoveState(1, (short) 0, Integer.MAX_VALUE); leader = f; leaderWeight = getUnitWeight(f); - List moveparams = new ArrayList<>(); + List moveparams = new ArrayList<>(1); moveparams.add(45f); f.getUnit().executeCustomCommand(CMD_WANTED_SPEED, moveparams, (short) 0, Integer.MAX_VALUE); }else if (getUnitWeight(f) < leaderWeight){ f.getUnit().setMoveState(1, (short) 0, Integer.MAX_VALUE); leader.getUnit().setMoveState(0, (short) 0, Integer.MAX_VALUE); // Set the wanted max speed for the new leader and remove the speed limit from the old leader. - List moveparams = new ArrayList<>(); + List moveparams = new ArrayList<>(1); moveparams.add(45f); f.getUnit().executeCustomCommand(CMD_WANTED_SPEED, moveparams, (short) 0, Integer.MAX_VALUE); moveparams.clear(); @@ -99,8 +104,8 @@ public void addUnit(Fighter f){ }else{ f.getUnit().setMoveState(0, (short) 0, Integer.MAX_VALUE); fighters.add(f); - List params = new ArrayList<>(); - List drawParams = new ArrayList<>(); + List params = new ArrayList<>(2); + List drawParams = new ArrayList<>(1); params.add((float)leader.id); drawParams.add((float)leader.id); if (f.getUnit().getDef().getUnitDefId() == domiID){ @@ -174,13 +179,15 @@ public void retreatTo(AIFloat3 pos){ } private void collectStragglers(){ + List drawParams = new ArrayList<>(1); + drawParams.add((float)leader.id); for (Fighter f:fighters){ if (distance(leader.getPos(), f.getPos()) > 600f){ f.moveTo(getAngularPoint(leader.getPos(), f.getPos(), 400f)); // have units that haven't rallied yet avoid enemies. - List params = new ArrayList<>(); - List drawParams = new ArrayList<>(); + + List params = new ArrayList<>(2); params.add((float)leader.id); - drawParams.add((float)leader.id); + if (f.getUnit().getDef().getUnitDefId() == domiID){ params.add(250f); }else if (f.getUnit().getDef().getUnitDefId() == aspisID){ @@ -190,6 +197,7 @@ private void collectStragglers(){ }else{ params.add(90f); } + f.getUnit().executeCustomCommand(CMD_ORBIT, params, OPTION_SHIFT_KEY, Integer.MAX_VALUE); f.getUnit().executeCustomCommand(CMD_ORBIT_DRAW, drawParams, OPTION_SHIFT_KEY, Integer.MAX_VALUE); } @@ -247,7 +255,7 @@ public boolean isDead(){ fighters.remove(leader); leader.getUnit().setMoveState(1, (short) 0, Integer.MAX_VALUE); leaderWeight = getUnitWeight(leader); - List moveparams = new ArrayList<>(); + List moveparams = new ArrayList<>(1); moveparams.add(45f); leader.getUnit().executeCustomCommand(CMD_WANTED_SPEED, moveparams, (short) 0, Integer.MAX_VALUE); collectStragglers();