| @@ -28,6 +28,8 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| self._res = { | |||
| "env_src":"", | |||
| "env":None, | |||
| "h_index":0, | |||
| "g_index":0, | |||
| "wall_src":"", | |||
| "walls":None, | |||
| "wall_index":-1, | |||
| @@ -132,7 +134,7 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| } | |||
| for c in range(0, w*h): | |||
| self._layer[name]["cells"].append({ | |||
| "c":0, # Sky / Ceiling | |||
| "h":0, # Horizon | |||
| "g":0, # Ground | |||
| "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 | |||
| @@ -271,6 +273,21 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| return False | |||
| def toggle_render_mode(self): | |||
| if self._renderMode == 0: | |||
| self._renderMode = 1 | |||
| else: | |||
| self._renderMode = 0 | |||
| def set_render_mode(self, mode): | |||
| if mode <= 0: | |||
| self._renderMode = 0 | |||
| else: | |||
| self._renderMode = 1 | |||
| def get_render_mode(self): | |||
| return self._renderMode | |||
| def _d_n2s(self, d): # _(d)irection_(n)umber_to_(s)tring | |||
| if d == 0: | |||
| return "n" | |||
| @@ -299,10 +316,21 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| return -1 | |||
| def _getCell(self, x, y): | |||
| index = self._indexFromPos(x, y) | |||
| if index < 0: | |||
| return None | |||
| return self._layer[self._currentLayer]["cells"][index] | |||
| if x >=- 0 and x < self.current_layer_width and y >= 0 and y < self.current_layer_height: | |||
| index = self._indexFromPos(x, y) | |||
| return self._layer[self._currentLayer]["cells"][index] | |||
| return None | |||
| def _getOrientVec(self): | |||
| if self._orientation == "n": | |||
| return (0, -1) | |||
| elif self._orientation == "s": | |||
| return (0, 1) | |||
| elif self._orientation == "e": | |||
| return (1, 0) | |||
| elif self._orientation == "w": | |||
| return (-1, 0) | |||
| return (0,0) | |||
| def _RenderTopDown(self): | |||
| @@ -345,8 +373,210 @@ class NodeGameMap(gbe.nodes.Node2D): | |||
| def _RenderPersFar(self, pos, size, o, orr, orl, wdat, wsurf): | |||
| ovec = self._getOrientVec() | |||
| fx = pos[0] + (ovec[0]*2) | |||
| fy = pos[1] + (ovec[1]*2) | |||
| fcell = self._getCell(fx, fy) | |||
| if fcell == None: | |||
| return # If we can't see the cell directly ahead, the other's won't be visible either! | |||
| lcell = llcell = rcell = rrcell = None | |||
| if ovec[0] == 0: # Facing North/South | |||
| lcell = self._getCell(fx + ovec[1], fy) | |||
| llcell = self._getCell(fx + (ovec[1]*2), fy) | |||
| rcell = self._getCell(fx - ovec[1], fy) | |||
| rrcell = self._getCell(fx - (ovec[1]*2), fy) | |||
| else: # Facing East/West | |||
| lcell = self._getCell(fx, fy + ovec[0]) | |||
| llcell = self._getCell(fx, fy + (ovec[0]*2)) | |||
| rcell = self._getCell(fx, fy - ovec[0]) | |||
| rrcell = self._getCell(fx, fy - (ovec[0]*2)) | |||
| hsw = int(size[0]*0.5) | |||
| hsh = int(size[1]*0.5) | |||
| # Rendering from edges to center | |||
| if llcell is not None: | |||
| if llcell[o][0] >= 0: | |||
| rect = wdat["walls"][llcell[o][0]]["f_far"] | |||
| hw = int(rect[2]*0.5) | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(wsurf, (0, hsh-hh), (rect[0], rect[1], hw, rect[3])) | |||
| if rrcell is not None: | |||
| if rrcell[o][0] >= 0: | |||
| rect = wdat["walls"][rrcell[o][0]]["f_far"] | |||
| hw = int(rect[2]*0.5) | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(wsurf, (size[0]-hw, hsh-hh), (rect[0]+hw, rect[1], hw, rect[3])) | |||
| if lcell is not None: | |||
| if lcell[o][0] >= 0: | |||
| rect = wdat["walls"][lcell[o][0]]["f_far"] | |||
| hw = int(rect[2]*0.5) | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(wsurf, (hw, hsh-hh), (rect[0], rect[1], rect[2], rect[3])) | |||
| if lcell[orl][0] >= 0: | |||
| rect = wdat["walls"][lcell[orl][0]]["s_far"] | |||
| lsurf = pygame.transform.flip(wsurf.subsurface(rect), True, False) | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(lsurf, (0, hsh-hh)) | |||
| if rcell is not None: | |||
| if rcell[o][0] >= 0: | |||
| rect = wdat["walls"][rcell[o][0]]["f_far"] | |||
| hw = int(rect[2]*0.5) | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(wsurf, (size[0]-(rect[2]+hw), hsh-hh), (rect[0], rect[1], rect[2], rect[3])) | |||
| if rcell[orr][0] >= 0: | |||
| rect = wdat["walls"][rcell[orr][0]]["s_far"] | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(wsurf, (size[0]-rect[2], hsh-hh), (rect[0], rect[1], rect[2], rect[3])) | |||
| # Rendering the main cell!! | |||
| frect = None # This will be used to place walls | |||
| if fcell[o][0] >= 0: | |||
| frect = wdat["walls"][fcell[o][0]]["f_far"] | |||
| hw = int(frect[2]*0.5) | |||
| hh = int(frect[3]*0.5) | |||
| self.draw_image(wsurf, (hsw-hw, hsh-hh), (frect[0], frect[1], frect[2], frect[3])) | |||
| if fcell[orl][0] >= 0: | |||
| rect = wdat["walls"][fcell[orl][0]]["s_far"] | |||
| if frect is None: | |||
| # Kinda cheating in that it's known that all walls are the same size. | |||
| frect = wdat["walls"][fcell[orl][0]]["f_far"] | |||
| hw = int(frect[2]*0.5) | |||
| lsurf = pygame.transform.flip(wsurf.subsurface(rect), True, False) | |||
| self.draw_image(lsurf, (hsw-(hw+rect[2]), hsh-int(rect[3]*0.5))) | |||
| if fcell[orr][0] >= 0: | |||
| rect = wdat["walls"][fcell[orr][0]]["s_far"] | |||
| if frect is None: | |||
| frect = wdat["walls"][fcell[orr][0]]["f_far"] | |||
| hw = int(frect[2]*0.5) | |||
| self.draw_image(wsurf, (hsw+hw, hsh-int(rect[3]*0.5)), (rect[0], rect[1], rect[2], rect[3])) | |||
| def _RenderPersMid(self, pos, size, o, orr, orl, wdat, wsurf): | |||
| ovec = self._getOrientVec() | |||
| fx = pos[0] + ovec[0] | |||
| fy = pos[1] + ovec[1] | |||
| fcell = self._getCell(fx, fy) | |||
| if fcell == None: | |||
| return # If we can't see the cell directly ahead, the other's won't be visible either! | |||
| lcell = rcell = None | |||
| if ovec[0] == 0: # Facing North/South | |||
| lcell = self._getCell(fx + ovec[1], fy) | |||
| rcell = self._getCell(fx - ovec[1], fy) | |||
| else: # Facing East/West | |||
| lcell = self._getCell(fx, fy + ovec[0]) | |||
| rcell = self._getCell(fx, fy - ovec[0]) | |||
| hsw = int(size[0]*0.5) | |||
| hsh = int(size[1]*0.5) | |||
| # Render from outside inwards! | |||
| if lcell is not None: | |||
| if lcell[o][0] >= 0: | |||
| rect = wdat["walls"][lcell[o][0]]["f_mid"] | |||
| hw = int(rect[2]*0.5) | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(wsurf, (0, hsh-hh), (rect[0]+hw, rect[1], int(rect[2]*0.5), rect[3])) | |||
| if rcell is not None: | |||
| if rcell[o][0] >= 0: | |||
| rect = wdat["walls"][rcell[o][0]]["f_mid"] | |||
| hw = int(rect[2]*0.5) | |||
| hh = int(rect[3]*0.5) | |||
| self.draw_image(wsurf, (size[0]-hw, hsh-hh), (rect[0], rect[1], hw, rect[3])) | |||
| # Rendering the main cell!! | |||
| frect = None # This will be used to place walls | |||
| if fcell[o][0] >= 0: | |||
| frect = wdat["walls"][fcell[o][0]]["f_mid"] | |||
| hw = int(frect[2]*0.5) | |||
| hh = int(frect[3]*0.5) | |||
| self.draw_image(wsurf, (hsw-hw, hsh-hh), (frect[0], frect[1], frect[2], frect[3])) | |||
| if fcell[orl][0] >= 0: | |||
| rect = wdat["walls"][fcell[orl][0]]["s_mid"] | |||
| if frect is None: | |||
| # Kinda cheating in that it's known that all walls are the same size. | |||
| frect = wdat["walls"][fcell[orl][0]]["f_mid"] | |||
| hw = int(frect[2]*0.5) | |||
| lsurf = pygame.transform.flip(wsurf.subsurface(rect), True, False) | |||
| self.draw_image(lsurf, (hsw-(hw+rect[2]), hsh-int(rect[3]*0.5))) | |||
| if fcell[orr][0] >= 0: | |||
| rect = wdat["walls"][fcell[orr][0]]["s_mid"] | |||
| if frect is None: | |||
| frect = wdat["walls"][fcell[orr][0]]["f_mid"] | |||
| hw = int(frect[2]*0.5) | |||
| self.draw_image(wsurf, (hsw+hw, hsh-int(rect[3]*0.5)), (rect[0], rect[1], rect[2], rect[3])) | |||
| def _RenderPersClose(self, pos, size, o, orr, orl, cell, wdat, wsurf): | |||
| fcell = self._getCell(pos[0], pos[1]) | |||
| hsw = int(size[0]*0.5) | |||
| hsh = int(size[1]*0.5) | |||
| # Rendering the main cell!! | |||
| frect = None # This will be used to place walls | |||
| if fcell[o][0] >= 0: | |||
| idx = fcell[o][0] | |||
| frect = wdat["walls"][idx]["f_close"] | |||
| hw = int(frect[2]*0.5) | |||
| hh = int(frect[3]*0.5) | |||
| self.draw_image(wsurf, (hsw-hw, hsh-hh), (frect[0], frect[1], frect[2], frect[3])) | |||
| if fcell[orl][0] >= 0: | |||
| idx = fcell[orl][0] | |||
| rect = wdat["walls"][idx]["s_close"] | |||
| if frect is None: | |||
| # Kinda cheating in that it's known that all walls are the same size. | |||
| frect = wdat["walls"][idx]["f_close"] | |||
| hw = int(frect[2]*0.5) | |||
| lsurf = pygame.transform.flip(wsurf.subsurface(rect), True, False) | |||
| self.draw_image(lsurf, (hsw-(hw+rect[2]), hsh-int(rect[3]*0.5))) | |||
| if fcell[orr][0] >= 0: | |||
| idx = fcell[orr][0] | |||
| rect = wdat["walls"][idx]["s_close"] | |||
| if frect is None: | |||
| frect = wdat["walls"][idx]["f_close"] | |||
| hw = int(frect[2]*0.5) | |||
| self.draw_image(wsurf, (hsw+hw, hsh-int(rect[3]*0.5)), (rect[0], rect[1], rect[2], rect[3])) | |||
| def _RenderPerspective(self): | |||
| pass | |||
| # Getting ALL of the core resources | |||
| rm = self.resource | |||
| edat = self._res["env"] | |||
| wdat = self._res["walls"] | |||
| if edat is None or wdat is None or edat() is None or wdat() is None: | |||
| return | |||
| edat = edat().data | |||
| wdat = wdat().data | |||
| ehsurf = rm.get("graphic", edat["horizon"]["src"]) | |||
| egsurf = rm.get("graphic", edat["ground"]["src"]) | |||
| wsurf = rm.get("graphic", wdat["src"]) | |||
| if ehsurf is None or egsurf is None or wsurf is None: | |||
| return | |||
| if ehsurf() is None or egsurf() is None or wsurf() is None: | |||
| return | |||
| px = self._cellpos[0] | |||
| py = self._cellpos[1] | |||
| orl = self._d_n2s(max(0, self._d_s2n(self._orientation) - 1)) | |||
| orr = self._d_n2s((self._d_s2n(self._orientation) + 1)%4) | |||
| cell = self._getCell(px, py) | |||
| # First, output the ground and horizon | |||
| # TODO Later, perhaps cut the horizon and ground to represent each possible cell instead of just the current one? | |||
| self.draw_image(ehsurf(), (0,0), edat["horizon"]["defs"][cell["h"]]["rect"]) | |||
| self.draw_image(egsurf(), (0,32), edat["ground"]["defs"][cell["g"]]["rect"]) | |||
| # Rendering the rest | |||
| size = self.resolution | |||
| self._RenderPersFar((px, py), size, self._orientation, orr, orl, wdat, wsurf()) | |||
| self._RenderPersMid((px, py), size, self._orientation, orr, orl, wdat, wsurf()) | |||
| self._RenderPersClose((px, py), size, self._orientation, orr, orl, cell, wdat, wsurf()) | |||
| def on_render(self): | |||
| if self._renderMode == 0: | |||
| @@ -430,7 +660,9 @@ class NodeMapEditor(gbe.nodes.Node2D): | |||
| if data["key_name"] == "escape": | |||
| self.emit("QUIT") | |||
| if data["key_name"] == "w": | |||
| if data["key_name"] == "tab": | |||
| p.toggle_render_mode() | |||
| elif data["key_name"] == "w": | |||
| p.move_forward(True) | |||
| elif data["key_name"] == "s": | |||
| p.move_backward(True) | |||