From 850611c14531be449fb2d1c71815eea44bc982df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Mon, 7 Dec 2015 16:29:09 +0100 Subject: add MapRules: that holds engagement specific rules --- core/src/ch/asynk/rustanddust/game/Map.java | 73 +---------------- .../ch/asynk/rustanddust/game/battles/Map00.java | 2 +- .../asynk/rustanddust/game/battles/MapRules.java | 93 ++++++++++++++++++++++ 3 files changed, 97 insertions(+), 71 deletions(-) create mode 100644 core/src/ch/asynk/rustanddust/game/battles/MapRules.java diff --git a/core/src/ch/asynk/rustanddust/game/Map.java b/core/src/ch/asynk/rustanddust/game/Map.java index 60c445b..6a5c8a9 100644 --- a/core/src/ch/asynk/rustanddust/game/Map.java +++ b/core/src/ch/asynk/rustanddust/game/Map.java @@ -58,6 +58,8 @@ public abstract class Map extends Board implements MoveToAnimationCb, ObjectiveS private OrderList commands; protected abstract void setup(); + protected abstract void resolveEngagement(Engagement e); + protected abstract int engagementCost(Engagement e); public Map(final RustAndDust game, String map, String hex) { @@ -482,74 +484,6 @@ public abstract class Map extends Board implements MoveToAnimationCb, ObjectiveS } } - private void resolveEngagement(Engagement e) - { - int dice = e.d1 + e.d2; - - int distance = 0; - boolean mayReroll = false; - boolean night = (meteorology.day == Meteorology.Day.NIGHT); - boolean flankAttack = false; - boolean terrainBonus = true; - - for (Unit unit : activatedUnits) { - if (unit != e.attacker) - e.addAssist(unit); - if (unit.isAce()) - mayReroll = true; - if (unit.isFlankAttack()) - flankAttack = true; - if (unit.preventDefenseOn(e.defender.getTile())) - terrainBonus = false; - if (night) { - if (distance < unit.attackDistance()) - distance = unit.attackDistance(); - } - } - - int cnt = activatedUnits.size(); - int def = e.defender.getDefense(e.attacker.getTile()); - int flk = (flankAttack ? Unit.FLANK_ATTACK_BONUS : 0); - int tdf = (terrainBonus ? e.defender.getTile().defense() : 0); - int wdf = 0; - if (night) { - if (distance > 3) - wdf = 3; - else if (distance > 2) - wdf = 2; - else if (distance > 1) - wdf = 1; - } - int s1 = (dice + cnt + flk); - int s2 = (def + tdf + wdf); - - boolean success = false; - if (dice == 2) { - success = false; - } else if (dice == 12) { - success = true; - } else { - success = (s1 >= s2); - } - if (!success && mayReroll) { - dice = e.d3 + e.d4; - s1 = (dice + cnt + flk); - if (dice == 2) { - success = false; - } else if (dice == 12) { - success = true; - } else { - success = (s1 >= s2); - } - } else { - e.d3 = 0; - e.d4 = 0; - } - - e.set(cnt, flk, def, tdf, wdf); - e.success = success; - } - private int doEngagement(Engagement e) { breakthroughUnits.clear(); @@ -575,8 +509,7 @@ public abstract class Map extends Board implements MoveToAnimationCb, ObjectiveS ctrl.hud.engagementSummary(e, ctrl.cfg.fxVolume); addEngagementAnimation(e.defender); - // do not consume action points - if ((activatedUnits.size() == 1) && e.attacker.isA(Unit.UnitType.AT_GUN) && e.defender.isHardTarget()) + if (engagementCost(e) == 0) activatedUnits.clear(); return (e.success ? 1 : 0); diff --git a/core/src/ch/asynk/rustanddust/game/battles/Map00.java b/core/src/ch/asynk/rustanddust/game/battles/Map00.java index 618fe45..a9126bd 100644 --- a/core/src/ch/asynk/rustanddust/game/battles/Map00.java +++ b/core/src/ch/asynk/rustanddust/game/battles/Map00.java @@ -6,7 +6,7 @@ import ch.asynk.rustanddust.engine.Orientation; import ch.asynk.rustanddust.game.Map; import ch.asynk.rustanddust.game.Hex; -public class Map00 extends Map +public class Map00 extends MapRules { public Map00(final RustAndDust game, String map, String hex) { diff --git a/core/src/ch/asynk/rustanddust/game/battles/MapRules.java b/core/src/ch/asynk/rustanddust/game/battles/MapRules.java new file mode 100644 index 0000000..3426701 --- /dev/null +++ b/core/src/ch/asynk/rustanddust/game/battles/MapRules.java @@ -0,0 +1,93 @@ +package ch.asynk.rustanddust.game.battles; + +import ch.asynk.rustanddust.RustAndDust; + +import ch.asynk.rustanddust.game.Map; +import ch.asynk.rustanddust.game.Unit; +import ch.asynk.rustanddust.game.Engagement; + +abstract public class MapRules extends Map +{ + public MapRules(final RustAndDust game, String map, String hex) + { + super(game, map, hex); + } + + @Override + protected int engagementCost(Engagement e) + { + if ((activatedUnits.size() == 1) && e.attacker.isA(Unit.UnitType.AT_GUN) && e.defender.isHardTarget()) + return 0; + return 1; + } + + @Override + protected void resolveEngagement(Engagement e) + { + int dice = e.d1 + e.d2; + + int distance = 0; + boolean mayReroll = false; + boolean night = meteorology.isNight(); + boolean flankAttack = false; + boolean terrainBonus = true; + + for (Unit unit : activatedUnits) { + if (unit != e.attacker) + e.addAssist(unit); + if (unit.isAce()) + mayReroll = true; + if (unit.isFlankAttack()) + flankAttack = true; + if (unit.preventDefenseOn(e.defender.getTile())) + terrainBonus = false; + if (night) { + if (distance < unit.attackDistance()) + distance = unit.attackDistance(); + } + } + + int cnt = activatedUnits.size(); + int def = e.defender.getDefense(e.attacker.getTile()); + int flk = (flankAttack ? Unit.FLANK_ATTACK_BONUS : 0); + int tdf = (terrainBonus ? e.defender.getTile().defense() : 0); + int wdf = 0; + if (night) { + if (distance > 3) + wdf = 3; + else if (distance > 2) + wdf = 2; + else if (distance > 1) + wdf = 1; + } + int s1 = (dice + cnt + flk); + int s2 = (def + tdf + wdf); + + boolean success = false; + if (dice == 2) { + success = false; + } else if (dice == 12) { + success = true; + } else { + success = (s1 >= s2); + } + if (!success && mayReroll) { + dice = e.d3 + e.d4; + s1 = (dice + cnt + flk); + if (dice == 2) { + success = false; + } else if (dice == 12) { + success = true; + } else { + success = (s1 >= s2); + } + } else { + e.d3 = 0; + e.d4 = 0; + } + + e.set(cnt, flk, def, tdf, wdf); + e.success = success; + } + +} -- cgit v1.1-2-g2b99