Initial commit
authorStan_Lewry <stanley.jml@gmail.com>
Sat, 10 Jul 2021 19:07:34 +0000 (20:07 +0100)
committerStan_Lewry <stanley.jml@gmail.com>
Sat, 10 Jul 2021 19:07:34 +0000 (20:07 +0100)
25 files changed:
Alogorithms.py [new file with mode: 0644]
Assets/_bitmap_font____romulus_by_pix3m-d6aokem.ttf [new file with mode: 0644]
Assets/alagard.ttf [new file with mode: 0644]
Assets/animation.png [new file with mode: 0644]
Assets/animation.pyxel [new file with mode: 0644]
Assets/dirt.png [new file with mode: 0644]
Assets/grass.png [new file with mode: 0644]
Assets/player.png [new file with mode: 0644]
Assets/player_debug.png [new file with mode: 0644]
Assets/sheet.png [new file with mode: 0644]
Assets/sheet.pyxel [new file with mode: 0644]
Assets/woodWall.png [new file with mode: 0644]
InputHandler.py [new file with mode: 0644]
Main.py [new file with mode: 0644]
Texture.py [new file with mode: 0644]
World.py [new file with mode: 0644]
WorldTemplates.py [new file with mode: 0644]
Writeup/first_attempt_bresenham_ray_tracing.png [new file with mode: 0644]
Writeup/first_attempt_bresenham_ray_tracing_door.png [new file with mode: 0644]
Writeup/linez.png [new file with mode: 0644]
Writeup/tile_development.png [new file with mode: 0644]
Writeup/vision.png [new file with mode: 0644]
__pycache__/InputHandler.cpython-39.pyc [new file with mode: 0644]
__pycache__/Texture.cpython-39.pyc [new file with mode: 0644]
__pycache__/WorldTemplates.cpython-39.pyc [new file with mode: 0644]

diff --git a/Alogorithms.py b/Alogorithms.py
new file mode 100644 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
index 0000000..8108d51
--- /dev/null
@@ -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 (file)
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 (file)
index 0000000..80a6416
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
diff --git a/WorldTemplates.py b/WorldTemplates.py
new file mode 100644 (file)
index 0000000..93325c5
--- /dev/null
@@ -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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
index 0000000..7d4ad93
Binary files /dev/null and b/__pycache__/WorldTemplates.cpython-39.pyc differ