From cb60e5e8bb3992529a6ed66a451629d4ab0da8d1 Mon Sep 17 00:00:00 2001
From: sfphoton <schulcz.ferenc@gmail.com>
Date: Sun, 13 May 2018 16:13:37 +0200
Subject: [PATCH] Fixed game ending detection

---
 src/killer_sokoban/AbstractField.java | 39 ++++++++++++++++++++++-----
 src/killer_sokoban/Main.java          | 17 +++++++++---
 src/killer_sokoban/SimpleField.java   |  6 ++---
 src/killer_sokoban/Wall.java          | 10 +++++++
 4 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/src/killer_sokoban/AbstractField.java b/src/killer_sokoban/AbstractField.java
index 75f9739..4f096aa 100644
--- a/src/killer_sokoban/AbstractField.java
+++ b/src/killer_sokoban/AbstractField.java
@@ -6,7 +6,18 @@ public abstract class AbstractField {
 	
 	
 	protected HashMap<Direction, AbstractField> neighbours=new HashMap<Direction, AbstractField>();
-	protected boolean isCorner;
+	protected HashMap<Direction, Boolean> gotCornerFrom = new HashMap<Direction, Boolean>();
+	
+	/**
+	 * Konstruktor
+	 */
+	public AbstractField() {
+		gotCornerFrom.put(Direction.UP, false);
+		gotCornerFrom.put(Direction.RIGHT, false);
+		gotCornerFrom.put(Direction.DOWN, false);
+		gotCornerFrom.put(Direction.LEFT, false);
+		
+	}
 	
 	/**Ez a függvény azt jelzi a mező számára, hogy szeretnének rálépni.
 	 * @param toward melyik irányból szeretnének rálépni
@@ -52,21 +63,37 @@ public abstract class AbstractField {
 		view.drawAbstract();
 	}
 	
+	/**
+	 * Megadja, hogy a mező saroknak számít-e
+	 */
+	protected boolean isCorner() {
+		return gotCornerFrom.get(Direction.UP) && (gotCornerFrom.get(Direction.RIGHT) || gotCornerFrom.get(Direction.LEFT)) || gotCornerFrom.get(Direction.DOWN) && (gotCornerFrom.get(Direction.RIGHT) || gotCornerFrom.get(Direction.LEFT));
+	}
+	
+	/**
+	 * Ha szükséges, értesíti a szomszédokat arról, hogy ettől a mezőtől ők lehetnének sarkok
+	 */
+	public void initCorner() {
+		//itt hívna egy fal minden szomszédra setToCorner()-t
+	}
+	
 	/**
 	 * Ez a függvény sarkot csinál a mezőből.
 	 */
-	public void setToCorner() {
-		isCorner = true;
+	public void setToCorner(Direction from) {
+		gotCornerFrom.replace(from, true);
 	}
 	
 	/**
 	 * A sarokba betoltunk valamit, így a szomszédjaiból sarok lett.
 	 */
 	public void fillCorner() {
-		if(!isCorner) return;
+		if(!isCorner()) return;
 		
-		for(AbstractField neighbor : neighbours.values()) {
-			if(!neighbor.isCorner) neighbor.setToCorner();
+		for(Direction dir : gotCornerFrom.keySet()) {
+			if (gotCornerFrom.get(dir)) {
+				neighbours.get(dir.opposite()).setToCorner(dir);
+			}
 		}
 	}
 
diff --git a/src/killer_sokoban/Main.java b/src/killer_sokoban/Main.java
index 9fcac4d..d98aaa8 100644
--- a/src/killer_sokoban/Main.java
+++ b/src/killer_sokoban/Main.java
@@ -211,6 +211,7 @@ public class Main extends Application {
 		AbstractField af=map.get("f_"+y+"_"+x);
 		af.shouldDraw(view);
 	}
+	
 	public static void main(String[] args) throws IOException {
 		launch(args);
 	}
@@ -307,7 +308,7 @@ public class Main extends Application {
 			stat(cmd[1]);
 		}
 		else if (cmd[0].equals("setcorner")) {
-			setCorner(cmd[1]);
+			setCorner(cmd[1], cmd[2]);
 		}
 		else if (cmd[0].equals("script")) {
 			script(cmd[1]);
@@ -386,6 +387,9 @@ public class Main extends Application {
 			}
 		}
 		
+		//Sarkok inicializálása
+		initCorners();
+		
 		//View újrainicializálása
 		view.init(lines,  columns);
 	}
@@ -479,12 +483,19 @@ public class Main extends Application {
 		}
 	}
 	
+	/**
+	 * Elindít egy inicializálást arról, hogy mely mezők vannak sarokban
+	 */
+	private static void initCorners() {
+		for(AbstractField f : map.values()) f.initCorner();
+	}
+	
 	/**
 	 * Sarkokat beállítja a megadott mezőn
 	 * @param field megadott mező
 	 */
-	private static void setCorner(String field) {
-		map.get(field).setToCorner();
+	private static void setCorner(String field, String from) {
+		map.get(field).setToCorner(Direction.fromString(from));
 	}
 	
 	/**
diff --git a/src/killer_sokoban/SimpleField.java b/src/killer_sokoban/SimpleField.java
index 83a5ffd..df07c42 100644
--- a/src/killer_sokoban/SimpleField.java
+++ b/src/killer_sokoban/SimpleField.java
@@ -26,7 +26,7 @@ public class SimpleField extends AbstractField {
 		{
 			m.move(this); //Fontos a sorrend, mert ez a függvény eldobatja magát m mezőjével.
 			myMoveable=m;
-			if (isCorner) m.arriveToCorner();
+			if (isCorner()) m.arriveToCorner();
 		}
 		
 
@@ -197,8 +197,8 @@ public class SimpleField extends AbstractField {
 	 * Ez a függvény sarkot csinál a mezőből.
 	 */
 	@Override
-	public void setToCorner() {
-		super.setToCorner();
+	public void setToCorner(Direction from) {
+		super.setToCorner(from);
 		if(myMoveable != null) myMoveable.arriveToCorner();
 	}
 }
diff --git a/src/killer_sokoban/Wall.java b/src/killer_sokoban/Wall.java
index 1acb7ab..a77ac01 100644
--- a/src/killer_sokoban/Wall.java
+++ b/src/killer_sokoban/Wall.java
@@ -22,6 +22,16 @@ public class Wall extends AbstractField {
 	public boolean couldMoveOn(Direction toward) {
 		return false;
 	}
+	
+	/**
+	 * Szól a szomszédjainak, hogy lehet, hogy sarokban vannak
+	 */
+	@Override
+	public void initCorner() {
+		for(Direction dir : neighbours.keySet()) {
+			neighbours.get(dir).setToCorner(dir.opposite());
+		}
+	}
 		
 	/**
 	 * Fal kirajzolásáért felel
-- 
GitLab