diff options
-rw-r--r-- | src/com/fourisland/frigidearth/MapViewGameState.java | 147 |
1 files changed, 142 insertions, 5 deletions
diff --git a/src/com/fourisland/frigidearth/MapViewGameState.java b/src/com/fourisland/frigidearth/MapViewGameState.java index e0cc8cb..bcac17d 100644 --- a/src/com/fourisland/frigidearth/MapViewGameState.java +++ b/src/com/fourisland/frigidearth/MapViewGameState.java | |||
@@ -9,6 +9,7 @@ import com.fourisland.frigidearth.mobs.Rat; | |||
9 | import java.awt.Color; | 9 | import java.awt.Color; |
10 | import java.awt.Graphics2D; | 10 | import java.awt.Graphics2D; |
11 | import java.awt.Point; | 11 | import java.awt.Point; |
12 | import java.awt.Rectangle; | ||
12 | import java.awt.event.KeyEvent; | 13 | import java.awt.event.KeyEvent; |
13 | import java.util.ArrayList; | 14 | import java.util.ArrayList; |
14 | import java.util.Collections; | 15 | import java.util.Collections; |
@@ -65,7 +66,28 @@ public class MapViewGameState implements GameState | |||
65 | } | 66 | } |
66 | } | 67 | } |
67 | 68 | ||
68 | makeRoom(MAP_WIDTH/2, MAP_HEIGHT/2, Direction.getRandomDirection()); | 69 | Direction keyRoomDirection = Direction.getRandomDirection(); |
70 | Rectangle legalBounds = null; | ||
71 | switch (keyRoomDirection) | ||
72 | { | ||
73 | case North: | ||
74 | legalBounds = new Rectangle(0, 14, MAP_WIDTH, MAP_HEIGHT-14); | ||
75 | break; | ||
76 | |||
77 | case East: | ||
78 | legalBounds = new Rectangle(0, 0, MAP_WIDTH-14, MAP_HEIGHT); | ||
79 | break; | ||
80 | |||
81 | case South: | ||
82 | legalBounds = new Rectangle(0, 0, MAP_WIDTH, MAP_HEIGHT-14); | ||
83 | break; | ||
84 | |||
85 | case West: | ||
86 | legalBounds = new Rectangle(14, 0, MAP_WIDTH-14, MAP_HEIGHT); | ||
87 | break; | ||
88 | } | ||
89 | |||
90 | makeRoom(MAP_WIDTH/2, MAP_HEIGHT/2, Direction.getRandomDirection(), legalBounds); | ||
69 | 91 | ||
70 | int currentFeatures = 1; | 92 | int currentFeatures = 1; |
71 | int objects = 300; | 93 | int objects = 300; |
@@ -140,7 +162,7 @@ public class MapViewGameState implements GameState | |||
140 | { | 162 | { |
141 | if (Functions.random(0, 100) <= 75) | 163 | if (Functions.random(0, 100) <= 75) |
142 | { | 164 | { |
143 | if (makeRoom(newx+xmod, newy+ymod, validTile)) | 165 | if (makeRoom(newx+xmod, newy+ymod, validTile, legalBounds)) |
144 | { | 166 | { |
145 | currentFeatures++; | 167 | currentFeatures++; |
146 | grid[newx][newy] = Tile.Door; | 168 | grid[newx][newy] = Tile.Door; |
@@ -200,17 +222,132 @@ public class MapViewGameState implements GameState | |||
200 | } | 222 | } |
201 | } | 223 | } |
202 | 224 | ||
225 | // Create key room | ||
226 | Room oRoom = null; | ||
227 | for (Room r : rooms) | ||
228 | { | ||
229 | if (oRoom == null) | ||
230 | { | ||
231 | oRoom = r; | ||
232 | } else if ((keyRoomDirection == Direction.North) && (r.getY() < oRoom.getY())) | ||
233 | { | ||
234 | oRoom = r; | ||
235 | } else if ((keyRoomDirection == Direction.East) && (r.getX() > oRoom.getX())) | ||
236 | { | ||
237 | oRoom = r; | ||
238 | } else if ((keyRoomDirection == Direction.South) && (r.getY() > oRoom.getY())) | ||
239 | { | ||
240 | oRoom = r; | ||
241 | } else if ((keyRoomDirection == Direction.West) && (r.getX() < oRoom.getX())) | ||
242 | { | ||
243 | oRoom = r; | ||
244 | } | ||
245 | } | ||
246 | |||
247 | Room room = null; | ||
248 | switch (keyRoomDirection) | ||
249 | { | ||
250 | case North: | ||
251 | room = new Room(oRoom.getX()+oRoom.getWidth()/2-3, oRoom.getY()-13, 7, 13, false); | ||
252 | break; | ||
253 | |||
254 | case East: | ||
255 | room = new Room(oRoom.getX()+oRoom.getWidth(), oRoom.getY()+oRoom.getHeight()/2-3, 13, 7, false); | ||
256 | break; | ||
257 | |||
258 | case South: | ||
259 | room = new Room(oRoom.getX()+oRoom.getWidth()/2-3, oRoom.getY()+oRoom.getHeight(), 7, 13, false); | ||
260 | break; | ||
261 | |||
262 | case West: | ||
263 | room = new Room(oRoom.getX()-13, oRoom.getY()+oRoom.getHeight()/2-3, 13, 7, false); | ||
264 | break; | ||
265 | } | ||
266 | |||
267 | for (int ytemp=room.getY(); ytemp < room.getY()+room.getHeight(); ytemp++) | ||
268 | { | ||
269 | for (int xtemp=room.getX(); xtemp < room.getX()+room.getWidth(); xtemp++) | ||
270 | { | ||
271 | if (xtemp == room.getX()) | ||
272 | { | ||
273 | if (((keyRoomDirection == Direction.North) || (keyRoomDirection == Direction.South)) && (ytemp % 2 == 0) && (ytemp != room.getY())) | ||
274 | { | ||
275 | grid[xtemp][ytemp] = Tile.Window; | ||
276 | } else { | ||
277 | grid[xtemp][ytemp] = Tile.DirtWall; | ||
278 | } | ||
279 | } else if (xtemp == room.getX()+room.getWidth()-1) | ||
280 | { | ||
281 | if (((keyRoomDirection == Direction.North) || (keyRoomDirection == Direction.South)) && (ytemp % 2 == 0) && (ytemp != (room.getY()+room.getHeight()))) | ||
282 | { | ||
283 | grid[xtemp][ytemp] = Tile.Window; | ||
284 | } else { | ||
285 | grid[xtemp][ytemp] = Tile.DirtWall; | ||
286 | } | ||
287 | } else if (ytemp == room.getY()) | ||
288 | { | ||
289 | if (((keyRoomDirection == Direction.West) || (keyRoomDirection == Direction.East)) && (xtemp % 2 == 0) && (xtemp != room.getX())) | ||
290 | { | ||
291 | grid[xtemp][ytemp] = Tile.Window; | ||
292 | } else { | ||
293 | grid[xtemp][ytemp] = Tile.DirtWall; | ||
294 | } | ||
295 | } else if (ytemp == room.getY()+room.getHeight()-1) | ||
296 | { | ||
297 | if (((keyRoomDirection == Direction.West) || (keyRoomDirection == Direction.East)) && (xtemp % 2 == 0) && (xtemp != (room.getX()+room.getWidth()))) | ||
298 | { | ||
299 | grid[xtemp][ytemp] = Tile.Window; | ||
300 | } else { | ||
301 | grid[xtemp][ytemp] = Tile.DirtWall; | ||
302 | } | ||
303 | } else { | ||
304 | grid[xtemp][ytemp] = Tile.DirtFloor; | ||
305 | } | ||
306 | } | ||
307 | } | ||
308 | |||
309 | switch (keyRoomDirection) | ||
310 | { | ||
311 | case North: | ||
312 | grid[room.getX()+room.getWidth()/2][room.getY()+room.getHeight()] = Tile.Door; | ||
313 | grid[room.getX()+room.getWidth()/2][room.getY()+room.getHeight()-1] = Tile.DirtFloor; | ||
314 | break; | ||
315 | |||
316 | case East: | ||
317 | grid[room.getX()-1][room.getY()+room.getHeight()/2] = Tile.Door; | ||
318 | grid[room.getX()][room.getY()+room.getHeight()/2] = Tile.DirtFloor; | ||
319 | break; | ||
320 | |||
321 | case South: | ||
322 | grid[room.getX()+room.getWidth()/2][room.getY()-1] = Tile.Door; | ||
323 | grid[room.getX()+room.getWidth()/2][room.getY()] = Tile.DirtFloor; | ||
324 | break; | ||
325 | |||
326 | case West: | ||
327 | grid[room.getX()+room.getWidth()][room.getY()+room.getHeight()/2] = Tile.Door; | ||
328 | grid[room.getX()+room.getWidth()-1][room.getY()+room.getHeight()/2] = Tile.DirtFloor; | ||
329 | break; | ||
330 | } | ||
331 | |||
203 | adjustViewport(); | 332 | adjustViewport(); |
204 | calculateFieldOfView(); | 333 | calculateFieldOfView(); |
205 | } | 334 | } |
206 | 335 | ||
207 | private boolean makeRoom(int x, int y, Direction direction) | 336 | private boolean makeRoom(int x, int y, Direction direction, Rectangle legalBounds) |
208 | { | 337 | { |
209 | int width = Functions.random(MIN_ROOM_WIDTH, MAX_ROOM_WIDTH); | 338 | int width = Functions.random(MIN_ROOM_WIDTH, MAX_ROOM_WIDTH); |
210 | int height = Functions.random(MIN_ROOM_HEIGHT, MAX_ROOM_HEIGHT); | 339 | int height = Functions.random(MIN_ROOM_HEIGHT, MAX_ROOM_HEIGHT); |
211 | Tile floor = Tile.DirtFloor; | 340 | Tile floor = Tile.DirtFloor; |
212 | Tile wall = Tile.DirtWall; | 341 | Tile wall = Tile.DirtWall; |
213 | Room room = null; | 342 | Room room = null; |
343 | Rectangle bounds = null; | ||
344 | |||
345 | if (legalBounds == null) | ||
346 | { | ||
347 | bounds = new Rectangle(0, 0, MAP_WIDTH, MAP_HEIGHT); | ||
348 | } else { | ||
349 | bounds = legalBounds; | ||
350 | } | ||
214 | 351 | ||
215 | switch (direction) | 352 | switch (direction) |
216 | { | 353 | { |
@@ -237,14 +374,14 @@ public class MapViewGameState implements GameState | |||
237 | 374 | ||
238 | for (int ytemp=room.getY(); ytemp < room.getY()+room.getHeight(); ytemp++) | 375 | for (int ytemp=room.getY(); ytemp < room.getY()+room.getHeight(); ytemp++) |
239 | { | 376 | { |
240 | if ((ytemp < 0) || (ytemp > MAP_HEIGHT)) | 377 | if ((ytemp < bounds.y) || (ytemp > bounds.y+bounds.height )) |
241 | { | 378 | { |
242 | return false; | 379 | return false; |
243 | } | 380 | } |
244 | 381 | ||
245 | for (int xtemp=room.getX(); xtemp < room.getX()+room.getWidth(); xtemp++) | 382 | for (int xtemp=room.getX(); xtemp < room.getX()+room.getWidth(); xtemp++) |
246 | { | 383 | { |
247 | if ((xtemp < 0) || (xtemp > MAP_WIDTH)) | 384 | if ((xtemp < bounds.x) || (xtemp > bounds.x+bounds.width)) |
248 | { | 385 | { |
249 | return false; | 386 | return false; |
250 | } | 387 | } |