From: Stan_Lewry Date: Sat, 10 Jul 2021 19:07:34 +0000 (+0100) Subject: Initial commit X-Git-Url: https://stanlewry.com/index.cgi?a=commitdiff_plain;h=f2d0e64dfc83487f9bf72a196f30b7984457928f;p=pyroguelike.git Initial commit --- f2d0e64dfc83487f9bf72a196f30b7984457928f diff --git a/Alogorithms.py b/Alogorithms.py new file mode 100644 index 0000000..e69de29 diff --git a/Assets/_bitmap_font____romulus_by_pix3m-d6aokem.ttf b/Assets/_bitmap_font____romulus_by_pix3m-d6aokem.ttf new file mode 100644 index 0000000..667fd0a Binary files /dev/null and b/Assets/_bitmap_font____romulus_by_pix3m-d6aokem.ttf differ diff --git a/Assets/alagard.ttf b/Assets/alagard.ttf new file mode 100644 index 0000000..c7ed1d9 Binary files /dev/null and b/Assets/alagard.ttf differ diff --git a/Assets/animation.png b/Assets/animation.png new file mode 100644 index 0000000..22fb4cd Binary files /dev/null and b/Assets/animation.png differ diff --git a/Assets/animation.pyxel b/Assets/animation.pyxel new file mode 100644 index 0000000..022b8e7 Binary files /dev/null and b/Assets/animation.pyxel differ diff --git a/Assets/dirt.png b/Assets/dirt.png new file mode 100644 index 0000000..fd69dae Binary files /dev/null and b/Assets/dirt.png differ diff --git a/Assets/grass.png b/Assets/grass.png new file mode 100644 index 0000000..91b97d9 Binary files /dev/null and b/Assets/grass.png differ diff --git a/Assets/player.png b/Assets/player.png new file mode 100644 index 0000000..917e3fa Binary files /dev/null and b/Assets/player.png differ diff --git a/Assets/player_debug.png b/Assets/player_debug.png new file mode 100644 index 0000000..834feec Binary files /dev/null and b/Assets/player_debug.png differ diff --git a/Assets/sheet.png b/Assets/sheet.png new file mode 100644 index 0000000..027913e Binary files /dev/null and b/Assets/sheet.png differ diff --git a/Assets/sheet.pyxel b/Assets/sheet.pyxel new file mode 100644 index 0000000..da72c26 Binary files /dev/null and b/Assets/sheet.pyxel differ diff --git a/Assets/woodWall.png b/Assets/woodWall.png new file mode 100644 index 0000000..3868a83 Binary files /dev/null and b/Assets/woodWall.png differ diff --git a/InputHandler.py b/InputHandler.py new file mode 100644 index 0000000..8108d51 --- /dev/null +++ b/InputHandler.py @@ -0,0 +1,47 @@ +from typing import Tuple +import pygame +from dataclasses import dataclass + +@dataclass +class InputState: + xy: Tuple = (0, 0) + quit: bool = False + zoomLevel: float = 1.0 + showDebug: bool = False + inputMade: bool = False + +maxZoom = 3.0 +minZoom = 1.0 + +globalInputState = InputState() + +def handleInputs(): + #copy global input state for now + global globalInputState + newInputState = globalInputState + newInputState.xy = (0, 0) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + newInputState.exit = True + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + newInputState.quit = True + elif event.key in (pygame.K_w, pygame.K_UP): + newInputState.xy = (0, -1) + elif event.key in (pygame.K_a, pygame.K_LEFT): + newInputState.xy = (-1, 0) + elif event.key in (pygame.K_s, pygame.K_DOWN): + newInputState.xy = (0, 1) + elif event.key in (pygame.K_d, pygame.K_RIGHT): + newInputState.xy = (1, 0) + elif event.key == pygame.K_RIGHTBRACKET and newInputState.zoomLevel <= maxZoom: + newInputState.zoomLevel += 0.5 + elif event.key == pygame.K_LEFTBRACKET and newInputState.zoomLevel >= minZoom: + newInputState.zoomLevel -= 0.5 + elif event.key == pygame.K_F3: + newInputState.showDebug = not newInputState.showDebug + + newInputState.inputMade = not newInputState == globalInputState + # now replace the global one with our new one + # mutex lock if I move to thread + globalInputState = newInputState diff --git a/Main.py b/Main.py new file mode 100644 index 0000000..bf077df --- /dev/null +++ b/Main.py @@ -0,0 +1,347 @@ +import pygame +import pygame.font +from pygame import transform +import os +from collections import namedtuple +from pygame import sprite +from pygame.constants import SCRAP_SELECTION, SYSTEM_CURSOR_SIZENESW +import WorldTemplates +import Texture +import InputHandler + +screenWidth = 1920 +screenHeight = 1080 + +worldWidth = 20 * 3 +worldHeight = 20 * 3 +objPixelWidth = 32 +objPixelHeight = 32 + +# int a = 1 +# int b = -1 +# unsigned int a = 5 +# uint8 myint = 255; +# float myFloat = 0.0001f; +# double myDouble = 0.0000000001f; + +pygame.init() +pygame.display.set_caption("Medieval Game") +gameFolder = os.path.dirname(__file__) +screen = pygame.display.set_mode([screenWidth, screenHeight]) +playerImage = pygame.image.load(os.path.join('Assets', 'player_debug.png')) +dirtImage = pygame.image.load(os.path.join('Assets', 'dirt.png')) +grassImage = pygame.image.load(os.path.join('Assets', 'grass.png')) +woodWallImage = pygame.image.load(os.path.join('Assets', 'woodWall.png')) + +debugRects = [] + +class GameObject(): + def __init__(self, worldX, worldY, texture, solid): + self.texture = texture + self.worldX = worldX + self.worldY = worldY + self.solid = solid + self.textureX = Texture.spriteDict[self.texture][0] + self.textureY = Texture.spriteDict[self.texture][1] + +class AnimationObject(GameObject): + def __init__(self, worldX, worldY, texture, solid, fps): + GameObject.__init__(self, worldX, worldY, texture, solid) + self.fps = fps + self.timer = 0 + + def update(self, deltaTime): + self.timer += deltaTime + if self.timer > 1 / self.fps: + self.timer = 0 + # increment animation frame + if self.textureX < Texture.animationDict[self.texture][2]: + self.textureX += 1 + else: + self.textureX = 0 + +class Door(GameObject): + def __init__(self, worldX, worldY, texture, open): + GameObject.__init__(self, worldX, worldY, texture, not open) + + def interact(): + print("player interacted with the door") + +class WorldCell(): + def __init__(self): + self.objects = [] # order this list somehow to get Z + self.visible = True + + def containsSolid(self): + return any(ob.solid for ob in self.objects) + +def genWorld(): + template = WorldTemplates.worldTemplate5 + output = [[]] + for y in range(worldHeight): + row = [] + for x in range(worldWidth): + cell = WorldCell() + if template[y][x] == 0: + cell.objects.append(GameObject(x, y, "dirt", False)) + elif template[y][x] == 1: + cell.objects.append(GameObject(x, y, "grass", False)) + elif template[y][x] == 2: + cell.objects.append(GameObject(x, y, "wood_wall", True)) + elif template[y][x] == 3: + cell.objects.append(GameObject(x, y, "wood_wall_side", True)) + elif template[y][x] == 4: + cell.objects.append(GameObject(x, y, "floor_planks", False)) + elif template[y][x] == 5: + cell.objects.append(GameObject(x, y, "floor_planks_shadow", False)) + elif template[y][x] == 6: + cell.objects.append(GameObject(x, y, "wood_wall_shadow", True)) + elif template[y][x] == 7: + cell.objects.append(GameObject(x, y, "grass_border_right", False)) + elif template[y][x] == 8: + cell.objects.append(GameObject(x, y, "grass_border_top", False)) + elif template[y][x] == 9: + cell.objects.append(GameObject(x, y, "grass_border_top_right_inner", False)) + elif template[y][x] == 10: + cell.objects.append(GameObject(x, y, "grass_border_top_right_outer", False)) + elif template[y][x] == 11: + cell.objects.append(GameObject(x, y, "grass_border_top_left_outer", False)) + elif template[y][x] == 12: + cell.objects.append(GameObject(x, y, "grass_border_top_left_inner", False)) + elif template[y][x] == 13: + cell.objects.append(GameObject(x, y, "grass_border_left", False)) + row.append(cell) + output.insert(y, row) + return output + +world = genWorld() + +class Player(GameObject): + def __init__(self, worldX, worldY): + GameObject.__init__(self, worldX, worldY, "player", False) + self.direction = (0, 1) + self.sightRange = 16 + + def update(self): + self.direction = InputHandler.globalInputState.xy + + if self.direction == (0, 1): + self.texture = "player" + elif self.direction == (0, -1): + self.texture = "player_north" + elif self.direction == (1, 0): + self.texture = "player_east" + elif self.direction == (-1, 0): + self.texture = "player_west" + + self.textureX = Texture.spriteDict[self.texture][0] + self.textureY = Texture.spriteDict[self.texture][1] + + desiredX, desiredY = self.worldX + self.direction[0], self.worldY + self.direction[1] + + if -1 < desiredX < worldWidth and -1 < desiredY < worldHeight: + if not world[int(desiredY)][int(desiredX)].containsSolid(): + self.worldX = desiredX + self.worldY = desiredY + +player = Player(30,30) +testAnim = AnimationObject(10, 10, "test_anim", False, 8) +door = Door(11, 13, "wood_door_open", True) +world[13][11].objects.append(door) +world[10][10].objects.append(testAnim) + +def computeVisibility(): + for y in range(worldHeight): + for x in range(worldWidth): + # reset visibility + world[y][x].visible = False + circle = generateCircle(player.worldX, player.worldY, player.sightRange) + for x, y in circle: + debugRects.append((x, y, (255, 255, 255))) + # debugs = [(x, y, (255, 255, 255)) for x, y in circle] + # debugRects.append(debugs) + for coord in circle: + #world[coord[1]][coord[0]].visible = True + pass + + for coord in circle: + line(player.worldX, player.worldY, coord[0], coord[1]) + +def generateCircle(x0, y0, radius): + circle = [] + f = 1 - radius + ddf_x = 1 + ddf_y = -2 * radius + x = 0 + y = radius + circle.append((x0, y0 + radius)) + circle.append((x0, y0 - radius)) + circle.append((x0 + radius, y0)) + circle.append((x0 - radius, y0)) + + while x < y: + if f >= 0: + y -= 1 + ddf_y += 2 + f += ddf_y + x += 1 + ddf_x += 2 + f += ddf_x + circle.append((x0 + x, y0 + y)) + circle.append((x0 - x, y0 + y)) + circle.append((x0 + x, y0 - y)) + circle.append((x0 - x, y0 - y)) + circle.append((x0 + y, y0 + x)) + circle.append((x0 - y, y0 + x)) + circle.append((x0 + y, y0 - x)) + circle.append((x0 - y, y0 - x)) + return circle + +def line(x0, y0, x1, y1): + dx = abs(x1 - x0) + dy = abs(y1 - y0) + x, y = x0, y0 + sx = -1 if x0 > x1 else 1 + sy = -1 if y0 > y1 else 1 + if dx > dy: + err = dx / 2.0 + while x != x1: + if x in range(0, worldWidth - 1) and y in range (0, worldHeight - 1) and not world[y][x].containsSolid(): + world[y][x].visible = True + debugRects.append((x, y, (255, 0, 0))) + err -= dy + if err < 0: + y += sy + err += dx + x += sx + else: + break + else: + err = dy / 2.0 + while y != y1: + if x in range(0, worldWidth - 1) and y in range (0, worldHeight - 1) and not world[y][x].containsSolid(): + world[y][x].visible = True + debugRects.append((x, y, (255, 0, 0))) + err -= dx + if err < 0: + x += sx + err += dy + y += sy + else: + break + debugRects.append((x, y, (255, 0, 0))) + world[y][x].visible = True + + + +def renderAll(cam, zoomLevel): + actualWidth = int(objPixelWidth * zoomLevel) + actualHeight = int(objPixelHeight * zoomLevel) + screenTopX = (cam[0] * actualWidth) - (screenWidth / 2) + screenTopY = (cam[1] * actualHeight) - (screenHeight / 2) + + sheet = pygame.transform.scale(Texture.spriteSheet, (int(Texture.sheetWidth * zoomLevel), int(Texture.sheetHeight * zoomLevel))) + + for y in range(worldHeight): + for x in range(worldWidth): + if (world[y][x].visible): + for gameObj in world[y][x].objects: + worldX = (gameObj.worldX * actualWidth) - (actualWidth / 2) + worldY = (gameObj.worldY * actualHeight) - (actualHeight / 2) + screen.blit(sheet, + (worldX - screenTopX, worldY - screenTopY), + (gameObj.textureX * actualWidth, + gameObj.textureY * actualHeight, + actualWidth, + actualHeight)) + + worldX = (player.worldX * actualWidth) - (actualWidth / 2) + worldY = (player.worldY * actualHeight) - (actualHeight / 2) + sheetPos = Texture.spriteDict[player.texture] + screen.blit(sheet, (worldX - screenTopX, worldY - screenTopY), + (player.textureX * actualWidth, + player.textureY * actualHeight, + actualWidth, + actualHeight)) + +def renderDebugUI(): + headerSurf = Texture.font.render("Medieval Game Debug Mode", False, (255,0,0)) + playerPosSurf = Texture.font.render("Player Pos ({x},{y})".format(x=player.worldX, y=player.worldY), + False, (255, 255, 255)) + screen.blit(headerSurf, (0, 0)) + screen.blit(playerPosSurf, (0, 30)) + infoSurf = Texture.font.render("Standing on:", False, (255, 255, 255)) + screen.blit(infoSurf, (0, 60)) + + y = 90 + for gameObj in world[int(player.worldY)][int(player.worldX)].objects: + objSurf = Texture.font.render("{t}".format(t=gameObj.texture), False, (0, 0, 255)) + screen.blit(objSurf, (16, y)) + y += 30 + +def renderDebug(cam, zoomLevel): + actualWidth = int(objPixelWidth * zoomLevel) + actualHeight = int(objPixelHeight * zoomLevel) + screenTopX = (cam[0] * actualWidth) - (screenWidth / 2) + screenTopY = (cam[1] * actualHeight) - (screenHeight / 2) + + for r in debugRects: + worldX = (r[0] * actualWidth) - (actualWidth / 2) + worldY = (r[1] * actualHeight) - (actualHeight / 2) + + s = pygame.Surface((actualWidth, actualHeight)) + s.set_alpha(128) + s.fill(r[2]) + screen.blit(s, (worldX - screenTopX, worldY - screenTopY)) + + # for r in debugRects: + # playerWorldX = (player.worldX * actualWidth) - (actualWidth / 2) + # playerWorldY = (player.worldY* actualHeight) - (actualHeight / 2) + # worldX = (r[0] * actualWidth) - (actualWidth / 2) + # worldY = (r[1] * actualHeight) - (actualHeight / 2) + + # pygame.draw.line(screen, (255, 0, 0), + # (playerWorldX - screenTopX, playerWorldY - screenTopY), + # (worldX - screenTopX, worldY - screenTopY), + # 1) + +def main(): + getTicksLastFrame = 0 + t = 0 + deltaTime = 0 + #zoomLevel = 1.0 + while not InputHandler.globalInputState.quit: + t = pygame.time.get_ticks() + deltaTime = (t - getTicksLastFrame) / 1000.0 + getTicksLastFrame = t + InputHandler.handleInputs() + player.update() + debugRects.clear() + #circle(player.worldX, player.worldY, 16) + computeVisibility() + #line(player.worldX, player.worldY, 40, 40) + testAnim.update(deltaTime) + cam = (player.worldX, player.worldY) + screen.fill((14, 40, 37)) + renderAll(cam, InputHandler.globalInputState.zoomLevel) + if InputHandler.globalInputState.showDebug: renderDebug(cam, InputHandler.globalInputState.zoomLevel) + renderDebugUI() + pygame.display.flip() + pygame.quit() + +main() + + +# Go for grid based and focus on making cool interactions +# make a spell that burns things - fire sets fire to objects and decays and spreads, leaving burnt material behind it. +# make things get wet, walls break. Roguelike, cool terrain generation and monsters +# breakable objects +# make cool light cone effect +# draw spell ranges, etc. +# make it turn based +# different z levels +# focus on making lots of cool unique objects to fill the world with +# aim to make everything in the game interactive in some way +# make liquids that can splash on the ground +# animated tiles +# cool effects on tiles \ No newline at end of file diff --git a/Texture.py b/Texture.py new file mode 100644 index 0000000..80a6416 --- /dev/null +++ b/Texture.py @@ -0,0 +1,49 @@ +import pygame +import pygame.font +import os +pygame.font.init() +gameFolder = os.path.dirname(__file__) +spriteSheet = pygame.image.load(os.path.join('Assets', 'sheet.png')) +animationSheet = pygame.image.load(os.path.join('Assets', 'animation.png')) +font = pygame.font.Font(os.path.join('Assets','alagard.ttf'), 30) + +sheetWidth = spriteSheet.get_width() +sheetHeight = spriteSheet.get_height() +# multiply coords by sprite size :) +spriteSize = 32 +spriteDict = { + "player" : (1, 19), + "player_north" : (0, 19), + "player_east" : (2, 19), + "player_west" : (3, 19), + "dirt" : (1, 0), + "grass" : (2, 0), + "stone" : (3, 0), + "wood" : (4, 0), + "floor_planks" : (5, 0), + "wood_wall" : (6, 0), + "wood_idk" : (7, 0), + "wood_wall_side" : (8, 0), + "floor_planks_shadow" : (9, 0), + "wood_wall_shadow" : (0, 1), + "grass_border_bottom_right_inner" : (1, 1), + "grass_border_bottom" : (2, 1), + "grass_border_bottom_left_inner" : (3, 1), + "grass_border_right" : (4, 1), + "grass_border_bottom_left_outer" : (5, 1), + "grass_border_left" : (6, 1), + "grass_border_top_right_inner" : (7, 1), + "grass_border_top" : (8, 1), + "grass_border_top_left_inner" : (9, 1), + "grass_border_top_left_outer" : (0, 2), + "grass_border_top_right_outer" : (1, 2), + "grass_border_bottom_right_outer" : (2, 2), + "wood_door_closed" : (3, 2), + "wood_door_open" : (4, 2), + "test_anim" : (0, 6) +} + +#Animation name, startX, startY, endX +animationDict = { + "test_anim" : (0, 6, 9) +} \ No newline at end of file diff --git a/World.py b/World.py new file mode 100644 index 0000000..e69de29 diff --git a/WorldTemplates.py b/WorldTemplates.py new file mode 100644 index 0000000..93325c5 --- /dev/null +++ b/WorldTemplates.py @@ -0,0 +1,138 @@ +# 0 = Dirt +# 1 = Grass +# 2 = Wood Wall + +worldTemplate1 = [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +] + +worldTemplate2 = [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 2, 2, 2, 1, 1, 1], + [1, 1, 1, 2, 0, 0, 2, 1, 1, 1], + [1, 1, 1, 2, 0, 0, 2, 1, 1, 1], + [1, 1, 1, 2, 0, 2, 2, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 1, 1, 1, 1], + [1, 1, 1, 1, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 2], +] + +worldTemplate3 = [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 2, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], +] + +worldTemplate4 = [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], +] + +worldTemplate5 = [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 6, 2, 2, 2, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 5, 4, 4, 4, 3,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 4, 2, 2,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 0, 0, 0, 0, 0, 0,13, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,10, 0, 0, 0,11,12, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9,10, 0,11,12, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +] \ No newline at end of file diff --git a/Writeup/first_attempt_bresenham_ray_tracing.png b/Writeup/first_attempt_bresenham_ray_tracing.png new file mode 100644 index 0000000..a7033e1 Binary files /dev/null and b/Writeup/first_attempt_bresenham_ray_tracing.png differ diff --git a/Writeup/first_attempt_bresenham_ray_tracing_door.png b/Writeup/first_attempt_bresenham_ray_tracing_door.png new file mode 100644 index 0000000..4485591 Binary files /dev/null and b/Writeup/first_attempt_bresenham_ray_tracing_door.png differ diff --git a/Writeup/linez.png b/Writeup/linez.png new file mode 100644 index 0000000..8093651 Binary files /dev/null and b/Writeup/linez.png differ diff --git a/Writeup/tile_development.png b/Writeup/tile_development.png new file mode 100644 index 0000000..ac74cf7 Binary files /dev/null and b/Writeup/tile_development.png differ diff --git a/Writeup/vision.png b/Writeup/vision.png new file mode 100644 index 0000000..c1e0a95 Binary files /dev/null and b/Writeup/vision.png differ diff --git a/__pycache__/InputHandler.cpython-39.pyc b/__pycache__/InputHandler.cpython-39.pyc new file mode 100644 index 0000000..8bdfa78 Binary files /dev/null and b/__pycache__/InputHandler.cpython-39.pyc differ diff --git a/__pycache__/Texture.cpython-39.pyc b/__pycache__/Texture.cpython-39.pyc new file mode 100644 index 0000000..d8c9f6c Binary files /dev/null and b/__pycache__/Texture.cpython-39.pyc differ diff --git a/__pycache__/WorldTemplates.cpython-39.pyc b/__pycache__/WorldTemplates.cpython-39.pyc new file mode 100644 index 0000000..7d4ad93 Binary files /dev/null and b/__pycache__/WorldTemplates.cpython-39.pyc differ