Added effects to simulator

This commit is contained in:
Samy Avrillon 2024-07-08 13:51:18 +02:00
parent b783361264
commit 8454e3a711
Signed by: Mysaa
GPG Key ID: 0220AC4A3D6A328B
3 changed files with 88 additions and 31 deletions

View File

@ -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<Unit,FightStats> 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<Research> relevantDefResearches(GameConfig gd) {
return List.of("divine_selection","phalanx","ram")

View File

@ -18,33 +18,67 @@ public class DefContext {
Map<Unit, Integer> 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<Unit, Integer> units, Hero hero, int heroLevel, int wallLevel, boolean hasTower,
Set<String> powers, int soteriasShrinePowerLevel, int olympicTorchGrepolympiaSummerLevel, int olympicSensesGrepolympiaSummerLevel, Set<String> researches, Set<String> 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;
}
}

View File

@ -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);
}