From 6410de196faa252765d5a9d413275869f0a04a12 Mon Sep 17 00:00:00 2001 From: Samy Avrillon Date: Sat, 2 Nov 2024 19:30:13 +0100 Subject: [PATCH] Refactored Powers, moved packages, addded CastedPower --- .../java/com/bernard/greposimu/Utils.java | 16 +- .../greposimu/controller/JSONReader.java | 172 +++++-------- .../controller/SchedulerController.java | 4 +- .../controller/SimulatorController.java | 2 +- .../greposimu/model/game/GameConfig.java | 229 +++++++++++++++++- .../greposimu/model/game/GrepoYaml.java | 3 + .../model/game/{ => buildings}/Building.java | 17 +- .../greposimu/model/game/{ => gods}/God.java | 4 +- .../model/game/powers/FuryPower.java | 20 +- .../greposimu/model/game/powers/GodPower.java | 32 +-- .../model/game/powers/MultitypePower.java | 21 -- .../greposimu/model/game/powers/Power.java | 170 ++++++------- .../model/game/queues/BuildingQueueItem.java | 6 +- .../game/queues/RecruitmentQueueItem.java | 4 +- .../model/game/queues/ResearchQueueItem.java | 4 +- .../model/game/researches/Research.java | 4 +- .../greposimu/model/game/units/Hero.java | 2 +- .../greposimu/model/game/units/NavalUnit.java | 4 +- .../model/game/units/TerrestrialUnit.java | 4 +- .../model/game/units/TransportUnit.java | 4 +- .../greposimu/model/game/units/Unit.java | 6 +- .../model/game/{ => util}/Identified.java | 2 +- .../model/game/{ => util}/Resources.java | 6 +- .../model/game/{ => util}/Timestamp.java | 2 +- .../model/game/{ => util}/UnitResources.java | 19 +- .../model/simulator/command/BuildCommand.java | 42 +++- .../model/simulator/command/Command.java | 4 +- .../simulator/command/HideStoreCommand.java | 6 +- .../simulator/command/RecruitCommand.java | 45 ++-- .../simulator/command/ResearchCommand.java | 34 ++- .../model/simulator/command/TownCommand.java | 6 +- .../model/simulator/data/CastedPower.java | 47 ++++ .../simulator/{ => data}/Joueureuse.java | 6 +- .../model/simulator/{ => data}/Movements.java | 4 +- .../simulator/{ => data}/SimulatorData.java | 3 +- .../model/simulator/{ => data}/Troupes.java | 2 +- .../model/simulator/{ => data}/Ville.java | 33 ++- .../simulator/objective/TownObjective.java | 8 +- .../bernard/greposimu/source/JSONSourcer.java | 41 ++-- .../greposimu/source/SourcedCastedPower.java | 16 +- src/main/resources/static/userscript.js | 3 +- .../greposimu/GrepoSimuApplicationTests.java | 2 +- src/test/resources/objectives.yml | 2 +- 43 files changed, 683 insertions(+), 378 deletions(-) rename src/main/java/com/bernard/greposimu/model/game/{ => buildings}/Building.java (85%) rename src/main/java/com/bernard/greposimu/model/game/{ => gods}/God.java (88%) delete mode 100644 src/main/java/com/bernard/greposimu/model/game/powers/MultitypePower.java rename src/main/java/com/bernard/greposimu/model/game/{ => util}/Identified.java (56%) rename src/main/java/com/bernard/greposimu/model/game/{ => util}/Resources.java (68%) rename src/main/java/com/bernard/greposimu/model/game/{ => util}/Timestamp.java (71%) rename src/main/java/com/bernard/greposimu/model/game/{ => util}/UnitResources.java (51%) create mode 100644 src/main/java/com/bernard/greposimu/model/simulator/data/CastedPower.java rename src/main/java/com/bernard/greposimu/model/simulator/{ => data}/Joueureuse.java (92%) rename src/main/java/com/bernard/greposimu/model/simulator/{ => data}/Movements.java (69%) rename src/main/java/com/bernard/greposimu/model/simulator/{ => data}/SimulatorData.java (89%) rename src/main/java/com/bernard/greposimu/model/simulator/{ => data}/Troupes.java (94%) rename src/main/java/com/bernard/greposimu/model/simulator/{ => data}/Ville.java (87%) diff --git a/src/main/java/com/bernard/greposimu/Utils.java b/src/main/java/com/bernard/greposimu/Utils.java index c6a91f4..2b2a884 100644 --- a/src/main/java/com/bernard/greposimu/Utils.java +++ b/src/main/java/com/bernard/greposimu/Utils.java @@ -7,8 +7,10 @@ import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; -import com.bernard.greposimu.model.game.Identified; +import com.bernard.greposimu.model.game.util.Identified; public class Utils { @@ -25,6 +27,12 @@ public class Utils { public static final T getIdentified(Set set, String id) { return set.stream().filter(x -> x.getId().equals(id)).findAny().orElse(null); } + public static final T throwingGetIdentified(String type, Set set,String id){ + if(id == null)return null; + T out = Utils.getIdentified(set, id); + if(out==null) throw new IllegalArgumentException("Could not find "+type+" of id "+id); + return out; + } public static final > EnumSet toEnumSet(Class c,Set set){ if(set.isEmpty()) @@ -32,6 +40,12 @@ public class Utils { else return EnumSet.copyOf(set); } + + public static final Map mapValue(Map map,Function f){ + return map.keySet().stream().collect(Collectors.toMap( + Function.identity(), + k -> f.apply(map.get(k)))); + } public static final Map setToMap(Set set){ return new AbstractMap() { diff --git a/src/main/java/com/bernard/greposimu/controller/JSONReader.java b/src/main/java/com/bernard/greposimu/controller/JSONReader.java index 004ce58..bd40662 100644 --- a/src/main/java/com/bernard/greposimu/controller/JSONReader.java +++ b/src/main/java/com/bernard/greposimu/controller/JSONReader.java @@ -9,19 +9,22 @@ import java.util.function.Function; import java.util.stream.Collectors; import org.json.JSONObject; +import org.springframework.lang.Nullable; import com.bernard.greposimu.Utils; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.powers.FuryPower; import com.bernard.greposimu.model.game.powers.GodPower; -import com.bernard.greposimu.model.game.powers.MultitypePower; import com.bernard.greposimu.model.game.powers.Power; +import com.bernard.greposimu.model.game.powers.Power.AreaOfEffect; +import com.bernard.greposimu.model.game.powers.Power.Effect; +import com.bernard.greposimu.model.game.powers.Power.Target; import com.bernard.greposimu.model.game.researches.Research; import com.bernard.greposimu.model.game.units.FightType; import com.bernard.greposimu.model.game.units.Hero; import com.bernard.greposimu.model.game.units.Hero.HeroCategory; +import com.bernard.greposimu.model.game.util.Resources; import com.bernard.greposimu.model.game.units.NavalUnit; import com.bernard.greposimu.model.game.units.TerrestrialUnit; import com.bernard.greposimu.model.game.units.TransportUnit; @@ -42,111 +45,61 @@ public class JSONReader { for(String p : powersJ.keySet()) { JSONObject power = powersJ.getJSONObject(p); JSONObject metadefaults = power.isNull("meta_defaults")?null:power.getJSONObject("meta_defaults"); - if(power.isNull("god_id") || power.getString("god_id").isEmpty()) { - // DETECTING TYPE DEPEDENCY - boolean dependent = - power.optJSONObject("name")!=null || + String id = power.getString("id"); + EnumSet targets = Utils.toEnumSet(Power.Target.class,power.getJSONArray("targets").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())); + EnumSet seedsTo = Utils.toEnumSet(Power.Target.class,power.getJSONArray("seeds_to").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())); + + String shortEffect = power.isNull("short_effect")?null:power.getString("short_effect"); + Power.Group powerGroup = getPowerGroup(power.getString("power_group")); + int powerGroupLevel = power.getInt("power_group_level"); + + //name + Set metaFields = power.getJSONArray("meta_fields").toList().stream().map(v -> (String)v).collect(Collectors.toSet()); + Map metaDefaults = metadefaults==null?Map.of():metadefaults.toMap(); + + + int lifetime = power.getInt("lifetime"); + + EnumSet tags = getPowerTags(power); + EnumSet effects = Utils.toEnumSet(Power.Effect.class,power.getJSONArray("effects").toList().stream().map(k -> getPowerEffect((String)k)).collect(Collectors.toSet())); + Set compatiblePowers = power.isNull("compatible_powers")?Set.of():power.getJSONArray("compatible_powers").toList().stream().map(v -> (String)v).collect(Collectors.toSet()); + EnumSet areaOfEffect = Utils.toEnumSet(Power.AreaOfEffect.class,power.getJSONArray("area_of_effect").toList().stream().map(k -> getPowerAOE((String)k)).collect(Collectors.toSet())); + + boolean dependent = + power.optJSONObject("name")!=null || power.optJSONObject("effect")!=null || - power.optJSONObject("description")!=null; - String dependentKind = dependent? - (metadefaults != null && metadefaults.has("type"))?"type": - (metadefaults != null && metadefaults.has("god"))?"god":"unknown" - :null; - - if(dependent) { - Set kinds = - Optional.ofNullable(power.optJSONObject("name")) - .orElseGet(() -> Optional.ofNullable(power.optJSONObject("effect")) - .orElseGet(() -> power.optJSONObject("description")) - ).getJSONObject(dependentKind).keySet(); - for(String kind : kinds){ - powers.add(new MultitypePower( - power.getString("id")+":"+kind, - Optional.ofNullable(power.optString("name")).orElseGet(() -> power.getJSONObject("name").getJSONObject(dependentKind).getString(kind)), - Optional.ofNullable(power.optString("description")).orElseGet(() -> power.getJSONObject("description").getJSONObject(dependentKind).getString(kind)), - power.isNull("short_effect")?null:power.getString("short_effect"), - Optional.ofNullable(power.optString("effect")).orElseGet(() -> power.getJSONObject("effect").getJSONObject(dependentKind).getString(kind)), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("targets").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("seeds_to").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - getPowerGroup(power.getString("power_group")), - power.getBoolean("negative"), - power.getInt("power_group_level"), - Utils.toEnumSet(Power.Effect.class,power.getJSONArray("effects").toList().stream().map(k -> getPowerEffect((String)k)).collect(Collectors.toSet())), - power.getBoolean("ignores_democritus"), - Utils.toEnumSet(Power.AreaOfEffect.class,power.getJSONArray("area_of_effect").toList().stream().map(k -> getPowerAOE((String)k)).collect(Collectors.toSet())), - getPowerTags(power), - power.getInt("lifetime"), - metadefaults==null?Map.of():metadefaults.toMap(), - power.getString("id") - )); - } - }else { - powers.add(new Power( - power.getString("id"), - power.getString("name"), - power.getString("description"), - power.isNull("short_effect")?null:power.getString("short_effect"), - power.getString("effect"), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("targets").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("seeds_to").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - getPowerGroup(power.getString("power_group")), - power.getBoolean("negative"), - power.getInt("power_group_level"), - Utils.toEnumSet(Power.Effect.class,power.getJSONArray("effects").toList().stream().map(k -> getPowerEffect((String)k)).collect(Collectors.toSet())), - power.getBoolean("ignores_democritus"), - Utils.toEnumSet(Power.AreaOfEffect.class,power.getJSONArray("area_of_effect").toList().stream().map(k -> getPowerAOE((String)k)).collect(Collectors.toSet())), - getPowerTags(power), - power.getInt("lifetime"), - metadefaults==null?Map.of():metadefaults.toMap() - )); - } - } else { - if(power.getInt("fury_percentage_cost") != 0) { - powers.add(new FuryPower( - power.getString("id"), - power.getString("name"), - power.getString("description"), - power.isNull("short_effect")?null:power.getString("short_effect"), - Optional.ofNullable(power.optString("effect")).orElseGet(() -> power.optJSONObject("effect").getString("not_cast")), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("targets").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("seeds_to").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - getPowerGroup(power.getString("power_group")), - power.getBoolean("negative"), - power.getInt("power_group_level"), - Utils.toEnumSet(Power.Effect.class,power.getJSONArray("effects").toList().stream().map(k -> getPowerEffect((String)k)).collect(Collectors.toSet())), - power.getBoolean("ignores_democritus"), - Utils.toEnumSet(Power.AreaOfEffect.class,power.getJSONArray("area_of_effect").toList().stream().map(k -> getPowerAOE((String)k)).collect(Collectors.toSet())), - getPowerTags(power), - power.getInt("lifetime"), - metadefaults==null?Map.of():metadefaults.toMap(), - power.isNull("god_id")?null:gods.stream().filter(g -> g.getId().equals(power.getString("god_id"))).findAny().get(), - power.getInt("favor"), - power.isNull("temple_level_sum_dependency")?0:power.getInt("temple_level_sum_dependency"), - power.getInt("fury_percentage_cost")/100.0 - )); - } else { - powers.add(new GodPower( - power.getString("id"), - power.getString("name"), - power.getString("description"), - power.isNull("short_effect")?null:power.getString("short_effect"), - Optional.ofNullable(power.optString("effect")).orElseGet(() -> power.optJSONObject("effect").getString("not_cast")), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("targets").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - Utils.toEnumSet(Power.Target.class,power.getJSONArray("seeds_to").toList().stream().map(k -> getPowerTarget((String)k)).collect(Collectors.toSet())), - getPowerGroup(power.getString("power_group")), - power.getBoolean("negative"), - power.getInt("power_group_level"), - Utils.toEnumSet(Power.Effect.class,power.getJSONArray("effects").toList().stream().map(k -> getPowerEffect((String)k)).collect(Collectors.toSet())), - power.getBoolean("ignores_democritus"), - Utils.toEnumSet(Power.AreaOfEffect.class,power.getJSONArray("area_of_effect").toList().stream().map(k -> getPowerAOE((String)k)).collect(Collectors.toSet())), - getPowerTags(power), - power.getInt("lifetime"), - metadefaults==null?Map.of():metadefaults.toMap(), - power.isNull("god_id")?null:gods.stream().filter(g -> g.getId().equals(power.getString("god_id"))).findAny().get(), - power.getInt("favor"), - power.isNull("temple_level_sum_dependency")?0:power.getInt("temple_level_sum_dependency") - ));} - } + power.optJSONObject("description")!=null; + String configType = dependent? + (metadefaults != null && metadefaults.has("type"))?"type": + (metadefaults != null && metadefaults.has("god"))?"god":"unknown" + :null; + + // for each X, either X or XM should be null. if one XM is not null, configType should be set + String name = (power.optJSONObject("name")==null)?power.optString("name"):null; + String effect = (power.optJSONObject("effect")==null)?power.optString("effect"):null; + String description = (power.optJSONObject("description")==null)?power.optString("description"):null; + + Map nameM = (name==null)?Utils.mapValue(power.getJSONObject("name").getJSONObject(configType).toMap(),v -> (String)v):null; + Map effectM = (effect==null)?Utils.mapValue(power.getJSONObject("effect").getJSONObject(configType).toMap(),v -> (String)v):null; + Map descriptionM = (description==null)?Utils.mapValue(power.getJSONObject("description").getJSONObject(configType).toMap(),v -> (String)v):null; + + if(!power.isNull("god_id") && !power.getString("god_id").isEmpty()) { + God god = gods.stream().filter(g -> g.getId().equals(power.getString("god_id"))).findAny().get(); + int favorCost = power.getInt("favor"); + int templeLevelSumDepedency = power.isNull("temple_level_sum_dependency")?0:power.getInt("temple_level_sum_dependency"); + + if(power.getInt("fury_percentage_cost") != 0) { + // FuryPower + int furyPercentageCost = power.getInt("fury_percentage_cost"); + powers.add(new FuryPower(id, targets, seedsTo, shortEffect, powerGroup, powerGroupLevel, metaFields, metaDefaults, lifetime, effects, tags, compatiblePowers, areaOfEffect, name, effect, description, configType, nameM, effectM, descriptionM, + god, favorCost, templeLevelSumDepedency, furyPercentageCost)); + } else { + // GodPower + powers.add(new GodPower(id, targets, seedsTo, shortEffect, powerGroup, powerGroupLevel, metaFields, metaDefaults, lifetime, effects, tags, compatiblePowers, areaOfEffect, name, effect, description, configType, nameM, effectM, descriptionM, god, favorCost, templeLevelSumDepedency)); + } + } else { + powers.add(new Power(id, targets, seedsTo, shortEffect, powerGroup, powerGroupLevel, metaFields, metaDefaults, lifetime, effects, tags, compatiblePowers, areaOfEffect, name, effect, description, configType, nameM, effectM, descriptionM)); + } } JSONObject researchesJ = json.getJSONObject("researches"); @@ -305,8 +258,13 @@ public class JSONReader { if(o.getBoolean("removed_on_target_loss"))out.add(Power.Tag.REMOVED_ON_TARGET_LOSS); if(o.getBoolean("requires_god"))out.add(Power.Tag.REQUIRES_GOD); if(o.getBoolean("no_lifetime"))out.add(Power.Tag.NO_LIFETIME); + if(o.getBoolean("only_own_towns"))out.add(Power.Tag.ONLY_OWN_TOWNS); + if(o.getBoolean("negative"))out.add(Power.Tag.NEGATIVE); + if(o.getBoolean("ignores_democritus"))out.add(Power.Tag.IGNORES_DEMOCRITUS); + if(o.getBoolean("boost"))out.add(Power.Tag.BOOST); return Utils.toEnumSet(Power.Tag.class,out); } + private static Power.AreaOfEffect getPowerAOE(String s){ switch(s) { case "area_of_effect_build_time": return Power.AreaOfEffect.BUILDTIME; diff --git a/src/main/java/com/bernard/greposimu/controller/SchedulerController.java b/src/main/java/com/bernard/greposimu/controller/SchedulerController.java index b568a4c..c878b11 100644 --- a/src/main/java/com/bernard/greposimu/controller/SchedulerController.java +++ b/src/main/java/com/bernard/greposimu/controller/SchedulerController.java @@ -17,10 +17,10 @@ import org.springframework.web.bind.annotation.ResponseBody; import com.bernard.greposimu.GrepoSimuApplication; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.simulator.Ville; import com.bernard.greposimu.model.simulator.command.Command; import com.bernard.greposimu.model.simulator.command.TownCommand; -import com.bernard.greposimu.model.simulator.SimulatorData; +import com.bernard.greposimu.model.simulator.data.SimulatorData; +import com.bernard.greposimu.model.simulator.data.Ville; import com.bernard.greposimu.model.simulator.objective.TownObjective; import com.bernard.greposimu.source.JSONSourcer; diff --git a/src/main/java/com/bernard/greposimu/controller/SimulatorController.java b/src/main/java/com/bernard/greposimu/controller/SimulatorController.java index 158f6b9..568d8f3 100644 --- a/src/main/java/com/bernard/greposimu/controller/SimulatorController.java +++ b/src/main/java/com/bernard/greposimu/controller/SimulatorController.java @@ -20,7 +20,7 @@ import com.bernard.greposimu.model.DefContext; import com.bernard.greposimu.model.FightStats; import com.bernard.greposimu.model.OffContext; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.God; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.units.Unit; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; diff --git a/src/main/java/com/bernard/greposimu/model/game/GameConfig.java b/src/main/java/com/bernard/greposimu/model/game/GameConfig.java index 44d43b9..c1496ed 100644 --- a/src/main/java/com/bernard/greposimu/model/game/GameConfig.java +++ b/src/main/java/com/bernard/greposimu/model/game/GameConfig.java @@ -1,14 +1,22 @@ package com.bernard.greposimu.model.game; -import java.util.Arrays; import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import com.bernard.greposimu.Utils; +import com.bernard.greposimu.model.game.buildings.Building; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.powers.Power; import com.bernard.greposimu.model.game.researches.Research; import com.bernard.greposimu.model.game.units.Hero; import com.bernard.greposimu.model.game.units.Unit; +import com.bernard.greposimu.model.game.util.Identified; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.game.util.UnitResources; +import com.bernard.greposimu.model.simulator.data.CastedPower; public class GameConfig { @@ -23,8 +31,6 @@ public class GameConfig { Set powers; - - public GameConfig(Set gods, Set units, Set heroes, Set researches, Set powers) { this.gods = gods; this.units = units; @@ -32,7 +38,7 @@ public class GameConfig { this.researches = researches; this.powers = powers; } - + public Set getGods() { return gods; } @@ -42,35 +48,44 @@ public class GameConfig { } public Unit getUnit(String id) { - return Utils.getIdentified(this.units, id); + return Utils.throwingGetIdentified("unit",this.units, id); } public Set getHeroes() { return Collections.unmodifiableSet(this.heroes); } public Hero getHero(String id) { - return Utils.getIdentified(this.heroes, id); + return Utils.throwingGetIdentified("hero",this.heroes, id); } public Set getResearches() { return Collections.unmodifiableSet(this.researches); } public Research getResearch(String id) { - return Utils.getIdentified(this.researches, id); + return Utils.throwingGetIdentified("research",this.researches, id); } public Building getBuilding(String bid) { - return Arrays.stream(Building.values()).filter(b -> b.id.equals(bid)).findAny().orElse(null); + return Utils.throwingGetIdentified("building", Set.of(Building.values()), bid); } public God getGod(String god) { - return Utils.getIdentified(this.gods, god); + return Utils.throwingGetIdentified("god", this.gods, god); } public Set getBuildings() { return Set.of(Building.values()); } + public Set getPowers() { + return powers; + } + + public Power getPower(String pid){ + System.out.println(powers.stream().map(Power::getId).sorted().collect(Collectors.joining("\n"))); + return Utils.throwingGetIdentified("power", powers, pid); + } + @SuppressWarnings("unchecked") public T getIdentified(Class clazz, String id) { if(Unit.class.isAssignableFrom(clazz)) @@ -80,9 +95,11 @@ public class GameConfig { if(Research.class.isAssignableFrom(clazz)) return (T)this.getResearch(id); if(God.class.isAssignableFrom(clazz)) - return (T)this.getGod(id); + return (T)this.getGod(id); if(Building.class.isAssignableFrom(clazz)) return (T)this.getBuilding(id); + if(Power.class.isAssignableFrom(clazz)) + return (T)this.getPower(id); throw new UnsupportedOperationException("Cannot get identified object of class "+clazz.getName()); } @@ -95,4 +112,196 @@ public class GameConfig { return tot; } + /*********************/ + /* COMPUTING METHODS */ + /*********************/ + + private double callOfTheOceanBonus = 0.5; + private double fertilityImprovementBonus = 0.5; + private double shipwrightBonus = 0.1; + private double instructorBonus = 0.1; + private double conscriptionBonus = 0.1; + private double mathematicsBonus = 0.1; + private double architectureBonus = 0.1; + private double craneBonus = 0.15; + + private double heroBonus(Hero h, int level) { return h.getPowerBaseValue() + level*h.getPowerValuePerLevel();} + + private List senateReduction = List.of(1.000 , 0.986 , 0.970 , 0.953 , 0.935 , 0.915 , 0.895 , 0.874 , 0.852 , 0.830 , 0.808 , 0.785 , 0.761 , 0.737 , 0.712 , 0.685 , 0.661 , 0.636 , 0.620 , 0.584 , 0.561 , 0.537 , 0.502 , 0.476 , 0.450); + + public long getUnitBuildTime(Unit u, int barracksLevel, int navalLevel, Set powers, Set researches, Hero hero, int heroLevel){ + // From helpers/general_modifications.js:169 + double build_time = (u.getBuildTime() * (1 - Math.pow((u.isNaval()?navalLevel:barracksLevel) - 1, 1.1) / 100)); + + double modification_factor_by_powers = 1; + double modification_factor_by_researches = 1; + + for(CastedPower p : powers){ + if (u.isNaval() && p.getPower().getId().equals("call_of_the_ocean")) { + modification_factor_by_powers -= this.callOfTheOceanBonus; + } else if (!u.isNaval() && p.getPower().getId().equals("fertility_improvement")) { + modification_factor_by_powers -= this.fertilityImprovementBonus; + } else if ( Set.of("unit_order_boost", "longterm_unit_order_boost", "assassins_unit_order_boost", "mourning", "missions_power_2") + .contains(p.getPower().getId())) { + modification_factor_by_powers -= Integer.parseInt((String)p.getConfiguration().get("percent"), 10) / 100.0; + } else if (p.getPower().getId().equals("mourning")) { + modification_factor_by_powers += Integer.parseInt((String)p.getConfiguration().get("percent"), 10) / 100.0; + } else if(p.getPower().getId().equals("great_arming")) { + modification_factor_by_powers *= (1 - Integer.parseInt((String)p.getConfiguration().get("percent"), 10) / 100.0); + } + // Alliance boost powers + if (p.getPower().getId().equals("unit_order_boost_alliance") || + p.getPower().getId().equals("unit_order_boost_alliance_hera")) { + String type = (String)p.getConfiguration().getOrDefault("type", ""); + // The configured type must either be "all" or match the type of the current unit + if (type.equals("all") || (u.isNaval() ? type.equals("naval") : type.equals("ground"))) { + modification_factor_by_powers *= 0.01 * (100 - ((Integer)p.getConfiguration().getOrDefault("percent", 0))); + } + } + } + if (u.isNaval() && researches.contains(this.getResearch("shipwright"))) { + modification_factor_by_researches -= shipwrightBonus; + } + + if (!u.isNaval() && researches.contains(this.getResearch("instructor"))) { + modification_factor_by_researches -= instructorBonus; + } + + build_time *= modification_factor_by_powers * modification_factor_by_researches; + + //TODO implement augmentation bonus from benefits + //build_time *= this.getCollection("benefits").getAugmentationBonusForUnitBuildTime(); + // Code in features/benefits/collections/benefits.js:12 + + //TODO implement augmentation bonus from world boosts + //build_time *= this.getCollection('world_boosts').getWorldBoostFactorForUnitRecruitTime(u); + // Code in collections/world_boosts.js:16 + + return Math.max(1, Math.round(build_time)); + } + + public UnitResources getUnitBuildResources(Unit u, int barracksLevel, int navalLevel, Set powers, Set researches,Hero hero,int heroLevel){ + //TODO use the real application computation (helpers/general_modifications.js:221) + Resources base = u.getBuildCost(); + + double modification_factor = 1; + Optional power; + //finished_wonders = us.last(MM.getCollections().Wonder); + + if (!u.isNaval() && researches.contains(this.getResearch("conscription"))) + modification_factor *= (1 - conscriptionBonus); + + if (!u.isNaval()) { + power = powers.stream().filter(p -> p.getPower().getId().equals("passionate_training")).findAny(); + if (power.isPresent()) + modification_factor *= (1 - Integer.parseInt((String)power.get().getConfiguration().get("percent"), 10) / 100.0); + } + + if (u.isNaval()) { + power = powers.stream().filter(p -> p.getPower().getId().equals("help_of_the_nereids")).findAny(); + if (power.isPresent()) + modification_factor *= (1 - Integer.parseInt((String)power.get().getConfiguration().get("percent"), 10) / 100.0); + } + + power = powers.stream().filter(p -> p.getPower().getId().equals("great_arming")).findAny(); + if (power.isPresent()) + modification_factor *= (1 - Integer.parseInt((String)power.get().getConfiguration().get("percent"), 10) / 100.0); + + if (u.isNaval() && researches.contains(this.getResearch("mathematics"))) + modification_factor *= (1 - mathematicsBonus); + + + // TODO take wonders into account + // finished_wonders.hasWonder('mausoleum_of_halicarnassus') + + if (u.getId().equals("hoplite") && heroLevel != 0 && hero.getId().equals("cheiron")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + if (u.getId().equals("archer") && heroLevel != 0 && hero.getId().equals("philoctetes")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + if (u.getId().equals("sword") && heroLevel != 0 && hero.getId().equals("odysseus")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + if (u.getId().equals("attack_ship") && heroLevel != 0 && hero.getId().equals("aristotle")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + if (u.getId().equals("bireme") && heroLevel != 0 && hero.getId().equals("daidalos")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + if (u.getId().equals("trireme") && heroLevel != 0 && hero.getId().equals("eurybia")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + + if(u.isMythological()){ + int favor_cost_modifier = 0; + + power = powers.stream().filter(p -> p.getPower().getId().equals("favor_boost_alliance")).findAny(); + if (power.isPresent()) + favor_cost_modifier += (int)power.get().getConfiguration().get("percent"); + + if (heroLevel != 0 && hero.getId().equals("anysia")) + favor_cost_modifier += 10 + heroLevel * 1; + + return new UnitResources(base.prod(modification_factor), + u.getGod(),(int)Math.ceil(u.getFavorCost() * (1 - (favor_cost_modifier/100))));//TODO modifier on favor cost + } else + return new UnitResources(base.prod(modification_factor)); + + } + + public long getBuildingBuildingTime(Building b, int toLevel, int senateLevel, Set powers, Set researches, Hero hero, int heroLevel){ + //TODO check this function is correct + double modification_factor = 1.0; + //TODO take availability into consideration + // models/heroes/player_hero.js:165 + if (heroLevel != 0 && hero.getId().equals("christopholus")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + + if (researches.contains(this.getResearch("building_crane"))) { + modification_factor -= craneBonus; + } + Optional power = powers.stream().filter(p -> p.getPower().getId().endsWith("building_order_boost")).findAny(); + if (power.isPresent()) + modification_factor *= (1 - Integer.parseInt((String)power.get().getConfiguration().get("percent"), 10) / 100.0); + + long time = (long) (b.getBuildTime(toLevel) * senateReduction.get(senateLevel-1)); + time = (long) Math.floor(time * modification_factor); + if (time < 1) time = 1; + + return time; + } + + public Resources getBuildingBuildingResources(Building b, int toLevel, int senateLevel, Set powers, Set researches, Hero hero, int heroLevel){ + //TODO check this function is correct + double modification_factor = 1; + if (researches.contains(this.getResearch("architecture"))) { + modification_factor -= architectureBonus; + } + + return b.getRequiredResources(toLevel).prod(modification_factor); + } + + public long getBuildingTearDownTime(Building b, int toLevel, int senateLevel, Set powers, Set researches, Hero hero, int heroLevel){ + return 0; + } + + public long getResearchTime(Research r, int academyLevel, Set powers, Hero hero, int heroLevel){ + double modification_factor = 1.0; + //TODO take availability into consideration + // models/heroes/player_hero.js:165 + if (heroLevel != 0 && hero.getId().equals("apheledes")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + + long time = (long) (r.getRequiredTime() * ((100 - Math.pow(academyLevel, 1.1)) / 100)); + time = (long) Math.floor(time * modification_factor); + if (time < 1) time = 1; + + return time; + } + + public Resources getResearchResources(Research r, int academyLevel, Set powers, Hero hero, int heroLevel){ + double modification_factor = 1.0; + //TODO take availability into consideration + // models/heroes/player_hero.js:165 + if (heroLevel != 0 && hero.getId().equals("apheledes")) + modification_factor *= (1 - heroBonus(hero, heroLevel)); + + return r.getResources().prod(modification_factor); + } + } diff --git a/src/main/java/com/bernard/greposimu/model/game/GrepoYaml.java b/src/main/java/com/bernard/greposimu/model/game/GrepoYaml.java index a5715af..05d1702 100644 --- a/src/main/java/com/bernard/greposimu/model/game/GrepoYaml.java +++ b/src/main/java/com/bernard/greposimu/model/game/GrepoYaml.java @@ -2,9 +2,12 @@ package com.bernard.greposimu.model.game; import java.io.IOException; +import com.bernard.greposimu.model.game.buildings.Building; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.researches.Research; import com.bernard.greposimu.model.game.units.Hero; import com.bernard.greposimu.model.game.units.Unit; +import com.bernard.greposimu.model.game.util.Identified; import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/com/bernard/greposimu/model/game/Building.java b/src/main/java/com/bernard/greposimu/model/game/buildings/Building.java similarity index 85% rename from src/main/java/com/bernard/greposimu/model/game/Building.java rename to src/main/java/com/bernard/greposimu/model/game/buildings/Building.java index ca03f34..be66b0e 100644 --- a/src/main/java/com/bernard/greposimu/model/game/Building.java +++ b/src/main/java/com/bernard/greposimu/model/game/buildings/Building.java @@ -1,7 +1,10 @@ -package com.bernard.greposimu.model.game; +package com.bernard.greposimu.model.game.buildings; import java.util.Map; +import com.bernard.greposimu.model.game.util.Identified; +import com.bernard.greposimu.model.game.util.Resources; + public enum Building implements Identified{ /* @@ -69,6 +72,18 @@ public enum Building implements Identified{ public int getRequiredPop(int level) { return (int) Math.floor(pop0*Math.pow(level, popF)); } + + public Resources getRequiredResources(int level) { + return new Resources( + (int) Math.floor(wood0*Math.pow(level, woodF)), + (int) Math.floor(stone0*Math.pow(level, stoneF)), + (int) Math.floor(iron0*Math.pow(level, ironF))); + } + + public long getBuildTime(int level) { + //TODO check this, is build_time_reduction used ? + return (long) Math.floor(build0*Math.pow(level, buildF)); + } public int popInBuildings(Map buildings) { return buildings.entrySet().stream().mapToInt(e -> e.getKey().getRequiredPop(e.getValue())).sum(); diff --git a/src/main/java/com/bernard/greposimu/model/game/God.java b/src/main/java/com/bernard/greposimu/model/game/gods/God.java similarity index 88% rename from src/main/java/com/bernard/greposimu/model/game/God.java rename to src/main/java/com/bernard/greposimu/model/game/gods/God.java index a3ee8e6..91b4136 100644 --- a/src/main/java/com/bernard/greposimu/model/game/God.java +++ b/src/main/java/com/bernard/greposimu/model/game/gods/God.java @@ -1,7 +1,9 @@ -package com.bernard.greposimu.model.game; +package com.bernard.greposimu.model.game.gods; import java.util.Objects; +import com.bernard.greposimu.model.game.util.Identified; + public class God implements Identified,Comparable{ String id; diff --git a/src/main/java/com/bernard/greposimu/model/game/powers/FuryPower.java b/src/main/java/com/bernard/greposimu/model/game/powers/FuryPower.java index 56f45a6..db13b1e 100644 --- a/src/main/java/com/bernard/greposimu/model/game/powers/FuryPower.java +++ b/src/main/java/com/bernard/greposimu/model/game/powers/FuryPower.java @@ -2,23 +2,27 @@ package com.bernard.greposimu.model.game.powers; import java.util.EnumSet; import java.util.Map; +import java.util.Set; -import com.bernard.greposimu.model.game.God; +import com.bernard.greposimu.model.game.gods.God; public class FuryPower extends GodPower { double furyProportionCost; - public FuryPower(String id, String name, String description, String shortEffect, String effect, - EnumSet targets, EnumSet seedsTo, Group powerGroup, boolean negative, int powerGroupLevel, - EnumSet effects, boolean ignores_democritus, EnumSet areaOfEffect, EnumSet tags, - int lifetime, Map metaDefaults, God god, int furyCost, int templeLevelSumDependency, + public FuryPower(String id, EnumSet targets, EnumSet seedsTo, String shortEffect, Power.Group powerGroup, + int powerGroupLevel, Set metaFields, Map metaDefaults, int lifetime, EnumSet effects, + EnumSet tags, + Set compatiblePowers, EnumSet areaOfEffect, String name, String effect, + String description, String configType, Map nameM, Map effectM, + Map descriptionM, God god2, int favorCost, int templeLevelSumDependency, double furyProportionCost) { - super(id, name, description, shortEffect, effect, targets, seedsTo, powerGroup, negative, powerGroupLevel, - effects, ignores_democritus, areaOfEffect, tags, lifetime, metaDefaults, god, furyCost, + super(id, targets, seedsTo, shortEffect, powerGroup, powerGroupLevel, metaFields, metaDefaults, lifetime, + effects, tags, compatiblePowers, areaOfEffect, name, + effect, description, configType, nameM, effectM, descriptionM, god2, favorCost, templeLevelSumDependency); this.furyProportionCost = furyProportionCost; } - + public double getFuryProportionCost() { return furyProportionCost; } diff --git a/src/main/java/com/bernard/greposimu/model/game/powers/GodPower.java b/src/main/java/com/bernard/greposimu/model/game/powers/GodPower.java index 8ea0c17..ef53951 100644 --- a/src/main/java/com/bernard/greposimu/model/game/powers/GodPower.java +++ b/src/main/java/com/bernard/greposimu/model/game/powers/GodPower.java @@ -2,26 +2,28 @@ package com.bernard.greposimu.model.game.powers; import java.util.EnumSet; import java.util.Map; +import java.util.Set; -import com.bernard.greposimu.model.game.God; +import com.bernard.greposimu.model.game.gods.God; public class GodPower extends Power { God god; - int furyCost; + int favorCost; int templeLevelSumDependency; - - - public GodPower(String id, String name, String description, String shortEffect, String effect, - EnumSet targets, EnumSet seedsTo, Group powerGroup, boolean negative, int powerGroupLevel, - EnumSet effects, boolean ignores_democritus, EnumSet areaOfEffect, EnumSet tags, - int lifetime, Map metaDefaults, God god, int furyCost, int templeLevelSumDependency) { - super(id, name, description, shortEffect, effect, targets, seedsTo, powerGroup, negative, powerGroupLevel, - effects, ignores_democritus, areaOfEffect, tags, lifetime, metaDefaults); - this.god = god; - this.furyCost = furyCost; + public GodPower(String id, EnumSet targets, EnumSet seedsTo, String shortEffect, Power.Group powerGroup, + int powerGroupLevel, Set metaFields, Map metaDefaults, int lifetime, EnumSet effects, + EnumSet tags, + Set compatiblePowers, EnumSet areaOfEffect, String name, String effect, + String description, String configType, Map nameM, Map effectM, + Map descriptionM, God god2, int favorCost, int templeLevelSumDependency) { + super(id, targets, seedsTo, shortEffect, powerGroup, powerGroupLevel, metaFields, metaDefaults, lifetime, + effects, tags, compatiblePowers, areaOfEffect, name, + effect, description, configType, nameM, effectM, descriptionM); + god = god2; + this.favorCost = favorCost; this.templeLevelSumDependency = templeLevelSumDependency; } @@ -29,10 +31,10 @@ public class GodPower extends Power { return god; } - public int getFuryCost() { - return furyCost; + public int getFavorCost() { + return favorCost; } - + public int getTempleLevelSumDependency() { return templeLevelSumDependency; } diff --git a/src/main/java/com/bernard/greposimu/model/game/powers/MultitypePower.java b/src/main/java/com/bernard/greposimu/model/game/powers/MultitypePower.java deleted file mode 100644 index c298be7..0000000 --- a/src/main/java/com/bernard/greposimu/model/game/powers/MultitypePower.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.bernard.greposimu.model.game.powers; - -import java.util.EnumSet; -import java.util.Map; - -public class MultitypePower extends Power{ - String commonId; - - public MultitypePower(String id, String name, String description, String shortEffect, String effect, - EnumSet targets, EnumSet seedsTo, Group powerGroup, boolean negative, int powerGroupLevel, - EnumSet effects, boolean ignores_democritus, EnumSet areaOfEffect, EnumSet tags, - int lifetime, Map metaDefaults, String commonId) { - super(id, name, description, shortEffect, effect, targets, seedsTo, powerGroup, negative, powerGroupLevel, - effects, ignores_democritus, areaOfEffect, tags, lifetime, metaDefaults); - this.commonId = commonId; - } - - public String getCommonId() { - return commonId; - } -} diff --git a/src/main/java/com/bernard/greposimu/model/game/powers/Power.java b/src/main/java/com/bernard/greposimu/model/game/powers/Power.java index e284d82..60e9dfc 100644 --- a/src/main/java/com/bernard/greposimu/model/game/powers/Power.java +++ b/src/main/java/com/bernard/greposimu/model/game/powers/Power.java @@ -2,50 +2,51 @@ package com.bernard.greposimu.model.game.powers; import java.util.EnumSet; import java.util.Map; +import java.util.Set; -import com.bernard.greposimu.model.game.Identified; +import org.springframework.lang.Nullable; + +import com.bernard.greposimu.model.game.util.Identified; public class Power implements Identified { String id; - String name; - String description; - String shortEffect; - String effect; - /** * The target it applies to */ EnumSet targets; - /** * The targets it is seeded to. For example, attack boost is targeted to towns, and is seeded to commands. */ EnumSet seedsTo; - - - // EFFECTS - Group powerGroup; - boolean negative; + + @Nullable + String shortEffect; + Power.Group powerGroup; int powerGroupLevel; + + //name + Set metaFields; + Map metaDefaults; + + int lifetime; + + EnumSet tags; EnumSet effects; - boolean ignores_democritus; + Set compatiblePowers; EnumSet areaOfEffect; + // for each X, either X or XM should be null. if one XM is not null, configType should be set + String name,effect,description; + String configType; + Map nameM,effectM,descriptionM; + + //display_amount -> ignore - // images -> IGNORE - EnumSet tags; - int lifetime; - - - Map metaDefaults; - - - - - + + public static enum Tag { EXTENDIBLE, DISPLAY_AMOUNT, @@ -63,96 +64,101 @@ public class Power implements Identified { RECREATE_ON_RESTART, REMOVED_ON_TARGET_LOSS, REQUIRES_GOD, - NO_LIFETIME; + NO_LIFETIME, + ONLY_OWN_TOWNS, + NEGATIVE, + IGNORES_DEMOCRITUS, + BOOST; } + public Power(String id, EnumSet targets, EnumSet seedsTo, String shortEffect, Power.Group powerGroup, + int powerGroupLevel, Set metaFields, Map metaDefaults, int lifetime, + EnumSet effects, EnumSet tags, + Set compatiblePowers, EnumSet areaOfEffect, String name, String effect, + String description, String configType, Map nameM, Map effectM, + Map descriptionM) { + this.id = id; + this.targets = targets; + this.seedsTo = seedsTo; + this.shortEffect = shortEffect; + this.powerGroup = powerGroup; + this.powerGroupLevel = powerGroupLevel; + this.metaFields = metaFields; + this.metaDefaults = metaDefaults; + this.lifetime = lifetime; + this.effects = effects; + this.tags = tags; + this.compatiblePowers = compatiblePowers; + this.areaOfEffect = areaOfEffect; + this.name = name; + this.effect = effect; + this.description = description; + this.configType = configType; + this.nameM = nameM; + this.effectM = effectM; + this.descriptionM = descriptionM; + } public static enum AreaOfEffect { BUILDTIME,COMMANDS,FAVOR,MILITIA,RESOURCES; } - public static enum Effect { GROUND,NAVAL,WALL; } - public static enum Group { ATTACK_BOOST,ATTACK_SHIP_ATTACK_BOOST,BATTLE_POINT_BOOST,BUILDING_BOOST,DEFENSE_BOOST,FAVOR_BOOST,RESOURCE_BOOST,UNIT_BOOST; } public static enum Target { ALLIANCE,COMMAND,PLAYER,SUPPORT_COMMAND,TOWN; } - - - - public Power(String id, String name, String description, String shortEffect, String effect, EnumSet targets, - EnumSet seedsTo, Group powerGroup, boolean negative, int powerGroupLevel, EnumSet effects, - boolean ignores_democritus, EnumSet areaOfEffect, EnumSet tags, int lifetime, - Map metaDefaults) { - this.id = id; - this.name = name; - this.description = description; - this.shortEffect = shortEffect; - this.effect = effect; - this.targets = targets; - this.seedsTo = seedsTo; - this.powerGroup = powerGroup; - this.negative = negative; - this.powerGroupLevel = powerGroupLevel; - this.effects = effects; - this.ignores_democritus = ignores_democritus; - this.areaOfEffect = areaOfEffect; - this.tags = tags; - this.lifetime = lifetime; - this.metaDefaults = metaDefaults; - } - @Override public String getId() { return id; } - public String getName() { - return name; - } - public String getDescription() { - return description; - } - public String getShortEffect() { - return shortEffect; - } - public String getEffect() { - return effect; - } public EnumSet getTargets() { return targets; } public EnumSet getSeedsTo() { return seedsTo; } - public Group getPowerGroup() { - return powerGroup; + public String getShortEffect() { + return shortEffect; } - public boolean isNegative() { - return negative; + public Power.Group getPowerGroup() { + return powerGroup; } public int getPowerGroupLevel() { return powerGroupLevel; } - public EnumSet getEffects() { - return effects; - } - public boolean isIgnores_democritus() { - return ignores_democritus; - } - public EnumSet getAreaOfEffect() { - return areaOfEffect; - } - public EnumSet getTags() { - return tags; - } - public int getLifetime() { - return lifetime; + public Set getMetaFields() { + return metaFields; } public Map getMetaDefaults() { return metaDefaults; } + public int getLifetime() { + return lifetime; + } + public EnumSet getEffects() { + return effects; + } + public EnumSet getTags() { + return tags; + } + public Set getCompatiblePowers() { + return compatiblePowers; + } + public EnumSet getAreaOfEffect() { + return areaOfEffect; + } + public String getName(Map configuration) { + return name!=null?name:(nameM.get(configuration.get(configType))); + } + public String getEffect(Map configuration) { + return effect!=null?effect:(effectM.get(configuration.get(configType))); + } + public String getDescription(Map configuration) { + return description!=null?description:(descriptionM.get(configuration.get(configType))); + } + } diff --git a/src/main/java/com/bernard/greposimu/model/game/queues/BuildingQueueItem.java b/src/main/java/com/bernard/greposimu/model/game/queues/BuildingQueueItem.java index 2fa85c4..6772c4a 100644 --- a/src/main/java/com/bernard/greposimu/model/game/queues/BuildingQueueItem.java +++ b/src/main/java/com/bernard/greposimu/model/game/queues/BuildingQueueItem.java @@ -1,8 +1,8 @@ package com.bernard.greposimu.model.game.queues; -import com.bernard.greposimu.model.game.Building; -import com.bernard.greposimu.model.game.Resources; -import com.bernard.greposimu.model.game.Timestamp; +import com.bernard.greposimu.model.game.buildings.Building; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.game.util.Timestamp; public class BuildingQueueItem extends QueueItem { diff --git a/src/main/java/com/bernard/greposimu/model/game/queues/RecruitmentQueueItem.java b/src/main/java/com/bernard/greposimu/model/game/queues/RecruitmentQueueItem.java index 41eee94..34eb4db 100644 --- a/src/main/java/com/bernard/greposimu/model/game/queues/RecruitmentQueueItem.java +++ b/src/main/java/com/bernard/greposimu/model/game/queues/RecruitmentQueueItem.java @@ -1,8 +1,8 @@ package com.bernard.greposimu.model.game.queues; -import com.bernard.greposimu.model.game.Timestamp; -import com.bernard.greposimu.model.game.UnitResources; import com.bernard.greposimu.model.game.units.Unit; +import com.bernard.greposimu.model.game.util.Timestamp; +import com.bernard.greposimu.model.game.util.UnitResources; public class RecruitmentQueueItem extends QueueItem { diff --git a/src/main/java/com/bernard/greposimu/model/game/queues/ResearchQueueItem.java b/src/main/java/com/bernard/greposimu/model/game/queues/ResearchQueueItem.java index ba56af1..223a67c 100644 --- a/src/main/java/com/bernard/greposimu/model/game/queues/ResearchQueueItem.java +++ b/src/main/java/com/bernard/greposimu/model/game/queues/ResearchQueueItem.java @@ -1,8 +1,8 @@ package com.bernard.greposimu.model.game.queues; -import com.bernard.greposimu.model.game.Resources; -import com.bernard.greposimu.model.game.Timestamp; import com.bernard.greposimu.model.game.researches.Research; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.game.util.Timestamp; public class ResearchQueueItem extends QueueItem { diff --git a/src/main/java/com/bernard/greposimu/model/game/researches/Research.java b/src/main/java/com/bernard/greposimu/model/game/researches/Research.java index 2c0ef93..9afb3c2 100644 --- a/src/main/java/com/bernard/greposimu/model/game/researches/Research.java +++ b/src/main/java/com/bernard/greposimu/model/game/researches/Research.java @@ -3,8 +3,8 @@ package com.bernard.greposimu.model.game.researches; import java.util.Map; import java.util.Set; -import com.bernard.greposimu.model.game.Identified; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.util.Identified; +import com.bernard.greposimu.model.game.util.Resources; public class Research implements Identified{ diff --git a/src/main/java/com/bernard/greposimu/model/game/units/Hero.java b/src/main/java/com/bernard/greposimu/model/game/units/Hero.java index a16510b..88185d7 100644 --- a/src/main/java/com/bernard/greposimu/model/game/units/Hero.java +++ b/src/main/java/com/bernard/greposimu/model/game/units/Hero.java @@ -4,7 +4,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; -import com.bernard.greposimu.model.game.Identified; +import com.bernard.greposimu.model.game.util.Identified; public class Hero extends TerrestrialUnit implements Comparable{ diff --git a/src/main/java/com/bernard/greposimu/model/game/units/NavalUnit.java b/src/main/java/com/bernard/greposimu/model/game/units/NavalUnit.java index d51483d..a1f3cf9 100644 --- a/src/main/java/com/bernard/greposimu/model/game/units/NavalUnit.java +++ b/src/main/java/com/bernard/greposimu/model/game/units/NavalUnit.java @@ -3,9 +3,9 @@ package com.bernard.greposimu.model.game.units; import java.util.Map; import java.util.Set; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.researches.Research; +import com.bernard.greposimu.model.game.util.Resources; public class NavalUnit extends Unit { diff --git a/src/main/java/com/bernard/greposimu/model/game/units/TerrestrialUnit.java b/src/main/java/com/bernard/greposimu/model/game/units/TerrestrialUnit.java index 2a47d70..6f1e783 100644 --- a/src/main/java/com/bernard/greposimu/model/game/units/TerrestrialUnit.java +++ b/src/main/java/com/bernard/greposimu/model/game/units/TerrestrialUnit.java @@ -3,9 +3,9 @@ package com.bernard.greposimu.model.game.units; import java.util.Map; import java.util.Set; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.researches.Research; +import com.bernard.greposimu.model.game.util.Resources; public class TerrestrialUnit extends Unit{ diff --git a/src/main/java/com/bernard/greposimu/model/game/units/TransportUnit.java b/src/main/java/com/bernard/greposimu/model/game/units/TransportUnit.java index 42a1443..46f459d 100644 --- a/src/main/java/com/bernard/greposimu/model/game/units/TransportUnit.java +++ b/src/main/java/com/bernard/greposimu/model/game/units/TransportUnit.java @@ -3,9 +3,9 @@ package com.bernard.greposimu.model.game.units; import java.util.Map; import java.util.Set; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.researches.Research; +import com.bernard.greposimu.model.game.util.Resources; public class TransportUnit extends NavalUnit { int capacity; diff --git a/src/main/java/com/bernard/greposimu/model/game/units/Unit.java b/src/main/java/com/bernard/greposimu/model/game/units/Unit.java index 1c865fc..99aa0ed 100644 --- a/src/main/java/com/bernard/greposimu/model/game/units/Unit.java +++ b/src/main/java/com/bernard/greposimu/model/game/units/Unit.java @@ -3,10 +3,10 @@ package com.bernard.greposimu.model.game.units; import java.util.Map; import java.util.Set; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Identified; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.researches.Research; +import com.bernard.greposimu.model.game.util.Identified; +import com.bernard.greposimu.model.game.util.Resources; public abstract class Unit implements Identified{ diff --git a/src/main/java/com/bernard/greposimu/model/game/Identified.java b/src/main/java/com/bernard/greposimu/model/game/util/Identified.java similarity index 56% rename from src/main/java/com/bernard/greposimu/model/game/Identified.java rename to src/main/java/com/bernard/greposimu/model/game/util/Identified.java index ae6a738..13996ca 100644 --- a/src/main/java/com/bernard/greposimu/model/game/Identified.java +++ b/src/main/java/com/bernard/greposimu/model/game/util/Identified.java @@ -1,4 +1,4 @@ -package com.bernard.greposimu.model.game; +package com.bernard.greposimu.model.game.util; public interface Identified { diff --git a/src/main/java/com/bernard/greposimu/model/game/Resources.java b/src/main/java/com/bernard/greposimu/model/game/util/Resources.java similarity index 68% rename from src/main/java/com/bernard/greposimu/model/game/Resources.java rename to src/main/java/com/bernard/greposimu/model/game/util/Resources.java index 31751f0..3ac04f7 100644 --- a/src/main/java/com/bernard/greposimu/model/game/Resources.java +++ b/src/main/java/com/bernard/greposimu/model/game/util/Resources.java @@ -1,7 +1,9 @@ -package com.bernard.greposimu.model.game; +package com.bernard.greposimu.model.game.util; public class Resources { + public static final Resources empty = new Resources(0,0,0); + int wood; int stone; int iron; @@ -25,7 +27,7 @@ public class Resources { } public Resources prod(double p){ - return new Resources((int)p*wood, (int)p*stone, (int)p*iron); + return new Resources((int)Math.ceil(p*wood), (int)Math.ceil(p*stone), (int)Math.ceil(p*iron)); } @Override diff --git a/src/main/java/com/bernard/greposimu/model/game/Timestamp.java b/src/main/java/com/bernard/greposimu/model/game/util/Timestamp.java similarity index 71% rename from src/main/java/com/bernard/greposimu/model/game/Timestamp.java rename to src/main/java/com/bernard/greposimu/model/game/util/Timestamp.java index 11d6593..8783a72 100644 --- a/src/main/java/com/bernard/greposimu/model/game/Timestamp.java +++ b/src/main/java/com/bernard/greposimu/model/game/util/Timestamp.java @@ -1,4 +1,4 @@ -package com.bernard.greposimu.model.game; +package com.bernard.greposimu.model.game.util; public class Timestamp { diff --git a/src/main/java/com/bernard/greposimu/model/game/UnitResources.java b/src/main/java/com/bernard/greposimu/model/game/util/UnitResources.java similarity index 51% rename from src/main/java/com/bernard/greposimu/model/game/UnitResources.java rename to src/main/java/com/bernard/greposimu/model/game/util/UnitResources.java index 040ff8f..8172b94 100644 --- a/src/main/java/com/bernard/greposimu/model/game/UnitResources.java +++ b/src/main/java/com/bernard/greposimu/model/game/util/UnitResources.java @@ -1,21 +1,26 @@ -package com.bernard.greposimu.model.game; +package com.bernard.greposimu.model.game.util; + +import com.bernard.greposimu.model.game.gods.God; public class UnitResources extends Resources { God god; int favor; - public UnitResources(int wood, int stone, int iron) { - super(wood, stone, iron); - this.god = null; - this.favor = 0; - } - public UnitResources(int wood, int stone, int iron, God god, int favor) { super(wood, stone, iron); this.god = god; this.favor = favor; } + public UnitResources(int wood, int stone, int iron) { + this(wood, stone, iron, null, 0); + } + public UnitResources(Resources r, God god, int favor) { + this(r.getWood(), r.getStone(), r.getIron(),god,favor); + } + public UnitResources(Resources r) { + this(r.getWood(), r.getStone(), r.getIron(),null,0); + } public God getGod() { return god; diff --git a/src/main/java/com/bernard/greposimu/model/simulator/command/BuildCommand.java b/src/main/java/com/bernard/greposimu/model/simulator/command/BuildCommand.java index c09caac..2fc4414 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/command/BuildCommand.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/command/BuildCommand.java @@ -1,9 +1,10 @@ package com.bernard.greposimu.model.simulator.command; -import com.bernard.greposimu.model.game.Building; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.Resources; -import com.bernard.greposimu.model.simulator.SimulatorData; +import com.bernard.greposimu.model.game.buildings.Building; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.simulator.data.SimulatorData; +import com.bernard.greposimu.model.simulator.data.Ville; public class BuildCommand extends TownCommand { @@ -31,14 +32,39 @@ public class BuildCommand extends TownCommand { @Override public Resources neededResources(SimulatorData sd) { - // TODO Auto-generated method stub - return new Resources(1000, 1000, 1000); + if(this.tearingDown)return Resources.empty; + Ville v = sd.getVille(town); + return gc.getBuildingBuildingResources( + this.building, + this.level, + v.getBatiments().get(Building.MAIN), + v.getPowers(), + v.getResearches(), + v.getHero(), + v.getHeroLevel()); } @Override - public int timeNeeded(SimulatorData sd) { - // TODO Auto-generated method stub - return 3600; + public long timeNeeded(SimulatorData sd) { + Ville v = sd.getVille(town); + if(this.tearingDown) + return gc.getBuildingTearDownTime( + this.building, + this.level, + v.getBatiments().get(Building.MAIN), + v.getPowers(), + v.getResearches(), + v.getHero(), + v.getHeroLevel()); + else + return gc.getBuildingBuildingTime( + this.building, + this.level, + v.getBatiments().get(Building.MAIN), + v.getPowers(), + v.getResearches(), + v.getHero(), + v.getHeroLevel()); } } diff --git a/src/main/java/com/bernard/greposimu/model/simulator/command/Command.java b/src/main/java/com/bernard/greposimu/model/simulator/command/Command.java index 0184feb..07ed7b9 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/command/Command.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/command/Command.java @@ -1,7 +1,7 @@ package com.bernard.greposimu.model.simulator.command; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.simulator.SimulatorData; +import com.bernard.greposimu.model.simulator.data.SimulatorData; public abstract class Command { @@ -11,6 +11,6 @@ public abstract class Command { this.gc = gc; } - public abstract int timeNeeded(SimulatorData sd); + public abstract long timeNeeded(SimulatorData sd); } diff --git a/src/main/java/com/bernard/greposimu/model/simulator/command/HideStoreCommand.java b/src/main/java/com/bernard/greposimu/model/simulator/command/HideStoreCommand.java index 029af32..349ef16 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/command/HideStoreCommand.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/command/HideStoreCommand.java @@ -1,8 +1,8 @@ package com.bernard.greposimu.model.simulator.command; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.Resources; -import com.bernard.greposimu.model.simulator.SimulatorData; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.simulator.data.SimulatorData; public class HideStoreCommand extends TownCommand { @@ -24,7 +24,7 @@ public class HideStoreCommand extends TownCommand { } @Override - public int timeNeeded(SimulatorData sd) { + public long timeNeeded(SimulatorData sd) { return 0; } diff --git a/src/main/java/com/bernard/greposimu/model/simulator/command/RecruitCommand.java b/src/main/java/com/bernard/greposimu/model/simulator/command/RecruitCommand.java index c5d0a73..f0b648a 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/command/RecruitCommand.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/command/RecruitCommand.java @@ -1,11 +1,11 @@ package com.bernard.greposimu.model.simulator.command; -import com.bernard.greposimu.model.game.Building; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.buildings.Building; import com.bernard.greposimu.model.game.units.Unit; -import com.bernard.greposimu.model.simulator.SimulatorData; -import com.bernard.greposimu.model.simulator.Ville; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.simulator.data.SimulatorData; +import com.bernard.greposimu.model.simulator.data.Ville; public class RecruitCommand extends TownCommand{ @@ -22,30 +22,31 @@ public class RecruitCommand extends TownCommand{ public String toString() { return "[%d] Recruit %d %s".formatted(this.town,this.count, this.unit.getName()); } - + @Override public Resources neededResources(SimulatorData sd) { - Resources base = this.unit.getBuildCost(); Ville v = sd.getVille(town); - double percentage = 1.0; - //TODO take heroes into account, generalize resarches - if(v.hasResearch(gc.getResearch("conscription"))) - percentage -= .1; - return base.prod(percentage*count); + return gc.getUnitBuildResources( + this.unit, + v.getBatiments().get(Building.BARRACKS), + v.getBatiments().get(Building.DOCKS), + v.getPowers(), + v.getResearches(), + v.getHero(), + v.getHeroLevel()).prod(this.count); } @Override - public int timeNeeded(SimulatorData sd) { - int base = this.unit.getBuildTime(); + public long timeNeeded(SimulatorData sd) { Ville v = sd.getVille(town); - double percentage = 1.0; - //TODO take heroes into account, generalize resarches - if(v.hasResearch(gc.getResearch("instructor"))) - percentage -= .1; - //TODO move this code in gameconfig - //TODO use the real application computation (helpers/general_modifications.js:221) - percentage -= Math.pow(v.getBatiments().get(Building.BARRACKS) - 1, 1.1) / 100; - return (int) (base * percentage * count); + return gc.getUnitBuildTime( + this.unit, + v.getBatiments().get(Building.BARRACKS), + v.getBatiments().get(Building.DOCKS), + v.getPowers(), + v.getResearches(), + v.getHero(), + v.getHeroLevel()) * this.count; } - + // Store favor cost somewhere } diff --git a/src/main/java/com/bernard/greposimu/model/simulator/command/ResearchCommand.java b/src/main/java/com/bernard/greposimu/model/simulator/command/ResearchCommand.java index 8e0f15d..08f15a1 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/command/ResearchCommand.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/command/ResearchCommand.java @@ -1,9 +1,11 @@ package com.bernard.greposimu.model.simulator.command; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.Resources; +import com.bernard.greposimu.model.game.buildings.Building; import com.bernard.greposimu.model.game.researches.Research; -import com.bernard.greposimu.model.simulator.SimulatorData; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.simulator.data.SimulatorData; +import com.bernard.greposimu.model.simulator.data.Ville; public class ResearchCommand extends TownCommand { @@ -22,19 +24,31 @@ public class ResearchCommand extends TownCommand { else return "[%d] Research %s".formatted(this.town,this.research.getName()); } - @Override public Resources neededResources(SimulatorData sd) { - //TODO take into account other modifiers (heroes zB) - //TODO take forgetting into account - return research.getResources(); + if(this.forget)return Resources.empty; + Ville v = sd.getVille(town); + return gc.getResearchResources( + this.research, + v.getBatiments().get(Building.ACADEMY), + v.getPowers(), + v.getHero(), + v.getHeroLevel()); } @Override - public int timeNeeded(SimulatorData sd) { - //TODO take into account other modifiers (heroes zB) - //TODO take forgetting into account - return research.getRequiredTime(); + public long timeNeeded(SimulatorData sd) { + Ville v = sd.getVille(town); + if(this.forget) + //TODO check this implementation correct + return 0; + else + return gc.getResearchTime( + this.research, + v.getBatiments().get(Building.ACADEMY), + v.getPowers(), + v.getHero(), + v.getHeroLevel()); } } diff --git a/src/main/java/com/bernard/greposimu/model/simulator/command/TownCommand.java b/src/main/java/com/bernard/greposimu/model/simulator/command/TownCommand.java index 9b27d1f..e9e766f 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/command/TownCommand.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/command/TownCommand.java @@ -1,8 +1,8 @@ package com.bernard.greposimu.model.simulator.command; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.Resources; -import com.bernard.greposimu.model.simulator.SimulatorData; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.simulator.data.SimulatorData; public abstract class TownCommand extends Command { @@ -12,6 +12,6 @@ public abstract class TownCommand extends Command { super(gc); this.town = town; } - + public abstract Resources neededResources(SimulatorData sd); } diff --git a/src/main/java/com/bernard/greposimu/model/simulator/data/CastedPower.java b/src/main/java/com/bernard/greposimu/model/simulator/data/CastedPower.java new file mode 100644 index 0000000..46e5162 --- /dev/null +++ b/src/main/java/com/bernard/greposimu/model/simulator/data/CastedPower.java @@ -0,0 +1,47 @@ +package com.bernard.greposimu.model.simulator.data; + +import java.util.Map; + +import com.bernard.greposimu.model.game.powers.Power; +import com.bernard.greposimu.model.game.util.Identified; +import com.bernard.greposimu.model.game.util.Timestamp; + +public class CastedPower implements Identified{ + + long originPlayer; + Power power; + Timestamp end; + String id; + Integer level; + int extended; + + // Replace with real OOP, depending on the power + Map configuration; + + public CastedPower(long originPlayer, Power power, Timestamp end, String id, Integer level, int extended, + Map configuration) { + this.originPlayer = originPlayer; + this.power = power; + this.end = end; + this.id = id; + this.level = level; + this.extended = extended; + this.configuration = configuration; + } + + public long getOriginPlayer() { + return originPlayer; + } + public Power getPower() { + return power; + } + public Timestamp getEnd() { + return end; + } + public String getId() { + return id; + } + public Map getConfiguration() { + return configuration; + } +} diff --git a/src/main/java/com/bernard/greposimu/model/simulator/Joueureuse.java b/src/main/java/com/bernard/greposimu/model/simulator/data/Joueureuse.java similarity index 92% rename from src/main/java/com/bernard/greposimu/model/simulator/Joueureuse.java rename to src/main/java/com/bernard/greposimu/model/simulator/data/Joueureuse.java index 3516e43..81aab5c 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/Joueureuse.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/data/Joueureuse.java @@ -1,11 +1,11 @@ -package com.bernard.greposimu.model.simulator; +package com.bernard.greposimu.model.simulator.data; import java.util.List; import java.util.Map; import java.util.Set; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Timestamp; +import com.bernard.greposimu.model.game.gods.God; +import com.bernard.greposimu.model.game.util.Timestamp; public class Joueureuse { diff --git a/src/main/java/com/bernard/greposimu/model/simulator/Movements.java b/src/main/java/com/bernard/greposimu/model/simulator/data/Movements.java similarity index 69% rename from src/main/java/com/bernard/greposimu/model/simulator/Movements.java rename to src/main/java/com/bernard/greposimu/model/simulator/data/Movements.java index 98621ba..657a6bf 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/Movements.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/data/Movements.java @@ -1,6 +1,6 @@ -package com.bernard.greposimu.model.simulator; +package com.bernard.greposimu.model.simulator.data; -import com.bernard.greposimu.model.game.Timestamp; +import com.bernard.greposimu.model.game.util.Timestamp; public class Movements { diff --git a/src/main/java/com/bernard/greposimu/model/simulator/SimulatorData.java b/src/main/java/com/bernard/greposimu/model/simulator/data/SimulatorData.java similarity index 89% rename from src/main/java/com/bernard/greposimu/model/simulator/SimulatorData.java rename to src/main/java/com/bernard/greposimu/model/simulator/data/SimulatorData.java index 4a670bf..993f0eb 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/SimulatorData.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/data/SimulatorData.java @@ -1,11 +1,10 @@ -package com.bernard.greposimu.model.simulator; +package com.bernard.greposimu.model.simulator.data; import java.util.Map; public class SimulatorData { Map villes; - Joueureuse joueureuse; public SimulatorData(Map villes, Joueureuse joueureuse) { diff --git a/src/main/java/com/bernard/greposimu/model/simulator/Troupes.java b/src/main/java/com/bernard/greposimu/model/simulator/data/Troupes.java similarity index 94% rename from src/main/java/com/bernard/greposimu/model/simulator/Troupes.java rename to src/main/java/com/bernard/greposimu/model/simulator/data/Troupes.java index 81c999c..505519a 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/Troupes.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/data/Troupes.java @@ -1,4 +1,4 @@ -package com.bernard.greposimu.model.simulator; +package com.bernard.greposimu.model.simulator.data; import java.util.Map; import java.util.function.Function; diff --git a/src/main/java/com/bernard/greposimu/model/simulator/Ville.java b/src/main/java/com/bernard/greposimu/model/simulator/data/Ville.java similarity index 87% rename from src/main/java/com/bernard/greposimu/model/simulator/Ville.java rename to src/main/java/com/bernard/greposimu/model/simulator/data/Ville.java index 42ff180..bf7af2c 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/Ville.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/data/Ville.java @@ -1,18 +1,18 @@ -package com.bernard.greposimu.model.simulator; +package com.bernard.greposimu.model.simulator.data; import java.util.List; import java.util.Map; import java.util.Set; -import com.bernard.greposimu.model.game.Building; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Resources; -import com.bernard.greposimu.model.game.Timestamp; -import com.bernard.greposimu.model.game.powers.Power; +import com.bernard.greposimu.model.game.buildings.Building; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.queues.BuildingQueueItem; import com.bernard.greposimu.model.game.queues.RecruitmentQueueItem; import com.bernard.greposimu.model.game.queues.ResearchQueueItem; import com.bernard.greposimu.model.game.researches.Research; +import com.bernard.greposimu.model.game.units.Hero; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.game.util.Timestamp; public class Ville { @@ -29,8 +29,7 @@ public class Ville { // Destination town -> troupes Map soutenus; - // sortilegeId -> effectEnd - Map sortileges; + Set powers; // Agora Timestamp festivalEnd,olympiquesEnd,marchEnd,theaterEnd; @@ -68,7 +67,7 @@ public class Ville { public Ville(int id, String nom, Map batiments, Troupes troupes, Map soutiens, - Map soutenus, Map sortileges, Timestamp festivalEnd, + Map soutenus, Set powers, Timestamp festivalEnd, Timestamp olympiquesEnd, Timestamp marchEnd, Timestamp theaterEnd, Set researches, List researchQueue, List buildingQueue, Timestamp miliceUntil, Resources storage, List terrestrialQueue, God god, @@ -81,7 +80,7 @@ public class Ville { this.troupes = troupes; this.soutiens = soutiens; this.soutenus = soutenus; - this.sortileges = sortileges; + this.powers = powers; this.festivalEnd = festivalEnd; this.olympiquesEnd = olympiquesEnd; this.marchEnd = marchEnd; @@ -152,8 +151,8 @@ public class Ville { return soutenus; } - public Map getSortileges() { - return sortileges; + public Set getPowers() { + return powers; } public Timestamp getFestivalEnd() { @@ -223,5 +222,15 @@ public class Ville { public Set getOutgoingTrade() { return outgoingTrade; } + + public Hero getHero(){ + //TODO implement this + return null; + } + + public int getHeroLevel() { + //TODO implement this + return 0; + } } diff --git a/src/main/java/com/bernard/greposimu/model/simulator/objective/TownObjective.java b/src/main/java/com/bernard/greposimu/model/simulator/objective/TownObjective.java index 4fb8692..3b6115b 100644 --- a/src/main/java/com/bernard/greposimu/model/simulator/objective/TownObjective.java +++ b/src/main/java/com/bernard/greposimu/model/simulator/objective/TownObjective.java @@ -5,18 +5,18 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import com.bernard.greposimu.model.game.Building; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.God; +import com.bernard.greposimu.model.game.buildings.Building; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.researches.Research; import com.bernard.greposimu.model.game.units.Unit; -import com.bernard.greposimu.model.simulator.Troupes; -import com.bernard.greposimu.model.simulator.Ville; import com.bernard.greposimu.model.simulator.command.BuildCommand; import com.bernard.greposimu.model.simulator.command.Command; import com.bernard.greposimu.model.simulator.command.HideStoreCommand; import com.bernard.greposimu.model.simulator.command.RecruitCommand; import com.bernard.greposimu.model.simulator.command.ResearchCommand; +import com.bernard.greposimu.model.simulator.data.Troupes; +import com.bernard.greposimu.model.simulator.data.Ville; public class TownObjective { GameConfig gc; diff --git a/src/main/java/com/bernard/greposimu/source/JSONSourcer.java b/src/main/java/com/bernard/greposimu/source/JSONSourcer.java index 1b41a09..33df604 100644 --- a/src/main/java/com/bernard/greposimu/source/JSONSourcer.java +++ b/src/main/java/com/bernard/greposimu/source/JSONSourcer.java @@ -10,12 +10,9 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import com.bernard.greposimu.model.game.Building; import com.bernard.greposimu.model.game.GameConfig; -import com.bernard.greposimu.model.game.God; -import com.bernard.greposimu.model.game.Resources; -import com.bernard.greposimu.model.game.Timestamp; -import com.bernard.greposimu.model.game.UnitResources; +import com.bernard.greposimu.model.game.buildings.Building; +import com.bernard.greposimu.model.game.gods.God; import com.bernard.greposimu.model.game.powers.Power; import com.bernard.greposimu.model.game.queues.BuildingQueueItem; import com.bernard.greposimu.model.game.queues.RecruitmentQueueItem; @@ -23,11 +20,15 @@ import com.bernard.greposimu.model.game.queues.RecruitmentQueueItem.RecruitmentK import com.bernard.greposimu.model.game.queues.ResearchQueueItem; import com.bernard.greposimu.model.game.researches.Research; import com.bernard.greposimu.model.game.units.Unit; -import com.bernard.greposimu.model.simulator.Joueureuse; -import com.bernard.greposimu.model.simulator.SimulatorData; -import com.bernard.greposimu.model.simulator.Troupes; -import com.bernard.greposimu.model.simulator.Ville; -import com.bernard.greposimu.model.simulator.Ville.TradeOrder; +import com.bernard.greposimu.model.game.util.Resources; +import com.bernard.greposimu.model.game.util.Timestamp; +import com.bernard.greposimu.model.game.util.UnitResources; +import com.bernard.greposimu.model.simulator.data.CastedPower; +import com.bernard.greposimu.model.simulator.data.Joueureuse; +import com.bernard.greposimu.model.simulator.data.SimulatorData; +import com.bernard.greposimu.model.simulator.data.Troupes; +import com.bernard.greposimu.model.simulator.data.Ville; +import com.bernard.greposimu.model.simulator.data.Ville.TradeOrder; import com.fasterxml.jackson.core.exc.StreamReadException; import com.fasterxml.jackson.databind.DatabindException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -73,7 +74,7 @@ public class JSONSourcer { Map buildings = new HashMap<>(); for(String bid : st.buildings.keySet())buildings.put(gc.getBuilding(bid), st.buildings.get(bid)); Set researches = new HashSet<>(); - for(String rid : st.researches.keySet())if(st.researches.get(rid))researches.add(gc.getResearch(rid)); + for(String rid : st.researches.keySet())if(!rid.equals("id") && st.researches.get(rid))researches.add(gc.getResearch(rid)); Map soutiens = new HashMap(); Map soutenus = new HashMap(); for(SourcedUnits uts : sd.units) { @@ -121,10 +122,18 @@ public class JSONSourcer { new Timestamp(sro.getEndTime()), getResources(sro.getRefund()) )); - Map sortileges = new HashMap<>(); - for(SourcedCastedPower sp : st.castedPowers) { - //TODO - } + + Set powers = new HashSet<>(); + for(SourcedCastedPower sp : st.castedPowers) + powers.add(new CastedPower( + sp.getOriginPlayer(), + gc.getPower(sp.getPower()), + sp.getEndTime()==null?null:new Timestamp(sp.getEndTime()), + sp.getId(), + sp.getLevel(), + sp.getExtended(), + sp.getConfiguration())); + Set incomingTrade = new HashSet<>(); Set outgoingTrade = new HashSet<>(); for(SourcedTrades str : sd.trades) { @@ -145,7 +154,7 @@ public class JSONSourcer { getTroupes(gc, st.getUnitsTotal()), soutiens, soutenus, - sortileges, + powers, townCele.stream().filter(c -> c.type.equals("party")).map(SourcedCelebration::getEnd).map(Timestamp::new).findAny().orElse(null), townCele.stream().filter(c -> c.type.equals("games")).map(SourcedCelebration::getEnd).map(Timestamp::new).findAny().orElse(null), diff --git a/src/main/java/com/bernard/greposimu/source/SourcedCastedPower.java b/src/main/java/com/bernard/greposimu/source/SourcedCastedPower.java index 322fe4d..8ab2ac0 100644 --- a/src/main/java/com/bernard/greposimu/source/SourcedCastedPower.java +++ b/src/main/java/com/bernard/greposimu/source/SourcedCastedPower.java @@ -1,20 +1,18 @@ package com.bernard.greposimu.source; +import java.util.Map; + public class SourcedCastedPower { - Object configuration; + Map configuration; Long endTime; int extended; Integer level; Long originPlayer; String power; + String id; - @Override - public String toString() { - return "SourcedCastedPower [configuration=" + configuration + ", endTime=" + endTime + ", extended=" + extended - + ", level=" + level + ", originPlayer=" + originPlayer + ", power=" + power + "]"; - } - public Object getConfiguration() { + public Map getConfiguration() { return configuration; } public Long getEndTime() { @@ -32,6 +30,8 @@ public class SourcedCastedPower { public String getPower() { return power; } - + public String getId() { + return id; + } } diff --git a/src/main/resources/static/userscript.js b/src/main/resources/static/userscript.js index 7d70c85..7585346 100644 --- a/src/main/resources/static/userscript.js +++ b/src/main/resources/static/userscript.js @@ -95,7 +95,8 @@ function makeObject() { extended: order.extended, level: order.level, originPlayer: order.origin_player_id, - power: order.power_id + power: order.power_id, + id: order.id }) } diff --git a/src/test/java/com/bernard/greposimu/GrepoSimuApplicationTests.java b/src/test/java/com/bernard/greposimu/GrepoSimuApplicationTests.java index 152ec52..cdf417a 100644 --- a/src/test/java/com/bernard/greposimu/GrepoSimuApplicationTests.java +++ b/src/test/java/com/bernard/greposimu/GrepoSimuApplicationTests.java @@ -13,7 +13,7 @@ import org.springframework.boot.test.context.SpringBootTest; import com.bernard.greposimu.model.game.GameConfig; import com.bernard.greposimu.model.game.GrepoYaml; import com.bernard.greposimu.model.game.units.Unit; -import com.bernard.greposimu.model.simulator.SimulatorData; +import com.bernard.greposimu.model.simulator.data.SimulatorData; import com.bernard.greposimu.model.simulator.objective.TownObjective; import com.bernard.greposimu.source.JSONSourcer; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/resources/objectives.yml b/src/test/resources/objectives.yml index 64aee9c..779385a 100644 --- a/src/test/resources/objectives.yml +++ b/src/test/resources/objectives.yml @@ -26,7 +26,7 @@ defTerTown: - "hoplite" - "pottery" - "instructor" - - "crane" + - "building_crane" - "conscription" - "cryptography" - "plow"