From ac7428027100b53ae9e84ff6c51e2c6cf5a2b0d1 Mon Sep 17 00:00:00 2001 From: Angelika Iskra Date: Sun, 10 Apr 2022 20:28:50 +0200 Subject: [PATCH 1/6] work on new logic; --- common/constants.py | 21 ++-- helpers/debug.py | 15 +++ logic/field.py | 28 ------ logic/game.py | 137 ++++---------------------- logic/grid.py | 86 ---------------- logic/level.py | 88 +++++++++++++++++ logic/spawner.py | 57 +++++------ models/castle.py | 13 +-- models/knight.py | 47 +++++++-- models/monster.py | 43 +++----- models/tile.py | 9 ++ resources/textures/knight_1_down.png | Bin 0 -> 17675 bytes resources/textures/knight_1_left.png | Bin 0 -> 15607 bytes resources/textures/knight_1_right.png | Bin 0 -> 15679 bytes resources/textures/knight_1_up.png | Bin 0 -> 17043 bytes resources/textures/knight_2_down.png | Bin 0 -> 18816 bytes resources/textures/knight_2_left.png | Bin 0 -> 18146 bytes resources/textures/knight_2_right.png | Bin 0 -> 18053 bytes resources/textures/knight_2_up.png | Bin 0 -> 18027 bytes resources/textures/knight_3_down.png | Bin 0 -> 15991 bytes resources/textures/knight_3_left.png | Bin 0 -> 13933 bytes resources/textures/knight_3_right.png | Bin 0 -> 13845 bytes resources/textures/knight_3_up.png | Bin 0 -> 13970 bytes resources/textures/knight_4_down.png | Bin 0 -> 16602 bytes resources/textures/knight_4_left.png | Bin 0 -> 14328 bytes resources/textures/knight_4_right.png | Bin 0 -> 14597 bytes resources/textures/knight_4_up.png | Bin 0 -> 15099 bytes ui/logs.py | 4 +- ui/screens/main_menu.py | 66 +++++++++++++ ui/stats.py | 4 +- 30 files changed, 299 insertions(+), 319 deletions(-) create mode 100644 helpers/debug.py delete mode 100644 logic/field.py delete mode 100644 logic/grid.py create mode 100644 logic/level.py create mode 100644 models/tile.py create mode 100644 resources/textures/knight_1_down.png create mode 100644 resources/textures/knight_1_left.png create mode 100644 resources/textures/knight_1_right.png create mode 100644 resources/textures/knight_1_up.png create mode 100644 resources/textures/knight_2_down.png create mode 100644 resources/textures/knight_2_left.png create mode 100644 resources/textures/knight_2_right.png create mode 100644 resources/textures/knight_2_up.png create mode 100644 resources/textures/knight_3_down.png create mode 100644 resources/textures/knight_3_left.png create mode 100644 resources/textures/knight_3_right.png create mode 100644 resources/textures/knight_3_up.png create mode 100644 resources/textures/knight_4_down.png create mode 100644 resources/textures/knight_4_left.png create mode 100644 resources/textures/knight_4_right.png create mode 100644 resources/textures/knight_4_up.png create mode 100644 ui/screens/main_menu.py diff --git a/common/constants.py b/common/constants.py index 31fd0a9..0924d6d 100644 --- a/common/constants.py +++ b/common/constants.py @@ -1,34 +1,39 @@ GAME_TITLE = 'WMICraft' WINDOW_HEIGHT = 800 WINDOW_WIDTH = 1360 +FPS_COUNT = 60 + GRID_CELL_PADDING = 5 -GRID_CELL_WIDTH = 36 -GRID_CELL_HEIGHT = 36 +GRID_CELL_SIZE = 36 ROWS = 19 COLUMNS = 24 + BORDER_WIDTH = 10 BORDER_RADIUS = 5 -FPS_COUNT = 60 + KNIGHTS_SPAWN_WIDTH = 4 KNIGHTS_SPAWN_HEIGHT = 7 LEFT_KNIGHTS_SPAWN_FIRST_ROW = 6 LEFT_KNIGHTS_SPAWN_FIRST_COL = 0 RIGHT_KNIGHTS_SPAWN_FIRST_ROW = 6 RIGHT_KNIGHTS_SPAWN_FIRST_COL = 20 -NBR_OF_WATER = 10 -NBR_OF_TREES = 16 CASTLE_SPAWN_WIDTH = 6 +# CASTLE_SPAWN_WIDTH = 0 CASTLE_SPAWN_HEIGHT = 5 +# CASTLE_SPAWN_HEIGHT = 0 CASTLE_SPAWN_FIRST_ROW = 7 CASTLE_SPAWN_FIRST_COL = 9 + +NBR_OF_WATER = 16 +NBR_OF_TREES = 20 +NBR_OF_MONSTERS = 2 + TILES = [ 'grass1.png', 'grass2.png', 'grass3.png', - # 'grass4.png', - # 'grass5.png', - # 'grass6.png', + 'grass4.png', 'sand.png', 'water.png', 'grass_with_tree.jpg', diff --git a/helpers/debug.py b/helpers/debug.py new file mode 100644 index 0000000..c5c9bee --- /dev/null +++ b/helpers/debug.py @@ -0,0 +1,15 @@ +import pygame.display + +from common.constants import GRID_CELL_PADDING, GRID_CELL_SIZE, COLUMNS, ROWS + + +def print_numbers(): + display_surface = pygame.display.get_surface() + font = pygame.font.SysFont('Arial', 16) + + for row_index in range(ROWS): + for col_index in range(COLUMNS): + x = (GRID_CELL_PADDING + GRID_CELL_SIZE) * col_index + GRID_CELL_PADDING + 7 + y = (GRID_CELL_PADDING + GRID_CELL_SIZE) * row_index + GRID_CELL_PADDING + 16 + display_surface.blit(font.render(f'[{col_index}, {row_index}]', True, (255, 0, 0)), (x, y)) + pygame.display.update() diff --git a/logic/field.py b/logic/field.py deleted file mode 100644 index 0faa309..0000000 --- a/logic/field.py +++ /dev/null @@ -1,28 +0,0 @@ -import pygame - -from logic.exceptions import FieldNotWalkable - - -class Field(pygame.sprite.Sprite): - def __init__(self, texture_path, converted_texture, img, rect, row=0, column=0): - super().__init__() - self.texture_path = texture_path - self.converted_texture = converted_texture - self.image = img - self.row = row - self.column = column - self.rect = rect - self.busy = False - self.busy_detection() - - def busy_detection(self): - if self.texture_path == 'water.png' or self.texture_path == 'grass_with_tree.jpg': - self.busy = True - - def put_on(self, obj): # ustawia objekt na srodku pola - if not self.busy: - obj.rect = obj.rect.clamp(self.rect) - self.busy = True - obj.update() - else: - raise FieldNotWalkable diff --git a/logic/game.py b/logic/game.py index 436d514..35cb1b9 100644 --- a/logic/game.py +++ b/logic/game.py @@ -2,19 +2,14 @@ import sys import pygame -from common.colors import FONT_DARK, WHITE from common.constants import * -from common.helpers import draw_text -from logic.knights_queue import KnightsQueue -from models.castle import Castle -from models.knight import Knight -from models.monster import Monster +from helpers.debug import print_numbers +from logic.level import Level from ui.logs import Logs from ui.screens.credits import Credits +from ui.screens.main_menu import MainMenu from ui.screens.options import Options from ui.stats import Stats -from .grid import Grid -from .spawner import Spawner class Game: @@ -26,99 +21,24 @@ class Game: self.screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) self.clock = pygame.time.Clock() - self.tiles = [] - for tile_path in TILES: - converted_tile = pygame.image.load('resources/textures/' + tile_path).convert_alpha() - self.tiles.append((tile_path, converted_tile)) - self.bg = pygame.image.load("./resources/textures/bg.jpg") self.screens = {'credits': Credits(self.screen, self.clock), 'options': Options(self.screen, self.clock)} - click = False + self.level = Level(self.screen) def main_menu(self): - while True: - self.screen.blit(self.bg, (0, 0)) - - pygame.draw.rect(self.screen, (255, 255, 255), pygame.Rect(800, 100, 400, 500), 0, 5) - draw_text('MAIN MENU', FONT_DARK, self.screen, 850, 150, 30, True) - - mx, my = pygame.mouse.get_pos() - - button_1 = pygame.Rect(850, 250, 300, 50) - button_2 = pygame.Rect(850, 350, 300, 50) - button_3 = pygame.Rect(850, 450, 300, 50) - if button_1.collidepoint((mx, my)): - if click: - self.game() - if button_2.collidepoint((mx, my)): - if click: - self.screens['options'].display_screen() - if button_3.collidepoint((mx, my)): - if click: - self.screens['credits'].display_screen() - pygame.draw.rect(self.screen, (0, 191, 255), button_1, 0, 4) - draw_text('PLAY', WHITE, self.screen, 870, 255) - - pygame.draw.rect(self.screen, (0, 191, 255), button_2, 0, 4) - draw_text('OPTIONS', WHITE, self.screen, 870, 355) - - pygame.draw.rect(self.screen, (0, 191, 255), button_3, 0, 4) - draw_text('CREDITS', WHITE, self.screen, 870, 455) - - click = False - for event in pygame.event.get(): - if event.type == pygame.QUIT: - pygame.quit() - sys.exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - pygame.quit() - sys.exit() - if event.type == pygame.MOUSEBUTTONDOWN: - if event.button == 1: - click = True - - pygame.display.update() - self.clock.tick(60) + menu = MainMenu(self.screen, self.clock, self.bg, + self.game, + self.screens['options'].display_screen, + self.screens['credits'].display_screen) + menu.display_screen() def game(self): - running = True - grid = Grid(self.tiles) stats = Stats() logs = Logs() - knights_sprite_group = pygame.sprite.Group() - monsters_sprite_group = pygame.sprite.Group() - castle_sprite_group = pygame.sprite.Group() - - knights_left = self.generate_knights_team(knights_sprite_group) - knights_right = self.generate_knights_team(knights_sprite_group) - - knights_queue = KnightsQueue(knights_left, knights_right) - - spawn_left_team = Spawner(grid, knights_left, KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT, - LEFT_KNIGHTS_SPAWN_FIRST_ROW, LEFT_KNIGHTS_SPAWN_FIRST_COL) - spawn_right_team = Spawner(grid, knights_right, KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT, - RIGHT_KNIGHTS_SPAWN_FIRST_ROW, - RIGHT_KNIGHTS_SPAWN_FIRST_COL) - - spawn_left_team.spawn() - spawn_right_team.spawn() - - spawned_monsters = self.generate_monster(monsters_sprite_group) - monster_spawn = Spawner(grid, spawned_monsters, spawn_where_possible=True) - - monster_spawn.spawn() - - spawned_castle = self.generate_castle(castle_sprite_group) - castle_spawn = Spawner(grid, [spawned_castle], CASTLE_SPAWN_WIDTH, CASTLE_SPAWN_HEIGHT, - CASTLE_SPAWN_FIRST_ROW, CASTLE_SPAWN_FIRST_COL) - - castle_spawn.spawn() - - #grid.put_on_tile(0, 0, knights_left[0]) - + print_numbers_flag = False + running = True while running: self.screen.blit(self.bg, (0, 0)) @@ -129,37 +49,16 @@ class Game: if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False + if event.key == 110: # clicked n letter on keyboard + print_numbers_flag = not print_numbers_flag - grid.update(self.screen) stats.draw(self.screen) logs.draw(self.screen) - knights_sprite_group.draw(self.screen) - monsters_sprite_group.draw(self.screen) - castle_sprite_group.draw(self.screen) + self.level.run() + + if print_numbers_flag: + print_numbers() + pygame.display.update() self.clock.tick(FPS_COUNT) - - @staticmethod - def generate_knights_team(knights_sprite_group): - knights = [] - for i in range(4): - knight = Knight("./resources/textures/knight.png") - knights.append(knight) - knights_sprite_group.add(knight) - return knights - - @staticmethod - def generate_monster(monsters_sprite_group): - monsters = [] - for i in range(2): - monster = Monster() - monsters.append(monster) - monsters_sprite_group.add(monster) - return monsters - - @staticmethod - def generate_castle(castle_sprite_group): - castle = Castle() - castle_sprite_group.add(castle) - return castle diff --git a/logic/grid.py b/logic/grid.py deleted file mode 100644 index 8074713..0000000 --- a/logic/grid.py +++ /dev/null @@ -1,86 +0,0 @@ -import random -import numpy as np -import pygame - -from common.constants import ROWS, COLUMNS, GRID_CELL_PADDING, GRID_CELL_WIDTH, GRID_CELL_HEIGHT, BORDER_WIDTH, \ - BORDER_RADIUS, NBR_OF_TREES, NBR_OF_WATER -from .exceptions import FieldNotWalkable -from .field import Field - - -class Grid: - def __init__(self, textures): - self.textures = textures - self.grid = [] - self.free_fields = [] - self.busy_fields = [] - podkladka = np.zeros((ROWS, COLUMNS)) - for drzewa in range(0, NBR_OF_TREES): - rzad = random.randint(0, ROWS - 1) - kolumna = random.randint(0, COLUMNS - 1) - if podkladka[rzad][kolumna] == 0: - podkladka[rzad][kolumna] = 1 - else: - drzewa = drzewa - 1 - for i in range(0, NBR_OF_WATER): - rzad = random.randint(0, ROWS - 1) - kolumna = random.randint(0, COLUMNS - 1) - if podkladka[rzad][kolumna] == 0: - podkladka[rzad][kolumna] = 2 - else: - drzewa = drzewa - 1 - - for row in range(ROWS): - self.grid.append([]) - for column in range(COLUMNS): - box_rect = [(GRID_CELL_PADDING + GRID_CELL_WIDTH) * column + GRID_CELL_PADDING + 7, - (GRID_CELL_PADDING + GRID_CELL_HEIGHT) * row + GRID_CELL_PADDING + 7, - GRID_CELL_WIDTH, - GRID_CELL_HEIGHT] - if podkladka[row][column] == 1: - texture_path, converted_texture = self.textures[-1] - elif podkladka[row][column] == 2: - texture_path, converted_texture = self.textures[-2] - else: - texture_path, converted_texture = self.get_random_texture() - field = Field( - texture_path, - converted_texture, - pygame.transform.scale(converted_texture, - (GRID_CELL_WIDTH, - GRID_CELL_HEIGHT)), - pygame.Rect(box_rect), - row=row, - column=column - ) - if field.busy: - self.busy_fields.append(field) - else: - self.free_fields.append(field) - - self.grid[row].append(pygame.sprite.Group(field)) - - def update(self, screen): - self.draw(screen) - - def get_random_texture(self): - texture_index = random.randint(0, len(self.textures) - 3) - return self.textures[texture_index] - - def get_tile(self, row, column): - return pygame.sprite.Group.sprites(self.grid[row][column])[0] # iteruj kolumny i wiersze od 0 - - def put_on_tile(self, row, column, obj): # iteruj kolumny i wiersze od 0 - try: - self.get_tile(row, column).put_on(obj) - except FieldNotWalkable: - print("Field busy") - - def draw(self, screen): - bg_width = (GRID_CELL_PADDING + GRID_CELL_WIDTH) * COLUMNS + BORDER_WIDTH - bg_height = (GRID_CELL_PADDING + GRID_CELL_HEIGHT) * ROWS + BORDER_WIDTH - pygame.draw.rect(screen, (255, 255, 255), pygame.Rect(5, 5, bg_width, bg_height), 0, BORDER_RADIUS) - - for fields_row in self.grid: - for fields in fields_row: - fields.draw(screen) diff --git a/logic/level.py b/logic/level.py new file mode 100644 index 0000000..1ec13d3 --- /dev/null +++ b/logic/level.py @@ -0,0 +1,88 @@ +import random + +import pygame + +from common.constants import * +from logic.spawner import Spawner +from models.castle import Castle +from models.knight import Knight +from models.monster import Monster +from models.tile import Tile + + +class Level: + def __init__(self, screen): + self.screen = screen + + # sprite group setup + self.sprites = pygame.sprite.Group() + + self.create_map() + + def generate_map(self): + map = [[' ' for x in range(COLUMNS)] for y in range(ROWS)] + + spawner = Spawner(map) + spawner.spawn_where_possible(['w' for x in range(NBR_OF_WATER)]) + spawner.spawn_where_possible(['t' for x in range(NBR_OF_TREES)]) + + spawner.spawn_in_area(['k' for x in range(4)], LEFT_KNIGHTS_SPAWN_FIRST_ROW, LEFT_KNIGHTS_SPAWN_FIRST_COL, + KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT) + spawner.spawn_in_area(['k' for x in range(4)], RIGHT_KNIGHTS_SPAWN_FIRST_ROW, RIGHT_KNIGHTS_SPAWN_FIRST_COL, + KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT) + + spawner.spawn_in_area(['c'], CASTLE_SPAWN_FIRST_ROW, CASTLE_SPAWN_FIRST_COL, CASTLE_SPAWN_WIDTH, + CASTLE_SPAWN_HEIGHT, 2) + + spawner.spawn_where_possible(['m' for x in range(NBR_OF_MONSTERS)]) + + return map + + def create_map(self): + map = self.generate_map() + + textures = [] + for texture_path in TILES: + converted_texture = pygame.image.load('resources/textures/' + texture_path).convert_alpha() + converted_texture = pygame.transform.scale(converted_texture, (40, 40)) + textures.append((texture_path, converted_texture)) + + castle_count = 0 # TODO: find some smarter method to print castle + + for row_index, row in enumerate(map): + print(row) + for col_index, col in enumerate(row): + x = (GRID_CELL_PADDING + GRID_CELL_SIZE) * col_index + GRID_CELL_PADDING + 7 + y = (GRID_CELL_PADDING + GRID_CELL_SIZE) * row_index + GRID_CELL_PADDING + 7 + + # add base tiles, e.g. water, tree, grass + if col == "w": + texture_index = 5 + texture_surface = textures[texture_index][1] + Tile((x, y), texture_surface, self.sprites, 'w') + elif col == "t": + texture_index = 6 + texture_surface = textures[texture_index][1] + Tile((x, y), texture_surface, self.sprites, 't') + else: + texture_index = random.randint(0, 4) + texture_surface = textures[texture_index][1] + Tile((x, y), texture_surface, self.sprites) + + # add objects, e.g. knights, monsters, castle + if col == "k": + map[row_index][col_index] = Knight((x, y), self.sprites) + elif col == "m": + map[row_index][col_index] = Monster((x, y), self.sprites) + elif col == "c": + castle_count += 1 + if castle_count == 4: + map[row_index][col_index] = Castle((x, y), self.sprites) + + def run(self): + bg_width = (GRID_CELL_PADDING + GRID_CELL_SIZE) * COLUMNS + BORDER_WIDTH + bg_height = (GRID_CELL_PADDING + GRID_CELL_SIZE) * ROWS + BORDER_WIDTH + pygame.draw.rect(self.screen, (255, 255, 255), pygame.Rect(5, 5, bg_width, bg_height), 0, BORDER_RADIUS) + + # update and draw the game + self.sprites.draw(self.screen) diff --git a/logic/spawner.py b/logic/spawner.py index 69286ce..67431e4 100644 --- a/logic/spawner.py +++ b/logic/spawner.py @@ -1,36 +1,33 @@ import random -from common.constants import GRID_CELL_PADDING, GRID_CELL_WIDTH, GRID_CELL_HEIGHT +from common.constants import COLUMNS, ROWS + class Spawner: - def __init__(self, grid, objs_to_spawn_list: list, spawn_area_width=0, spawn_area_height=0, spawn_area_pos_row=0, - spawn_area_pos_column=0, spawn_where_possible=False): # kolumny i wiersze liczymy od 0; - self.objs_to_spawn_list = objs_to_spawn_list - self.spawn_area_width = spawn_area_width - self.spawn_area_height = spawn_area_height - self.spawn_area_pos_row = spawn_area_pos_row - self.spawn_area_pos_column = spawn_area_pos_column - self.grid = grid - self.spawn_where_possible = spawn_where_possible + def __init__(self, map): + self.map = map - def spawn(self): - if self.spawn_where_possible: - possible_fields = self.grid.free_fields - else: - possible_fields = [] - for field in self.grid.free_fields: - if (self.spawn_area_pos_column <= field.column < (self.spawn_area_width + self.spawn_area_pos_column)) \ - and (self.spawn_area_pos_row <= field.row < (self.spawn_area_height + self.spawn_area_pos_row)): - possible_fields.append(field) + def __is_free_field(self, field): + return field == ' ' - for obj in self.objs_to_spawn_list: - ran_index = random.randint(0, len(possible_fields)-1) - ran_field = possible_fields[ran_index] - ran_field.busy = True - obj.rect = obj.rect.clamp(ran_field) - self.grid.busy_fields.append(ran_field) - if ran_field in self.grid.free_fields: - self.grid.free_fields.remove(ran_field) - if ran_field in possible_fields: - possible_fields.remove(ran_field) - obj.update() + def spawn_in_area(self, objects: list, spawn_area_pos_row=0, spawn_area_pos_column=0, spawn_area_width=0, + spawn_area_height=0, size=1): + spawned_objects_count = 0 + + while spawned_objects_count != len(objects): + x = random.randint(0, spawn_area_height) + spawn_area_pos_row + y = random.randint(0, spawn_area_width) + spawn_area_pos_column + if x < ROWS-1 and y < COLUMNS-1 and self.__is_free_field(self.map[x][y]): + for i in range(size): + for j in range(size): + self.map[x-i][y-j] = objects[spawned_objects_count] + spawned_objects_count += 1 + + def spawn_where_possible(self, objects: list): + spawned_objects_count = 0 + while spawned_objects_count != len(objects): + x = random.randint(0, ROWS-1) + y = random.randint(0, COLUMNS-1) + if self.__is_free_field(self.map[x][y]): + self.map[x][y] = objects[spawned_objects_count] + spawned_objects_count += 1 diff --git a/models/castle.py b/models/castle.py index 5c0b4af..ca75946 100644 --- a/models/castle.py +++ b/models/castle.py @@ -2,14 +2,9 @@ import pygame.image class Castle(pygame.sprite.Sprite): - images = [] - - def __init__(self): - super().__init__() - - self.image = pygame.image.load("./resources/textures/castle.png") + def __init__(self, position, group): + super().__init__(group) + self.image = pygame.image.load("./resources/textures/castle.png").convert_alpha() self.image = pygame.transform.scale(self.image, (78, 78)) - self.images.append(self.image) - self.rect = self.image.get_rect() - castle_list = pygame.sprite.Group() + self.rect = self.image.get_rect(center=position) self.health = 80 diff --git a/models/knight.py b/models/knight.py index a4e264c..6e8a18a 100644 --- a/models/knight.py +++ b/models/knight.py @@ -1,17 +1,48 @@ import pygame.image import random +from common.constants import GRID_CELL_SIZE + + +def load_knight_textures(): + random_index = random.randint(1, 4) + states = [ + pygame.image.load(f'resources/textures/knight_{random_index}_up.png').convert_alpha(), # up = 0 + pygame.image.load(f'resources/textures/knight_{random_index}_right.png').convert_alpha(), # right = 1 + pygame.image.load(f'resources/textures/knight_{random_index}_down.png').convert_alpha(), # down = 2 + pygame.image.load(f'resources/textures/knight_{random_index}_left.png').convert_alpha(), # left = 3 + ] + return states + + class Knight(pygame.sprite.Sprite): - def __init__(self, img): - super().__init__() - self.images = [] - self.image = pygame.image.load("./resources/textures/knight.png") - self.image = pygame.transform.scale(self.image, (40, 40)) - self.images.append(self.image) - self.rect = self.image.get_rect() + + def __init__(self, position, group): + super().__init__(group) + + self.direction = 2 + self.states = load_knight_textures() + + self.image = self.states[self.direction] + self.rect = self.image.get_rect(topleft=position) self.health = random.randint(7, 12) self.attack = random.randint(4, 7) - self.defense = random.randint(1,4) + self.defense = random.randint(1, 4) self.points = 1 + # direction arg = -1 to rotate left + # direction arg = 1 to rotate right + def rotate(self, direction): + self.direction = (self.direction + direction) % 4 + self.image = self.states[self.direction] + + def step_forward(self): + if self.direction == 0: + self.rect.y = self.rect.y - GRID_CELL_SIZE + elif self.direction == 1: + self.rect.x = self.rect.x + GRID_CELL_SIZE + elif self.direction == 2: + self.rect.y = self.rect.y + GRID_CELL_SIZE + else: + self.rect.x = self.rect.x - GRID_CELL_SIZE diff --git a/models/monster.py b/models/monster.py index bec0315..7109dff 100644 --- a/models/monster.py +++ b/models/monster.py @@ -1,47 +1,36 @@ import pygame.image import random +monster_images = [ + pygame.image.load("./resources/textures/dragon2.png"), + pygame.image.load("./resources/textures/birb.png"), + pygame.image.load("./resources/textures/wolfart.png"), + pygame.image.load("./resources/textures/goblin.png"), +] + class Monster(pygame.sprite.Sprite): - monster_images = [] - - def __init__(self): - super().__init__() - - self.monster_image1 = pygame.image.load("./resources/textures/dragon2.png") - self.monster_image1 = pygame.transform.scale(self.monster_image1, (40, 40)) - self.monster_image2 = pygame.image.load("./resources/textures/birb.png") - self.monster_image2 = pygame.transform.scale(self.monster_image2, (40, 40)) - self.monster_image3 = pygame.image.load("./resources/textures/wolfart.png") - self.monster_image3 = pygame.transform.scale(self.monster_image3, (40, 40)) - self.monster_image4 = pygame.image.load("./resources/textures/goblin.png") - self.monster_image4 = pygame.transform.scale(self.monster_image4, (40, 40)) - self.monster_images.append(self.monster_image1) - self.monster_images.append(self.monster_image2) - self.monster_images.append(self.monster_image3) - self.monster_images.append(self.monster_image4) - #self.images.append(self.image1) - self.image = random.choice(self.monster_images) - self.rect = self.image.get_rect() - monster_list = pygame.sprite.Group() - + def __init__(self, position, group): + super().__init__(group) + self.image = random.choice(monster_images) + self.image = pygame.transform.scale(self.image, (40, 40)) + self.rect = self.image.get_rect(topleft=position) self.health = random.randrange(15, 25) self.attack = random.randrange(2, 10) - if self.image == self.monster_images[0]: + if self.image == monster_images[0]: self.health = 20 self.attack = 9 self.points = 10 - elif self.image == self.monster_images[1]: + elif self.image == monster_images[1]: self.health = 15 self.attack = 7 self.points = 7 - elif self.image == self.monster_images[2]: + elif self.image == monster_images[2]: self.health = 10 self.attack = 4 self.points = 4 - elif self.image == self.monster_images[3]: + elif self.image == monster_images[3]: self.health = 7 self.attack = 2 self.points = 2 - diff --git a/models/tile.py b/models/tile.py new file mode 100644 index 0000000..e4dc283 --- /dev/null +++ b/models/tile.py @@ -0,0 +1,9 @@ +import pygame + + +class Tile(pygame.sprite.Sprite): + def __init__(self, position, image, group, tile_type=' '): + super().__init__(group) + self.image = image + self.rect = self.image.get_rect(topleft=position) + self.tile_type = tile_type \ No newline at end of file diff --git a/resources/textures/knight_1_down.png b/resources/textures/knight_1_down.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe50367abb4f045a6ca2eb79ce36a701bc6fef0 GIT binary patch literal 17675 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

SqD~#Vqu&ve7S-3U9cA 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%0D>;ZFIXgF(GGh+ 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 ZTUBrN{amK;{Mh_~$Vhw=uN5^2{685+?Y#g1 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_1_right.png b/resources/textures/knight_1_right.png new file mode 100644 index 0000000000000000000000000000000000000000..6374b9dd82c745f21fb1e290e37291529e85bc0c GIT binary patch literal 15679 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%0D{wGD}s~T_#&^M>{SB)@whnH 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 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_1_up.png b/resources/textures/knight_1_up.png new file mode 100644 index 0000000000000000000000000000000000000000..3a465c9d4a6c949bbff5a210b471ded010b75d0b GIT binary patch literal 17043 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 I7Sa#+KYB))1poj5 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_2_down.png b/resources/textures/knight_2_down.png new file mode 100644 index 0000000000000000000000000000000000000000..288481cb1869f5acc34bbbd14dde0d9ccbeffe5a GIT binary patch literal 18816 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

p=z%9Q6}LWiIcK7tP?e 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 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_2_left.png b/resources/textures/knight_2_left.png new file mode 100644 index 0000000000000000000000000000000000000000..0c83300a7c14f337a40009c5a506b56ebbdfbbcf GIT binary patch literal 18146 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 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_2_right.png b/resources/textures/knight_2_right.png new file mode 100644 index 0000000000000000000000000000000000000000..905a7513af1067817a1e91f5f878f5d11b6c7444 GIT binary patch literal 18053 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

`fN&aoz#r6%z!RNR2HP9VvT%(LcRuDgExV7L-e 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 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_2_up.png b/resources/textures/knight_2_up.png new file mode 100644 index 0000000000000000000000000000000000000000..2cef1c93588ea0e606810818d8b27f7dc5eab041 GIT binary patch literal 18027 zcmeIZV{~L)*EJlcVp|p4w%xHiwr$&X$9BiI(J?#juw$pg4!-nt`+J{1&lvCf@2(o9 zz1Ny+t-0skbxxgKk&5z?2(Y-YARr(J(o$l|AFot@9ssD1=a{!PTM!UhelJx`7iB|t zpo5dWnWc>>(8bfi6lm&UX$At~u~w38=|%Hgw zZ24h8U*EmA*RTuy3A>k3`^odYc6sm;&W8vp@28+{d3B!sWUpUQ*_Oi9GTiG1)k$QG z!u?F>^Gs-=?-oE13wx`<=eYXK6Xw>3$lvd69qNte745Y1{xbUI^;C7WJI9kbGY7ly za0}a?5O`AC&h;&}sWH(cQ^@(FJbb+&4VH`ri9A z`r0YzP%AK)?GvBOC?=&Y&6DnW|r-5f=<^m1%Z+j-Db*6S!}a72bqy z+|M!PV(nKP_Mkp7GO>-Kj;l#Bib~r;{GCZ%2Isw^Vn;MMUzYnY$=a^{P{~M|JYCre zg(?o$+KGKx+1j>wdCo|dzIEQpy1I3)T2hGhVcy!l`+>RbaCI)<@s0p(b=P=hRdvru3jyb2{X|XYdCw>evd(;{$EG?(=(I zKkf6;ukSa9TXmlw>ofUfk7Mszmpq!k>!$;PlIgMxnVhK&u4&M=XDPCtFqK)f{?Fpj^ zsBeWS8Ay1!aJ11o)4U7aw{^lD97w$QznwVb`84o7QInrwiSU{t*>j*QZrFJ-@2;!E+o|-&mAa7si(5Bvg%#XBzv*vB5tNWi!-h^ef3^*L}P{zARIo}gfZ?!+U5rcll z*(5l{5=Dy9kk#4QEde)LkP0E zTxOKeZrmQn8>dLnnso16wyXks3v8aq#5`5@w0Gi1#o8ms^l)I~)F_AAqg%09VeknZK&;vy(Sr;h8TrB5J$SZ?-udIPntE;n@lqkNlXU$?7v6B%UFU zi5V`%R|aR$-+%JIE&45xQIK#lA47cW6S%Tc;@MJy-R~^_2qTvjDHQt!mxlVtrbNf* z7ef%{#cZZvXLW@@Y9Da3X+tal(%0S2_ zy^1mgG%gY?6-0RWgqi&eX^3SZY2Tg$8|GCvupN`%?{ zkVo+>W&4(f+w#pPJOxBF=-WW{&l`6xEuiRaaD+(#g=(nYr~sDx#*hV?Bgr-c=^&0) zkhokKzVEuFtMoSDX>eCUQioH1d$(%(ISIdM$OhV$agv9Y8Ds|`@hjkwh*iSDHS~w~ zhF!;mtnIl_XNBhB&CRw$9%WtxpXP#Y5!XHLejE>-1oS&gNs{398MiFBV^-_kt+lOQ zrK+q&SQ~k7)XmHfuE7?JJ@++#p5~6Tk+CqGoc?j$*1@N6yDRQ>ufW3`yjRm9y_4TM9C=3NNb0fX2c&#nA;;Y z4S`8DqSS5^8jPFJ_xXhrBGVE;NC878+Su#nBCaQ1VeY48`F=g#&5GGmGujsxMw-Nz z#mX{?o8Be^Q3<-{bTE$NZVbGHqUlVa+(w?u1pv|se+9sB z23iy`HB#1`7P^gX+51Y@EGm zOMbO$2(6md{y<&xV~=&{Tzxc0q<+L47vcQWV2Lh*YmW>?a{yA#Q?+zdAeF}Aggf1NfqMnJ;LJ^u zSS5jA_2PUtAyg&JwM(pHrg=(07V4{D2)NHfLBeo4XeYW20tU>avynv!OFI@qgqF_9 zrMs{Dpe{(40jA<6bZb0=74DzMLzYeH6R7(4zQL`?=+Nfs%xrR5Q6M^)cX9P&qo5A4 z8Ce&oOYI=ntoSC`IR?;~B%>#d+h4*}JS3wyl_CYm#m_I%s(aMbZF+Cau87jNJXs_fWx2NrfQ zCYG`Fz`&DcjjroHLPOZ>T`Ce|6vd&#Sb|X+v5pH&FyL2!yp`@(mXKbnqe-rYH^IG$ z+Jx8Z8pHA?@;wZO2U2+Cfvz&PZU0<R#3W;%j3eJ z-=clL9Yuc7e`OQZcW+HSUE6;}v3WtN7fb*K~E|h|Pf`JHA zMS>&jtQ2hWYF*zX^_imA{)^+Nc^|yZYCyhI(Q;@$thz9yQ1@W?Y$ak9M*})_GLSoj zspgI3m$?=KEKH@5!Vse;!Bm$5m_Kw3fg6Z7*g4=cz7gJya^~*mm2lqvph#18aB!+JO-~8chKSUXB{3R})f|lZD$d15ehubQH^5JQ`MUIxWaifr^gfe_lkqiuO ziTb}q5S-HGVi+2fbAx+u$plaC#$^EP!TmO*;2an&4M-D9LRa>|rh_R7frn44 zAwW~w>9EDy(l$er z8T{5*bOCn`zWW1aem$|G3iaMDK1Iu0c;=u{Qh!VPRL&DMwl!ccpneu*t zuM#BM{AfO52o-zm9|NM$EXnK0hnW)D=ZsClFrjgct+Rsg6vGsBC$=h{gw_uP>-sQ> zm;C;YBz7udE}z5|Zl)c?VbrBgE zh64rHxx5KG7Zak81l5%>TNEEfaS*rK$>1-dSR#I8ZwIWNOJoh`-8n~J_svB#5?^j7@0`fFL-#R1_fGk(dQb!_O4y2JrggjF{$iaGiSsn1{sCCot$svfl-7 zJYV`PbllkKUprsHDV_Bu;wOn9%=i2L!@nQ<|k z12)N)!koa=EdZ>Dw~Q_!ysY_39&n7I|9)fTX;1pKWFENexQ$SU1`PR0v{YN=25zHP zVVHnkbNZBu4ssuQi8Y2y_FXe1P~4e;{@Bg!^NmYBB8SIMj4O{w97AZrMT2Q9R2)AI z)mc)~`s(P;eTBz*$MWqgX;_@E9hUdt&zQ9x`-@nwRkJpdK|oXRA*YK^J;qs4VCB=Q zEqo>e*&u@mLF3CXF||L|{J^|4is827gQG$*sDAH}7>xTFCBtVu!h*pE(kf{PrS-|& zrpJtjz)bH`*8E6AyKI8k-sq>bCH3;;_pX>#1IK#e3kkB za88|>*;`DiRn7xr38CC6`%<3(HBMZ14M?5yBsrig$)bjVP+x zJvkA)yB8EE*e0xFqnR z)Sm-*xu*dU5&Eqf9FX+QH@p}0unI748Ue;4iO!12mDk{?ImC@RuyJM;0d+NBXL87_8ie2N81=xtGA--2ct@&VxlT?S0 z%5cFrV_*w$wZ`C+Gszk6&|%?+t~VygrSS#+!t0D8s=WQQ^YAJ|M8hpqHNt_^EE>I- zrf0k04Yj>`W+XdBv9wHF>mmR75nX0ffh1xH+dt3HYNTv4-T+ z1kzlLqKmU*+0eOC9AK|rRf@C5Ptn`q0#quH2qomJN^0<6Y%IErl}G_;mBW0DlG|C~ zWaZQ4E)wDVsUHLD>HscG|Ci$BE-c2HvlhWx|MF1X<9l!sjXc$?tS1!88t%xqFqdGi z?*u&BeKIgDP>UoT=BOA<&6NpO{PgkKxx>SY4m_2%d(mI#l7&g03-HeoG^*J#gza1s zARKTCK+PV)I0r`@b(%E`6A))Vi$Q8L6G{2+R~f2M4=(OJZ{q=^%j1J+>(cntGz{2L zq-Rv5dRx=m4c|$t4cb5tqy*Hrr6IkN;rLS=xZ-w#v8-h0iNgbV(Z+_@UKGn4>XHUw zJvdmP>tnlgO`;+<^c^e!(!#=N;3_L%1CpSyi5ZH$T;Ta(F4SQWfxYF5k>M3Aq9$na zPfPDmKjayxr`YS1*OS`Tx!Y})4pKk&hcUepga+Zve>jN4wmcYnp1hx~f+VB(%!>;%kBi z1(t-L0-=ffw>s50iSQJe9}}Hy(TGTgjco|g5le7!I%h^2AtN|FY?LyTmsl2-uCIzT z6`ebhiuV(?z4auH8g1+fKEoq}5Yt}ELQ$n`Eg?RN>^_0ULC-Os6q+@`kFO=)tSS0+ zVIU1x>R?3{_<=DH0_X9p`BagqzI%!XVF{&)A=(gxYuW%@)R>ql`Cu8D_-@9bce>v+ zA|rm4PuEgbIXSYw0EZ#`R8~0#RuZ%UK46c!Mr`|y9p^Bx;pdoyHPeF|*cg12kl5U} zUiS61CMT*^}&AA@uoBkiPyK3~0!;GF0W7 zIFsujh170mRyS~YMG9fP#$3MDdB;%kn`R9x>9Im5#SFdGaT$GS+h>wzXoXPuLhv4_ zT2K=#r+{A6;bP9Fb81@aceJxw5>puGd^&vxBX8(_Vq5kUQ&Az4rNyy}k@-iQq&M{m zRG=uv9XJ1VA4c%Xr6{iyotqHiwHT9lenV6FWx^td6U2=!AKjjqDZ?>qwinvT()yFf zRTAmW00_MgT2*XPB$S#`z~HX{B)tGI(&C+5SGo`gZ&;hX3EjK9U?{r&B65$hX_8q! zdD}2N!POAjD9OI8K;1<^*Vn1MB-Jl0Fca#!UqH&kHZyVG8)7p~2`xmo_onn1536o+ zWjeyE8QLHqzWIOEZPt!=AuUxNR2KC?9U-nS2%>Pow=8*{RmFCFvEHR;DpJ#XSDsSK zzbz#j4<$2J07AYbK;OY5;ufwaV9pEZyjDJiAB0g>5HCQsWfFT{C|-lI$M~Vb1=P*) zHu9C`7q)lK8n^LD!z)0HH;AQw&ar5!5p9mM20g))I26jGaJ2Qd9&>+B8W#e!zwQU z+mM8@6c^KRvXmZ=i%g7t|aI878f2v+9{-w480|klq5h&#$^_hgWU@2ut#wK(08gjh7HCctSBw2t;`p20PL4k5fPye zQ#9uuA;Rt~Wu|f&1zxG};At50tA#g9Hj3N9HQ|F0z6uGurQTX;ZvrxJhvqPR!2=dU zr0yjOm1FpZPZv-R-WXp$_ul8NHB0T+u-%6TJ)tm-*$J*vT(IL8N>4tHM@C{|U@OX0 z@~fdZ`6>G8!Ujrbige&O1;sA0L3x{I()D#S`R}-?_~H%Fk9!1?(Qd;kOIq$_*fY+0 z=FL)M?kFPoNCO%R&q{d644h_XnRe0Cs=`wwRmoN-6;S*X*Q+KN&VCUr1c9irqjyQr zz{mx)X77+m_ay+lGakwhlx8t$;0em1bBBT@6I$u!qKFm9zSm=ClZ)iZ*w1)PlPyHh zvP=eon_tQ1!j{S6)YS&|@Ei0m+Lvn6v?nzLS6{M-cWs3-*aUpBzCjeiW zR=wmZIwOIFOzm$0LD!7LC!w56p(XZLroHEJ%8h_kr`rAOj5$)|QV_n#<6f)%;147`#)aGo@dL zCL#(q+a^w9QwF~haS)+uF~s%idhTYjoF8f8nIA@5;Id5CPKU4U+hRA;GU$u!K2c@j z(?B}mF7>QLpVIc_Y=Rcs(?cLYlO3}k3cNkbr=RtjgzSs}B*JQnJ=MI38<@DsmZAV{ z1~y$xk%Jy{6aP7rvX#7SL33~O_Yw#4yCRKUl@ab3XpBpV$0N~f9%jq}Dhk~pFi#DP z`AW*;iky%hA0?+Jqph(h4In$0Ch+GB@-nmq)KAE_cP7QW|2+2k*iw0;Tn z!TEgX%Ge<-cDDv4NgF&q`9>>xf$H{di3lkXvRCTNNmoH~;;)k94G;@_TR`)h=^B<$ zxYD`0^3olRVu%CWE}lBkh!rwkyFg2l#80`WsNR*#l(f4)AJ`XoY=(MUq28>oVd6q? z-pfU)iOt|LgXJJu*w|aW7WMXjmlBGH3&!s9X((T|dSFC1af^lFf}GjVX4-{l*B#<@ zO$G`P+Zww~k(EOyfjA?elP;qGs*-i2v&GhVREmtXVs+j^ykCyz_iRBsw`~@mYgErILp)+2QYgsD=B|ldArFu3WQh2lIyV@s6YM3$(?^ zEn94$E2o2{R&+Xi<8fwEGhJ3!S0WfripV?Y$zE~6tlluPhyqn;7^t0tGC$AH0LC_d zFT++cu|dHBqgK`|`K9e&lz&1njIlk^kz>^?DDFX(Xa+Q~NVv1ck9(*Z7(7>ij?}1UmPDh_KVYn82&~A_g{4IN?rWh&j@QVuLji&L!6^!8OW#&u++fFibOo< z13++>&aa3F*ZGJ2Q4Xu5Pr)p@R?ij;^_U1lx-FwCY)gAy=-o#KWfa!4qkjCKD2vI( z2*Yo&&!DEzlHL)6iJ)hzrj!IGS-0{CMP zkrTM^?RB=(6hL~k(L*50Bc9UC9u>_LYO*9Ep?S+tRHnX`@7fY9rF{HCUfHFJTL`y9 zJHMpAs{Dy}D1Qz&dj=HMmNb{0h0}rCvnVB~e3L{D`0eD%7&#hT#&_}V5R3~GcSoRR z2~EQd{Bs%$S#e5kA9Xp4PH;+ASf6u3i{zY(B9(J)xnH^z{j~wiV52b&>HbfXeRm^x z37At#IxWb_^!=cf<4R|%q24M;*w38o`O?+(B@lg1!dEa7E;-9F+)zl{YokAJ-}uc0 z!b-D%IiY7r1|;hgor?{KRNWlqxJdC`+$&cDeDCR-)_XGC-6HVuU~4 z&Qj}qkE8(gSPiTWW9vJH9b-!ZfxaY1Fh&SICO_{?pZ5$x;JB#nI&i@1Ul0zd#`#p+ zuQqkc9ZN{a!h(d@wT$TkPdw<~MX1dzc#X>;niD7h7J#{Pjq8dqb4&9;!LSkKFf=;^ zU{*inAur5u+@Kf6=gAcWney5ou?V z_;|ZPfl^P%U8MKLGYf!dYy>S;n`mVSy&4lQx9&SswOTy!0wIAsiK$>q@nh5$3__RE zAyYAY^0a!ntAMISZD3u{vv7vWJpOI}@6>i-7{a&hC_Y}hE|@c?xlz}Ak3aZqZBEb1q#^q`zu`~85?huC zZL_MOQD@O>K%ynisp1P%3t1`!NPYXnGj0XjSx|vXm>n{q9*>oLQ(DOv$q^u$7yC63 z^AmODwOPBJf3T!>IYk#snwyBoCOR0KPmZyou(M8RN?`*IYB-e`dA}mw_}&?38)zn! zk)_2M3Ha;<@3WDgfbznO2J14&{t{+aFxS*rgV?0km=-%bF0w;xpM;1P0y@Rg3doWk zryE~2YRp>*fXl-mqJCXT6&PSE1SX& zIZka*i!#hMS-o^SE8y%D_ZWWvgm{eiy&w%xA*6D0O`ub$%-_j(;u8!E3d4-Hxac4BopE*sL!gpttFlD@?!X8qY*2G1^ z?d2@rWb42{2SX!fw203VVmDKsaQEA+7d>7kuPeqQ3kFn^{Gd5H+Q!qK{BZZVlgc93 zf2vz+m{+*?;J7!?lpwLVNt4Ur9E<0~L8@F`XX&3hj;SnCf7e0jGQk`Taz!?z`JS}` z_HotyLiW`;B-qU5n={E6kJ{3fL*)2PZ+u~Z2QBwN{3D1~8KM>8l)n1=T2gCOYn2B8 zms~<=$NwQq5Nc$}>Qg0F(GV~=E?aNS+PFEdqeUJX`7U1o-Q`R8Kz^2sgk7-Q&03)_ zoylbf&#xwjx7E$~gwzAtbNvyG{=|AE48>>RfdI0EqoOe816~5v=hNMS>g?xb&Q~V& zIzXzTpwL_d_sd?1J=a`}7Nlc}fiQj-Nn{))eS(%`YPKd#h{|5?6pzw7#TF-pDrtiV z1N%wI9yah@$(I~fam1%a>oS-sM<12?7MC_WKGukCrq7cn$NA3s5J6 z*9qF^h*mvea1>vDiax~S7~^d*6KWY?P88>rV)cU_T>?Wea88@}##1i`JIOogG@6Ek z2H2(A(s6(uVWL*wUE0BZTsk5^vfGJ7B4iE>wYut$()}@;u=`@6KSp8!tMW>08K6AB zev5xJ0uDHywZN#?0LA<=_r-65Cs$@*xgU^6I`HDffw$Kaj1gvMtG?(8$n5iTUCA>4 zf?HF`(?eRH*m9En>UVophiJ3~!p5n^-QFf`im0nYAv{sDtEN+1%TOZD#?p(y()~EQ zgdHV+8#w#CGrvihEFTtbvX|i+q&+ww87nL|e6LW7#`vltg{upN75=3y>`>2%vn;vk zO6LaIW~Yy+kmell>&TmQ>ttw(=ENK!L($ZXeWURzfn0D}@gi=zckZC}8UCvibnGDM zqg|x)OxliednIAOhMnH4=R6LN*l$*rmpeEp_uq%AQBVZk&*K0_D|FVMcMWPSD&~rk zXQ&N&{CAwZd9DW7B@#hw{%kOa4rZ}Y^`$;~(#mJqWF=eNL66V;b`fU%51?G}>_|rm za5c0iSi?(WLYZq41zT5fE|TO*_Y%@na0mesU+9I2Qd3bag%;^$7Jhb#`%>C|b*C>rR2JJzWn4W< zCb1gwIiOb}z>p-jao_OYEk6pJ4?K6ERCvN))3`!Pt0)UpNNAc!SfzS-^4_MU?SB4F zs80AjC?k7FrWSm~Q(U9s{q*`7e|7Mt#-Ar>)QAWF>8gYx{a$8YcV5P|-|PE=#XKCN z9gQIDDe1Fgy-GmiK^2*}{*+X&j!91ojU}cWtfOcIlrwJM46gdt-fI+?iyg*rhYDjo z!ZpFL1k5p&+p8RtitD3qxgN&-na}ps7=u-r%s-s8j&H`{X4{wVa(4H&W0A)y3PG+Gag#v%#`NoHeeull78$lIm~%YHE9InnMxp@F5g^nX3RlKz3RA}3684TPGz>% z{mVHKvNVyTJb!Uk45)X`rsV^5fv=%jM4=3fFsiKE8=^+Qi}Dn_<m*b}iG2jmNs2u)P!^pK8{8HxAOgVL>g~zSm+7-zJH$Y6zDHqX1m$ zk+bq>I7sb%2A3GFgUXJ2evrh2V#&|etHIghHr&SG^vM4~Lu!Qm9fmGJrgz@q;T>P; zqL(-F_Cc}g%P0PnGvS`%a}y<8-{6Q&<{)`#dQ=n^r%wbm;fuyHHlAVcac(=qL%oRH zF+&nUNW6vA798Te%#b!NJhV9c@Dl#aR4(-^nRRQ~f*bR{So3z9>(S6NMMMg+{9bV= zW~m8(u<53iqEipqA|30&v;6-*g65Y^X0v#4ZrCTp&`# zLQR2;K3?aEWSx}Aq9GqwvgH?$DdRFgVtpBTwP()(Il_&Gk&nfx)!zu3t#g-wL%rkd zv@FM7_KKrnzE$|P{JJ7$V5Om}Szw{}OwVTs3?ZR0O0sv=8&LLIK)6Fl^czJq4%Z{8 z(!H;Bg#nZY7i_7cvSX$!mH=xjlo!XB%}JFK+sKRAx-DtUk0zM}aeuU*5q08|-?WdO zmVV_lEf&=f>-!EvPTeSwFmNL1WKZqNhoFF>zxnML8%jcvHXK1==M|C7e{1q^K5?y( zij=BpeJ=-%3b!YMrw;VmEU_&Z^lhM0FhOSYIMd@4=L9!vIfa@<9C;?3HqTUMqfVh1S9Lht*S*5!7 z0_Q-VH|d#+L%DUCdb}B-7)`=TeIZ$Bq@3jZs=yM0%ve23n(ki+QOv~2Io$ybCVqEE zSY|rS6>cCPprMwcqKeX@qW{>s`w=JGH<4dzPzZlmU$FQy4Wb(|$~VOvx`?QVWYu~A zri^xh8g#O3Z@#o>((W!*8z%mX=2xCJuG5ok8bA;cFiu`Ria~kzJxS!_>R#OM>x&dfj`Yy_d_|OIj2%n&bgQ2mtsSD7^)ZEgJpX9Q$mjq~O!cU^XF2^M2AZlu1 zDdpv4s^TTDYV2ig%xyvb1co-So-Q5}7 zSsCn|%o&-vxw#pcSQuGY=szszojvVb3_a-WoJs#c{0&3Q)Y;hSL(rD?cECTFhDP?T zF8m}UAN|08Aypm82{7X!PUv;uX0R`8BJ|WZ9hz%KcX`KM@UI&ImLf^ z{Gq_y($?WGuMe{S!_vjl>|bR4M{a+5{wn9+6ZvreC+>e(|D*Q5j6ba8B@hbaf!2ZYgwHwQaAJ(IDqnW>=>Hy0a| z(Z4|`I9YzE($MDLv-$&N@&UzZ#?8#eY-;!c@F5H~784G7E>;$9dTtXgV-8j$c4k8} zK!Or}zjz5I+2rEkSldv!_{i{XM#?Zy=!{K8NSlXG` zyF34@OV!fWRK>;c51-5&Y}_2oALX-ivaqpmGyls--PFnXLyLbt z`JmSDk5WGX{_^;!hDX%N)X>G=N!8xohM(k5Qoui+e+eAO_qSn@vUL8i@cg6szpGxw z)bVeh{x%70EdS~P0{;>&kD>A3f;bzxnVS3+=)>=CUB(uMcIKuZGyLz8`bWFv|1eyJ z?A(TCY{tg)#$3#%^laQr?DSmh9LDraY%E;tT+GI-OkDpzbZ2`r7k5J^Q(^OuN!Y{~P3g#qWRV`Y&DoD+c~o z#{X5k zj}{mQDJ^FZ5ID3y4^WWIZ0wIlXcuWYap(gGSQJc7M)oO)kG=?LF=18B!R9ZX4jVr` zM+Gl0S6n|=S3n?oEp6fyeF%bpjd)U zcdw@Oo_fQ#!rr!1x6i-Li#&X!+z=)j>geEBcO)FWmDr&Dv{P5l5iCOI=T%8~Cyu{* zlIO~5Y3#~AcRBb@5fhi)9Rx1%-`48)V!8tXB0XQ=9iJRA0f9vYkkuv7WfRkD>sSk@ z4z-DpakO`ox^hm?YdN)y`b`k-*3f{!Xwx@W(Mm3qpV}*&*1fa82NKTRLNE6nE)N;j1&S#)AzcUd()Ic(iF5g zTI`Y_WfB=~LQvwmRW9QynsN(|8llDsSPuD?Vu z>7uRF$}HU&r56zQOEMzzwWf>nxI7-I?n@CHcAWP~MbXPh(gPT96tkle;^CEYVS|xP z7Cdd_2+sUYtEoKn-sV%ua%CO8e5}%^v;}iw#g><3pfU?prpTCN#Az0;k?1js&=HLH zS%G9B$k~E8hU?oV2kY-WuXZtGS*#?kwr_6dSHF!%X9x+WXJ9?QH?cn@VBi#`j8gq% zXnYA*f^4Y3XT0F4eqTNiZ7p|mEFRG!Wf^X|E&+wI4vuXW@OPM=7l&q3dyPg4OiN1ZQ zI`ljc!K9xZ8I0#EpU&H=hLzP;EKhkaRj$U|;8-sB#9XcKij@vGd{;1ik+n>xKiN0H z9fK&h?K+_<1Br`=%Z)F4yQN@fJQxLqFCQs*o@->kGGwNrHM>03#l1YsO<3An8@*-~ zh-ariCB`*=^K-f0e(Oh`oPKyhz29__7 zn5tS+t(NvV1$if`Ih&QIvtnY=74g=NZIBAMvll(slfI$25RCu$OtS69s5eMk9F01`F`9UTJugqCCXkfYe zIG0+&OZ8$~6vPXINqG3N3+y1KP?~9FhkP2%GQuxZyqxWqE2Wlmt}x3?bSIqBWEdMa z1Y#H_L2#x_WRb zes*1s)wBoE94I4AE1=-`M)UO`1>ekVx2?T>owaVi@ z+iCmK%jd;c+uKv($oh3GuBtJ+G95U$3HD!=j$JVE;EJAaim3SxRVS20mQ6?r9jD;*%LH4OGXaB~J%{G) zF;UX~XKhb&+{H8no7}4ny#P1I=P|AM3sUpKFH5lCa3adp%YKdFxVEEN-jPGMiyV)M zWZ!-&4?k2L!%P#bPdtt>f6mlVy@gDQq(LKxd!0`R+jmKI@JKO+c2Cab3b(@Ki`5(5 zLzhh{g-e-$N;B2XNFsC25GHdUVEMHajkQ$CPw#r6Q}3f7QL9!N3ifjd*bgN)Pnpb~ zhT!F8^?3bIBl)d_>)I};b%2AXqhsvj4;ckTcs%tL=)sb2V%6P3=`$oMb;a#DptV-X zIPj9(jshcBifwG!RPXq##yWGIZLKBelDBxnTY?Vuy{zdC9y_TjFB7Hub9i5c8H-nM zvdVDKsnh6Bg_&i#+#Qm9%aXCf;!L#w*M`QKVSzDmCfM+!4J+iFg0IuMblt`T+za2F z8M`K@H8>8_7iE#wRHZrTA?hxn?Q>)O3Kz*6GP={w@+_ZkFr^sqz# zxY|~Uu`m=x(uf3v<`ZvBaJ(m1-e*`-zH=v=ZX227S0+JdSS0(^5+b_QHa-^oQG>%h zo9o=p+X!hc&$gAaos6j8e$-OWFPmn#>k-Lhzp9dRW8l21Edda_y^ex>qBXR7cV`o0 zIXS+o#KblDziYjt4>oC;6q;+ccaE$FF8!GP| za(OUdGj6p1!0Z z%FM+pRboVSeSIVf$N$rxkFYjOHE(hwj-mss2Sy8Z;_~S!?FvKh$@q!XaJdzbw*p9D z)WBM9UnQ^N2zn)+j!T&Ct|u zy4wW`5Lf)HWWMfZo7}~l#?gU9fG2y##hiqd_aNuwbt3{<4&w5?HC;IoP-;esDtGht z!(Do)5grjq0mg$4pU9JWapQGywcj~jilpk%2P$q2B*SQJp7v)eZD|IPTnMA(C=zAF z+YN2wGQ`Qgek-T&MhDH%83*dYWlv*UF6r?pG62Z z>YT{E?uulVW>sez$YqbtFU{YQoSt37m5R=t%S?Phb`$c_-G{icQT@zoa<8o3P2(d8=k{Xl zD3XG;)Dul7m;LuwNoF}(RchUhjCFPlVrI5XZ1&p4nRn2zMC1`~cs9R}!*md7ae1*C I5rd%r4-%h3r2qf` literal 0 HcmV?d00001 diff --git a/resources/textures/knight_3_down.png b/resources/textures/knight_3_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f8313b479badf59c25e64544f1bf35c359d0d606 GIT binary patch literal 15991 zcmeHtWl&t*(k|}7gA<$#1a}5^26qV%WEeEK2MO-(B)Gdva0|hGa1AcOgWDzV(Xa0J z=TzPM@66QRvv;rVr@NokYt`O09j2lr^9qdw4F(406-ZW6?d2En=RiSvIY&Nyvw?x3 zg?!S`aaJ>SqqKLlGqd~%p>+1JhfqS?EzMwH+!qVdEgSWDD+`{T@VOEEg+h8=E53A- z`gniEiMJUXE6hx6aUdV%r-l86WSTGVeDS&JUgW`YCSJa|aZ3K|0VH(Ec2jUWo^|H) zMfqg+9?z%E?6ddkqZiew#umHJQ(e-@{bxZt5!O==qKD*X=bXk4){)MRiRp2ihfDD_ zQmH7w>G0Es;?J!3y}O9_AB?;Tx8?0F$JJAJFK!+m%!zMyf78sm9c2;TUUsTOE?sv9 ziF(2aghap(n3M;G_711=8$}|o zcUP(=<$m5L-wacyWW{{GZ>xK_R`rm7E)poZdSrgMylw8;6@N;Znd|g)Yqc92G0E>y zOF7B+sr=&e(>pweXWO4wF(lujk#6@Kq{&3voP^>BMD_iU>_jAj|jB!TDxA}Og0 zPon-eaO57~oilY7t?O$zCY+`*j33lElvV_FuP?X*t$v8}z;O`)U2y4fs?&STVyXIc zLKV?lxG74mR!JP!El)!Muc+g|VM+5U)(Gzk6rP~aft)z768~Ea z5KUt3$UUcKZPPF}X(G?uG-YL7(KIO$<7;+YFt_^Y1Z+RvorIkArp-8#*eu=BjCZ)a zZdACR+FR?rN0O$to_7?v>+*U(OY3pt{hNNw66dMGqV!LT`{w#;N78Q7qfN`7mX6#W zA{TkfJ0BlebIsO@g9sVgYn~!W#%J#~aq0O6!--+hS%`6}&|p!?@j2I+3bF?n%sP-u zsgaS=Uf0=#6X7WIi+5bnxUzUrmkvBuZR}Xx$uIXj+ij(bUmHpvUw?ZvfHqoKw1;|^ zsze;n%=8}?MNI?`95=}j{!nWEUaiw-ODr5}o?j6%YHuYFVlL32X=Qj+Si`)%Zl~ZD zs7=)ug9fFB`7&N!GtbE_&aJ-F&aN|^H*hp3Gt2UO%2%ki8)XR9HfvdenXaf0n1$y? zWFDga>3SD>)6D3>xhnV|BGj^GIPVR2xPJReF~(JyVfqJ?Gr}6HA+@xJ6&aY+qE1H`sKEr6{{9$nwW*oca=*A zo%*Yf5%-)j)lDk{7|*GOH!eN}yNHp1#E^1@ieD6}#^1{t$f>(@2kOKsi~8al4D^ci zZod|H)F~4;R~~9RQ{C1SUXq;KjxJg?>SYKd)|nhQT__YHO@w8j2D|e{08fsac04z~ zuu}H3@1!cXB4RIcHu(&+Nj9Uz%Kch7zPcPs9d6q)1M}Tkm}WoJa(8=X=MmcxJGsiK z=CS$;S-+P~E7n-GpW^Gll*_`^@f;D^d9J{U^}lJ24O=8>Iv&TiF77{mpZKbKsS_#Y z?ox#My1(H=#iIm{&zsL!Q>EZ0!`uZh(U=)>M=i$)57A6&E@ahvHWY!dnz49NJ!By* zafZxIPX`iH3y)8TOQkb26Axe$hZR+G3X4ET|aVW&?qgu`g z#7RTN?i-m}Q-k%8O^`mZMMoNJ)v#5BuU=RfMbKh2ry5F;=IXPS^T>=0qOItFqaLa! z6PNDVJNErq+;XM)^7=DXPA~b1LHJ3cX#&kkz$QWRYnw@fJtSy z;$|!He$4i~Nu-|?J$c4YY6xRa7tI;tJ=L(24#p)rAZD{-nG1^`&hp9YU#>&Li=~oP zSM-~Dv^dnM)~p8Z>QgjbKc<2^jK5?I2$|K}g^w`itCb^Xb&vO+EW4X!d#2M@qU7DL z49`MWnGLkj;>{))9&HO;UFyM^G?Bdf0kmb%F=MuP{e`8R<|9+`!&KoZ8))4s%k=9E z8wfdHW4ACb?wq(K%EtPmOI&qZ+p4=kHo;wcM)4b4U7g+9qjb^t?>`J_Q4NN&!QUXw zoIqo!h;ZHU4vTFHr)jjDw6{{r394iZ+lGOqDD{fX^q{lZuQDckI-aRy|0aQ%N2@Tq z-sB6O4FYQx5D`YI@e=76iLz9`F00}4Yl5}3WdJKe{S{HOL;BR`Weh|Qq<7*ys{UxA z8Zc()YcL3a5P%vMwkb1lvWnoVZ%c@3DuR=iX!MufBz5BxI%5fEQLWO0WD0uz-fkt`0x%#jsUp6a~z5aZyqRn|?gU@$O-#E}TZpnlZKrdCFX zFb!7d^mH*g@4%AYEJzsk^aNzn{yY)o-~5#@ykgE1oNf_0>b8b$3qoy&!Q6(}C$C|h zSIRv6BYzsLx<`md!Cuk6+n;nrP^)I`0^x9~J&|~>jx@aG!vX4C4wC3<>vO2dQKf)#5bb+6VG zEBx7ye_HMQEl$dSK%ZE5Cd-OmpwEYB$kfi~G6+QF-Zg%z3beJsA)YiPN)v zdV>s#1#MZv5GiWE`wkV{mm`(fi)9Nuf z6@M=E?FXkTw&uwJ7J?kc;BaC%ee&uk7)&iP7WBrhRldLlLE_@&39avCh?*?&9JnNJ z2KDv33u|&^&`_T{GC8C!U?(n&VP!)bd#=BFbq5FkoLejKzu!hJXlVKlW>A%Bh>k#Kqs0_bs6B0XT}Z0hPmE!e+kj&3zGS?5)Lr9G%c< zicqKV#x1bD4^D)ekh+UwnKM|qdv&(kx7N_Sw7b~CAzP1o0H(33QPU2sg;q_LO~90n zxj3HsFg1zbc8&xvY9A=<)e!m?b24?Y$@`Emd=&Nl`g-k+t13a_Kwg74j0qz%P3>fq zQ=Guo0L~SpaQH5z=y_vMPcfbBQ?7qnZcDYdr-seCF#0lfa<=58Bwzu~0DCFZ4fX^H zplGsbjQ*5LrwRtZ$@;2FktTYO_(YYOr{i#Z9_G)>Uk#+Iam_Dhol^D1*EgRq<&;|u zn`5(03zceurfkLyIv(KJL(u)ug5oK^mirKGroiXk z;aH@SX(cXZTJVGu)SlUyQ^~!Ni`i0UO!-9sxZy}kxA>k-g&D$%x}81SmE!FxFKgpM zoHOWY-L36EbgF5Ngy*p{7VBGi@eW(>j%Vn>E`~TzXNoz4c5Ztj`CE9@ILM}@5R=SO zm?Tp5=S~NLeBov z9!v6+Z1LcE&tk5W74e*eNwK-(*Z%ntpx2Z)Qb_2r?bi4Plr|!5u;#_U8@p#V*8o zGpr`ZH-j8l!sby;NTm}-@{}^i*0-KOQNUg9YV3lLq`Mb6l7ZLALe9<<7C*Bp)s$N> z1aa|u$Ry*kxnO@-p{dL<%cH^-F%=Du@5^!}YT=sqmJeZu_d#(Ii}-&1K}He0#simH z5M);a2Jq~2>)#Kv(QZq+OJ{wLy&^6vZ;KMIg_?c`v|^lq-CT`)cv4SNS1EsCIm6g9 zha0+4C1}CZ(wIae(~4}bk&smnWQd2sD5f&evKL~tTbR=D5Vb4UWO&eh*^RxRmPyga z*u(r>D&J4*@al&8fn@tVO)##Dgjv96kcV&Io7dLp5qZ4HjZquk*6g=rmeOhKmV_Os ztS~iiipa4PFgdc8w5kEd=p5p$L^shm65wGmSXV+W9uR%$YceKpPPb}hz^zpZP%R4jh#cCpQoIYerFS!M7wbAaW z1mQpvw|6)WJO}&gXI^7Gpb%?!E=D&MPLu;H<@BU`-g|-w5qjD_5Y7VnR$tX9CqGm7@$~LC9kW7ucKKn!f`M(jV<|o$wyIL6mA@%9_tq$tca^%s}#aCaqV7(P~EYH zl2h#GhwRsqe}WXtfQa!W33u({9vOkdQhQR#-kDB7j=2izF3JZPxCz88 z0rVr&i7a(c>TXOjW<{lV^;2mE>axtUI*X=4f1PBCd0D(@LbK}d}^K#Qeig7530M4hhf_6?A+#-dX zwC`}z|D(XS`Ok*(9!DIG*^xKGz?lgwDe1R_3>A4Rd7bUV*W(t{^A{*MEZ>?b#CU(l7_K3rt`$?hJ=xE zU-zc6`unkxi&S|q)C2bQbj7ei_h$;715c9 zbL5`5C$X?B9g=@}vi(vlUSOED*rzf{Gn7ReJ#P8MN&r!+*Oyi|e(dlPyiP!O1Y?)2 z^?j)|m^>mHH(pmTm86Uyqy^(vEjJ%~fLF8+B{;#YSRfXXZ0t8OK={k}fZA#6)%nqY zcnE_(0^nz2WzY3i5GasFXUKgUG_|m#ouU8cBotdzLSYqiwvZ}=ySWiO&-y%kG06jY z_Au0<tBp_d`**ZpU0dpafQu#X|oUGHxD95 zI)#na+!yoOVotuvj!+F?=*cp@H`^zJDR(v8S_uu}HG~9PzPl(!EItm7Ry67$U1bOy zk34!?W=?K~f~gt9_MN&cD@fMU#@;4;oL)LsnmB_Xm27@QL zch;}&2`{0yJ@tBE6-G5wapJW+e#q<^(;gjG6AfpUrtzy^6$DJdS4jbI2U(f3^jwi9 zj^1j`65U{Kt)Ws_^!;2ga+FR7BPkoOnu1WPLBpi` zecjxs&;-hE4k|k0mwdba;_pqUm`i;+Pe-sAA>uNMpzq=e)9Z)+{Crke#V4?z^4L7l z&G(8Y1vskXKLVV2L8p=C8hI1!q&C@p1h7~@%H%q+q#}t_D$XIRtvGpcECP_{g6Nrl z*#wXL~WQ?u0$0_uMxn03=D*b$7?ICuWbx@9;fo0s^~+&6$s) zv@=RjK^gnqq>EZ?G?y`<5+QL5J|1n>(b+XuW5{$I=)GgGt6h@R@7LckkHBH6NWgep zzdoawF)hFx7l@H08T3`K=_yrpj_U_cOlEfMQ&2etq+;| zS-3@##8n{gK!q0j`K=m}jK7pGYa0(@Na1)FmemUf4=^Ej*SH7&%v)b_YEXBL)!PCN`;ALf9|ggx zQn;Fq&@>vBXDaMYkl`kj>TX!r+Aa<}e2^Md%)gzc_-0jQyRr%18lP5VqKn&fO0;kc zB6j_6jM;2?=&U)B$fR}=BEO6(5pweChZ`7clYT{5kj4Q=lojYKhICsv`qjeF zY1O&b(p*|NcMLAwDqF6P!-BOWEMMkrY6hkLT1HaCwhos9Z?jcsSLFKpis$$)G&E3{59cGM0*kBqPmHcgkbl>N5M*<(nly&J8Rz zD&E89JT}JBcvwq)KU`vP6!udR=&N;59rS)iuS#?oh_~GTvhF6x1@)5MbUVc-X}ME;!qN#B_wM{!do z^Jb=SY+f+~5}V#T&{e-)gzqJazMOA6*|X|<(B)QM^&O9UYZ6U2zFphqY`{WdDxSYI*L!CjcP~0r7)GRi?fCH zs$O~R85a6}P>B-&h>2!$~YhCKpwfG|FdJl&!PBgPD z-%8yga~}|FROiGo)XG^X?GaMK_riOWO_PTunS8l35$lAW111QSuytQEq^W0=uGfr3 z;fwiDQ>5j98=w!=p7#As9lHhSm999e-TLI-zJ{hT;k@U?T`d~Jlnz?6`w87-Z7Osk z2SMF#o=fG%8wp77bKy1dFbj47e5JM3(&o|&mGQOpO)})_8Ut^)HUQANFP_DW^POa4&7!8^1^+TVU}SrK#OHTP39OjLxqQ zrJ~r~oZCw8$T&j+KDK3=u=VQd`9N~Q^E*8^h1??;9KwKo*C5K`^-Y4;;pf0tmm!D! zQ}XMe4&+{%zG_+kT& zN9fO#xXUBJL~)JTlsMu}sGiJ{DvcO0%Il-GkZhyk_ED-)NdZ%-W3<@YcDM(OOBEFb zGkNQgnk-Jh;yHuW6y8dpxi~xzfv8LlHtC+~5p>u}$jYQxSs4 zilB2L0~nZJbF)W;#-cW|)aDv!s3sY&Ndv!I_r7Z$hua+P7LcA0zLS1zF4>9w~F|1jw~()h<3p>lb^Yj-(%g*{W++;zz|H!WYZN&JXNoTs9%tex^A#jp`w(7FIm002i)9sU z+8(z2h+k4irYR$sbhuuzY&#hjMD)&iqyE}kWdrEq`18n(i=Q$UL_P&8j&ytq*rF3I zj%-3Fg3fX|tG;TJgW5U(;pd^#0V$f3R>k(5FsAR~sUB3#G{W9rLaF_F_^DM4nT3ac z`7n2^Sz$pCd#ULaLlChUU*|pak4Y_)y1hvuoyALLBijy^d>HqR`0U3Z@}`x?XmEr$ zVmjH@cMrh|=!v$o#_(YCMD9|GXcmAm!$OD}05GA?^q|J$jc9D`UaqCXoO$BsK-rdO zK7*Q99h3KWw0YrSOY$o>BZINc&u10BAQHDbl&N3)4jzWSfdqHO?b=D1w|54$V{-w? z&)Ur7P1rj@aLE_3KZ3h!+)p3pEuAM7oD8%|CHDur#AUci?QjC-Dib7h&T?2yor~4r zuxl`8X>+RDP?S^h6T%Q)Uz|>10@86^4xa6aE2TPO^%t{|+Ti?A5+CH0C1brhNtzOC z#)x@Pb=u<1`9VW|R=-+zVm3un7}Z@oDm!oxj6jcX!p3ib@yf{Bi%0w3OR(l`-kcf3 zHo$mIXfB$kFPauX<9pINsiIc5)jK%N-KgX`iLjDu*noqtm=!8W->zD#KWXk5>S67p zwZTvRnm<~bXja8C>!{9OF zRZ!7sgGX~^1e;8Nwo9M_GsV%dU-#4sPWRU?^MEFtZYB=w{8y2PR;3y01M@L92E+S+ zd>Hb0;sMok47eTd&+fw*mR|{s_<*57;P@IeB7pZk$rR&(NIy$tsvoFs zg$}Fp;1j5-}GSBhT*V3fD_w?>oPzIyN>UNeT=ij+drFDGmA-#9ef7`|xwdG zePD4U8pu`5OgZf)S*^Q;Hu8>OrUr}M$w{^U-uVgTAdnGJ@!;O##57w(iyL1+@)(iv z;M?Ih+c|a@?+nQ=PY3I*Zp?2WftC!}n{FQ%L(pm8d~eWRC&uAXT4G}&>S(pS#I5m; z!Ud@+Uhk6+;F`r=z|<(N0s3;U>Q<@JTojS@PUi#ECc0-m`;#=Eu2jFlbxVk26;*xT zdzZOv0B5k$T_JHL-XpeLGil=AzDlSHV|i3cpD{3(vRE5EQy>~_A~o61+qu%+M~Tzr zUX;yQ3tS6gdKDVCl3F~L;CVR+#i0OlB1Br(k#oqhJfAUvpxMLcdokO0O%FHT>G+c_ z`dc0Hn^j6sZ4JpEto9BA=B(ayIs4c|mK9YrI}>--Q(nr>(AULA*tnFr9bmMR2#OI# zAxD5ryx7}Gr$m(~VEt4*_&2|2B~6}Hl~oZIB+O8t;J}ng0N=#=Wu&J-#qb29L5GL?2|ij z(gsPihnm9x4TrjPwn>*3(J3T?Z`LYVP~7cgDdFs!EnLSSWY+IG^$UqVf93?Vm77*p z_Is-whL*wwix@zi#kCDfbC-QSE8QP4@BIc`lDfpFnw$@iu!&QZh-8vj3G~Dr^yZq# z^)_K;6wlVEXUf1|SN00O89cbWJfCZF1-kPY{UH9`;NeYfA`V*o0lm(~Rvq6-x$USE zw}s}NEHov&j&LC0DmeLyQ3Pg_(w2~gbGInGdVo(Yz{?85f42y(3ud31V{Ww)U6b*z z-3$kd_wO+vGp(-Mh)E=PZ4sK}1~2*^B6Tw8em;?8>zB2be|K(^C%|1y;5S z4qmf@-u5Ocq!E$k34X;ZdLL*i*ZfO`8*dR*@2^Elp#6KFGUc97x#|g>yijwsi zisZj%#B{~R8C1z&3JniU(5OKnkkiZ2L{5=#Z)daIJ=Rm*>CxuKpcISCwJytBcM~Tc2(TROc}BAt5(GDS74Y1BVjI=76_|h@ z4r{=ge8~=n;Ob|#Qri*3T;>6Hlj--a;i!toH%)o!(1zI&;kOMu;hc@)B0P(muislm zsFdFMU~#f_82&e5Eeou8kdm5qaygM;}+gW1W$*4fyd+182X55(Uv zBq2^<$Cq-pw6mrBgK2DH=i)3xP5m-X`H%Q)>=hON32*E4cNSjwV0AaPXJuz$W3{ni z{dWr|XDQbgkiQ4?zgjqHyfp5yszIFWTpYm=DOZTCGtIw4n1cUlZ|~yx@vn4D!K{#v z5StfOrx&m6|HGvWNKxgV7Jn!(x3sbU%j$*f|Dow@Y4$I&{zq(oM*d3Y-vfCu|0nMM z(Edm6e<{CcDJlXb?Z7U7!UIVPQUCD|G_?a;ngaj2dI2AlAM`Am$NUy72QnG5m~ z5-;Ujdd0*%3cbK+#|3i%rgFLr+$0$Ui{ znnPYz_}@$FA9Bn8WxCkFY&<4xy!^~;CMF!rT&A4-%*I@%#>{N&d?q{`-26QJ#(zuv zpXg3@X3lQLju0{PmrP%>c`2d4vY`b0olJ(m(*CEun+4<#Q*1Bmn~jT^olS$CAIQN4 zWMiXd{d=;kf7bLrvK3_gzxWXROX1%(ffu{K$zC>>m%WPhpPSX+`FipF|MTH3ct_>YwTTV4O9>px=PKT`g0b^Sl13+-R8I}qEKCm^?%ml<3O z)~A;jAtV!d8A+JuKi};3qJ$R-s=chP6ATPG-k$>&=1V%!ixAlvq$q{FgMfxZ1cQn$ z6$Ar=W($%O)6nT{NVWb*Hs=wX#mVWpM%S#*Vn@vojt`1UmXy=52y0PEE|BH<0<|}V zvg_A}&Tt{(Ui>s^Ys+V;ET#TFkw(2lZc0?CW5Bpll51d zw=l0e>RO!+v2<%U_-Y3x;778$-F5^oGOxYXZl$Zk%gSm>WKhOP#T`@Qzk$n5mjHzY zOB2^)zo8RyySVSjCl=_>r7kG_=vLV9YPL)+a1EtDn- z&;vAHvf9Xpi)=ZR-G+@0r#{HNuY?q<(sZm9>7%9PSz7$f7Y2~a&QK6?7eVeK?!!z! z96)b&Gnv+=P79Xa-O!3k(okDs6KsuXfj)_bpk1(R6TYNkjXvqr1Wsyw!X0k3p{f?C zZfUfss|3mxkA%Sd$aP8_5%@Zt7}&n!8*XU=IA`YmNGccHot*qB^V0?(YkmrohwO2R zw^_Jq)sjvtzoRzZi`E$2jy%7rF&Zbd^v&&%-u0uc42qxe7qZ2=sEFsQ&iVNpeM~aU zZHeRuFiibV0 zdw-0x-TJDWv5L=B-sF0eZc*hpx31J*mMbbTv!B$S#uTw=y1VcPiNAE*L*mfS_ZgCv z1My~#399o~hgOU(R-<^AM{~tZX}j`=x2xt9y9<(Z(=`~$IpBTZWDvfH(wzN48U@ZH zRQo2R(9b9`9X!;I4|*faiFAb9(?Ize&S?{AONVxtPdLuDNM z;_nT)jU*s>yx17t%{euj1v1YM(@Vg`B?o}5^RyqBUar7U+QGxVIYYMAAA4ighLn!O zA*uOYZ@Q3ACchotHN{@h=k*T?68j9PJA`sAAASq85l$^q1h>&-D__k9A0B+*uQtcR z60Rn6>xxJQ;S?8dnHP=KoR+x_vM6uFLU4zPp|?`dTRLbEUqqY(lA%wMVViTN;Rs~j z;}quJ)wS+&^-bvSXddfDM{49OBtwkZGKh`VO z(u-V-IK8ug10{q$gK1Sy=mQitTGNsXGcvuqF*tlq1bAV&Z+$Hf0B9OW!zfxBxQ06J zB<`k~zT%;IwlOh@T3bg=tA#!+AaiTq>8e7Mpdo&HBj4nxRz9BxJ`b1uM@Hi%gq{ZH zdW{76-L45$bBS5m3;2Z zA}R!A_t_b}?f)i7xNW72(u+GUo~u%A-`d5)d=5&A>ZTTt3xhb*E~u(Pn6E_YPuMY! zj<=grqMbP6-apbWwAZ9}wpD#Sy<@@X{Mvbcuca29Wq&um0g|dYiuRpWiai! z4QIb6<&;UrU-XLHUqy`jZTp@-``-ShSeO~@_cezhkr

nBLSwMmF5N6WAs4;S^^v zG;vUU?6CRr%$4v(9v*sYJwyP$xVl9z=)8==sHr~1baDvL{~*Dsj}t27xw&%NU@c%r z5MopuPcGo*u&+(n4CIkw`6`X#U@1)6TJYVACs|9sQeGR6QTQ`4cY_U78~OAe9{+qX z9C-cO#U?tAh^o^K{H=fYF>*+)u{I9*GAj?#W z@vI<587UVjP0iCqg~+PUmoi&*BsFPtw7MlQaH8h{y9OXFMw7aPbgxUz=x6P4uSQW1 zO+E`f=}|9w0=>E)?X%h|M7CBw9pLF?<>UFf1dfz|1WHpNvewW^YFgqh;%#y?M-P=exK@0brB+qc+V+==wBWqFVtMq`!m~EWm$gy+sUIg>?#vn20^V;GrkCSJ zEh`4=gDQ2?MXr$s1Mk|BmArY)t$xUiK0Yt{H)cQnHd%Oi7=-~zDM?m}8~Ohq_Jz07 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_3_left.png b/resources/textures/knight_3_left.png new file mode 100644 index 0000000000000000000000000000000000000000..f89d6d10aba8c93c61127c37bedb808bc519a8a5 GIT binary patch literal 13933 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 NASb0PSubu9{6GC1p~(OM literal 0 HcmV?d00001 diff --git a/resources/textures/knight_3_right.png b/resources/textures/knight_3_right.png new file mode 100644 index 0000000000000000000000000000000000000000..8958ba5b67a982112e4d6fe535a968ab5d47bffc GIT binary patch literal 13845 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 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_3_up.png b/resources/textures/knight_3_up.png new file mode 100644 index 0000000000000000000000000000000000000000..8221933aec94565422ee20031b94f7dbbf5ba2ce GIT binary patch literal 13970 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 literal 0 HcmV?d00001 diff --git a/resources/textures/knight_4_left.png b/resources/textures/knight_4_left.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d34076645845ad63f764eac77c8f605853d83e GIT binary patch literal 14328 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 Mc@4Q*8H?cm0oZ26NdN!< literal 0 HcmV?d00001 diff --git a/resources/textures/knight_4_up.png b/resources/textures/knight_4_up.png new file mode 100644 index 0000000000000000000000000000000000000000..242610afab731719ed22f7d2bf21fe972aa82913 GIT binary patch literal 15099 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 Date: Mon, 11 Apr 2022 00:01:57 +0200 Subject: [PATCH 2/6] bfs - knights are moving but idk where --- algorithms/bfs.py | 129 ++++++++++++++++++++++++++++++++++++++++++++ common/constants.py | 27 +++++++++- common/helpers.py | 18 +++++++ helpers/debug.py | 15 ------ logic/game.py | 14 ++++- logic/level.py | 100 +++++++++++++++++++++++++--------- models/castle.py | 5 +- models/knight.py | 42 ++++++++------- models/monster.py | 5 +- models/tile.py | 5 +- 10 files changed, 295 insertions(+), 65 deletions(-) create mode 100644 algorithms/bfs.py delete mode 100644 helpers/debug.py diff --git a/algorithms/bfs.py b/algorithms/bfs.py new file mode 100644 index 0000000..8dd8a7b --- /dev/null +++ b/algorithms/bfs.py @@ -0,0 +1,129 @@ +from __future__ import annotations +from typing import List + +# temporary goal for testing +from common.constants import ACTION, Direction, ROWS, COLUMNS + +GOAL = (9, 9) + + +class State: + def __init__(self, row, column, direction): + self.row = row + self.column = column + self.direction = direction + + +class Node: + def __init__(self, state, parent=None, action=None): + self.state = state + self.parent = parent + self.action = action + + +def goal_test(state: State): + if (state.row, state.column) == GOAL: + return True + return False + + +def get_successors(state: State, map): + successors = list() + + state_left = State(state.row, state.column, state.direction.right()) + successors.append((ACTION.get("rotate_left"), state_left)) + + state_right = State(state.row, state.column, state.direction.left()) + successors.append((ACTION.get("rotate_right"), state_right)) + + target = go(state.row, state.column, state.direction) + + if is_valid_move(map, target[0], target[1]): + state_go = State(target[0], target[1], state.direction) + successors.append((ACTION.get("go"), state_go)) + + return successors + + +def graphsearch(initial_state: State, map, fringe: List[Node] = None, explored: List[Node] = None, + tox: int = None, toy: int = None): + # fringe and explored initialization + global GOAL + if fringe is None: + fringe = list() + if explored is None: + explored = list() + if tox is not None and toy is not None: + GOAL = (tox, toy) + explored_states = set() + fringe_states = set() + + # root Node + fringe.append(Node(initial_state)) + fringe_states.add((initial_state.row, initial_state.column, initial_state.direction)) + + while True: + # fringe empty -> solution not found + if not any(fringe): + print("Brak rozwiazania") + return [] + + # get first element from fringe + element = fringe.pop(0) + fringe_states.remove((element.state.row, element.state.column, element.state.direction)) + + # if solution was found, prepare and return actions sequence + if goal_test(element.state): + actions_sequence = [element.action] + parent = element.parent + + while parent is not None: + # root's action will be None, don't add it + if parent.action is not None: + actions_sequence.append(parent.action) + parent = parent.parent + + actions_sequence.reverse() + return actions_sequence + + # add current node to explored (prevents infinite cycles) + explored.append(element) + explored_states.add((element.state.row, element.state.column, element.state.direction)) + + # loop through every possible next action + for successor in get_successors(element.state, map): + + # make sure not to fall into a cycle + successor_state = (successor[1].row, successor[1].column, successor[1].direction) + if successor_state not in fringe_states and \ + successor_state not in explored_states: + # create new Node and add it at the end of fringe + new_node = Node(state=successor[1], + parent=element, + action=successor[0]) + fringe.append(new_node) + fringe_states.add((new_node.state.row, new_node.state.column, new_node.state.direction)) + + +# TEMPORARY METHOD +def go(row, column, direction): + target = tuple() + + if direction == Direction.RIGHT: + target = row, column + 1 + elif direction == Direction.LEFT: + target = row, column - 1 + elif direction == Direction.UP: + target = row - 1, column + elif direction == Direction.DOWN: + target = row + 1, column + + return target + + +def is_valid_move(map, target_row, target_column): + # TODO: check collisions with objects + if 0 <= target_row < ROWS and 0 <= target_column < COLUMNS: + return True + + return False diff --git a/common/constants.py b/common/constants.py index 0924d6d..9772ff8 100644 --- a/common/constants.py +++ b/common/constants.py @@ -1,7 +1,10 @@ +from enum import Enum + GAME_TITLE = 'WMICraft' WINDOW_HEIGHT = 800 WINDOW_WIDTH = 1360 FPS_COUNT = 60 +TURN_INTERVAL = 1000 GRID_CELL_PADDING = 5 GRID_CELL_SIZE = 36 @@ -19,9 +22,7 @@ RIGHT_KNIGHTS_SPAWN_FIRST_ROW = 6 RIGHT_KNIGHTS_SPAWN_FIRST_COL = 20 CASTLE_SPAWN_WIDTH = 6 -# CASTLE_SPAWN_WIDTH = 0 CASTLE_SPAWN_HEIGHT = 5 -# CASTLE_SPAWN_HEIGHT = 0 CASTLE_SPAWN_FIRST_ROW = 7 CASTLE_SPAWN_FIRST_COL = 9 @@ -38,3 +39,25 @@ TILES = [ 'water.png', 'grass_with_tree.jpg', ] + + +class Direction(Enum): + UP = 0 + RIGHT = 1 + DOWN = 2 + LEFT = 3 + + def left(self): + v = (self.value + 1) % 4 + return Direction(v) + + def right(self): + v = (self.value - 1) % 4 + return Direction(v) + + +ACTION = { + "rotate_left": -1, + "rotate_right": 1, + "go": 0, +} diff --git a/common/helpers.py b/common/helpers.py index 63238b6..b3d51c5 100644 --- a/common/helpers.py +++ b/common/helpers.py @@ -1,4 +1,5 @@ import pygame +from common.constants import GRID_CELL_PADDING, GRID_CELL_SIZE, COLUMNS, ROWS def draw_text(text, color, surface, x, y, text_size=30, is_bold=False): @@ -10,3 +11,20 @@ def draw_text(text, color, surface, x, y, text_size=30, is_bold=False): textrect = textobj.get_rect() textrect.topleft = (x, y) surface.blit(textobj, textrect) + + +def print_numbers(): + display_surface = pygame.display.get_surface() + font = pygame.font.SysFont('Arial', 16) + + for row_index in range(ROWS): + for col_index in range(COLUMNS): + x = (GRID_CELL_PADDING + GRID_CELL_SIZE) * col_index + GRID_CELL_PADDING + 7 + y = (GRID_CELL_PADDING + GRID_CELL_SIZE) * row_index + GRID_CELL_PADDING + 16 + display_surface.blit(font.render(f'[{col_index}, {row_index}]', True, (255, 0, 0)), (x, y)) + pygame.display.update() + + +# parse array index to screen x or y coordinate +def parse_cord(cord): + return (GRID_CELL_PADDING + GRID_CELL_SIZE) * cord + GRID_CELL_PADDING + 7 diff --git a/helpers/debug.py b/helpers/debug.py deleted file mode 100644 index c5c9bee..0000000 --- a/helpers/debug.py +++ /dev/null @@ -1,15 +0,0 @@ -import pygame.display - -from common.constants import GRID_CELL_PADDING, GRID_CELL_SIZE, COLUMNS, ROWS - - -def print_numbers(): - display_surface = pygame.display.get_surface() - font = pygame.font.SysFont('Arial', 16) - - for row_index in range(ROWS): - for col_index in range(COLUMNS): - x = (GRID_CELL_PADDING + GRID_CELL_SIZE) * col_index + GRID_CELL_PADDING + 7 - y = (GRID_CELL_PADDING + GRID_CELL_SIZE) * row_index + GRID_CELL_PADDING + 16 - display_surface.blit(font.render(f'[{col_index}, {row_index}]', True, (255, 0, 0)), (x, y)) - pygame.display.update() diff --git a/logic/game.py b/logic/game.py index 35cb1b9..b81673e 100644 --- a/logic/game.py +++ b/logic/game.py @@ -3,7 +3,8 @@ import sys import pygame from common.constants import * -from helpers.debug import print_numbers +from common.helpers import print_numbers +from logic.knights_queue import KnightsQueue from logic.level import Level from ui.logs import Logs from ui.screens.credits import Credits @@ -37,6 +38,13 @@ class Game: stats = Stats() logs = Logs() + # setup clock for rounds + NEXT_TURN = pygame.USEREVENT + 1 + pygame.time.set_timer(NEXT_TURN, TURN_INTERVAL) + + # create level + self.level.create_map() + print_numbers_flag = False running = True while running: @@ -51,11 +59,13 @@ class Game: running = False if event.key == 110: # clicked n letter on keyboard print_numbers_flag = not print_numbers_flag + if event.type == NEXT_TURN: # is called every 't' milliseconds + self.level.handle_turn() stats.draw(self.screen) logs.draw(self.screen) - self.level.run() + self.level.update() if print_numbers_flag: print_numbers() diff --git a/logic/level.py b/logic/level.py index 1ec13d3..75a1e3e 100644 --- a/logic/level.py +++ b/logic/level.py @@ -2,7 +2,9 @@ import random import pygame +from algorithms.bfs import graphsearch, State from common.constants import * +from logic.knights_queue import KnightsQueue from logic.spawner import Spawner from models.castle import Castle from models.knight import Knight @@ -17,18 +19,29 @@ class Level: # sprite group setup self.sprites = pygame.sprite.Group() - self.create_map() + self.map = [[' ' for x in range(COLUMNS)] for y in range(ROWS)] + + self.list_knights_blue = [] + self.list_knights_red = [] + self.list_monsters = [] + self.list_castles = [] + + self.knights_queue = None + + def create_map(self): + self.generate_map() + self.setup_base_tiles() + self.setup_objects() + self.knights_queue = KnightsQueue(self.list_knights_blue, self.list_knights_red) def generate_map(self): - map = [[' ' for x in range(COLUMNS)] for y in range(ROWS)] - - spawner = Spawner(map) + spawner = Spawner(self.map) spawner.spawn_where_possible(['w' for x in range(NBR_OF_WATER)]) spawner.spawn_where_possible(['t' for x in range(NBR_OF_TREES)]) - spawner.spawn_in_area(['k' for x in range(4)], LEFT_KNIGHTS_SPAWN_FIRST_ROW, LEFT_KNIGHTS_SPAWN_FIRST_COL, + spawner.spawn_in_area(['k_b' for x in range(4)], LEFT_KNIGHTS_SPAWN_FIRST_ROW, LEFT_KNIGHTS_SPAWN_FIRST_COL, KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT) - spawner.spawn_in_area(['k' for x in range(4)], RIGHT_KNIGHTS_SPAWN_FIRST_ROW, RIGHT_KNIGHTS_SPAWN_FIRST_COL, + spawner.spawn_in_area(['k_r' for x in range(4)], RIGHT_KNIGHTS_SPAWN_FIRST_ROW, RIGHT_KNIGHTS_SPAWN_FIRST_COL, KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT) spawner.spawn_in_area(['c'], CASTLE_SPAWN_FIRST_ROW, CASTLE_SPAWN_FIRST_COL, CASTLE_SPAWN_WIDTH, @@ -36,50 +49,87 @@ class Level: spawner.spawn_where_possible(['m' for x in range(NBR_OF_MONSTERS)]) - return map - - def create_map(self): - map = self.generate_map() - + def setup_base_tiles(self): textures = [] for texture_path in TILES: converted_texture = pygame.image.load('resources/textures/' + texture_path).convert_alpha() converted_texture = pygame.transform.scale(converted_texture, (40, 40)) textures.append((texture_path, converted_texture)) - castle_count = 0 # TODO: find some smarter method to print castle - - for row_index, row in enumerate(map): - print(row) + for row_index, row in enumerate(self.map): for col_index, col in enumerate(row): - x = (GRID_CELL_PADDING + GRID_CELL_SIZE) * col_index + GRID_CELL_PADDING + 7 - y = (GRID_CELL_PADDING + GRID_CELL_SIZE) * row_index + GRID_CELL_PADDING + 7 # add base tiles, e.g. water, tree, grass if col == "w": texture_index = 5 texture_surface = textures[texture_index][1] - Tile((x, y), texture_surface, self.sprites, 'w') + Tile((row_index, col_index), texture_surface, self.sprites, 'w') elif col == "t": texture_index = 6 texture_surface = textures[texture_index][1] - Tile((x, y), texture_surface, self.sprites, 't') + Tile((row_index, col_index), texture_surface, self.sprites, 't') else: texture_index = random.randint(0, 4) texture_surface = textures[texture_index][1] - Tile((x, y), texture_surface, self.sprites) + Tile((row_index, col_index), texture_surface, self.sprites) + + def setup_objects(self): + castle_count = 0 # TODO: find some smarter method to print castle + + for row_index, row in enumerate(self.map): + print(row) + for col_index, col in enumerate(row): # add objects, e.g. knights, monsters, castle - if col == "k": - map[row_index][col_index] = Knight((x, y), self.sprites) + if col == "k_b": + knight = Knight((row_index, col_index), self.sprites, "blue") + self.map[row_index][col_index] = knight + self.list_knights_blue.append(knight) + elif col == "k_r": + knight = Knight((row_index, col_index), self.sprites, "red") + self.map[row_index][col_index] = knight + self.list_knights_red.append(knight) elif col == "m": - map[row_index][col_index] = Monster((x, y), self.sprites) + monster = Monster((row_index, col_index), self.sprites) + self.map[row_index][col_index] = monster + self.list_monsters.append(monster) elif col == "c": castle_count += 1 if castle_count == 4: - map[row_index][col_index] = Castle((x, y), self.sprites) + castle = Castle((row_index, col_index), self.sprites) + self.map[row_index][col_index] = castle + self.list_castles.append(castle) - def run(self): + def handle_turn(self): + print("next turn") + current_knight = self.knights_queue.dequeue_knight() + knight_pos_x = current_knight.position[0] + knight_pos_y = current_knight.position[1] + state = State(knight_pos_x, knight_pos_y, current_knight.direction) + action_list = graphsearch(state, self.map) + print(action_list) + + if len(action_list) == 0: + return + + if action_list[0] == ACTION.get("rotate_left"): + current_knight.rotate_left() + elif action_list[0] == ACTION.get("rotate_right"): + current_knight.rotate_right() + elif action_list[0] == ACTION.get("go"): + current_knight.step_forward() + self.map[knight_pos_x][knight_pos_y] = ' ' + + if current_knight.direction.name == 'UP': + self.map[knight_pos_x][knight_pos_y - 1] = current_knight + elif current_knight.direction.name == 'RIGHT': + self.map[knight_pos_x + 1][knight_pos_y] = current_knight + elif current_knight.direction.name == 'DOWN': + self.map[knight_pos_x][knight_pos_y + 1] = current_knight + elif current_knight.direction.name == 'LEFT': + self.map[knight_pos_x - 1][knight_pos_y] = current_knight + + def update(self): bg_width = (GRID_CELL_PADDING + GRID_CELL_SIZE) * COLUMNS + BORDER_WIDTH bg_height = (GRID_CELL_PADDING + GRID_CELL_SIZE) * ROWS + BORDER_WIDTH pygame.draw.rect(self.screen, (255, 255, 255), pygame.Rect(5, 5, bg_width, bg_height), 0, BORDER_RADIUS) diff --git a/models/castle.py b/models/castle.py index ca75946..2f51d32 100644 --- a/models/castle.py +++ b/models/castle.py @@ -1,10 +1,13 @@ import pygame.image +from common.helpers import parse_cord + class Castle(pygame.sprite.Sprite): def __init__(self, position, group): super().__init__(group) self.image = pygame.image.load("./resources/textures/castle.png").convert_alpha() self.image = pygame.transform.scale(self.image, (78, 78)) - self.rect = self.image.get_rect(center=position) + position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + self.rect = self.image.get_rect(center=position_in_px) self.health = 80 diff --git a/models/knight.py b/models/knight.py index 6e8a18a..b2c9cba 100644 --- a/models/knight.py +++ b/models/knight.py @@ -1,7 +1,8 @@ import pygame.image import random -from common.constants import GRID_CELL_SIZE +from common.constants import GRID_CELL_SIZE, Direction +from common.helpers import parse_cord def load_knight_textures(): @@ -17,32 +18,37 @@ def load_knight_textures(): class Knight(pygame.sprite.Sprite): - def __init__(self, position, group): + def __init__(self, position, group, team): super().__init__(group) - self.direction = 2 + self.direction = Direction.DOWN self.states = load_knight_textures() - self.image = self.states[self.direction] - self.rect = self.image.get_rect(topleft=position) + self.image = self.states[self.direction.value] + self.position = position + position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + self.rect = self.image.get_rect(topleft=position_in_px) + self.team = team self.health = random.randint(7, 12) self.attack = random.randint(4, 7) self.defense = random.randint(1, 4) self.points = 1 - # direction arg = -1 to rotate left - # direction arg = 1 to rotate right - def rotate(self, direction): - self.direction = (self.direction + direction) % 4 - self.image = self.states[self.direction] + def rotate_left(self): + self.direction = self.direction.right() + self.image = self.states[self.direction.value] + + def rotate_right(self): + self.direction = self.direction.left() + self.image = self.states[self.direction.value] def step_forward(self): - if self.direction == 0: - self.rect.y = self.rect.y - GRID_CELL_SIZE - elif self.direction == 1: - self.rect.x = self.rect.x + GRID_CELL_SIZE - elif self.direction == 2: - self.rect.y = self.rect.y + GRID_CELL_SIZE - else: - self.rect.x = self.rect.x - GRID_CELL_SIZE + if self.direction.name == 'UP': + self.rect.y = self.rect.y - GRID_CELL_SIZE - 5 + elif self.direction.name == 'RIGHT': + self.rect.x = self.rect.x + GRID_CELL_SIZE + 5 + elif self.direction.name == 'DOWN': + self.rect.y = self.rect.y + GRID_CELL_SIZE + 5 + elif self.direction.name == 'LEFT': + self.rect.x = self.rect.x - GRID_CELL_SIZE - 5 diff --git a/models/monster.py b/models/monster.py index 7109dff..7a97973 100644 --- a/models/monster.py +++ b/models/monster.py @@ -1,6 +1,8 @@ import pygame.image import random +from common.helpers import parse_cord + monster_images = [ pygame.image.load("./resources/textures/dragon2.png"), pygame.image.load("./resources/textures/birb.png"), @@ -14,7 +16,8 @@ class Monster(pygame.sprite.Sprite): super().__init__(group) self.image = random.choice(monster_images) self.image = pygame.transform.scale(self.image, (40, 40)) - self.rect = self.image.get_rect(topleft=position) + position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + self.rect = self.image.get_rect(topleft=position_in_px) self.health = random.randrange(15, 25) self.attack = random.randrange(2, 10) diff --git a/models/tile.py b/models/tile.py index e4dc283..a28456e 100644 --- a/models/tile.py +++ b/models/tile.py @@ -1,9 +1,12 @@ import pygame +from common.helpers import parse_cord + class Tile(pygame.sprite.Sprite): def __init__(self, position, image, group, tile_type=' '): super().__init__(group) self.image = image - self.rect = self.image.get_rect(topleft=position) + position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + self.rect = self.image.get_rect(topleft=position_in_px) self.tile_type = tile_type \ No newline at end of file -- 2.20.1 From 57cdb87820273e703b9c6378035ca90eaa531c84 Mon Sep 17 00:00:00 2001 From: Angelika Iskra Date: Mon, 11 Apr 2022 12:00:15 +0200 Subject: [PATCH 3/6] worked on bfs; --- algorithms/bfs.py | 8 +++----- common/constants.py | 4 ++-- logic/game.py | 3 +-- logic/level.py | 35 +++++++++++++++++++---------------- models/castle.py | 2 +- models/knight.py | 10 +++++++--- models/monster.py | 2 +- models/tile.py | 2 +- 8 files changed, 35 insertions(+), 31 deletions(-) diff --git a/algorithms/bfs.py b/algorithms/bfs.py index 8dd8a7b..94b150f 100644 --- a/algorithms/bfs.py +++ b/algorithms/bfs.py @@ -30,10 +30,10 @@ def goal_test(state: State): def get_successors(state: State, map): successors = list() - state_left = State(state.row, state.column, state.direction.right()) + state_left = State(state.row, state.column, state.direction.left()) successors.append((ACTION.get("rotate_left"), state_left)) - state_right = State(state.row, state.column, state.direction.left()) + state_right = State(state.row, state.column, state.direction.right()) successors.append((ACTION.get("rotate_right"), state_right)) target = go(state.row, state.column, state.direction) @@ -95,8 +95,7 @@ def graphsearch(initial_state: State, map, fringe: List[Node] = None, explored: # make sure not to fall into a cycle successor_state = (successor[1].row, successor[1].column, successor[1].direction) - if successor_state not in fringe_states and \ - successor_state not in explored_states: + if successor_state not in fringe_states and successor_state not in explored_states: # create new Node and add it at the end of fringe new_node = Node(state=successor[1], parent=element, @@ -122,7 +121,6 @@ def go(row, column, direction): def is_valid_move(map, target_row, target_column): - # TODO: check collisions with objects if 0 <= target_row < ROWS and 0 <= target_column < COLUMNS: return True diff --git a/common/constants.py b/common/constants.py index 9772ff8..37dd0ae 100644 --- a/common/constants.py +++ b/common/constants.py @@ -47,11 +47,11 @@ class Direction(Enum): DOWN = 2 LEFT = 3 - def left(self): + def right(self): v = (self.value + 1) % 4 return Direction(v) - def right(self): + def left(self): v = (self.value - 1) % 4 return Direction(v) diff --git a/logic/game.py b/logic/game.py index b81673e..755a851 100644 --- a/logic/game.py +++ b/logic/game.py @@ -4,7 +4,6 @@ import pygame from common.constants import * from common.helpers import print_numbers -from logic.knights_queue import KnightsQueue from logic.level import Level from ui.logs import Logs from ui.screens.credits import Credits @@ -59,7 +58,7 @@ class Game: running = False if event.key == 110: # clicked n letter on keyboard print_numbers_flag = not print_numbers_flag - if event.type == NEXT_TURN: # is called every 't' milliseconds + if event.type == NEXT_TURN: # is called every 'TURN_INTERVAL' milliseconds self.level.handle_turn() stats.draw(self.screen) diff --git a/logic/level.py b/logic/level.py index 75a1e3e..dbfb807 100644 --- a/logic/level.py +++ b/logic/level.py @@ -63,15 +63,15 @@ class Level: if col == "w": texture_index = 5 texture_surface = textures[texture_index][1] - Tile((row_index, col_index), texture_surface, self.sprites, 'w') + Tile((col_index, row_index), texture_surface, self.sprites, 'w') elif col == "t": texture_index = 6 texture_surface = textures[texture_index][1] - Tile((row_index, col_index), texture_surface, self.sprites, 't') + Tile((col_index, row_index), texture_surface, self.sprites, 't') else: texture_index = random.randint(0, 4) texture_surface = textures[texture_index][1] - Tile((row_index, col_index), texture_surface, self.sprites) + Tile((col_index, row_index), texture_surface, self.sprites) def setup_objects(self): castle_count = 0 # TODO: find some smarter method to print castle @@ -82,52 +82,55 @@ class Level: # add objects, e.g. knights, monsters, castle if col == "k_b": - knight = Knight((row_index, col_index), self.sprites, "blue") + knight = Knight((col_index, row_index), self.sprites, "blue") self.map[row_index][col_index] = knight self.list_knights_blue.append(knight) elif col == "k_r": - knight = Knight((row_index, col_index), self.sprites, "red") + knight = Knight((col_index, row_index), self.sprites, "red") self.map[row_index][col_index] = knight self.list_knights_red.append(knight) elif col == "m": - monster = Monster((row_index, col_index), self.sprites) + monster = Monster((col_index, row_index), self.sprites) self.map[row_index][col_index] = monster self.list_monsters.append(monster) elif col == "c": castle_count += 1 if castle_count == 4: - castle = Castle((row_index, col_index), self.sprites) + castle = Castle((col_index, row_index), self.sprites) self.map[row_index][col_index] = castle self.list_castles.append(castle) def handle_turn(self): print("next turn") + # current_knight = self.list_knights_red[0] current_knight = self.knights_queue.dequeue_knight() knight_pos_x = current_knight.position[0] knight_pos_y = current_knight.position[1] - state = State(knight_pos_x, knight_pos_y, current_knight.direction) + state = State(knight_pos_y, knight_pos_x, current_knight.direction) action_list = graphsearch(state, self.map) print(action_list) if len(action_list) == 0: return - if action_list[0] == ACTION.get("rotate_left"): + next_action = action_list.pop(0) + if next_action == ACTION.get("rotate_left"): current_knight.rotate_left() - elif action_list[0] == ACTION.get("rotate_right"): + elif next_action == ACTION.get("rotate_right"): current_knight.rotate_right() - elif action_list[0] == ACTION.get("go"): + elif next_action == ACTION.get("go"): current_knight.step_forward() - self.map[knight_pos_x][knight_pos_y] = ' ' + self.map[knight_pos_y][knight_pos_x] = ' ' + # update knight on map if current_knight.direction.name == 'UP': - self.map[knight_pos_x][knight_pos_y - 1] = current_knight + self.map[knight_pos_y - 1][knight_pos_x] = current_knight elif current_knight.direction.name == 'RIGHT': - self.map[knight_pos_x + 1][knight_pos_y] = current_knight + self.map[knight_pos_y][knight_pos_x + 1] = current_knight elif current_knight.direction.name == 'DOWN': - self.map[knight_pos_x][knight_pos_y + 1] = current_knight + self.map[knight_pos_y + 1][knight_pos_x] = current_knight elif current_knight.direction.name == 'LEFT': - self.map[knight_pos_x - 1][knight_pos_y] = current_knight + self.map[knight_pos_y][knight_pos_x - 1] = current_knight def update(self): bg_width = (GRID_CELL_PADDING + GRID_CELL_SIZE) * COLUMNS + BORDER_WIDTH diff --git a/models/castle.py b/models/castle.py index 2f51d32..d558d6e 100644 --- a/models/castle.py +++ b/models/castle.py @@ -8,6 +8,6 @@ class Castle(pygame.sprite.Sprite): super().__init__(group) self.image = pygame.image.load("./resources/textures/castle.png").convert_alpha() self.image = pygame.transform.scale(self.image, (78, 78)) - position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + position_in_px = (parse_cord(position[0]), parse_cord(position[1])) self.rect = self.image.get_rect(center=position_in_px) self.health = 80 diff --git a/models/knight.py b/models/knight.py index b2c9cba..f9bac44 100644 --- a/models/knight.py +++ b/models/knight.py @@ -26,7 +26,7 @@ class Knight(pygame.sprite.Sprite): self.image = self.states[self.direction.value] self.position = position - position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + position_in_px = (parse_cord(position[0]), parse_cord(position[1])) self.rect = self.image.get_rect(topleft=position_in_px) self.team = team @@ -36,19 +36,23 @@ class Knight(pygame.sprite.Sprite): self.points = 1 def rotate_left(self): - self.direction = self.direction.right() + self.direction = self.direction.left() self.image = self.states[self.direction.value] def rotate_right(self): - self.direction = self.direction.left() + self.direction = self.direction.right() self.image = self.states[self.direction.value] def step_forward(self): if self.direction.name == 'UP': + self.position = (self.position[0], self.position[1] - 1) self.rect.y = self.rect.y - GRID_CELL_SIZE - 5 elif self.direction.name == 'RIGHT': + self.position = (self.position[0] + 1, self.position[1]) self.rect.x = self.rect.x + GRID_CELL_SIZE + 5 elif self.direction.name == 'DOWN': + self.position = (self.position[0], self.position[1] + 1) self.rect.y = self.rect.y + GRID_CELL_SIZE + 5 elif self.direction.name == 'LEFT': + self.position = (self.position[0] - 1, self.position[1]) self.rect.x = self.rect.x - GRID_CELL_SIZE - 5 diff --git a/models/monster.py b/models/monster.py index 7a97973..fa42177 100644 --- a/models/monster.py +++ b/models/monster.py @@ -16,7 +16,7 @@ class Monster(pygame.sprite.Sprite): super().__init__(group) self.image = random.choice(monster_images) self.image = pygame.transform.scale(self.image, (40, 40)) - position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + position_in_px = (parse_cord(position[0]), parse_cord(position[1])) self.rect = self.image.get_rect(topleft=position_in_px) self.health = random.randrange(15, 25) diff --git a/models/tile.py b/models/tile.py index a28456e..ccbefa6 100644 --- a/models/tile.py +++ b/models/tile.py @@ -7,6 +7,6 @@ class Tile(pygame.sprite.Sprite): def __init__(self, position, image, group, tile_type=' '): super().__init__(group) self.image = image - position_in_px = (parse_cord(position[1]), parse_cord(position[0])) + position_in_px = (parse_cord(position[0]), parse_cord(position[1])) self.rect = self.image.get_rect(topleft=position_in_px) self.tile_type = tile_type \ No newline at end of file -- 2.20.1 From 88297d0b9bd2db784ab17246e6c70528024698c5 Mon Sep 17 00:00:00 2001 From: Angelika Iskra Date: Mon, 11 Apr 2022 12:08:03 +0200 Subject: [PATCH 4/6] added collision to bfs; --- algorithms/bfs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/bfs.py b/algorithms/bfs.py index 94b150f..2e76d45 100644 --- a/algorithms/bfs.py +++ b/algorithms/bfs.py @@ -121,7 +121,7 @@ def go(row, column, direction): def is_valid_move(map, target_row, target_column): - if 0 <= target_row < ROWS and 0 <= target_column < COLUMNS: + if 0 <= target_row < ROWS and 0 <= target_column < COLUMNS and map[target_row][target_column] == ' ': return True return False -- 2.20.1 From e98a4da2aa9c2fa0edf24cbe58663da07cb361a5 Mon Sep 17 00:00:00 2001 From: Angelika Iskra Date: Mon, 11 Apr 2022 12:56:22 +0200 Subject: [PATCH 5/6] finished bfs; --- algorithms/bfs.py | 16 +++++++--------- common/helpers.py | 17 +++++++++++++++++ logic/level.py | 5 +++-- models/castle.py | 1 + 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/algorithms/bfs.py b/algorithms/bfs.py index 2e76d45..316ecf1 100644 --- a/algorithms/bfs.py +++ b/algorithms/bfs.py @@ -3,8 +3,9 @@ from typing import List # temporary goal for testing from common.constants import ACTION, Direction, ROWS, COLUMNS +from common.helpers import castle_neighbors -GOAL = (9, 9) +GOAL_LIST = [] class State: @@ -21,8 +22,8 @@ class Node: self.action = action -def goal_test(state: State): - if (state.row, state.column) == GOAL: +def goal_test(goal_list, state: State): + if (state.row, state.column) in goal_list: return True return False @@ -45,16 +46,13 @@ def get_successors(state: State, map): return successors -def graphsearch(initial_state: State, map, fringe: List[Node] = None, explored: List[Node] = None, - tox: int = None, toy: int = None): +def graphsearch(initial_state: State, map, goal_cords, fringe: List[Node] = None, explored: List[Node] = None): # fringe and explored initialization - global GOAL if fringe is None: fringe = list() if explored is None: explored = list() - if tox is not None and toy is not None: - GOAL = (tox, toy) + goal_list = castle_neighbors(map, goal_cords[0], goal_cords[1]) explored_states = set() fringe_states = set() @@ -73,7 +71,7 @@ def graphsearch(initial_state: State, map, fringe: List[Node] = None, explored: fringe_states.remove((element.state.row, element.state.column, element.state.direction)) # if solution was found, prepare and return actions sequence - if goal_test(element.state): + if goal_test(goal_list, element.state): actions_sequence = [element.action] parent = element.parent diff --git a/common/helpers.py b/common/helpers.py index b3d51c5..dd13e31 100644 --- a/common/helpers.py +++ b/common/helpers.py @@ -28,3 +28,20 @@ def print_numbers(): # parse array index to screen x or y coordinate def parse_cord(cord): return (GRID_CELL_PADDING + GRID_CELL_SIZE) * cord + GRID_CELL_PADDING + 7 + + +def castle_neighbors(map, castle_bottom_right_row, castle_bottom_right_col): + neighbors = [] + for row_add in range(-2, 2): + new_row = castle_bottom_right_row + row_add + if 0 <= new_row <= len(map) - 1: + for col_add in range(-2, 2): + new_col = castle_bottom_right_col + col_add + if 0 <= new_col <= len(map) - 1: + if (new_col == castle_bottom_right_col - 1 and new_row == castle_bottom_right_row - 1) \ + or (new_col == castle_bottom_right_col and new_row == castle_bottom_right_row - 1) \ + or (new_col == castle_bottom_right_col - 1 and new_row == castle_bottom_right_row) \ + or (new_col == castle_bottom_right_col and new_row == castle_bottom_right_row): + continue + neighbors.append((new_col, new_row)) + return neighbors diff --git a/logic/level.py b/logic/level.py index dbfb807..6c5d012 100644 --- a/logic/level.py +++ b/logic/level.py @@ -102,12 +102,13 @@ class Level: def handle_turn(self): print("next turn") - # current_knight = self.list_knights_red[0] current_knight = self.knights_queue.dequeue_knight() knight_pos_x = current_knight.position[0] knight_pos_y = current_knight.position[1] state = State(knight_pos_y, knight_pos_x, current_knight.direction) - action_list = graphsearch(state, self.map) + + castle_cords = (self.list_castles[0].position[0], self.list_castles[0].position[1]) + action_list = graphsearch(state, self.map, castle_cords) print(action_list) if len(action_list) == 0: diff --git a/models/castle.py b/models/castle.py index d558d6e..629f524 100644 --- a/models/castle.py +++ b/models/castle.py @@ -8,6 +8,7 @@ class Castle(pygame.sprite.Sprite): super().__init__(group) self.image = pygame.image.load("./resources/textures/castle.png").convert_alpha() self.image = pygame.transform.scale(self.image, (78, 78)) + self.position = position position_in_px = (parse_cord(position[0]), parse_cord(position[1])) self.rect = self.image.get_rect(center=position_in_px) self.health = 80 -- 2.20.1 From 404eb8e70d28300ac3a75bb923d543ff4d752f3d Mon Sep 17 00:00:00 2001 From: Angelika Iskra Date: Mon, 11 Apr 2022 13:13:03 +0200 Subject: [PATCH 6/6] refactor bfs; --- algorithms/bfs.py | 7 +------ logic/level.py | 4 +++- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/algorithms/bfs.py b/algorithms/bfs.py index 316ecf1..e900faa 100644 --- a/algorithms/bfs.py +++ b/algorithms/bfs.py @@ -1,11 +1,7 @@ from __future__ import annotations from typing import List -# temporary goal for testing from common.constants import ACTION, Direction, ROWS, COLUMNS -from common.helpers import castle_neighbors - -GOAL_LIST = [] class State: @@ -46,13 +42,12 @@ def get_successors(state: State, map): return successors -def graphsearch(initial_state: State, map, goal_cords, fringe: List[Node] = None, explored: List[Node] = None): +def graphsearch(initial_state: State, map, goal_list, fringe: List[Node] = None, explored: List[Node] = None): # fringe and explored initialization if fringe is None: fringe = list() if explored is None: explored = list() - goal_list = castle_neighbors(map, goal_cords[0], goal_cords[1]) explored_states = set() fringe_states = set() diff --git a/logic/level.py b/logic/level.py index 6c5d012..17db1f0 100644 --- a/logic/level.py +++ b/logic/level.py @@ -4,6 +4,7 @@ import pygame from algorithms.bfs import graphsearch, State from common.constants import * +from common.helpers import castle_neighbors from logic.knights_queue import KnightsQueue from logic.spawner import Spawner from models.castle import Castle @@ -108,7 +109,8 @@ class Level: state = State(knight_pos_y, knight_pos_x, current_knight.direction) castle_cords = (self.list_castles[0].position[0], self.list_castles[0].position[1]) - action_list = graphsearch(state, self.map, castle_cords) + goal_list = castle_neighbors(self.map, castle_cords[0], castle_cords[1]) # list of castle neighbors + action_list = graphsearch(state, self.map, goal_list) print(action_list) if len(action_list) == 0: -- 2.20.1