From 8454e3a711ca4bd9ab2271f34cdb95d11448defd Mon Sep 17 00:00:00 2001 From: Samy Avrillon Date: Mon, 8 Jul 2024 13:51:18 +0200 Subject: [PATCH] Added effects to simulator --- .../bernard/greposimu/engine/game/Fight.java | 46 +++++++++---- .../bernard/greposimu/model/DefContext.java | 69 ++++++++++++++----- .../bernard/greposimu/model/FightStats.java | 4 ++ 3 files changed, 88 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/bernard/greposimu/engine/game/Fight.java b/src/main/java/com/bernard/greposimu/engine/game/Fight.java index d66cfb0..c1aa7ba 100644 --- a/src/main/java/com/bernard/greposimu/engine/game/Fight.java +++ b/src/main/java/com/bernard/greposimu/engine/game/Fight.java @@ -15,7 +15,6 @@ import com.bernard.greposimu.model.game.units.Unit; public class Fight { public static FightStats computeDefStats(GameConfig gc, DefContext def) { - //TODO replace def getters with more complex getters (.getCounsellors.contains -> .hasCounsellor; .getUnits.get -> .getUnitCount) FightStats everyoneStatsBonus = FightStats.zero(); Map unitsBonuses; @@ -25,16 +24,17 @@ public class Fight { unitsBonuses = Heroes.heroFightBonuses(gc, def.getHero(), def.getHeroLevel(), false); // Tower & wall - cityBaseStats = Buildings.cityBaseStats(def.getWallLevel()); - everyoneStatsBonus = FightStats.add(everyoneStatsBonus, Buildings.wallBonus(def.getWallLevel())); + if(def.hasTrojanDefense()) { + cityBaseStats = Buildings.cityBaseStats(def.getWallLevel()+1); + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, Buildings.wallBonus(def.getWallLevel()+1)); + } else { + cityBaseStats = Buildings.cityBaseStats(def.getWallLevel()); + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, Buildings.wallBonus(def.getWallLevel())); + } if(def.hasTower()) // Add 10% to all units everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.cst(0.1)); - // Powers - - //TODO powers - // Researches if(def.hasDivineSelection()) for(Unit u : gc.getUnits()) @@ -51,17 +51,33 @@ public class Fight { // Counsellors if(def.hasPriest()) - for(Unit u : gc.getUnits()) - if(u.isMythological()) - unitsBonuses.put(u, FightStats.add(unitsBonuses.getOrDefault(u, FightStats.zero()), FightStats.cst(0.2))); - if(def.hasCommander()) for(Unit u : gc.getUnits()) if(u.isGround()) unitsBonuses.put(u, FightStats.add(unitsBonuses.getOrDefault(u, FightStats.zero()), FightStats.cst(0.2))); + if(def.hasCommander()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(0.2)); if(def.hasCaptain()) - for(Unit u : gc.getUnits()) - if(u.isNaval()) - unitsBonuses.put(u, FightStats.add(unitsBonuses.getOrDefault(u, FightStats.zero()), FightStats.cst(0.2))); + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.naval(0.2)); + + // Powers + if(def.hasMyrmidionAttack()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(-0.1)); + if(def.hasDefenseBoost()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(+0.05)); + if(def.hasDefensePenalty()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(-0.1)); + if(def.hasLongtermDefenseBoost()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(+0.05)); + if(def.hasRareDefenseBoost()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(+0.05)); + if(def.hasEpicDefenseBoost()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(+0.1)); + if(def.getOlympicTorchGrepolympiaSummerLevel()!=0) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(+0.05*def.getOlympicTorchGrepolympiaSummerLevel())); + if(def.getSoteriasShrineLevel()!=0) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(+0.007*def.getOlympicTorchGrepolympiaSummerLevel())); + if(def.hasNarcissism()) + everyoneStatsBonus = FightStats.add(everyoneStatsBonus, FightStats.terrestre(-0.1)); // Night Bonus if(def.isNightBonus()) @@ -99,7 +115,7 @@ public class Fight { "epic_defense_boost", "olympic_torch.grepolympia_summer", "olympic_senses.grepolympia_summer", "missions_power_4.missions_dionysia", "divine_battle_strategy_rare", "divine_battle_strategy_epic", "naval_battle_strategy_rare", "naval_battle_strategy_epic", "land_battle_strategy_rare", "land_battle_strategy_epic", - "soterias_shrine.not_cast"); + "soterias_shrine.not_cast","narcissism"); } public static List relevantDefResearches(GameConfig gd) { return List.of("divine_selection","phalanx","ram") diff --git a/src/main/java/com/bernard/greposimu/model/DefContext.java b/src/main/java/com/bernard/greposimu/model/DefContext.java index 84d373f..26a4474 100644 --- a/src/main/java/com/bernard/greposimu/model/DefContext.java +++ b/src/main/java/com/bernard/greposimu/model/DefContext.java @@ -18,33 +18,67 @@ public class DefContext { Map units; // HEROS - Hero hero; - int heroLevel; + Hero hero = null; + int heroLevel = 0; // BUILDINGS - int wallLevel; - boolean hasTower; + int wallLevel = 0; + boolean hasTower=false; // RESEARCHES - boolean divineSelection, phalanx, ram; + boolean divineSelection= false, phalanx = false, ram=false; // COUNSELLORS - boolean commander; - boolean priest; - boolean captain; + boolean commander= false; + boolean priest = false; + boolean captain = false; // EFFECTS - boolean acumen, divineSenses, myrmidionAttack, trojanDefense, - defenseBoost, defensePenalty, longtermDefenseBoost, assassinsAcumen, - rareDefenseBoost, epicDefenseBoost, missionsPower4, - divineBattleStrategyRare, divineBattleStrategyEpic, navalBattleStrategyRare, - navalBattleStrategyEpic, landBattleStrategyRare, landBattleStrategyEpic; + // PC x2 + boolean acumen = false; + // PC x4 + boolean divineSenses= false; + // Attq +10%, Def -10% + boolean myrmidionAttack= false; + // Remparts +1, Milice+5/farm (level max 25) + boolean trojanDefense= false; + // Def +5% + boolean defenseBoost= false; + // Def -10% + boolean defensePenalty= false; + // Def +5% + boolean longtermDefenseBoost= false; + // PC +50% + boolean assassinsAcumen= false; + // Def +5% + boolean rareDefenseBoost= false; + // Def +10% + boolean epicDefenseBoost= false; + // +50% PC + boolean missionsPower4= false; + // PC+50% (sauf BC, transport) + boolean divineBattleStrategyRare= false; + // PC+100% (sauf BC, transport) + boolean divineBattleStrategyEpic= false; + // PC+50% against naval (sauf BC,transports) + boolean navalBattleStrategyRare= false; + // PC+100% against naval (sauf BC, transport) + boolean navalBattleStrategyEpic= false; + // PC+50% against terrestres + boolean landBattleStrategyRare= false; + // PC+100% against terrestre + boolean landBattleStrategyEpic= false; + // Def -10% + boolean narcissism= false; + // PC+10%*level int olympicSensesGrepolympiaSummerLevel = 0; + // Def +5%*level int olympicTorchGrepolympiaSummerLevel = 0; + // Df +0.7%*level int soteriasShrineLevel = 0; // BONUSES - boolean nightBonus; + boolean nightBonus = false; public DefContext(Map units, Hero hero, int heroLevel, int wallLevel, boolean hasTower, Set powers, int soteriasShrinePowerLevel, int olympicTorchGrepolympiaSummerLevel, int olympicSensesGrepolympiaSummerLevel, Set researches, Set counsellors, boolean nightBonus) { @@ -55,7 +89,7 @@ public class DefContext { this.hasTower = hasTower; if(powers.contains("acumen"))this.acumen = true; if(powers.contains("divine_senses"))this.divineSenses = true; - if(powers.contains("myrmdion_attack"))this.myrmidionAttack = true; + if(powers.contains("myrmidion_attack"))this.myrmidionAttack = true; if(powers.contains("trojan_defense"))this.trojanDefense = true; if(powers.contains("defense_boost"))this.defenseBoost = true; if(powers.contains("defense_penalty"))this.defensePenalty = true; @@ -73,6 +107,7 @@ public class DefContext { if(powers.contains("land_battle_strategy_rare"))this.landBattleStrategyRare = true; if(powers.contains("land_battle_strategy_epic"))this.landBattleStrategyEpic = true; if(powers.contains("soterias_shrine"))this.soteriasShrineLevel = soteriasShrinePowerLevel; + if(powers.contains("narcissism"))this.narcissism = true; if(researches.contains("divine_selection"))this.divineSelection = true; if(researches.contains("phalanx"))this.phalanx = true; if(researches.contains("ram"))this.ram = true; @@ -208,6 +243,8 @@ public class DefContext { return soteriasShrineLevel; } - + public boolean hasNarcissism() { + return narcissism; + } } diff --git a/src/main/java/com/bernard/greposimu/model/FightStats.java b/src/main/java/com/bernard/greposimu/model/FightStats.java index 9fb6f31..5cc0ea5 100644 --- a/src/main/java/com/bernard/greposimu/model/FightStats.java +++ b/src/main/java/com/bernard/greposimu/model/FightStats.java @@ -27,6 +27,10 @@ public class FightStats implements Cloneable{ return new FightStats(value, value, value, 0.0); } + public static final FightStats naval(double value) { + return new FightStats(0.0, 0.0, 0.0, value); + } + public static final FightStats cst(double value) { return new FightStats(value, value, value, value); }