summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-10-14 16:53:55 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2014-10-14 16:53:55 +0200
commit605d4e13db0d6401927f0b03ed9c6764bd2147d2 (patch)
tree562bcf9bb961b7eac3b0a9900c3c2790cce3df7a
parent8cef42c8fcdfc38ffe66f122ff89e14c643f7709 (diff)
downloadRustAndDust-605d4e13db0d6401927f0b03ed9c6764bd2147d2.zip
RustAndDust-605d4e13db0d6401927f0b03ed9c6764bd2147d2.tar.gz
add promote action
-rw-r--r--TODO1
-rw-r--r--core/src/ch/asynk/tankontank/game/Ctrl.java6
-rw-r--r--core/src/ch/asynk/tankontank/game/Hud.java13
-rw-r--r--core/src/ch/asynk/tankontank/game/Map.java8
-rw-r--r--core/src/ch/asynk/tankontank/game/Player.java14
-rw-r--r--core/src/ch/asynk/tankontank/game/State.java1
-rw-r--r--core/src/ch/asynk/tankontank/game/states/StateAttack.java4
-rw-r--r--core/src/ch/asynk/tankontank/game/states/StateMove.java2
-rw-r--r--core/src/ch/asynk/tankontank/game/states/StatePromote.java44
-rw-r--r--core/src/ch/asynk/tankontank/game/states/StateRotate.java4
-rw-r--r--core/src/ch/asynk/tankontank/game/states/StateSelect.java1
11 files changed, 91 insertions, 7 deletions
diff --git a/TODO b/TODO
index abc9caa..f09b45d 100644
--- a/TODO
+++ b/TODO
@@ -22,7 +22,6 @@ Game:
- attack
- infantry move after won fight
- at bonus: no AP used for AT only attack against HT (still must have > 0 AP left ;))
- - promote
- add options to hide moves/targets/assists even in action
Hex, Unit:
diff --git a/core/src/ch/asynk/tankontank/game/Ctrl.java b/core/src/ch/asynk/tankontank/game/Ctrl.java
index dd92575..6ef8eed 100644
--- a/core/src/ch/asynk/tankontank/game/Ctrl.java
+++ b/core/src/ch/asynk/tankontank/game/Ctrl.java
@@ -7,6 +7,7 @@ import ch.asynk.tankontank.game.states.StateCommon;
import ch.asynk.tankontank.game.states.StateSelect;
import ch.asynk.tankontank.game.states.StateMove;
import ch.asynk.tankontank.game.states.StateRotate;
+import ch.asynk.tankontank.game.states.StatePromote;
import ch.asynk.tankontank.game.states.StateAttack;
import ch.asynk.tankontank.game.states.StateAnimation;
@@ -24,6 +25,7 @@ public class Ctrl implements Disposable
private State selectState;
private State pathState;
private State rotateState;
+ private State promoteState;
private State attackState;
private State animationState;
@@ -46,6 +48,7 @@ public class Ctrl implements Disposable
this.selectState = new StateSelect(this, map);
this.pathState = new StateMove();
this.rotateState = new StateRotate();
+ this.promoteState = new StatePromote();
this.attackState = new StateAttack();
this.animationState = new StateAnimation();
@@ -131,6 +134,9 @@ public class Ctrl implements Disposable
case ROTATE:
this.state = rotateState;
break;
+ case PROMOTE:
+ this.state = promoteState;
+ break;
case ATTACK:
this.state = attackState;
break;
diff --git a/core/src/ch/asynk/tankontank/game/Hud.java b/core/src/ch/asynk/tankontank/game/Hud.java
index 91af8b3..81009bc 100644
--- a/core/src/ch/asynk/tankontank/game/Hud.java
+++ b/core/src/ch/asynk/tankontank/game/Hud.java
@@ -25,6 +25,7 @@ public class Hud implements Disposable
public Button moveBtn;
public Button rotateBtn;
+ public Button promoteBtn;
public Button attackBtn;
public Button checkBtn;
public Button cancelBtn;
@@ -46,6 +47,7 @@ public class Hud implements Disposable
moveBtn = new Button(atlas, "btn-move");
rotateBtn = new Button(atlas, "btn-rotate");
+ promoteBtn = new Button(atlas, "btn-promote");
attackBtn = new Button(atlas, "btn-attack");
checkBtn = new Button(atlas, "btn-check");
cancelBtn = new Button(atlas, "btn-cancel");
@@ -68,6 +70,7 @@ public class Hud implements Disposable
{
moveBtn.dispose();
rotateBtn.dispose();
+ promoteBtn.dispose();
attackBtn.dispose();
checkBtn.dispose();
cancelBtn.dispose();
@@ -82,6 +85,7 @@ public class Hud implements Disposable
flag.draw(batch);
if (moveBtn.visible) moveBtn.getImage().draw(batch);
if (rotateBtn.visible) rotateBtn.getImage().draw(batch);
+ if (promoteBtn.visible) promoteBtn.getImage().draw(batch);
if (attackBtn.visible) attackBtn.getImage().draw(batch);
if (checkBtn.visible) checkBtn.getImage().draw(batch);
if (cancelBtn.visible) cancelBtn.getImage().draw(batch);
@@ -101,7 +105,7 @@ public class Hud implements Disposable
return (y + btn.getHeight() + OFFSET);
}
- public void show(boolean rotate, boolean move, boolean attack, boolean check, boolean cancel)
+ public void show(boolean promote, boolean rotate, boolean move, boolean attack, boolean check, boolean cancel)
{
float x = (bottomLeft.x - checkBtn.getWidth());
float y = bottomLeft.y;
@@ -112,6 +116,8 @@ public class Hud implements Disposable
else rotateBtn.hide();
if (attack) y = setButton(attackBtn, x, y);
else attackBtn.hide();
+ if (promote) y = setButton(promoteBtn, x, y);
+ else promoteBtn.hide();
if (cancel) y = setButton(cancelBtn, x, y);
else cancelBtn.hide();
if (check) y = setButton(checkBtn, x, y);
@@ -124,6 +130,7 @@ public class Hud implements Disposable
{
moveBtn.hide();
rotateBtn.hide();
+ promoteBtn.hide();
attackBtn.hide();
checkBtn.hide();
cancelBtn.hide();
@@ -140,6 +147,8 @@ public class Hud implements Disposable
btn = moveBtn;
else if (rotateBtn.hit(x, y))
btn = rotateBtn;
+ else if (promoteBtn.hit(x, y))
+ btn = promoteBtn;
else if (attackBtn.hit(x, y))
btn = attackBtn;
else if (checkBtn.hit(x, y))
@@ -165,6 +174,8 @@ public class Hud implements Disposable
ctrl.setState(State.StateType.MOVE);
else if (btn == rotateBtn)
ctrl.setState(State.StateType.ROTATE);
+ else if (btn == promoteBtn)
+ ctrl.setState(State.StateType.PROMOTE);
else if (btn == attackBtn)
ctrl.setState(State.StateType.ATTACK);
else if (btn == checkBtn)
diff --git a/core/src/ch/asynk/tankontank/game/Map.java b/core/src/ch/asynk/tankontank/game/Map.java
index 352d73d..1e57c6a 100644
--- a/core/src/ch/asynk/tankontank/game/Map.java
+++ b/core/src/ch/asynk/tankontank/game/Map.java
@@ -362,4 +362,12 @@ public abstract class Map extends Board
activatedPawns.add(pawn);
return activablePawns.size();
}
+
+ public void promote(Pawn pawn, Pawn with)
+ {
+ GridPoint2 coords = getHexUnder(pawn);
+ removePawnFrom(pawn, coords);
+ setPawnAt(with, coords, pawn.getOrientation());
+ activatedPawns.add(with);
+ }
}
diff --git a/core/src/ch/asynk/tankontank/game/Player.java b/core/src/ch/asynk/tankontank/game/Player.java
index 5646311..bb50013 100644
--- a/core/src/ch/asynk/tankontank/game/Player.java
+++ b/core/src/ch/asynk/tankontank/game/Player.java
@@ -118,6 +118,20 @@ public class Player implements Drawable, Disposable
return false;
}
+ public Pawn promote(Pawn pawn)
+ {
+ for (Pawn p: casualties) {
+ if (p.isHqOf(pawn)) {
+ units.remove(pawn);
+ casualties.add(pawn);
+ units.add(p);
+ casualties.remove(p);
+ return p;
+ }
+ }
+ return null;
+ }
+
public void setPosition(float x, float y)
{
flag.setPosition(x, y);
diff --git a/core/src/ch/asynk/tankontank/game/State.java b/core/src/ch/asynk/tankontank/game/State.java
index 6156f8b..8f004c4 100644
--- a/core/src/ch/asynk/tankontank/game/State.java
+++ b/core/src/ch/asynk/tankontank/game/State.java
@@ -7,6 +7,7 @@ public interface State
MOVE,
ROTATE,
ATTACK,
+ PROMOTE,
ANIMATION
};
diff --git a/core/src/ch/asynk/tankontank/game/states/StateAttack.java b/core/src/ch/asynk/tankontank/game/states/StateAttack.java
index bbf54d1..c6aebc6 100644
--- a/core/src/ch/asynk/tankontank/game/states/StateAttack.java
+++ b/core/src/ch/asynk/tankontank/game/states/StateAttack.java
@@ -11,7 +11,7 @@ public class StateAttack extends StateCommon
public void enter(boolean fromSelect)
{
map.clearPossibleTargets();
- ctrl.hud.show(false, false, true, false, ctrl.cfg.canCancel);
+ ctrl.hud.show(false, false, false, true, false, ctrl.cfg.canCancel);
ctrl.hud.attackBtn.setOn();
if (fromSelect) {
@@ -56,7 +56,7 @@ public class StateAttack extends StateCommon
map.showTarget(to, true);
map.buildAttackAssists(selectedPawn, activePawn, to, ctrl.currentPlayer().unitIterator());
map.showAttackAssists(true);
- ctrl.hud.show(false, false, true, true, ctrl.cfg.canCancel);
+ ctrl.hud.show(false, false, false, true, true, ctrl.cfg.canCancel);
}
if ((activePawn != null) && map.isInPossibleAttackAssists(upHex)) {
diff --git a/core/src/ch/asynk/tankontank/game/states/StateMove.java b/core/src/ch/asynk/tankontank/game/states/StateMove.java
index 43a8d7f..e8e1c3b 100644
--- a/core/src/ch/asynk/tankontank/game/states/StateMove.java
+++ b/core/src/ch/asynk/tankontank/game/states/StateMove.java
@@ -10,7 +10,7 @@ public class StateMove extends StateCommon
public void enter(boolean fromSelect)
{
map.clearPossiblePaths();
- ctrl.hud.show(true, true, false, ((map.activablePawnsCount() + map.activatedPawnsCount()) > 1), ctrl.cfg.canCancel);
+ ctrl.hud.show(false, true, true, false, ((map.activablePawnsCount() + map.activatedPawnsCount()) > 1), ctrl.cfg.canCancel);
ctrl.hud.moveBtn.setOn();
if (fromSelect) {
diff --git a/core/src/ch/asynk/tankontank/game/states/StatePromote.java b/core/src/ch/asynk/tankontank/game/states/StatePromote.java
new file mode 100644
index 0000000..cb86fd9
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/game/states/StatePromote.java
@@ -0,0 +1,44 @@
+package ch.asynk.tankontank.game.states;
+
+import ch.asynk.tankontank.engine.Pawn;
+import ch.asynk.tankontank.game.State.StateType;
+
+public class StatePromote extends StateCommon
+{
+ @Override
+ public void enter(boolean flag)
+ {
+ ctrl.hud.hide();
+ Pawn p = ctrl.currentPlayer().promote(selectedPawn);
+ if (p != null) {
+ map.promote(selectedPawn, p);
+ }
+ done();
+ }
+
+ @Override
+ public void leave(StateType nextState)
+ {
+ }
+
+ @Override
+ public void touchDown()
+ {
+ }
+
+ @Override
+ public void touchUp()
+ {
+ }
+
+ @Override
+ public void abort()
+ {
+ }
+
+ @Override
+ public void done()
+ {
+ super.done();
+ }
+}
diff --git a/core/src/ch/asynk/tankontank/game/states/StateRotate.java b/core/src/ch/asynk/tankontank/game/states/StateRotate.java
index 9b26288..43350df 100644
--- a/core/src/ch/asynk/tankontank/game/states/StateRotate.java
+++ b/core/src/ch/asynk/tankontank/game/states/StateRotate.java
@@ -15,7 +15,7 @@ public class StateRotate extends StateCommon
this.rotateOnly = rotateOnly;
// if ((map.activablePawnsCount() + map.activatedPawnsCount()) == 1)
- ctrl.hud.show(true, false, false, false, ctrl.cfg.canCancel);
+ ctrl.hud.show(false, true, false, false, false, ctrl.cfg.canCancel);
ctrl.hud.rotateBtn.setOn();
if (rotateOnly) {
@@ -68,7 +68,7 @@ public class StateRotate extends StateCommon
if (ctrl.cfg.mustValidate) {
map.showDirections(to, false);
map.showOrientation(to, true, o);
- ctrl.hud.show(true, false, false, true, ctrl.cfg.canCancel);
+ ctrl.hud.show(false, true, false, false, true, ctrl.cfg.canCancel);
} else
doRotation(o);
}
diff --git a/core/src/ch/asynk/tankontank/game/states/StateSelect.java b/core/src/ch/asynk/tankontank/game/states/StateSelect.java
index 5dc5e68..10fbed1 100644
--- a/core/src/ch/asynk/tankontank/game/states/StateSelect.java
+++ b/core/src/ch/asynk/tankontank/game/states/StateSelect.java
@@ -57,6 +57,7 @@ public class StateSelect extends StateCommon
int assists = map.buildMoveAssists(selectedPawn, selectedHex);
showPossibleTargetsMovesAssists(selectedPawn);
ctrl.hud.show(
+ ctrl.currentPlayer().canPromote(selectedPawn),
selectedPawn.canMove(),
(selectedPawn.canMove() && (moves > 0)),
(selectedPawn.canAttack() && (targets > 0)),