| @@ -26,23 +26,28 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| self._layer = {} | |||
| self._currentLayer = "" | |||
| self._res = { | |||
| "environment":"", | |||
| "walls":"" | |||
| "env_src":"", | |||
| "env":None, | |||
| "wall_src":"", | |||
| "walls":None, | |||
| "wall_index":-1, | |||
| "door_index":-1 | |||
| } | |||
| self._topdown = { | |||
| "size":8, # Pixels square | |||
| "wall_color":pygame.Color(255, 255, 255), | |||
| "blocked_color":pygame.Color(255, 0, 0) | |||
| } | |||
| self._cellpos = [0,0] | |||
| self._orientation = "n" | |||
| @property | |||
| def environment_resource(self): | |||
| return self._res["horizon"] | |||
| def environment_source(self): | |||
| return self._res["env_src"] | |||
| @property | |||
| def wall_resource(self): | |||
| return self._res["walls"] | |||
| def wall_source(self): | |||
| return self._res["wall_src"] | |||
| @property | |||
| def layer_count(self): | |||
| @@ -71,19 +76,48 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| names.append(names) | |||
| return names | |||
| @property | |||
| def orientation(self): | |||
| return self._orientation | |||
| @property | |||
| def cell_position(self): | |||
| return (self._cellpos[0], self._cellpos[1]) | |||
| def set_resources(self, environment, walls): | |||
| def set_resources(self, env_src, wall_src): | |||
| 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 | |||
| if env_src != "" and env_src != self._res["env_src"]: | |||
| if res.is_valid("json", env_src): | |||
| if not res.has("json", env_src): | |||
| res.store("json", env_src) | |||
| e = res.get("json", env_src) | |||
| if e is not None and e() is not None: | |||
| self._res["env_src"] = env_src | |||
| self._res["env"] = e | |||
| # TODO: Load the images associated with the environments | |||
| if wall_src != "" and wall_src != self._res["wall_src"]: | |||
| if res.is_valid("json", wall_src): | |||
| if not res.has("json", wall_src): | |||
| print("Storing resource {}".format(wall_src)) | |||
| res.store("json", wall_src) | |||
| w = res.get("json", wall_src) | |||
| print(w) | |||
| if w is not None and w() is not None: | |||
| self._res["wall_src"] = wall_src | |||
| self._res["walls"] = w | |||
| # NOTE: I'm making a lot of assumptions to the structural validity of the data file, but... | |||
| imgsrc = w().data["src"] | |||
| if res.is_valid("graphic", imgsrc): | |||
| if res.has("graphic", imgsrc): | |||
| res.store("graphic", imgsrc) | |||
| else: | |||
| print("Failed to get JSON instance {}".format(wall_src)) | |||
| else: | |||
| print("Invalid JSON {}".format(wall_src)) | |||
| def add_layer(self, name, w, h): | |||
| if name == "" or name in self._layers: | |||
| if name == "" or name in self._layer: | |||
| return | |||
| self._layer[name] = { | |||
| "w":w, | |||
| @@ -91,17 +125,25 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| "cells":[] | |||
| } | |||
| for c in range(0, w*h): | |||
| self._layer[name]["cells"][c] = { | |||
| self._layer[name]["cells"].append({ | |||
| "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 | |||
| } | |||
| "n":[-1, False, -1, None], # North Wall | [<graphic index, -1 = None>, <blocking>, <door index, -1 = None, 0 = closed, 1=open>, <door target>] | |||
| "s":[-1, False, -1, None], # South Wall | |||
| "e":[-1, False, -1, None], # East Wall | |||
| "w":[-1, False, -1, None], # West Wall | |||
| }) | |||
| if self._currentLayer == "": | |||
| self._currentLayer = name | |||
| def set_active_layer(self, name, x=0, y=0): | |||
| if name == "" or not (name in self._layers): | |||
| return | |||
| layer = self._layers[name] | |||
| if x >= 0 and x < layer["w"] and y >= 0 and y < layer["h"]: | |||
| self._currentLayer = name | |||
| self._cellpos = [x,y] | |||
| def set_cell_env(self, x, y, ceiling=-1, ground=-1): | |||
| if self._currentLayer == "": | |||
| return | |||
| @@ -128,6 +170,8 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| if x >= 0 and x < layer["w"] and y >= 0 and y < layer["h"]: | |||
| index = (y * layer["w"]) + x | |||
| cell = layer["cells"] | |||
| if gi <= -2: | |||
| gi = self._res["wall_index"] | |||
| if gi >= -1: | |||
| cell[index][face][0] = gi | |||
| if blocking is not None: | |||
| @@ -141,6 +185,26 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| blocking = (blocking == True) # Forcing a boolean | |||
| cell[index][face][1] = blocking | |||
| def next_wall(self): | |||
| if self._res["walls"] is not None: | |||
| w = self._res["walls"]() | |||
| if w is not None: | |||
| windex = self._res["wall_index"] + 1 | |||
| if windex >= len(w.data["walls"]): | |||
| windex = -1 | |||
| self._res["wall_index"] = windex | |||
| print("Next Wall Index: {}".format(windex)) | |||
| def prev_wall(self): | |||
| if self._res["walls"] is not None: | |||
| w = self._res["walls"]() | |||
| if w is not None: | |||
| windex = self._res["wall_index"] - 1 | |||
| if windex < -1: | |||
| windex = len(w.data["walls"]) - 1 | |||
| self._res["wall_index"] = windex | |||
| print("Prev Wall Index: {}".format(windex)) | |||
| def turn_left(self): | |||
| onum = self._d_s2n(self._orientation) | |||
| onum -= 1 | |||
| @@ -155,6 +219,36 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| onum = 0 | |||
| self._orientation = self._d_n2s(onum) | |||
| def move_to(self, x, y): | |||
| if x >= 0 and x < self.current_layer_width and y >= 0 and y < self.current_layer_height: | |||
| self._cellpos = [x, y] | |||
| def move_forward(self, ignore_passible=False): | |||
| if ignore_passible or self.is_passible(self._cellpos[0], self._cellpos[1], self._orientation): | |||
| x = self._cellpos[0] | |||
| y = self._cellpos[1] | |||
| if self._orientation == "n": | |||
| y -= 1 | |||
| elif self._orientation == "e": | |||
| x += 1 | |||
| elif self._orientation == "s": | |||
| y += 1 | |||
| elif self._orientation == "w": | |||
| x -= 1 | |||
| self.move_to(x, y) | |||
| def move_backward(self, ignore_passible=False): | |||
| orient = self._orientation | |||
| if self._orientation == "n": | |||
| self._orientation = "s" | |||
| elif self._orientation == "s": | |||
| self._orientation = "n" | |||
| elif self._orientation == "e": | |||
| self._orientation = "w" | |||
| elif self._orientation == "w": | |||
| self._orientation = "e" | |||
| self.move_forward(ignore_passible) | |||
| self._orientation = orient | |||
| def is_passible(self, x, y, d): | |||
| """ | |||
| @@ -208,7 +302,7 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| def _RenderTopDown(self): | |||
| cell_size = self._topdown["size"] | |||
| size = self.resolution | |||
| pos = self.position | |||
| pos = self._cellpos | |||
| lsize = (self.current_layer_width, self.current_layer_height) | |||
| hcells = int(size[0] / cell_size) | |||
| vcells = int(size[1] / cell_size) | |||
| @@ -256,7 +350,7 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| class MapEditor(gbe.nodes.Node2D): | |||
| class NodeMapEditor(gbe.nodes.Node2D): | |||
| def __init__(self, name="MapEditor", parent=None): | |||
| try: | |||
| gbe.nodes.Node2D.__init__(self, name, parent) | |||
| @@ -264,11 +358,34 @@ class MapEditor(gbe.nodes.Node2D): | |||
| raise e | |||
| def on_start(self): | |||
| pass | |||
| self.listen("KEYPRESSED", self.on_keypressed) | |||
| def on_pause(self): | |||
| pass | |||
| self.unlisten("KEYPRESSED", self.on_keypressed) | |||
| def on_keypressed(self, event, data): | |||
| p = self.parent | |||
| if p is None or not isinstance(p, NodeGameMap): | |||
| return | |||
| if data["key_name"] == "escape": | |||
| self.emit("QUIT") | |||
| if data["key_name"] == "w": | |||
| p.move_forward(True) | |||
| elif data["key_name"] == "s": | |||
| p.move_backward(True) | |||
| elif data["key_name"] == "a": | |||
| p.turn_left() | |||
| elif data["key_name"] == "d": | |||
| p.turn_right() | |||
| elif data["key_name"] == "space": | |||
| o = p.orientation | |||
| cpos = p.cell_position | |||
| p.set_cell_face(cpos[0], cpos[1], o) | |||
| elif data["key_name"] == "e": | |||
| p.next_wall() | |||
| elif data["key_name"] == "q": | |||
| p.prev_wall() | |||