From 563c88e55860d62c5a8b288c9ba8ed3c50930fe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Mon, 13 Oct 2014 16:54:31 +0200 Subject: SearchBoard: clean up buildAttack(...)' -> canAttack(...) uses Pawn.Attack inner class --- .../ch/asynk/tankontank/engine/SearchBoard.java | 44 ++++++++++++++++------ 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/core/src/ch/asynk/tankontank/engine/SearchBoard.java b/core/src/ch/asynk/tankontank/engine/SearchBoard.java index c628363..c39cb0d 100644 --- a/core/src/ch/asynk/tankontank/engine/SearchBoard.java +++ b/core/src/ch/asynk/tankontank/engine/SearchBoard.java @@ -345,30 +345,52 @@ public class SearchBoard return targets; } - public boolean canAttack(Pawn pawn, int col0, int row0, int col1, int row1) + public boolean buildAttack(Pawn pawn, Pawn target, int col0, int row0, int col1, int row1) { - Node from = getNode(col0, row0); - Node to = getNode(col1, row1); - Tile tile = board.getTile(col0, row0); + pawn.attack.isClear = false; + pawn.attack.target = target; + pawn.attack.distance = distance(col0, row0, col1, row1); + + if (pawn.attack.distance > pawn.getAttackRangeFrom(board.getTile(col0, row0))) + return false; - if (distance(from, to) > pawn.getAttackRangeFrom(tile)) + List los = lineOfSight(col0, row0, col1, row1); + Node last = los.get(los.size() -1); + if ((last.col != col1) || (last.row != row1)) return false; - return hasClearLineOfSight(from, to, pawn.getAngleOfAttack()); + + if (!validatePathAngle(pawn.getAngleOfAttack(), los)) { + System.err.println("angleOfAttack is not respected"); + return false; + } + + pawn.attack.isClear = true; + pawn.attack.isFlankAttack = isFlankAttack(target.getFlankSides(), los); + + return true; } private boolean hasClearLineOfSight(Node from, Node to, int angleOfAttack) { - List nodes = lineOfSight(from.col, from.row, to.col, to.row); - Node last = nodes.get(nodes.size() -1); + List los = lineOfSight(from.col, from.row, to.col, to.row); + Node last = los.get(los.size() -1); if ((last.col != to.col) || (last.row != to.row)) return false; - return validatePathAngle(angleOfAttack, nodes); + return validatePathAngle(angleOfAttack, los); + } + + private boolean isFlankAttack(int angle, List los) + { + Node from = los.get(los.size() - 2); + Node to = los.get(los.size() - 1); + Orientation o = Orientation.fromMove(to.col, to.row, from.col, from.row); + return o.isInSides(angle); } - public boolean validatePathAngle(int angle, List nodes) + private boolean validatePathAngle(int angle, List los) { Node prev = null; - for (Node next : nodes) { + for (Node next : los) { if (prev != null) { Orientation o = Orientation.fromMove(prev.col, prev.row, next.col, next.row); if (!o.isInSides(angle)) -- cgit v1.1-2-g2b99