From db1b94581533d3b4ed5ba0f9b82627bfd714ae59 Mon Sep 17 00:00:00 2001 From: Tony Grosinger Date: Mon, 25 Apr 2011 20:02:34 -0700 Subject: [PATCH] Added new mapping feature. Will now create a directory and output generated map files every turn. Will probably add a way to change the frequency these are generated. Signed-off-by: Tony Grosinger --- bin/net/grosinger/nomads/DroneTools.class | Bin 3040 -> 3040 bytes bin/net/grosinger/nomads/InitializeGame.class | Bin 4147 -> 4563 bytes bin/net/grosinger/nomads/Nomads.class | Bin 3698 -> 3782 bytes bin/net/grosinger/nomads/World.class | Bin 2823 -> 6205 bytes src/net/grosinger/nomads/DroneListItem.java | 2 +- src/net/grosinger/nomads/DroneTeam.java | 4 +- src/net/grosinger/nomads/DroneTools.java | 5 + src/net/grosinger/nomads/InitializeGame.java | 22 +++- src/net/grosinger/nomads/Nomads.java | 6 ++ src/net/grosinger/nomads/World.java | 94 +++++++++++++++++- 10 files changed, 124 insertions(+), 9 deletions(-) diff --git a/bin/net/grosinger/nomads/DroneTools.class b/bin/net/grosinger/nomads/DroneTools.class index 6be4f111c56f9797ddf17871c4bc96ae1cf65582..18740a292f4a8e9c831ffe1d9f14c53452f346cc 100644 GIT binary patch delta 69 zcmaDL{y=;KAGc)*0|!GXg8)MrgE&JugFHh8Lm)#HLli?bLjgk#kXOr4&rrwE1|%0S UG%zd&s@VWkyMv*1vOD)o05#4LF8}}l delta 69 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 diff --git a/bin/net/grosinger/nomads/World.class b/bin/net/grosinger/nomads/World.class index 4416603cbb2a644d56a384d9ba9d7b4ef097d9fd..74072dd47ebd624187fa28ec0fbfaa7176553c46 100644 GIT binary patch literal 6205 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 delta 223 zcmWNKKTAS!7)H%<7N zN0c}RB;?Pz@l#6EY>;7#Q(ewDA}f_p%UsAJlrv@7aZBb}YHr@H5#Ub7ZZlZNint new X location */ public void setX(int newX) { diff --git a/src/net/grosinger/nomads/DroneTeam.java b/src/net/grosinger/nomads/DroneTeam.java index 9a2457d..a816847 100644 --- a/src/net/grosinger/nomads/DroneTeam.java +++ b/src/net/grosinger/nomads/DroneTeam.java @@ -30,7 +30,7 @@ public class DroneTeam { /** * Class Constructor * - * @param firstDrone + * @param firstList * DroneListItem that will be the first Drone */ public DroneTeam(DroneListItem firstList) { @@ -105,7 +105,7 @@ public class DroneTeam { /** * Sets the last DroneListItem to that provided * - * @param theFirst + * @param theLast * DroneListItem to be made last */ public void setLast(DroneListItem theLast) { diff --git a/src/net/grosinger/nomads/DroneTools.java b/src/net/grosinger/nomads/DroneTools.java index 5620b15..51a8028 100644 --- a/src/net/grosinger/nomads/DroneTools.java +++ b/src/net/grosinger/nomads/DroneTools.java @@ -107,6 +107,11 @@ public class DroneTools { return worldReference.inSafeZone(getX(), getY()); } + /** + * Retrieve a list of all Drones that are visible within your sight range. (Sight range can be upgraded) + * + * @return ArrayList of Neighbors + */ public ArrayList checkRadar(){ ArrayList neighbors = new ArrayList(); int maxDistance = listItem.getVisibleDistance(); diff --git a/src/net/grosinger/nomads/InitializeGame.java b/src/net/grosinger/nomads/InitializeGame.java index a4b9def..3bad486 100644 --- a/src/net/grosinger/nomads/InitializeGame.java +++ b/src/net/grosinger/nomads/InitializeGame.java @@ -2,8 +2,10 @@ package net.grosinger.nomads; import java.io.File; import java.io.IOException; +import java.math.BigInteger; import java.net.URL; import java.net.URLClassLoader; +import java.security.SecureRandom; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -34,7 +36,7 @@ public class InitializeGame { // Obtain a list of the classes that exist in the directory String[] classesToLoad = generateList(); - if(classesToLoad.length == 0){ + if (classesToLoad.length == 0) { System.out.println("No Drones to load"); Nomads.running = false; } @@ -66,10 +68,12 @@ public class InitializeGame { // Create new GameObject // TODO - This will break if it loads a class from a jar // that does not extend Drone - GameObject newDrone = (GameObject) c.newInstance(); - newDrone.setName(className); + GameObject newGameObject = (GameObject) c.newInstance(); + newGameObject.setName(className); + Drone newDrone = (Drone) newGameObject; + newDrone.setUID(generateUID()); - createNewDrone(newDrone); + createNewDrone(newGameObject); System.out.println("Class loaded sucessfully"); } catch (Exception e) { @@ -119,6 +123,16 @@ public class InitializeGame { } } + /** + * Creates a unique identifier for each drone that is loaded + * + * @return String- UID + */ + private static String generateUID() { + SecureRandom random = new SecureRandom(); + return new BigInteger(130, random).toString(32); + } + /** * Generates and places required buildings in the world * diff --git a/src/net/grosinger/nomads/Nomads.java b/src/net/grosinger/nomads/Nomads.java index da8afea..7aa3a30 100644 --- a/src/net/grosinger/nomads/Nomads.java +++ b/src/net/grosinger/nomads/Nomads.java @@ -63,8 +63,12 @@ public class Nomads { if (DEBUGSTATUS) System.out.println("Game loop starting..."); + int turn = 0; + while (running) { + turn++; + long startTime = System.currentTimeMillis(); for (DroneTeam currentTeam : allTeams) { @@ -76,6 +80,8 @@ public class Nomads { if (DEBUGSTATUS) System.out.println("Moves took " + (endTime - startTime) + "milliseconds"); + awesomeWorld.generateMap(turn); + try { Thread.sleep(200); } catch (InterruptedException e) { diff --git a/src/net/grosinger/nomads/World.java b/src/net/grosinger/nomads/World.java index e19e511..e97fd7b 100644 --- a/src/net/grosinger/nomads/World.java +++ b/src/net/grosinger/nomads/World.java @@ -1,5 +1,14 @@ package net.grosinger.nomads; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + /** * Main class where information about the world is stored * @@ -134,6 +143,15 @@ public class World { setObjectAt(lastUsedX, 20, newDrone.getCurrent()); } + /** + * Returns if the Drone at given coordinates is in a safe zone + * + * @param x + * - Specified X value + * @param y + * - Specified Y value + * @return boolean + */ public boolean inSafeZone(int x, int y) { /* * Safe Zones - Measured in radius of a square TownHall - 3 : RepairShop @@ -143,8 +161,8 @@ public class World { // Maximum distance away a building that provides a safehouse is 3 for (int i = -3; i <= 3; i++) { for (int j = -3; j <= 3; j++) { - //Prevent OutofBounds. Indexes = - WORLDSIZE-1 - if (x + i >= WORLDSIZE-1 || x + i < 0 || y + j >= WORLDSIZE-1 || y + j < 0) { + // Prevent OutofBounds. Indexes = - WORLDSIZE-1 + if (x + i >= WORLDSIZE - 1 || x + i < 0 || y + j >= WORLDSIZE - 1 || y + j < 0) { } else if (i != 0 && j != 0) { GameObject objectHere = theWorld[x + i][y + j]; @@ -162,4 +180,76 @@ public class World { } return false; } + + /** + * Outputs an HTML file showing the world + */ + public void generateMap(int turn) { + ArrayList allColors = new ArrayList(); + addColors(allColors); + Map colorMap = new HashMap(); + int counter = 0; + + // Create the color map + for (DroneTeam team : Nomads.allTeams) { + String name = team.getName(); + Color color = null; + if (counter <= 8) + color = allColors.get(counter); + colorMap.put(name, color); + counter++; + } + + new File("maps").mkdir(); + BufferedImage image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = image.createGraphics(); + + g2d.setColor(Color.white); + g2d.fillRect(0, 0, 1000, 1000); + + // draw grid lines + g2d.setColor(Color.black); + for (int i = 10; i <= 1000; i += 100) { + g2d.drawLine(i, 0, i, 1000); + g2d.drawLine(0, i, 1000, i); + } + for (int i = 0; i < WORLDSIZE; i++) { + for (int j = 0; j < WORLDSIZE; j++) { + GameObject objectHere = theWorld[j][i]; + if (objectHere == null) { + // Do nothing + } else if (objectHere instanceof Drone) { + String name = objectHere.getName(); + Color color = colorMap.get(name); + g2d.setColor(color); + g2d.fillOval(j * 10, i * 10, 10, 10); + } else if (objectHere instanceof Building) { + // TODO - output for buildings + } + } + } + writeImage(image, "maps/Map-Turn" + turn); + // g2d.dispose(); + } + + private void addColors(ArrayList allColors) { + allColors.add(Color.blue); + allColors.add(Color.orange); + allColors.add(Color.red); + allColors.add(Color.green); + allColors.add(Color.darkGray); + allColors.add(Color.yellow); + allColors.add(Color.cyan); + allColors.add(Color.magenta); + } + + private void writeImage(BufferedImage image, String fileName) { + try { + String ext = "png"; // bmp, gif, png, jpg okay + File file = new File(fileName + "." + ext); + javax.imageio.ImageIO.write(image, ext, file); + } catch (IOException e) { + System.out.println("write error: " + e.getMessage()); + } + } }