| @@ -6,7 +6,7 @@ class NodeInterface(gbe.nodes.NodeSurface): | |||
| def __init__(self, name="Interface", parent=None): | |||
| try: | |||
| gbe.nodes.NodeSurface.__init__(self, name, parent) | |||
| except NodeError as e: | |||
| except gbe.nodes.NodeError as e: | |||
| raise e | |||
| def on_render(self): | |||
| @@ -20,8 +20,259 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| def __init__(self, name="GameMap", parent=None): | |||
| try: | |||
| gbe.nodes.Node2D.__init__(self, name, parent) | |||
| except NodeError as e: | |||
| except gbe.nodes.NodeError as e: | |||
| raise e | |||
| self._renderMode = 0 # 0 = Top-down | 1 = Perspective | |||
| self._layer = {} | |||
| self._currentLayer = "" | |||
| self._res = { | |||
| "environment":"", | |||
| "walls":"" | |||
| } | |||
| self._topdown = { | |||
| "size":8, # Pixels square | |||
| "wall_color":pygame.Color(255, 255, 255), | |||
| "blocked_color":pygame.Color(255, 0, 0) | |||
| } | |||
| self._orientation = "n" | |||
| @property | |||
| def environment_resource(self): | |||
| return self._res["horizon"] | |||
| @property | |||
| def wall_resource(self): | |||
| return self._res["walls"] | |||
| @property | |||
| def layer_count(self): | |||
| return len(self._layer) | |||
| @property | |||
| def current_layer(self): | |||
| return self._currentLayer | |||
| @property | |||
| def current_layer_width(self): | |||
| if self._currentLayer != "": | |||
| return self._layer[self._currentLayer]["w"] | |||
| return 0 | |||
| @property | |||
| def current_layer_height(self): | |||
| if self._currentLayer != "": | |||
| return self._layer[self._currentLayer]["h"] | |||
| return 0 | |||
| @property | |||
| def layer_names(self): | |||
| names = [] | |||
| for key in self._layer: | |||
| names.append(names) | |||
| return names | |||
| def set_resources(self, environment, walls): | |||
| res = self.resource | |||
| if environment != self._res["environment"]: | |||
| if res.is_valid("graphic", environment): | |||
| self._res["environment"] = environment | |||
| if walls != self._res["walls"]: | |||
| if res.is_valid("graphic", walls): | |||
| self._res["walls"] = walls | |||
| def add_layer(self, name, w, h): | |||
| if name == "" or name in self._layers: | |||
| return | |||
| self._layer[name] = { | |||
| "w":w, | |||
| "h":h, | |||
| "cells":[] | |||
| } | |||
| for c in range(0, w*h): | |||
| self._layer[name]["cells"][c] = { | |||
| "c":0, # Sky / Ceiling | |||
| "g":0, # Ground | |||
| "n":[-1,False], # North Wall | [<graphic index, -1 = None>, <blocking>] | |||
| "s":[-1,False], # South Wall | |||
| "e":[-1,False], # East Wall | |||
| "w":[-1,False] # West Wall | |||
| } | |||
| if self._currentLayer == "": | |||
| self._currentLayer = name | |||
| def set_cell_env(self, x, y, ceiling=-1, ground=-1): | |||
| if self._currentLayer == "": | |||
| return | |||
| layer = self._layer[self._currentLayer] | |||
| if x >= 0 and x < layer["w"] and y >= 0 and y < layer["h"]: | |||
| index = (y * layer["w"]) + x | |||
| cell = layer["cells"] | |||
| if ceiling >= 0: | |||
| cell[index]["c"] = ceiling | |||
| if ground >= 0: | |||
| cell[index]["g"] = ground | |||
| def fill_cell_env(self, x1, y1, x2, y2, ceiling=-1, ground=-1): | |||
| if self._currentLayer == "": | |||
| return | |||
| for y in range(y1, y2+1): | |||
| for x in range(x1, x2+1): | |||
| self.set_cell_env(x, y, ceiling, ground) | |||
| def set_cell_face(self, x, y, face, gi=-2, blocking=None): | |||
| if self._currentLayer == "" or not (face == "n" or face == "s" or face == "w" or face == "e"): | |||
| return | |||
| layer = self._layer[self._currentLayer] | |||
| if x >= 0 and x < layer["w"] and y >= 0 and y < layer["h"]: | |||
| index = (y * layer["w"]) + x | |||
| cell = layer["cells"] | |||
| if gi >= -1: | |||
| cell[index][face][0] = gi | |||
| if blocking is not None: | |||
| cell[index][face][1] = (blocking == True) | |||
| else: | |||
| if gi == -1: # If gi = -1, there is no wall, so, by default, there is no blocking. | |||
| cell[index][face][1] = False | |||
| else: # Otherwise, blocking is assumed :) | |||
| cell[index][face][1] = True | |||
| elif blocking is not None: | |||
| blocking = (blocking == True) # Forcing a boolean | |||
| cell[index][face][1] = blocking | |||
| def turn_left(self): | |||
| onum = self._d_s2n(self._orientation) | |||
| onum -= 1 | |||
| if onum < 0: | |||
| onum = 3 | |||
| self._orientation = self._d_n2s(onum) | |||
| def turn_right(self): | |||
| onum = self._d_s2n(self._orientation) | |||
| onum += 1 | |||
| if onum > 3: | |||
| onum = 0 | |||
| self._orientation = self._d_n2s(onum) | |||
| def is_passible(self, x, y, d): | |||
| """ | |||
| Returns true if it's possible to move forward from the x, y map position in the direction given. | |||
| d - 0 = North, 1 = East, 2 = South, 3 = West | |||
| """ | |||
| if self._currentLayer == "" or d < 0 or d >= 4: | |||
| return False | |||
| layer = self._layer[self._currentLayer] | |||
| if x >= 0 and x < layer["w"] and y >= 0 and y < layer["h"]: | |||
| index = (y * layer["w"]) + x | |||
| d = self._d_n2s(d) | |||
| return not layer["cells"][index][d][1] | |||
| return False | |||
| def _d_n2s(self, d): # _(d)irection_(n)umber_to_(s)tring | |||
| if d == 0: | |||
| return "n" | |||
| elif d == 1: | |||
| return "e" | |||
| elif d == 2: | |||
| return "s" | |||
| elif d == 3: | |||
| return "w" | |||
| return "" | |||
| def _d_s2n(self, d): | |||
| if d == "n": | |||
| return 0 | |||
| elif d == "e": | |||
| return 1 | |||
| elif d == "s": | |||
| return 2 | |||
| elif d == "w": | |||
| return 3 | |||
| return -1 | |||
| def _indexFromPos(self, x, y): | |||
| if x >= 0 and x < self.current_layer_width and y >= 0 and y < self.current_layer_height: | |||
| return (y * self.current_layer_width) + x | |||
| return -1 | |||
| def _getCell(self, x, y): | |||
| index = self._indexFromPos(x, y) | |||
| if index < 0: | |||
| return None | |||
| return self._layer[self._currentLayer]["cells"][index] | |||
| def _RenderTopDown(self): | |||
| cell_size = self._topdown["size"] | |||
| size = self.resolution | |||
| pos = self.position | |||
| lsize = (self.current_layer_width, self.current_layer_height) | |||
| hcells = int(size[0] / cell_size) | |||
| vcells = int(size[1] / cell_size) | |||
| cx = pos[0] - int(hcells * 0.5) | |||
| cy = pos[1] - int(vcells * 0.5) | |||
| ry = -4 | |||
| for j in range(0, vcells+1): | |||
| y = cy + j | |||
| if y >= 0 and y < lsize[1]: | |||
| rx = -1 | |||
| for i in range(0, hcells+1): | |||
| x = cx + i | |||
| if x >= 0 and x < lsize[0]: | |||
| cell = self._getCell(x, y) | |||
| if cell["n"][0] >= 0: | |||
| self.draw_rect((rx, ry, cell_size, 2), self._topdown["wall_color"], 0, self._topdown["wall_color"]) | |||
| if cell["e"][0] >= 0: | |||
| self.draw_rect((rx+(cell_size-2), ry, 2, cell_size), self._topdown["wall_color"], 0, self._topdown["wall_color"]) | |||
| if cell["s"][0] >= 0: | |||
| self.draw_rect((rx, ry+(cell_size-2), cell_size, 2), self._topdown["wall_color"], 0, self._topdown["wall_color"]) | |||
| if cell["w"][0] >= 0: | |||
| self.draw_rect((rx, ry, 2, cell_size), self._topdown["wall_color"], 0, self._topdown["wall_color"]) | |||
| if cell["n"][1] == True: | |||
| self.draw_lines([(rx+1, ry+1), (rx+(cell_size-1), ry+1)], self._topdown["blocked_color"], 1) | |||
| if cell["e"][1] == True: | |||
| self.draw_lines([(rx+(cell_size-2), ry+1), (rx+(cell_size-2), ry+(cell_size-2))], self._topdown["blocked_color"], 1) | |||
| if cell["s"][1] == True: | |||
| self.draw_lines([(rx+1, ry+(cell_size-2)), (rx+(cell_size-2), ry+(cell_size-2))], self._topdown["blocked_color"], 1) | |||
| if cell["w"][1] == True: | |||
| self.draw_lines([(rx+1, ry+1), (rx+1, ry+(cell_size-2))], self._topdown["blocked_color"], 1) | |||
| rx += cell_size | |||
| ry += cell_size | |||
| def _RenderPerspective(self): | |||
| pass | |||
| def on_render(self): | |||
| if self._renderMode == 0: | |||
| self._RenderTopDown() | |||
| else: | |||
| self._RenderPerspective() | |||
| class MapEditor(gbe.nodes.Node2D): | |||
| def __init__(self, name="MapEditor", parent=None): | |||
| try: | |||
| gbe.nodes.Node2D.__init__(self, name, parent) | |||
| except gbe.nodes.Node2D as e: | |||
| raise e | |||
| def on_start(self): | |||
| pass | |||
| def on_pause(self): | |||
| pass | |||