From 9990a184f296dc61643da9b3fad9fd6e55699d5f Mon Sep 17 00:00:00 2001
From: Tamas Bunth <btomi96@gmail.com>
Date: Sun, 15 May 2016 14:14:32 +0200
Subject: [PATCH] implement zpm spawn

---
 core/app/Controller.java         |  1 -
 core/app/GameController.java     | 63 ++++++++++++++++++++++++++++----
 core/game/Model.java             |  6 ++-
 core/mapobjs/defobjs/Portal.java |  1 -
 4 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/core/app/Controller.java b/core/app/Controller.java
index 53d94fa..5997a9f 100644
--- a/core/app/Controller.java
+++ b/core/app/Controller.java
@@ -72,7 +72,6 @@ public class Controller {
 		}
 	}
 
-	// TODO: Nincs játék vége lekezelve
 	/**
 	 * Start the game with the given beginning parameters
 	 *
diff --git a/core/app/GameController.java b/core/app/GameController.java
index ef18b70..07334ff 100644
--- a/core/app/GameController.java
+++ b/core/app/GameController.java
@@ -4,6 +4,7 @@ import java.awt.event.KeyEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
+import java.util.Random;
 
 import exceptions.GameRunningException;
 import game.Direction;
@@ -12,6 +13,7 @@ import game.PortalColor;
 import mapobjs.defobjs.DefaultElement;
 import mapobjs.defobjs.Field;
 import mapobjs.defobjs.IElement;
+import mapobjs.defobjs.ZPM;
 import mapobjs.movobjs.Player;
 import view.View;
 import view.ViewElement;
@@ -46,6 +48,8 @@ public class GameController implements PropertyChangeListener{
 		Integer tmpColonelLives = Model.getInstance().getColonel().getPlayerLives();
 		Integer tmpJaffaLives = Model.getInstance().getJaffa().getPlayerLives();
 
+		int takenUpZPMCountInOneTurn = 0;
+
 		while(true)
 		{
 			try {
@@ -210,7 +214,8 @@ public class GameController implements PropertyChangeListener{
 					break;
 				}
 
-				updateZPMCount( rZPMCount, prevColonelZpm, prevJaffaZpm );
+				takenUpZPMCountInOneTurn += updateZPMCount( rZPMCount, prevColonelZpm, prevJaffaZpm );
+				takenUpZPMCountInOneTurn = invokeZPMSpawn(takenUpZPMCountInOneTurn);
 			} // end of if key pressed
 
 		} // end of while
@@ -220,6 +225,45 @@ public class GameController implements PropertyChangeListener{
 		return;	// Map finished
 	}
 
+	/**
+	 * Checks if a new ZPM should be spawned.
+	 * If so, than it creates a zpm in a random empty Field
+	 * @param zpms zpm's taken up since the last spawn
+	 * @return zpm's tanken up since the last spawn
+	 */
+	private int invokeZPMSpawn(int zpms) {
+		if(zpms > 1) {
+			randomZPMSpawn();
+			return 0;
+		}
+		return zpms;
+	}
+
+	/**
+	 * Searches for an empty field and inserts a zpm
+	 */
+	private void randomZPMSpawn() {
+		boolean ready = false;
+		ArrayList<Field> map = Model.getInstance().getMap();
+
+
+		Random rand = new Random();
+		while( !ready ) {
+			// TODO not works
+			int randNum = rand.nextInt(map.size());
+			if(map.get(randNum).getElementNum() == 0) {
+
+				System.out.println("new zpm at: " + randNum);
+				Field chosedField = map.get(randNum);
+				ZPM zpm = new ZPM(chosedField);
+				chosedField.addElement(zpm);
+				chosedField.addToInsert(zpm);
+				ready = true;
+			}
+		}
+
+	}
+
 	private void updateViewToolbar(Integer beforeColonelLives, Integer beforeJaffaLives)
 	{
 		int afterColonelLives = Model.getInstance().getColonel().getPlayerLives();
@@ -280,14 +324,20 @@ public class GameController implements PropertyChangeListener{
 	 * @param prevColonelZpm the previous ZPM count of
 	 *  the colonel on the current map
 	 */
-	private void updateZPMCount( int[] rZPMCount, int prevColonelZpm, int prevJaffaZpm)
+	private int updateZPMCount( int[] rZPMCount, int prevColonelZpm, int prevJaffaZpm)
 	{
 		if( rZPMCount == null)
 			rZPMCount = new int[] {0, 0};
 
+		int colonelZPMChange = Model.getInstance().getColonel().getZpmCount() - prevColonelZpm;
+		int jaffaZPMChange = Model.getInstance().getJaffa().getZpmCount() - prevJaffaZpm;
+
 		// update global ZPM counts
-		rZPMCount[0] += Model.getInstance().getColonel().getZpmCount() - prevColonelZpm;
-		rZPMCount[1] += Model.getInstance().getJaffa().getZpmCount() - prevJaffaZpm;
+		rZPMCount[0] += colonelZPMChange;
+		rZPMCount[1] += jaffaZPMChange;
+
+		int returnValue = colonelZPMChange + jaffaZPMChange;
+
 
 		// update previous values of ZPM's on the current map
 		prevColonelZpm = Model.getInstance().getColonel().getZpmCount();
@@ -295,6 +345,8 @@ public class GameController implements PropertyChangeListener{
 
 		this.view.setColonelZPMDisplayed(rZPMCount[0]);
 		this.view.setJaffaZPMDisplayed(rZPMCount[1]);
+
+		return returnValue;
 	}
 
 	@Override
@@ -309,9 +361,6 @@ public class GameController implements PropertyChangeListener{
 			return;
 		}
 
-		// TODO coord is wrong (122 for me) for the second map
-		// indexOutOfBoundsException
-
 		// update only the changed fields
 		int coord = (int)evt.getNewValue();
 		int xCoord = coord / map[0].length;
diff --git a/core/game/Model.java b/core/game/Model.java
index 21f622f..b8c276e 100644
--- a/core/game/Model.java
+++ b/core/game/Model.java
@@ -50,7 +50,7 @@ public class Model implements PropertyChangeListener
 			propSupp.addPropertyChangeListener(listener);
 		}
 	}
-	
+
 	public void removePropertyChangeListener(PropertyChangeListener listener)
 	{
 		if(listener != null)
@@ -81,6 +81,10 @@ public class Model implements PropertyChangeListener
 		return map.get((num-1));
 	}
 
+	public ArrayList<Field> getMap() {
+		return map;
+	}
+
 	public void resetMapReq()
 	{
 		isMapFinished = true;
diff --git a/core/mapobjs/defobjs/Portal.java b/core/mapobjs/defobjs/Portal.java
index 80a7b93..f5867d5 100644
--- a/core/mapobjs/defobjs/Portal.java
+++ b/core/mapobjs/defobjs/Portal.java
@@ -24,7 +24,6 @@ public class Portal extends DefaultElement {
 	public boolean setOtherSide(Portal otherSide) {
 		if(PortalColor.convertToInverse(otherSide.getColor()).equals(this.color))
 		{
-			System.out.println("setOtherSide");
 			this.otherSide = otherSide;
 			otherSide.bindFieldsAsOtherSide(this);
 
-- 
GitLab