diff --git a/src/killer_sokoban/Main.java b/src/killer_sokoban/Main.java
index 08bd34ea3b9210fe0cafba673699b0277d3a716d..e48d9cb4e3516bfd7fdc1ced0094e79dbc7528d8 100644
--- a/src/killer_sokoban/Main.java
+++ b/src/killer_sokoban/Main.java
@@ -1,620 +1,185 @@
 package killer_sokoban;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Scanner;
+
 public class Main {
 	
 	private static HashMap<String, AbstractField> map = new HashMap<>(); //itt tároljuk a pályán lévő mezőket név (pl. "f_2_4") és referencia szerint
 	private static HashMap<String, Worker> workers = new HashMap<>(); //a munkások
 	private static HashMap<String, Crate> crates = new HashMap<>(); //a ládák - azért szedtem így külön mindent, hogy a játék vége detektálásánál végig lehessen kérdezgetni csak a ládákat - comment by SF
-
-	public static void main(String[] args) {
-		
-		Scanner sc = new Scanner(System.in);
-		int esetszam;
+	private static boolean gameRunning;
+	
+	public static void main(String[] args) throws IOException {
+		System.out.println("Üdv a protóban! Kilépés EOF-fal\n\n");
 		
-		System.out.println("Üdv a tesztprogramunkban! Kilépés '0'-val\n\n");
+		InputStreamReader isr =	new InputStreamReader(System.in);
+		BufferedReader br = new BufferedReader(isr);
 		
-		do {
-			System.out.println("Melyik tesztesetet szeretnéd futtatni?\n\n"
-					+ "1. Worker pushes Worker into Wall\n"
-					+ "2. Worker steps on Wall\n"
-					+ "3. Worker steps on SimpleField\n"
-					+ "4. Worker steps on TargetField\n"
-					+ "5. Worker steps on SwitchField\n"
-					+ "6. Worker steps on Hole\n"
-					+ "7. Worker steps on SwitchableHole\n"
-					+ "8. Worker tries to push crate on Wall\n"
-					+ "9. Worker tries to push crate on SimpleField\n"
-					+ "10. Worker tries to push crate on TargetField\n"
-					+ "11. Worker tries to push crate on SwitchField\n"
-					+ "12. Worker tries to push crate on Hole\n"
-					+ "13. Worker tries to push crate on SwitchableHole\n"
-					+ "14. Worker pushes worker\n"
-					+ "15. Worker pushes crate which pushes worker\n"
-					+ "16. Worker pushes crate which pushes crate\n"
-					+ "17. Worker pushes crate off TargetField\n"
-					+ "18. Worker pushes crate off SwitchField\n"
-					+ "19. Worker tries to push worker which pushes worker on Wall\n"
-					+ "---\n"
-					+ "0. Kilépés");	//A kirajzolt menü
-			esetszam=sc.nextInt()%20;	//Választás beolvasása
-			
-			Logger.disable();			//A logolás letiltása a pálya felépítésének idejére
+		while (true) {
+			String line;
+			line = br.readLine();
+
+			if (line == null) break;
 			
-			switch(esetszam) {			//A válasznak megfelelő eset indítása
-			case 0: continue;
-			case 1: workerPushesWorkerIntoWall();
-				break;
-			case 2: workerStepsOnWall();
-				break;
-			case 3: workerStepsOnSimpleField();
-				break;
-			case 4: workerStepsOnTargetField();
-				break;
-			case 5: workerStepsOnSwitchField();
-				break;
-			case 6: workerStepsOnHole();
-				break;
-			case 7: workerStepsOnSwitchableHole();
-				break;
-			case 8: workerTriesToPushCrateOnWall();
-				break;
-			case 9: workerTriesToPushCrateOnSimpleField();
-				break;
-			case 10: workerTriesToPushCrateOnTargetField();
-				break;
-			case 11: workerTriesToPushCrateOnSwitchField();
-				break;
-			case 12: workerTriesToPushCrateOnHole();
-				break;
-			case 13: workerTriesToPushCrateOnSwitchableHole();
-				break;
-			case 14: workerPushesWorker();
-				break;
-			case 15: workerPushesCrateWhichPushesWorker();
-				break;
-			case 16: workerPushesCrateWhichPushesCrate();
-				break;
-			case 17: workerPushesCrateOffTargetField();
-				break;
-			case 18: workerPushesCrateOffSwitchField();
-				break;
-			case 19: workerTriesToPushWorkerWhichPushesWorkerOnWall();
-				break;
-			}
-			System.out.println("Teszteset vége. A folytatáshoz írj be valamit!");
-			if(sc.next().equals("0")) esetszam=0;
-		}while(esetszam!=0);
-		sc.close();
+			runCommand(line);			
+		}
 		System.out.println("Viszlát!");
-		//workerTriesToPushWorkerWhichPushesWorkerOnWall();
 	}
 	
-	//Kész
-	//1.
-	public static void workerPushesWorkerIntoWall() {
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new Wall();
-		
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable w2=new Worker();
-		f1.accept(null, null, w);
-		f2.accept(null, null, w2);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(w2, "w2");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
-		}
-	
-	//2.
-	public static void workerStepsOnWall(){
-		//MiniMap
-		AbstractField f1, f2;
-		f1=new SimpleField();
-		f2=new Wall();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		f1.accept(null, null, w);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(w, "w");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
-		}
 	
-	//3.
-	public static void workerStepsOnSimpleField(){
-		//MiniMap
-		AbstractField f1, f2;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		f1.accept(null, null, w);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(w, "w");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	public static String getFieldName(AbstractField field)
+	{
+		return getKeyByValue(map, field);
 	}
 	
-	//4.
-	public static void workerStepsOnTargetField(){
-		//MiniMap
-		AbstractField f1, f2;
-		f1=new SimpleField();
-		f2=new TargetField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		f1.accept(null, null, w);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(w, "w");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	public static String getMoveableName(Moveable m)
+	{		
+		if (m instanceof Crate) //Jobb ötlete valakinek?
+		{
+			return getKeyByValue(crates, (Crate) m);
+		}
+		else
+		{
+			return getKeyByValue(workers, (Worker) m);
+		}
 	}
 	
-	//5.
-	public static void workerStepsOnSwitchField(){
-		//MiniMap
-		AbstractField f1, f2;
-		f1=new SimpleField();
-		f2=new SwitchField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		f1.accept(null, null, w);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(w, "w");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	public static void deleteWorker(Worker w)
+	{
+		workers.remove(getKeyByValue(workers, w));
 	}
 	
-	//6.
-	public static void workerStepsOnHole(){
-		//MiniMap
-		AbstractField f1, f2;
-		f1=new SimpleField();
-		f2=new Hole();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		f1.accept(null, null, w);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(w, "w");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	public static void deleteCrate(Crate c)
+	{
+		crates.remove(getKeyByValue(crates, c));
 	}
 	
-	//7.
-	public static void workerStepsOnSwitchableHole(){
-		//MiniMap
-		AbstractField f1, f2;
-		f1=new SimpleField();
-		f2=new SwitchableHole();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		f1.accept(null, null, w);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(w, "w");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
-	}
-	//8.
-	public static void workerTriesToPushCrateOnWall(){
-			//MiniMap
-			AbstractField f1, f2, f3;
-			f1=new SimpleField();
-			f2=new SimpleField();
-			f3=new Wall();
-			f1.setNeighbour(Direction.RIGHT, f2);
-			f2.setNeighbour(Direction.RIGHT, f3);
-			
-			//Create'n'Place
-			Worker w=new Worker();
-			Moveable m=new Crate();
-			f1.accept(null, null, w);
-			f2.accept(null, null, m);
-			
-			//Register4Logger
-			Logger.enable();
-			Logger.register(f1, "f1");
-			Logger.register(f2, "f2");
-			Logger.register(f3, "f3");
-			Logger.register(w, "w");
-			Logger.register(m, "m");
-			
-			//Stepping
-			w.step(Direction.RIGHT);
+	private static void endGame()
+	{
+		for (Entry<String, Worker> e : workers.entrySet())
+		{
+			System.out.println(e.getKey() + ": " + e.getValue());
 		}
-	//9.
-	public static void workerTriesToPushCrateOnSimpleField(){
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new SimpleField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable m=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, null, m);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(m, "m");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
-	}
-
-	//10.
-	public static void workerTriesToPushCrateOnTargetField(){
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new TargetField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable m=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, null, m);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(m, "m");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+		gameRunning=false;
 	}
-	
-	//11.
-	public static void workerTriesToPushCrateOnSwitchField()
+	private static void runCommand(String cmdline)
 	{
+		//Parancs részekgre tördelése
+		String cmd[];
+		cmd = cmdline.split(" ");
 		
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new SwitchField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable c=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, null, c);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(c, "c");
 		
+		//Parancs értelmezés, és a szükséges függvény meghívása
+		if (cmd[0].equals("parseMap")) {			
+			parseMap(Integer.parseInt(cmd[1]), Integer.parseInt(cmd[2]));
+		}
+		else if (cmd[0].equals("worker")) {
+			spawnWorker(cmd[1],Double.parseDouble(cmd[2]),cmd[3]);
+		}
+		else if (cmd[0].equals("crate")) {
+			spawnCrate(cmd[1],cmd[2]);
+		}
+		else if (cmd[0].equals("setswitch")) {
+			setSwitch(cmd[1], cmd[2]);
+		}
+		else if (cmd[0].equals("putfluid")) {
+			putFluid(cmd[1], cmd[2].charAt(0));
+		}
+		else if (cmd[0].equals("step")) {
+			step(cmd[1],cmd[2]);
+		}
+		else if (cmd[0].equals("stat")) {
+			stat(cmd[1]);
+		}
+		else if (cmd[0].equals("script")) {
+			stat(cmd[1]);
+		}
+		else 
+		{
+			System.out.println("érvénytelen parancs");
+		}
 		
-		//Stepping
-		w.step(Direction.RIGHT);
 	}
 	
-	//12.
-	public static void workerTriesToPushCrateOnHole(){
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new Hole();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable m=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, null, m);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(m, "m");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	private static void parseMap(int parseInt, int parseInt2) {
+		// TODO implement
+		throw new UnsupportedOperationException("Not implemented yet");
 	}
-		
-	//13.
-	public static void workerTriesToPushCrateOnSwitchableHole()
+	
+	private static void spawnWorker(String name, double force, String field)
 	{
-		
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new SwitchableHole();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable c=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, null, c);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(c, "c");
-		
-		
-		//Stepping
-		w.step(Direction.RIGHT);
-	}
-
-	//14.
-	public static void workerPushesWorker(){
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new SimpleField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable m=new Worker();
-		f1.accept(null, null, w);
-		f2.accept(null, null, m);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(m, "m");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+		Worker w=new Worker(force);
+		workers.put(name, w);
+		AbstractField f=map.get(field);
+		f.accept(Direction.RIGHT, w, w);
 	}
-	//15.
-	public static void workerPushesCrateWhichPushesWorker(){
-		//MiniMap
-		AbstractField f1, f2, f3, f4;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new SimpleField();
-		f4=new SimpleField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		f3.setNeighbour(Direction.RIGHT, f4);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable c= new Crate();
-		Moveable w3=new Worker();
-		f1.accept(null, null, w);
-		f2.accept(null, null, c);
-		f3.accept(null, null, w3);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(f4, "f4");
-		Logger.register(w, "w");
-		Logger.register(c, "c");
-		Logger.register(w3, "w3");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	
+	private static void spawnCrate(String name, String field)
+	{
+		Crate c=new Crate();
+		crates.put(name, c);
+		AbstractField f=map.get(field);
+		f.accept(Direction.RIGHT, new Worker(0), c);
 	}
 	
-	//16.
-	public static void workerPushesCrateWhichPushesCrate() {
-		//MiniMap
-		AbstractField f1, f2, f3, f4;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new SimpleField();
-		f4=new SimpleField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		f3.setNeighbour(Direction.RIGHT, f4);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable c2= new Crate();
-		Moveable c3=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, null, c2);
-		f3.accept(null, null, c3);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(f4, "f4");
-		Logger.register(w, "w");
-		Logger.register(c2, "c2");
-		Logger.register(c3, "c3");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	private static void setSwitch(String shole, String mySwitch)
+	{
+		((SwitchField) map.get(mySwitch)).setSHole((SwitchableHole) map.get(shole));
 	}
-	//17.
-	public static void workerPushesCrateOffTargetField(){
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new TargetField();
-		f3=new SimpleField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable m=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, w, m); //meg kell adni a workert, mert különben NullPointerException lép fel, amikor a Crate::stepOnTarget meghívja a w.incrementPoint()-ot; ez végül is bug, de nem javítandó, mert a végleges programban úgysem célmezőre kerülnek inicializáláskor a ládák - comment by SF
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(m, "m");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	
+	private static void putFluid(String field, char fluid)
+	{
+		SimpleField sf=((SimpleField) map.get(field));
+		if (fluid=='h')
+			sf.putHoney();
+		else if (fluid=='o')
+			sf.putHoney();
+		else
+			System.out.println("you can only choose either 'h' or 'o'");
 	}
-	//18.
-	public static void workerPushesCrateOffSwitchField(){
-		//MiniMap
-		AbstractField f1, f2, f3;
-		f1=new SimpleField();
-		f2=new SwitchField();
-		f3=new SimpleField();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable m=new Crate();
-		f1.accept(null, null, w);
-		f2.accept(null, null, m);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(m, "m");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+	
+	private static void step(String worker, String toward)
+	{
+		Worker w= (Worker) workers.get(worker);
+		w.step(Direction.fromString(toward));
 	}
 	
-	//19.
-	public static void workerTriesToPushWorkerWhichPushesWorkerOnWall()
+	private static void stat(String object)
 	{
-		//MiniMap
-		AbstractField f1, f2, f3, f4;
-		f1=new SimpleField();
-		f2=new SimpleField();
-		f3=new SimpleField();
-		f4=new Wall();
-		f1.setNeighbour(Direction.RIGHT, f2);
-		f2.setNeighbour(Direction.RIGHT, f3);
-		f3.setNeighbour(Direction.RIGHT, f4);
-		
-		//Create'n'Place
-		Worker w=new Worker();
-		Moveable w2=new Worker();
-		Moveable w3=new Worker();
-		f1.accept(null, null, w);
-		f2.accept(null, null, w2);
-		f3.accept(null, null, w3);
-		
-		//Register4Logger
-		Logger.enable();
-		Logger.register(f1, "f1");
-		Logger.register(f2, "f2");
-		Logger.register(f4, "f4");
-		Logger.register(f3, "f3");
-		Logger.register(w, "w");
-		Logger.register(w2, "w2");
-		Logger.register(w3, "w3");
-		
-		//Stepping
-		w.step(Direction.RIGHT);
+		if (map.containsKey(object))
+		{
+//			map.get(object).printStat();
+		}
+		else if (workers.containsKey(object))
+		{
+//			workers.get(object).printStat();
+		}
+		else if (crates.containsKey(object))
+		{
+//			crates.get(object).printStat();
+		}
 	}
 	
+	private static void script(String file)
+	{
+		// TODO implement
+		throw new UnsupportedOperationException("Not implemented yet");
+	}
 	
+	//code copied from StackOverFlow
+	private static <T, E> T getKeyByValue(Map<T, E> map, E value) {
+	    for (Entry<T, E> entry : map.entrySet()) {
+	        if (Objects.equals(value, entry.getValue())) {
+	            return entry.getKey();
+	        }
+	    }
+	    return null;
+	}
 
 }