From 9be9cfc9424280f7c2fc4648c2744177757bcb32 Mon Sep 17 00:00:00 2001 From: dima Date: Sat, 1 Feb 2025 13:45:33 +0300 Subject: [PATCH] ver 1.1.2 --- chess_open_world.py | 363 +++++++++++++++++++------------------------- sprites/bB.png | Bin 0 -> 3521 bytes sprites/bK.png | Bin 0 -> 3670 bytes sprites/bN.png | Bin 0 -> 3510 bytes sprites/bP.png | Bin 0 -> 2670 bytes sprites/bQ.png | Bin 0 -> 4233 bytes sprites/bR.png | Bin 0 -> 2991 bytes sprites/wB.png | Bin 0 -> 3404 bytes sprites/wK.png | Bin 0 -> 3681 bytes sprites/wN.png | Bin 0 -> 3387 bytes sprites/wP.png | Bin 0 -> 2385 bytes sprites/wQ.png | Bin 0 -> 4222 bytes sprites/wR.png | Bin 0 -> 2827 bytes 13 files changed, 155 insertions(+), 208 deletions(-) create mode 100644 sprites/bB.png create mode 100644 sprites/bK.png create mode 100644 sprites/bN.png create mode 100644 sprites/bP.png create mode 100644 sprites/bQ.png create mode 100644 sprites/bR.png create mode 100644 sprites/wB.png create mode 100644 sprites/wK.png create mode 100644 sprites/wN.png create mode 100644 sprites/wP.png create mode 100644 sprites/wQ.png create mode 100644 sprites/wR.png diff --git a/chess_open_world.py b/chess_open_world.py index 8ad6879..18e58d7 100644 --- a/chess_open_world.py +++ b/chess_open_world.py @@ -21,13 +21,13 @@ COLOR_SELECTED = (255, 0, 0) COLOR_MOVE = (0, 255, 0) COLOR_WHITE_PIECE = (255, 255, 255) # Заливка белых фигур -COLOR_BLACK_PIECE = (0, 0, 0) # Заливка чёрных фигур +COLOR_BLACK_PIECE = (0, 0, 0) # Заливка чёрных фигур # Новые цвета для бонусов COLOR_REGEN = (0, 255, 0) # Зелёный COLOR_HP_UPGRADE = (0, 128, 255) # Синий COLOR_DAMAGE = (255, 0, 0) # Красный -COLOR_KING_HP_UPGRADE = (255, 215, 0) # Золотой +COLOR_KING_HP_UPGRADE = (255, 215, 0) # Золотой COLOR_ADD_PIECE = (255, 255, 255) # Белый (с плюсом) COLOR_ADD_PIECE_PINK = (255, 192, 203) # Розовый @@ -50,7 +50,7 @@ COLOR_COIN = (255, 165, 0) # Оранжевый screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("Шахматы с Открытым Миром 1.1.1") -# Шрифты +# --- Шрифты --- font = pygame.font.SysFont(None, CELL_SIZE // 2) victory_font = pygame.font.SysFont(None, 60) turn_font = pygame.font.SysFont(None, 30) @@ -61,7 +61,7 @@ shop_font = pygame.font.SysFont(None, 24) # --- Глобальное множество открытых клеток (туман войны) --- global_revealed = set() -# --- Словарь символов --- +# --- Словарь символов (фолбэк, если спрайт не найден) --- piece_symbols = { 'rook': 'Л', 'knight': 'К', @@ -78,7 +78,7 @@ base_bonus_probabilities = { 'regen': 0.42, # 42% 'hp_upgrade': 0.32, # 32% 'damage': 0.2, # 20% - 'king_hp_upgrade': 0.05, # 5% + 'king_hp_upgrade': 0.05, # 5% 'add_piece': 0.01 # 1% } @@ -97,17 +97,14 @@ def choose_bonus_type(): def resolve_combat(attacker, defender): a = attacker.hp b = defender.hp - if a < b: defender.hp = b - a attacker.hp = 0 return (False, True) - elif a > b: attacker.hp = a - b defender.hp = 0 return (True, False) - else: attacker.hp = 1 defender.hp = 0 @@ -121,6 +118,7 @@ class Piece: self.x = x self.y = y self.selected = False + self.has_moved = False # Для ограничения повторного хода за один ход # Инициализация HP if self.name == 'king': @@ -136,11 +134,9 @@ class Piece: def get_possible_moves(self, pieces): moves = [] if self.name == 'pawn': - directions = [ - (-1,-1), (0,-1), (1,-1), - (-1, 0), (1, 0), - (-1, 1), (0, 1), (1, 1) - ] + directions = [(-1,-1), (0,-1), (1,-1), + (-1, 0), (1, 0), + (-1, 1), (0, 1), (1, 1)] for dx, dy in directions: nx = self.x + dx ny = self.y + dy @@ -148,19 +144,14 @@ class Piece: blocking = next((p for p in pieces if p.x == nx and p.y == ny), None) if not blocking or blocking.color != self.color: moves.append((nx, ny)) - elif self.name in ['rook', 'bishop', 'queen']: - # Ограничиваем движение до 3 клеток или до 5 для улучшенного хода max_steps = self.move_range if hasattr(self, 'move_range') else 3 if self.name == 'rook': directions = [(-1,0),(1,0),(0,-1),(0,1)] elif self.name == 'bishop': directions = [(-1,-1),(1,-1),(1,1),(-1,1)] elif self.name == 'queen': - directions = [ - (-1,0),(1,0),(0,-1),(0,1), - (-1,-1),(1,-1),(1,1),(-1,1) - ] + directions = [(-1,0),(1,0),(0,-1),(0,1),(-1,-1),(1,-1),(1,1),(-1,1)] for dx, dy in directions: for step in range(1, max_steps + 1): nx = self.x + dx * step @@ -174,62 +165,52 @@ class Piece: moves.append((nx, ny)) else: break - elif self.name == 'knight': deltas = [(-2,-1),(-1,-2),(1,-2),(2,-1), (2,1),(1,2),(-1,2),(-2,1)] for dx, dy in deltas: - nx, ny = self.x+dx, self.y+dy + nx, ny = self.x + dx, self.y + dy if 0 <= nx < GRID_WIDTH and 0 <= ny < GRID_HEIGHT: blocking = next((p for p in pieces if p.x == nx and p.y == ny), None) if not blocking or blocking.color != self.color: moves.append((nx, ny)) - elif self.name == 'king': - directions = [ - (-1,0),(1,0),(0,-1),(0,1), - (-1,-1),(1,-1),(1,1),(-1,1) - ] + directions = [(-1,0),(1,0),(0,-1),(0,1),(-1,-1),(1,-1),(1,1),(-1,1)] for dx, dy in directions: - nx, ny = self.x+dx, self.y+dy + nx, ny = self.x + dx, self.y + dy if 0 <= nx < GRID_WIDTH and 0 <= ny < GRID_HEIGHT: blocking = next((p for p in pieces if p.x == nx and p.y == ny), None) if not blocking or blocking.color != self.color: moves.append((nx, ny)) - return moves # --- Инициализация фигур --- def initialize_pieces(): - """Чёрные: y=2(back), y=3(pawns). Белые: y=27(back), y=26(pawns).""" + """Чёрные: y=2 (back), y=3 (pawns). Белые: y=27 (back), y=26 (pawns).""" pieces = [] - cx = GRID_WIDTH//2 - - # ЧЁРНЫЕ + cx = GRID_WIDTH // 2 + # Чёрные black_back = ['rook','knight','bishop','king','queen','bishop','knight','rook'] - for i,pname in enumerate(black_back): + for i, pname in enumerate(black_back): x = cx - 3 + i y = 2 - pieces.append(Piece(pname,'black',x,y)) + pieces.append(Piece(pname, 'black', x, y)) for i in range(8): - x = cx-3 + i + x = cx - 3 + i y = 3 - pieces.append(Piece('pawn','black',x,y)) - - # БЕЛЫЕ + pieces.append(Piece('pawn', 'black', x, y)) + # Белые white_back = ['rook','knight','bishop','king','queen','bishop','knight','rook'] - for i,pname in enumerate(white_back): + for i, pname in enumerate(white_back): x = cx - 3 + i y = 27 - pieces.append(Piece(pname,'white',x,y)) + pieces.append(Piece(pname, 'white', x, y)) for i in range(8): - x = cx-3 + i + x = cx - 3 + i y = 26 - pieces.append(Piece('pawn','white',x,y)) - + pieces.append(Piece('pawn', 'white', x, y)) return pieces -# Инициализация фигур pieces = initialize_pieces() selected_piece = None @@ -239,12 +220,13 @@ winner = None # --- Туман войны --- cell_counters = {} # {(x,y): turns_since_last_revealed} -BONUS_GENERATION_CHANCE = 0.10 # 10% шанс появления бонуса при повторном открытии -COIN_GENERATION_CHANCE = 0.001 # 0.1% шанс появления монеты +# Каждая новая клетка имеет 10% шанс стать бонусной. +BONUS_GENERATION_CHANCE = 0.10 -# --- Система ходов --- +# --- Система ходов и многоперемещений --- current_turn = 'white' # Начинаем с белых turn_count = 0 +moves_remaining = 3 # За один ход игрок может сделать 3 перемещения # --- Механика повышения вероятности красных полей --- def update_bonus_probabilities(): @@ -292,26 +274,31 @@ def check_timer(): else: switch_turn() +# При переключении хода сбрасываем число оставшихся ходов и флаг has_moved у фигур текущего игрока. def switch_turn(): - global current_turn, turn_count, timer_expired + global current_turn, turn_count, timer_expired, moves_remaining current_turn = 'black' if current_turn == 'white' else 'white' turn_count += 1 reset_timer() timer_expired = False update_bonus_probabilities() + moves_remaining = 3 + for p in pieces: + if p.color == current_turn: + p.has_moved = False +# После успешного перемещения фигуры вызываем эту функцию. +def end_move(moved_piece): + global moves_remaining + moved_piece.has_moved = True + moves_remaining -= 1 + if moves_remaining <= 0: + switch_turn() + +# --- Обновление тумана войны и генерация бонусов/монет --- def update_fog(): - """ - Обновляет туман войны: - - Открытые клетки остаются открытыми. - - Закрытые клетки, которые не находятся рядом с любыми фигурами на расстоянии 2 клеток, - становятся закрытыми через 5 ходов. - - При повторном открытии клетки шанс на появление нового бонуса. - """ global global_revealed, bonus_cells - previous_revealed = global_revealed.copy() - new_revealed = set() for p in pieces: for dx in range(-2, 3): @@ -320,13 +307,9 @@ def update_fog(): ny = p.y + dy if 0 <= nx < GRID_WIDTH and 0 <= ny < GRID_HEIGHT: new_revealed.add((nx, ny)) - - # Исключаем клетки торговцев из тумана войны for merchant_pos in merchant_positions: new_revealed.add(merchant_pos) - newly_revealed = new_revealed - previous_revealed - for y in range(GRID_HEIGHT): for x in range(GRID_WIDTH): pos = (x, y) @@ -338,34 +321,24 @@ def update_fog(): cell_counters[pos] += 1 else: cell_counters[pos] = 1 - if cell_counters[pos] >= 5: if pos in global_revealed: global_revealed.remove(pos) - # Удаляем бонус, если клетка закрывается и бонус не является 'damage' if pos in bonus_cells and bonus_cells[pos]['type'] != 'damage': del bonus_cells[pos] - - # Генерируем бонусы и монеты на новых открытых клетках for pos in newly_revealed: if pos not in bonus_cells and pos not in coin_cells and random.random() < BONUS_GENERATION_CHANCE: - bonus_type = choose_bonus_type() - if not any(p.x == pos[0] and p.y == pos[1] for p in pieces): - bonus_cells[pos] = {'type': bonus_type} - # Генерация монет - if pos not in coin_cells and random.random() < COIN_GENERATION_CHANCE: - if not any(p.x == pos[0] and p.y == pos[1] for p in pieces): - coin_cells.add(pos) + if random.random() < 0.90: + bonus_type = choose_bonus_type() + if not any(p.x == pos[0] and p.y == pos[1] for p in pieces): + bonus_cells[pos] = {'type': bonus_type} + else: + if not any(p.x == pos[0] and p.y == pos[1] for p in pieces): + coin_cells.add(pos) # --- Добавление торговцев --- -# Определяем позиции торговцев: центральная линия по краям central_line_y = GRID_HEIGHT // 2 -merchant_positions = [ - (0, central_line_y), - (GRID_WIDTH - 1, central_line_y) -] - -# Добавляем торговцы в глобальное множество открытых клеток +merchant_positions = [(0, central_line_y), (GRID_WIDTH - 1, central_line_y)] global_revealed.update(merchant_positions) # --- Монеты на поле --- @@ -375,14 +348,44 @@ coin_cells = set() player_coins = {'white': 0, 'black': 0} # --- Механика магазина --- +# Повышенные цены: 6 монет за покупку shop_open = False shop_items = { - 'extend_move': {'name': 'Расширить ход', 'cost': 3}, - 'increase_hp': {'name': 'Увеличить HP', 'cost': 3}, - 'damage_enemy': {'name': 'Уменьшить HP врага', 'cost': 3}, - 'curse': {'name': 'Проклятие', 'cost': 3} + 'extend_move': {'name': 'Расширить ход', 'cost': 6}, + 'increase_hp': {'name': 'Увеличить HP', 'cost': 6}, + 'damage_enemy': {'name': 'Уменьшить HP врага', 'cost': 6}, + 'curse': {'name': 'Проклятие', 'cost': 6} } +# --- Реализация спрайтов фигур --- +# Ожидается, что в папке "sprites" находятся файлы: wK.png, wQ.png, wR.png, wB.png, wN.png, wP.png для белых, +# и bK.png, bQ.png, bR.png, bB.png, bN.png, bP.png для чёрных. +piece_sprites = {} + +def load_piece_sprites(): + piece_names_map = { + 'king': 'K', + 'queen': 'Q', + 'rook': 'R', + 'bishop': 'B', + 'knight': 'N', + 'pawn': 'P' + } + colors = ['white', 'black'] + for color in colors: + letter = 'w' if color == 'white' else 'b' + for name in piece_names_map: + filename = f"sprites/{letter}{piece_names_map[name]}.png" + try: + image = pygame.image.load(filename).convert_alpha() + image = pygame.transform.scale(image, (CELL_SIZE, CELL_SIZE)) + piece_sprites[(color, name)] = image + except Exception as e: + print(f"Ошибка загрузки спрайта {filename}: {e}") + piece_sprites[(color, name)] = None + +load_piece_sprites() + # --- Функции отрисовки --- def draw_grid(): for x in range(0, CELL_SIZE * GRID_WIDTH, CELL_SIZE): @@ -395,38 +398,37 @@ def draw_fog(): for x in range(GRID_WIDTH): pos = (x, y) if pos not in global_revealed: - rect = pygame.Rect(x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE, CELL_SIZE) + rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, COLOR_FOG, rect) else: if pos in merchant_positions: - continue # Торговцы всегда видимы + continue if cell_counters.get(pos, 0) == 4: - rect = pygame.Rect(x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE, CELL_SIZE) + rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, COLOR_PRE_FOG, rect) def draw_bonus_cells(): for (bx, by), info in bonus_cells.items(): - # Для 'damage' бонусов отображаем всегда, иначе только если клетка видна if info['type'] != 'damage' and (bx, by) not in global_revealed: continue - cx = bx*CELL_SIZE + CELL_SIZE//2 - cy = by*CELL_SIZE + CELL_SIZE//2 + cx = bx * CELL_SIZE + CELL_SIZE // 2 + cy = by * CELL_SIZE + CELL_SIZE // 2 bonus_type = info['type'] if bonus_type == 'regen': color = COLOR_REGEN - pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE//4) + pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE // 4) elif bonus_type == 'hp_upgrade': color = COLOR_HP_UPGRADE - pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE//4) + pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE // 4) elif bonus_type == 'damage': color = COLOR_DAMAGE - pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE//4) + pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE // 4) elif bonus_type == 'king_hp_upgrade': color = COLOR_KING_HP_UPGRADE - pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE//4) + pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE // 4) elif bonus_type == 'add_piece': possible = False - for dx, dy in [(-1,0),(1,0),(0,-1),(0,1), (-1,-1),(1,-1),(1,1),(-1,1)]: + for dx, dy in [(-1,0),(1,0),(0,-1),(0,1),(-1,-1),(1,-1),(1,1),(-1,1)]: nx = bx + dx ny = by + dy if 0 <= nx < GRID_WIDTH and 0 <= ny < GRID_HEIGHT: @@ -434,25 +436,22 @@ def draw_bonus_cells(): possible = True break color = COLOR_ADD_PIECE if possible else COLOR_ADD_PIECE_PINK - pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE//4) - # Рисуем плюс - pygame.draw.line(screen, (0,0,0), (cx - CELL_SIZE//8, cy), (cx + CELL_SIZE//8, cy), 2) - pygame.draw.line(screen, (0,0,0), (cx, cy - CELL_SIZE//8), (cx, cy + CELL_SIZE//8), 2) + pygame.draw.circle(screen, color, (cx, cy), CELL_SIZE // 4) + pygame.draw.line(screen, (0, 0, 0), (cx - CELL_SIZE // 8, cy), (cx + CELL_SIZE // 8, cy), 2) + pygame.draw.line(screen, (0, 0, 0), (cx, cy - CELL_SIZE // 8), (cx, cy + CELL_SIZE // 8), 2) def draw_coin_cells(): for pos in coin_cells: if pos not in global_revealed: - continue # Монеты видны только в открытых клетках + continue x, y = pos cx = x * CELL_SIZE + CELL_SIZE // 2 cy = y * CELL_SIZE + CELL_SIZE // 2 size = CELL_SIZE // 3 - # Рисуем оранжевый треугольник point1 = (cx, cy - size) point2 = (cx - size, cy + size) point3 = (cx + size, cy + size) pygame.draw.polygon(screen, COLOR_COIN, [point1, point2, point3]) - # Рисуем символ доллара dollar_text = font.render('$', True, (0, 0, 0)) text_rect = dollar_text.get_rect(center=(cx, cy)) screen.blit(dollar_text, text_rect) @@ -460,151 +459,123 @@ def draw_coin_cells(): def draw_merchants(): for pos in merchant_positions: x, y = pos - rect = pygame.Rect(x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE, CELL_SIZE) + rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, COLOR_MERCHANT, rect) - # Рисуем стрелку вверх - arrow_color = (255, 255, 255) - arrow_size = CELL_SIZE // 2 points = [ (x * CELL_SIZE + CELL_SIZE // 2, y * CELL_SIZE + CELL_SIZE // 4), (x * CELL_SIZE + CELL_SIZE // 4, y * CELL_SIZE + 3 * CELL_SIZE // 4), (x * CELL_SIZE + 3 * CELL_SIZE // 4, y * CELL_SIZE + 3 * CELL_SIZE // 4) ] - pygame.draw.polygon(screen, arrow_color, points) + pygame.draw.polygon(screen, (255, 255, 255), points) def draw_pieces(pieces): for p in pieces: - rect = pygame.Rect(p.x*CELL_SIZE, p.y*CELL_SIZE, CELL_SIZE, CELL_SIZE) - - if p.color == 'white': - pygame.draw.rect(screen, COLOR_WHITE_PIECE, rect) - symbol = piece_symbols.get(p.name,'?') - text = font.render(symbol, True, (255,0,0)) - text_rect = text.get_rect(center=rect.center) - screen.blit(text, text_rect) - # HP чёрным - hp_str = f"{p.hp}/{p.max_hp}" - hp_text = font.render(hp_str, True, (0,0,0)) - screen.blit(hp_text, (rect.x+2, rect.y+2)) + x = p.x * CELL_SIZE + y = p.y * CELL_SIZE + sprite = piece_sprites.get((p.color, p.name)) + if sprite: + screen.blit(sprite, (x, y)) else: - pygame.draw.rect(screen, COLOR_BLACK_PIECE, rect) - symbol = piece_symbols.get(p.name,'?') - text = font.render(symbol, True, (255,0,0)) + rect = pygame.Rect(x, y, CELL_SIZE, CELL_SIZE) + if p.color == 'white': + pygame.draw.rect(screen, COLOR_WHITE_PIECE, rect) + else: + pygame.draw.rect(screen, COLOR_BLACK_PIECE, rect) + symbol = piece_symbols.get(p.name, '?') + text = font.render(symbol, True, (255, 0, 0)) text_rect = text.get_rect(center=rect.center) screen.blit(text, text_rect) - # HP белым - hp_str = f"{p.hp}/{p.max_hp}" - hp_text = font.render(hp_str, True, (255,255,255)) - screen.blit(hp_text, (rect.x+2, rect.y+2)) - + # Отрисовка HP с полупрозрачным фоном для лучшей читаемости: + hp_str = f"{p.hp}/{p.max_hp}" + # Определяем цвета: для белых фигур текст будет черным, для черных – белым; + # фон выбираем противоположный + if p.color == 'white': + text_color = (0, 0, 0) + bg_color = (255, 255, 255) + else: + text_color = (255, 255, 255) + bg_color = (0, 0, 0) + hp_text = font.render(hp_str, True, text_color) + text_rect = hp_text.get_rect(topleft=(x + 2, y + 2)) + # Создаем временную поверхность для фона с альфа-каналом + bg_surf = pygame.Surface(text_rect.size) + bg_surf.set_alpha(200) # степень прозрачности (0-255) + bg_surf.fill(bg_color) + screen.blit(bg_surf, text_rect.topleft) + screen.blit(hp_text, text_rect.topleft) if p.selected: + rect = pygame.Rect(x, y, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, COLOR_SELECTED, rect, 2) - for (mx, my) in possible_moves: - r = pygame.Rect(mx*CELL_SIZE, my*CELL_SIZE, CELL_SIZE, CELL_SIZE) + r = pygame.Rect(mx * CELL_SIZE, my * CELL_SIZE, CELL_SIZE, CELL_SIZE) pygame.draw.rect(screen, COLOR_MOVE, r, 2) def draw_statistics_panel(): panel_rect = pygame.Rect(CELL_SIZE * GRID_WIDTH, 0, PANEL_WIDTH, WINDOW_HEIGHT) pygame.draw.rect(screen, (50, 50, 50), panel_rect) - - # Заголовок title_text = shop_font.render("Статистика", True, (255, 255, 255)) screen.blit(title_text, (CELL_SIZE * GRID_WIDTH + 10, 10)) - - # Текущий ход turn_text = turn_font.render(f"Ход: {current_turn.capitalize()}", True, COLOR_TURN_TEXT) screen.blit(turn_text, (CELL_SIZE * GRID_WIDTH + 10, 50)) - - # Количество ходов counter_text = counter_font.render(f"Ходов: {turn_count}", True, (255, 255, 255)) screen.blit(counter_text, (CELL_SIZE * GRID_WIDTH + 10, 80)) - - # Таймер time_left = get_time_left() minutes = time_left // 60 seconds = time_left % 60 timer_text_str = f"Время: {minutes:02}:{seconds:02}" - if timer_expired and player_timeouts[current_turn] >=1: - color = COLOR_TIMER_WARNING - else: - color = COLOR_TIMER_NORMAL + color = COLOR_TIMER_WARNING if timer_expired and player_timeouts[current_turn] >= 1 else COLOR_TIMER_NORMAL timer_text = timer_font.render(timer_text_str, True, color) screen.blit(timer_text, (CELL_SIZE * GRID_WIDTH + 10, 110)) - - # Количество монет coins_text_white = counter_font.render(f"Белые монеты: {player_coins['white']}", True, (255, 255, 0)) coins_text_black = counter_font.render(f"Чёрные монеты: {player_coins['black']}", True, (255, 255, 0)) screen.blit(coins_text_white, (CELL_SIZE * GRID_WIDTH + 10, 140)) screen.blit(coins_text_black, (CELL_SIZE * GRID_WIDTH + 10, 170)) - - # Если открыт магазин, отображаем его + moves_text = counter_font.render(f"Осталось ходов: {moves_remaining}", True, (255, 255, 255)) + screen.blit(moves_text, (CELL_SIZE * GRID_WIDTH + 10, 200)) if shop_open: draw_shop() def draw_shop(): shop_x = CELL_SIZE * GRID_WIDTH + 10 - shop_y = 200 + shop_y = 240 shop_title = shop_font.render("Магазин", True, (255, 255, 0)) screen.blit(shop_title, (shop_x, shop_y)) - for idx, (key, item) in enumerate(shop_items.items()): item_y = shop_y + 40 + idx * 60 - # Кнопка button_rect = pygame.Rect(shop_x, item_y, PANEL_WIDTH - 20, 50) - # Проверка, хватает ли монет - if player_coins[current_turn] >= item['cost']: - button_color = (0, 255, 0) # Зелёный - else: - button_color = (128, 128, 128) # Серый + button_color = (0, 255, 0) if player_coins[current_turn] >= item['cost'] else (128, 128, 128) pygame.draw.rect(screen, button_color, button_rect) - # Название предмета - item_text = shop_font.render(f"{item['name']} - {item['cost']} мон.", True, (0,0,0)) + item_text = shop_font.render(f"{item['name']} - {item['cost']} мон.", True, (0, 0, 0)) screen.blit(item_text, (shop_x + 5, item_y + 15)) - # Хранение позиции кнопки для обработки кликов shop_items[key]['button_rect'] = button_rect def draw_victory(winner): text = victory_font.render(f"{winner.capitalize()} победил!", True, (255, 255, 255)) - text_rect = text.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2)) + text_rect = text.get_rect(center=(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2)) screen.blit(text, text_rect) def apply_bonus(piece, bonus_type, pieces): - """Применяем эффект бонуса к фигуре piece в зависимости от типа.""" if bonus_type == 'regen': - # Регенерация (1..2) для НЕ короля if piece.name != 'king': amt = random.randint(1, 2) piece.hp = min(piece.hp + amt, piece.max_hp) - elif bonus_type == 'hp_upgrade': - # Повышение max_hp только НЕ королю без восстановления HP if piece.name != 'king': piece.max_hp += 1 - # piece.hp остается неизменным - elif bonus_type == 'king_hp_upgrade': - # Только для короля, бонус активируется другим игроком if piece.name != 'king': - # Найти короля той же команды king = next((p for p in pieces if p.name == 'king' and p.color == piece.color), None) if king: if king.hp == king.max_hp: - # Увеличиваем max_hp на 1 king.max_hp += 1 king.hp = king.max_hp else: - # Восстанавливаем HP до max king.hp = min(king.hp + 1, king.max_hp) - elif bonus_type == 'damage': - # Урон при прохождении через клетку 'damage' уже обрабатывается отдельно pass - elif bonus_type == 'add_piece': - # Добавление новой фигуры рядом, если возможно и не король if piece.name != 'king': - directions = [(-1,0),(1,0),(0,-1),(0,1), (-1,-1),(1,-1),(1,1),(-1,1)] + directions = [(-1,0),(1,0),(0,-1),(0,1),(-1,-1),(1,-1),(1,1),(-1,1)] random.shuffle(directions) for dx, dy in directions: nx = piece.x + dx @@ -617,15 +588,15 @@ def apply_bonus(piece, bonus_type, pieces): def handle_shop_purchase(key): if player_coins[current_turn] < shop_items[key]['cost']: - return # Недостаточно монет + return player_coins[current_turn] -= shop_items[key]['cost'] if key == 'extend_move': for p in pieces: if p.color == current_turn: if p.name in ['rook', 'bishop', 'queen']: - setattr(p, 'move_range', getattr(p, 'move_range', 3) + 2) # До 5 + setattr(p, 'move_range', getattr(p, 'move_range', 3) + 2) elif p.name == 'pawn': - setattr(p, 'move_range', getattr(p, 'move_range', 1) + 1) # До 2 + setattr(p, 'move_range', getattr(p, 'move_range', 1) + 1) elif key == 'increase_hp': for p in pieces: if p.color == current_turn and p.name != 'king': @@ -640,12 +611,10 @@ def handle_shop_purchase(key): elif p.hp > 1: p.hp = 1 else: - p.hp = 1 # Уже 1, остаётся 1 + p.hp = 1 elif key == 'curse': - # Уменьшаем вероятность появления 'regen' и 'hp_upgrade' на 10% bonus_probabilities['regen'] = max(bonus_probabilities['regen'] - 0.10, 0) bonus_probabilities['hp_upgrade'] = max(bonus_probabilities['hp_upgrade'] - 0.10, 0) - # Нормализуем вероятности total_prob = sum(bonus_probabilities.values()) for bt in bonus_probabilities: bonus_probabilities[bt] /= total_prob if total_prob > 0 else 1 @@ -663,36 +632,25 @@ while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False - elif event.type == pygame.MOUSEBUTTONDOWN and not game_over: mx, my = pygame.mouse.get_pos() if mx < CELL_SIZE * GRID_WIDTH and my < CELL_SIZE * GRID_HEIGHT: gx = mx // CELL_SIZE gy = my // CELL_SIZE - clicked_piece = next((p for p in pieces if p.x == gx and p.y == gy), None) - if selected_piece: if (gx, gy) in possible_moves: - # Проверяем бонус if (gx, gy) in bonus_cells: bonus_type = bonus_cells[(gx, gy)]['type'] apply_bonus(selected_piece, bonus_type, pieces) del bonus_cells[(gx, gy)] - - # Проверяем монету if (gx, gy) in coin_cells: player_coins[current_turn] += 1 coin_cells.remove((gx, gy)) - - # Проверяем, является ли клетка торговцем if (gx, gy) in merchant_positions: shop_open = True - - # Проверяем, есть ли там вражеская фигура defender = next((p for p in pieces if p.x == gx and p.y == gy), None) if defender: - # Проводим бой attacker = selected_piece attacker_alive, defender_alive = resolve_combat(attacker, defender) if not defender_alive: @@ -708,15 +666,14 @@ while running: switch_turn() continue else: - # Перемещаем атакующего path = [] if attacker.name in ['rook', 'bishop', 'queen']: dx = gx - attacker.x dy = gy - attacker.y if dx != 0: - dx = dx // abs(dx) + dx //= abs(dx) if dy != 0: - dy = dy // abs(dy) + dy //= abs(dy) for step in range(1, max(abs(gx - attacker.x), abs(gy - attacker.y))): path_x = attacker.x + dx * step path_y = attacker.y + dy * step @@ -724,7 +681,7 @@ while running: survived = True for pos in path: if pos in bonus_cells and bonus_cells[pos]['type'] == 'damage': - damage = random.randint(1,5) + damage = random.randint(1, 5) attacker.hp = max(attacker.hp - damage, 0) del bonus_cells[pos] if attacker.hp == 0: @@ -738,20 +695,18 @@ while running: attacker.x = gx attacker.y = gy attacker.selected = False + end_move(attacker) selected_piece = None possible_moves.clear() - switch_turn() - else: - # Пустая клетка — просто ходим path = [] if selected_piece.name in ['rook', 'bishop', 'queen']: dx = gx - selected_piece.x dy = gy - selected_piece.y if dx != 0: - dx = dx // abs(dx) + dx //= abs(dx) if dy != 0: - dy = dy // abs(dy) + dy //= abs(dy) for step in range(1, max(abs(gx - selected_piece.x), abs(gy - selected_piece.y))): path_x = selected_piece.x + dx * step path_y = selected_piece.y + dy * step @@ -759,7 +714,7 @@ while running: survived = True for pos in path: if pos in bonus_cells and bonus_cells[pos]['type'] == 'damage': - damage = random.randint(1,5) + damage = random.randint(1, 5) selected_piece.hp = max(selected_piece.hp - damage, 0) del bonus_cells[pos] if selected_piece.hp == 0: @@ -773,36 +728,28 @@ while running: selected_piece.x = gx selected_piece.y = gy selected_piece.selected = False + end_move(selected_piece) selected_piece = None possible_moves.clear() - switch_turn() - update_fog() else: selected_piece.selected = False selected_piece = None possible_moves.clear() - else: - # Выбираем фигуру только если клетка видима и соответствует текущему ходу - if clicked_piece and (gx, gy) in global_revealed and clicked_piece.color == current_turn: + if clicked_piece and (gx, gy) in global_revealed and clicked_piece.color == current_turn and not clicked_piece.has_moved: selected_piece = clicked_piece selected_piece.selected = True possible_moves = selected_piece.get_possible_moves(pieces) - else: - # Клик в правой панели if shop_open: for key, item in shop_items.items(): if 'button_rect' in item and item['button_rect'].collidepoint(mx, my): if player_coins[current_turn] >= item['cost']: handle_shop_purchase(key) - elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: shop_open = False - - # Отрисовка screen.fill(COLOR_BG) draw_grid() draw_fog() diff --git a/sprites/bB.png b/sprites/bB.png new file mode 100644 index 0000000000000000000000000000000000000000..264f82b66d1d9a3bf53a22678c47804a7bf8ca7b GIT binary patch literal 3521 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 Koic6v$o~MBf{5n; literal 0 HcmV?d00001 diff --git a/sprites/bK.png b/sprites/bK.png new file mode 100644 index 0000000000000000000000000000000000000000..c451963e19611b60e37113835abd08d28568757a GIT binary patch literal 3670 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 Q_&Ej{=$L3%pl^r&ANVz%@c;k- literal 0 HcmV?d00001 diff --git a/sprites/bN.png b/sprites/bN.png new file mode 100644 index 0000000000000000000000000000000000000000..77f00d3619a339c41b47dce946b7f746bbcd769c GIT binary patch literal 3510 zcmYk8cQoAF7RN^rjFt#vbkTc@UK3G98>074jOav0h`72iqDLYVk%jwt# z0h@$`h{*o}fKyad6fDin&8@Ai!J%$$ZujrspP!#ED=P#3fPercB_*({r>9q4 zUG44d-PYD7DJe<$&j6o;7#t3#sHiwRJRBY#uA`#^Je{4LLqkKrd3JVo`SNApad&rL zTU*oC)_(QsRajUUm@6wQfB*gs!nU`!i;IgpIyxE}8UzIefu@g-50D3yB9TZSQeIxZ zu&@AZpaVu$Ru&qKo|u^U`SWKl5&6^+%kPj^_t+KK*s8L;A{r2tK^78VaBY-m%6%}X-0|SGGh6WrCXJTRkrIC}9 zGcqy)h5!q=IhvZ9Fc=Kv42rU|v$M3ctg5P-o}NY^5Ui}Mg@uKH!0hbo($W%vKv-X2 z2Q6S@V@pj*?u<$K!Kzb9Z)j zYHDgKDk=cpYs8XIAp5isQ=}QhoRaJk*9i$Jy>c9s_A)ue6-FAkknAZt_ql?k7J^S* zahKEZ4%=e5u&9;OK+dtXyq+1Rq#)YX_tr8-w+`vFfiHv2xc%@O$*yw4_V4w7dpkws zaZn6-bWfvsTzzKFI{5u@xQsBdXv=G4$zv`)df~&5JjXl^t<1*C#I~PlL7D4FOeLwr zU-y|m%aWnUR2%8lwLGVV9E>g}_h3*SULSB90J5 z92OW$%|HNuGLvvku6RS|rP@VSH#$YS7=pR|gKsIL8#+jL!Oi?LzT;o$q0{9DT=vH_ zN8|f)PPa3BY&!)yM7WYW6D`WNJ13oxdKs$(O8jKT<4X}Mo+-WOGSxkQR@v}%^*YA8 zkCY5%^BWe0eacX`d>^`0Q9@wZd=O zM#GoCtHbEv~-_S=8k20s|Ep%{j#P+8tJbb9V`-#%<%){4(rG@wt+13lm z)sVvVKW80w%2aZv)0y+rc+tySEQBtvheEAX5c$*iwHKr~uN&ukn{n`-+x^K*PgZ8B zRK$%&avJ84TR}8w|z&@%8pph z4Xr;`&cd(j>>>8v#D-~qi(P!N7SL2)D9-NpE?FlpK0aY|x2V~-g#_02DE)qI2@l^! z{pHfOS+p{?f_hXouC3xAVCH@e+uRX9Jn(8;wC?UUp5{bN!b)g~Rsr2cOIaD_{4>EN z*dcis9YF?D`y(ZD>xN>3k2rgSR+|M$zG$qg%rE(r$cgc*jautIKO7ENcqoHvD8lA> z6gPb+*)Te`NtAJ#`QdVPtPVz@EhDQVERWpuvt${i z%zfi9gg=W+j$NXjRq54p!6;g|)}EU8kcNh9t$$&up@{g@Csf9^(SM*T^_nj1F#nQ$ zQc9*!ZvD>n)xSPE=(N=O6DrF6f-N9jis>?MiR^KNQsELdiT#qo>dZ$U$QL2R8 z@$a?MU;8)$WKr@t`B4vqG7ON6I|8e6vSb^toc-51SBb2cBWbvAr=Ps;OAMCiv=|g0 zJ|~ir9~@H~xS!E^_(mH^|bdPSq#*MxoNE830>2v^if>0z!&xnoypZ& zis)=h<3bh-o4ANuWVqWMVPeR}=|!s2*25Na`KPr^OoMpm5wB>j7A88BLpG-;Ar2Y%4$2vPTVW)<7OytHe1`!LI|9l^5o4_5ZG(Hz`#*H%Q$&>*RsU*8}y`_f%NXkJ8b+PNs@2hS#osmnLM zZ%3jUzOXBIGb5*&O=al^;(|C9vn(RUa1-8T^oDl#&l7#vok-gH5(hnR#=v=Ts?-eY z{lihM@}tOKQl8~MqNbHrk`a45(QI>xW8TCcs2&{_uiX5US6A2MRz>>X8E&nm->VO_ zR$=b#rM6LwBo9%dQO4*L5WV1qsq=;cQ)R^?#MRG--_L2Qcs1AO zt};UL(emE8xp&DPVuCoZPpYwPII;Ua#-@2w6!hZVVT(L_WYH8Z#qaF(cy&$PwYiiu z3yylHm{Nnj=B6BrE*{W-=#`H94gZb)U6U3u($6-b%l178g)>CPxThd9`VpgfD(WS+ z#k%r3y-{N#$9KO{VNjy>MuCZeSS}|uoPpEz%y%!;ycC33>hw|Xi%{z@$YhpCu?0;C zt$v7#$9t~U%{9+o^QOqqWap%v;(}?u%;(6XU#7O*$_F{)-EVM^oh{KSrFpnP#Iof; zYwic)^E=+Q^U#-se#dL)u8J0A*&Yo(dO{xSa6T3Xip~^;*@*pYHCUlz1w0dr=g=44 zZ#)`9m`%^S_^GG23B3HcqgSr~Vv5}Y^;YH}L*RzE1H}LLR$mKe+@>6zxwM;GgshOe z55?H=$PwP^NvjX*hFRWcxz(Be zAs%hw?11CsGcVOkpQ(k;@tW;b?i1nux2%GTCi3+^dMBh;)}fb8y~kB2^HUUMg}&J^ zlj7c2Pdw-zyZY;BAmXKJ;};X{TF>*dpAZg|5l?|e9Ve%QR7+LV{uIyZM3WjT`5x9S z6X8|R|JcXC5EHsk6LD3vY?`u|c_?g~*#n{`7>ap)*c6I%Avrw3R(*UUJ=z}ZE?XDs zusoJnbVm;Q?Q?PBhCjrmZ(yC-em`d0m{cfyN!M(dF((nP(AASBV^U%D=2%5H!FlGK zB=H5q*$#xCyGjg4X|#A)Xjaj(+8oeHzV_4z7rqJ zgpv9YbIHk-*_Fo+4YwFjWmA$PyeOh)LdV*MD+1mpb#v^D7@i_`di@sO-t3mX;W zldMFD4fNub9vSA(1#2;8Ye+Nlf53Nl59=Wq4wLk{T+=Bx$`u_B8^N%T5F zjPMDGE>S1ZRxc|^NU+cMIcLxJob%rI-usmIe}DHp=S{-cT5)rVb3z~xZfg|M9=tLC zeb||RZ607OfIyfa7#o}=2*KdxeHxyeoVtGC;q&y87bc;_mM5 z*|TSLbaZTNY(O4lyu7@?2~|~9!^6WrfBroE-0|@-`1F-4S6p0N2n2$&volaQJw1JJ zaM0J+2LvQ0CW5ISKYpa8rM0)W2L%Oz1!OWAs7gpksI9FvGczL+iRI13i_V@IXNXIB}GL=H8nK_1qFaYSy>s-gTvvPnwqMrs(_M)h6doQ zudffpn46pH>gob{fEW^qG%zqQG&I!K*1mAz0s?^$7Z*Q&{=9{Sg^7uYk&%(Hu`wEr zwzIQyaB#SI@uIM>FlaGgC?q5VXw=ly09-&kC>e0*?d`?m@t`z7es6EDzrP=_C6P!1 z0s=G|t*fhReSMvSgX6TC>lx|IExxV`Jm;@^Wl!Y*JDZ;0F3KI5=2TR0LX+o10r)TpSh_=I!l$>((tgogN$< z{N%|K&}9mR0$LCFZyy|9274$(ds_zxF3yPYP=*cjHp84c>9D4Myzq;Re zn6w$WwX)hfexkl)I1rXNJYZNe3)K=>GJF2E%1X1Kfw)rF*Ph^tCQl<+8kQRdEGT1* z>K5I9v#7{dQ$IlnVSBqPR~wlsS|#K?=Q%M+Gxg#;(DltG&~{E80yG5l4fI z&^I0s#uE+f6JK)$k8xV=UAz&eexLHFT3+G-G2x+Pbe!nrBbstuZvm}+F0X|;G&D0d zWVIDL75MVmYKrwv{Fw2v*yif$ngwi_@}~P*L@wCGCE?;u?N&?xHbWK^PQ?;6Ma&efRwF#!QQ5$$qnNaVVlQi4- zdUBT=<(h#YF(5w2#joNMPIXk}rZa2RVx|YP7`8i~?%)K`&`EDOTVOoV*cLyxmhx@E zZG|W+YOC~pnGG@mzpiHoy~p|CG30nXnZ1pS5aW)kkqY}}8y)a0U490I85d#LZw?Qa zt0wACiE*=Dc!w*BonX^xPsQHfy|1!I6rD5vrCDU;pr4>EoyOW(+K+m##XKT{Nq^L> zvhHdyC}M+jJ0RRFpm+q#=GLj+mU@HtU4yT=y5<~|#%Ns7(pLfFS zGFT>P&y`xXA2q((M=G&@2dDLg8TPOFSz*H)XiL7AVY1bAzDk{_jy&X)p&&9LZQh{3 z?shj*p#c1PdAc&L9D097GU21XXzIn-jW#XDs87;&Q0mnd$_qQmu00(QQ~chB1}UoY(5R<=e)3@LsII>>K0hfl(4V!bO)vqz*=txQ`D*1kM~A*W9TLou(z_Kj^k)@M zXw^;p>Yloyx<>WK_ho*E{Og-~5x)<03VSj>wAqsW9_GBEmL!oUlgj-limXG}3=x?Z z@1+0WZ3^oyQVF*&!@TloT4aN;MdYiQlmu%ZB|u)a7F)_cR)l4Uh7N2%rhc13QqS`& zDc2RycR#K{+MC&&<>)B(w$C3DbSf=%`tL-Cw)|=^VV3cZ`Lp=F&l+!Gy0y$n*kp$I zVPVa1A!AAZlKXt};^7+mzr5M99(t){>y|9s`9`+U6uRKEAR+KfR7w~6K0-18!J90C zhiTMoxNKXAPE2Omgol}~A&s0k%-^-#!6{795e#>;Q{7<53N~{(Tc?C}9RAIsIbted z+)v+Qw~4V3=QWRQvP&vxHBs~s4Aqo0$*~S|mKMzaaBMm*+Sob2Q=+XzdebVZAm5)= z#q*=<{P+ZPZqVOc{}u<)p5}iOlX0W!MCSboqNH;m3-0rpXa8F;!(@j{QkPqG)EQkF zWhr9x8Z>6@4~2o6(I#Q4ct5k4=2{&`n-(IoK^GrmU6gbHCfc zv(*dU67=Pjw1cRjw95jj35n%Z$@sjn6_R#nk?Kz1)N*!y;Gx*m+BSCzO;umFr1|y> zy=d~41=X~!2Px#WJa}uHeclDkD9P2plrWt+N z*#}RHh7|9*vTJ-S?IZP|Tla6?_SJN+&b7qXkF%cenBp?;I`bRtao>{B@{Y2F{nZ*- zwJ*+Oo#E{6doX%Zb%YvJWb~NsD#$r^y_nV)Wr%H$QKxGA`DrFTd#OG`mGZ}x_HlBL zYR;yT9J_*l=DTm->XlJd8pV)k)$?`C523NfA)XRiaTj&i@L$6I{uu$mKP-7Yi1%#@ znUN|-$md=rRZ!~-o5{V7BN;7uSAGkeeQp^vE2J7wmS^wMpxO~~m^;~``uM~543w7| zwZ=a(wT(bg5Oj18?ks94Dd9p6jpELgc6f|tRq{01D-?K_`4FDSJm~HgA3-*wldc{< zPsWvUi#MZmS?kfyUyPdZu}eNqV*L*XbEv=Jz+DD1+9zs#Nfb>=*CX3n19e)jw`k(%lXIG7+zBqSspB}G|n;H~-J2OSyc8%Lk#AR!?mX{zeV z0Yji6BmejNzxM3eGe7|SKk@&kfbS?MDF2qBqN4s2K>z%I?cea}=?M`3w+tBm(|`a1 zVq;@-adDlVo~o*{%^Nu+S=N{vXqpRgM$M=w6?ZhUteEbT>Oiy zprAlYOABl@J3CuhS(%xcxwEqah`G5rdV2cfQkFgG_h0O{xF*Vfi%Y;0_4X-Q5_4g>_K1_lOzI0gm=0P4!h%EQA0 z02vn-2Lv=XH(y;{-PqUwV1Q&NCnp;k8eCjlfXF}uAm7^BS`!l!92}hV^z^#Ay88P1 z>gsBLe}CYY>FH?z9#~03L&MI_&cMLH!otGI$w@~?2iQnWO${Ic$pTcAl$0VOB0yeD zOiTg-0w53w@PUnu4XBiqloTEw9*{K<2Mh)SJb;Hl2_z&WAP|U;2teRFeDP*9++ufM&$-QVA@rKJV9dUSLIlnL-ED=P~)Le9?4EiEnf z_V$2Ljg5^%LqkD9K^+|(^YimnRaJl?KnZ{vMMg%JmX_Ms*Z>};rltbU0H-22IQYw# zFTl~F`5IvXWS;v@TU`eUgop8h66YE6b1W2MQVJF>d_r1ObVhz*I*uo56?N?!1)h6B zFv-Ga#MxG#jF`<;&cbE?<(Z_zJI*)b>F{~qWzEB%6-io~`StRDxBDp8L;_O|sspWy zg`v^!_&f|8145(COwH_|@g<&Bn{igNMl7>iy(2BE;syC>(UMW&Ely>*E3GLZ(o7+x z98JGFHRmDGU4fr$#>YDn=0bu8M1Q_ULc&f}l9kr=fgYsV>XIAGAq2p!!ECE|b*~zT z7u*jR-JK9#ey*<78CDZ}mrEb|lj}1da(VIjK(sNt@nJ|4JfssbmQHKo&JgQ0)T=6OvR-$Wu2O6Um?-T5TUpDPD9VlJ%PRyJ zO!qdJ+#5m!D0C&~W{G{0IQndQ%FL==*~n;@=5r{lJdbAv1vwSEMTGYbJx76c=NS0# zaTdd<^+>~gS$vfjWXkwY1S&z7%|z|^EY{;=Xg7mb(k$1XRP70!p+Y{qa|`jr651sMdz;*w?}H}MDLg1@eDcUAA1QT% zFnhXJ7=5{63Kmh?k9z*H$eFl!DeH52w&53?E25UK)?=_7laHG=ghP}+YPSzLw=G4I z?RUCmTa7DyLFg~owOOh26UkmY;bb1XnN$BBlTW3fu#lGPZFx!OUNLpQpzE|4RWh1Z zYjKjlAv`b^^9fg6U8@j0KN`e~)WX3%5P`yx;0%p8{Fw44u{(!xPOnEX``lFFq`*%C zKK(|-RwLjcTSQ|s4)0bWx~e&x(E5a}e0@~0SJ?JKPBn{0XNm0R0!;&n>80!e?XtRm z?jXngp1hMM^cOYpmfgEV8`^|1JA5pGMA(4QJsL%cOIL3@@upS4$E9?`)Ym(|T4lbm z=%8o!z;-JocR3I_#A($v%x}deB1?RkYBk{>2r02AJ}JCs%Nt0PBtkQt=V29_KR^5+ zY^ZjZ+T`h@pBuNxn#f}Nm;dPet~7S-s*%a@GGp7kb^bWrn0Zo5#l0|p6+Ky7G%v~z z$Jt8(ZE0wPKT>GLLx!fKKC>5l%oMyR^bPyasqCc3&n>pM@K0Nm4)jj1<+UzGjj9=< zM|PF2&1Ha&+6?h}BoOn5LoL%T)w!;o(B#GH3fjAbJaCl{apj#y|9cKI>+!vdtK8+m z?2aZm{I~j>9u#;Hv6hVjDlCw5)Ve0{LxaMPQGxPX)=PopBUGEn9+^;&7jVjUs*WU^ zG74Ax=n|tD5?5sg9+{%?09VY4&@MEdjSr$pPN)e^VV=}BS{7CIkIISD&kZG^rTW;f zK<}A6AFqOY22l(-z2jjnI)ovFob*B_?+{+{`&4X`4_kx5hf)}F&~cLCrslc zhlPz;lEHnkouTbH?Vm0Z8P_<^$KVRb<#eTnc5#b;$Q6IjDQ#EIHt`HwjH&jj8_@M; zBlbXpW^PQR(Y}5sL4L#2Zhwq=^sg+cdo9w!4|{uSQVSWME&rh`)J~HvFjM?4GU-R) zYOm_)KAwagq5e0<=}a~=x9hC}pOWVaF~1nwYN7E~IzRP_&CJ>YEX*$^^gMj@+&*g) z9^A&VCKjvaw}(%0C0p=Tdwz6FqtUl7=QHZwmALq$uao5ihe-gLO4%y)s`%Dfee7M7 zye(;wcXVjFtGKu!b*|$Taar|Eu3O2H|TI&V@J~(py6{ zk$?~^J%uw3(p+;W=UrzIXpJyK9t;Hou|z3}mO_Krlf^@8U?}}4LLVanV?E|Zf8PhH zLj0*mP97DRlQVk28h&wc@V1${j&(W z3gVg^(-?JX9pB)VVaSSGMl^(O#59Cl;ERy(N43GLsk_y{pvksUb6l^vRw8T_(fPz+ zQ{14>bzh~P9-pB?%4#;Sr?z|WZ`{CPOx|P_rf5iXr3p3+hE|ZlIY>9NzA2>t?rx$Z`w2DXKSL zDl{|m4!jKH$ld0KQ5P3PTGCalv74pI^;Xf`Y5t=71~7kmJvCD4B)%&gb)c2pO_tAI zXDMVLN01k?^ISc-8#!}}A4*XAC3uBMnLkrS7XQW+mMJK;{Z@0n)LivyxVXr@;vSe7jIZa%i@{>!3^tul3~mgqetaoL5Bta`JMHxW%pja!l6w#+R)vyP#<$H}hvb`I z-ke<6yH+6{Qkymz$4k+K=Z~|Pgc~v1Um18;{x_J`l}H8^g*P8rJtvklL=SuIxM2aO z`MANJAx~G@9x5A@g;;YJPNN}zhdNFrx{kdNT!j24hwDOWN(ODgrM|q3n#*AlbLSXb zpj`XXc2F7eI%OV8gn5nrDe)s@JdXJRx!1A2(MhmkpM&_jZtts5RLTo{SXGisee_>< zf8x<^4Z&3P!#1U7)LjNFS#KHgG+h@%Vd?T2!)k@~HxcVO4W@?)_^Xa(Z$7G}`K=sV zr!F1VY7kqRnbwwv3hTt}X*#ivPve`YExsa@EFn@!q(|Q%b11)Q?ugWep-&{f>^p#I zpsdna!q_En{inn@xD5qLGozdnKh% z4GRxwygocGU<5-BY)#zCOVkXyPVWvY5W{^Jun_3^vVQhM8JDjg;xM`j)V3mi7zAgD zNFZIO$J#)B>vDOoG}9$Zr-sx!OlI(rmT)MOk3cGb;n!hL;Z4{oN7q)?x58@dELO22 znRh9t@t*Wp-m=%@rq|qD^M!-g_XIh*g_>Kb%z2|kCHqe8$@`*AI>~Fz9w8M#Xd7e()HGN5LqKzcn>QGawa(IZ^ zR}j3+N>7Zf-one~yI!okUFIhSvn;5iza>Mhrt(B#va$+&4m4W8pWKF2fjO~wI-$DC zU4Rn@{t5=8oHJ_^P`i1QQ7dEDHlEh*npK=F(^HbCO#~6*4aw5|5_9l|9@#s#N7C*~ z+@D;k*y4&_E0Xe2_i-z?8>YVXAw!09wlvpX`Ds)ik%qg~aLsyJ*|ui5vPwj!;EN$A!{JFS5)ch=8_`MUlkITDG{(-hS^0uHnE9HZZL@`b%BbPB} zVWmQRB1d%XcG8jRk}#S#xA14N)N1!rZ)ktrZdid*lw!UhkvcV>SEr7~!#W~X^>Ml0 zV5z;yXKAVREXrWH{q*1|?Y=KI=yXyCs~46AwbNFTEqIwAlQfWEl$axAvp=)d)@0r} zq0xT)YxyzyxSj;+bG!2btL=7Srpog4G@6%_O=-7*4^$wlVDxk9SN_cea8W$%{X)A- zXcd=|A{lUdpARmb0`JIg(1S}LR*6<6{Eft41(}&A9A0w_sp}Zp)!A&W+o>f(l#>{F zqSm$PD6+I|xY_!~OulLBfMN_eMi}EV!t*EDOp`V9xj|O-?+flp@>LmlNqGq|F{Bk0 z7m1>bO78bpXC?Nz;^{u_vyViQ&{o_kAHq>EeS9wltmO2R20Vg=33zMm$9(00O$1d^nZc>UnwamL1<}dsj8~#-#vPIdf=Oxnf;1T zQT>Deul-5^L27F13l}b!nwnNuSO5I4ffOtj`!5uTfh;B_Ch$HvIeGi`ZD?rdFP!@N zdaw%;0mAj`*Kgmx?d|Oi4uFP#8Q6kCp}=QkWUQ;Jd-m*EM@I)huC1+|pPzsK{yo6i z+uNg~qqDNI0zM9hTUl8F4mgvMkpa5u`mc?TkC&B|wYRqy6#;rEl9Q7`E|Ew)KR-7z zGD=TR2h|M>4DQ~&tE8kYQB_ri!{K>(dBVcNySux#wzll->_7`J zV@^(vmX;P8jn>xI*45R$apMNyfrEnsjEuoxI5{~1^AHFGuzm63MJFdGFrbc(j-H+# z;DMW)n}>(z@bK{9;Gny^`}p`6kl^a->fzx581VJ=H8C*(lLiF^?d+uH*zY;0^8 z7#Iiy0xd1AySsZ|UtdT_$n5NFYinzBb8}{9rh|inpPwHdj|aB}T%ohGvw(nr*x1-N zZ{7fz;^X6^qN4Ki^Ru(FfeQQk`#?>g8qnqA$B%$gGMNnS(%RY@AbfLk6NtOKyquJj z^z`Y|)YR0<%F3y!sm(it4KQTPJySz73PJOSEZ>zcP*L)5Gto0pPxmojrWL1g zuwLO{M~FeCoVwSK?RZIQ*fTRR*~8V}3?+v41~davO2hGSk@qnHw_}Q5b+ycm-PltM z$3<;A)LWYM4%U#LdkZ_x25k{ML_KcfNSoRL&-9w+Cq~!CB>m*(S!Z^2YEowUm;018 zr?V+2=>EcCHO=oke$ENLXZG=A(ATbKR_i5o`W=zVEQsji`>cXDq7Xy|gQtl0D-Ju$ zVP6iyV0Nr_uU;NDen`B5;7^xZ7(gIeo1PvHp5O zdMbnp>jOXJ`{jnnqiLef_{U=F+@E2{CDle>clS>@?^Un-6iB8{70@78*2^hS_Cqrj zs%3RDQ+r;;mle(}&kdoD8|8m0BE5aEK?iRq)>~H$aZ0!L}etjc#o%{J3?%=2hAUH%+~e9U=kWm`#q zC?|3`(EioT;^Jae2p4ifXFN1vY2D+LX>5&)ezOrBxud`EfTSz@Rw|sTQ&{zT)_t^J2t5b%?eE|O2?$-G6!7(adhKQUk_>TjV3IlzE7iC zh&gCdQV6rDowRcLa+GV6vBch}T;Ralz?D~reX8Jth#`NV%`U8po#Z+!O&weC7;;?j z4bItj-yigAk(1YLm~{Q~ZyU>6rM77fQ6imAoh8gA$fXb3Yi+8g^VfDz zD_gtTTD^6ZWp&BK;|0o5I3KU=(4gzt^%nt)OW33ag)kC6rZ)u(<)5L6{RHPmSdeLq z_O78eiDGFHO^^xNxzH(HQCu0W1Lo(4DDC~e<&x)Ty?f0j{u9oEQ)^Nt>cQ!ERirna zGMh`F9lbba%B?PNwkW!P#Sx(t5m5ZC@8owzr|`??%QJ5Ei&FeXeV3B3+d;uo6|>3( zhW04f#HM+0BblKyw7yQ<38uH={BY#Ap3F+em_Uq4yBG)KER+XpWn*EHWNx*d(LL1} zr~*6Lgg@kz6v90BO=QIR;5J_r^$rh29*#U@=3N%FZ`~b`I{#`knr9N_R3llSt^*w+ zzGk{okyB*%t!FFS*(-s`wAd)QD^>j~dYCT>nW~Am<*q1oegnVR$wKg2^YvX!u_t## zoHj2WFUD>5X&?J-j@XmYdD97sYXcnBXWaLWa#LytKh%XOMP9Ay94?%mp4MiH-$|I{ z95;UaT^=)P!8ut{xALy*?BNe;_-HiU(7P1sSe2lj-%y;A5|7BRReTb>9-Xi<``5%l zg6KT++SkwrIZfML&4L*c+>$EX_FB-!_IjtrzRMHhWc*C+aC*U~@_Z{ZT*U7~fc2y+ez@R$J03Ba93Z zwGBP${16vsXeh(Vp{mUTmO9vllPUiK3Kt0XBeP3E6{tFKVp?JiQAi)x`aG5%nf*bu zNok=oP!Ij6-ZC~-MMz3YK@0Egv?z+Uv$KO;_QJUE<(HbV^DlWp1|!rV{y(J760h?q z%U#1mk@Y*1ae=}9C&_R*TuJGTL)mQ=d<+Mco%bE@TDWHOxR8^u|H0NdBNwb><^V~>E{9@lZSKaK_)+@UbGt}xlp9}G-WhEvKn+yKPOgO(UXvt+> z*_Q0SOcnop?vG}hJKp8^NOdD@IoF3oGR>t-WvZZP_i|~Pf>x^wZkZnrXf!hPHX%Z6 z;Vs*>b9yscfye8_Ez+t{nxuo9E};rRBDWd~>C0>+S=45cJgP5hshAAtm6)MCe4-yX95y%6mjB*kUTn<8Jey;AipLim_JTx6hCCEz9F6(Oe(nR{YLD+2_pRLwh> zy3>#d*Eg%KEG(>9G|c6GzO9MzWBZ)mY*@l02gHF$-8&lpwz#5RkxngKAvF?(qbPhL z;)JoSd7^ecvlb>gyjIR{RnnnUN+TUk- z|Ig=4Tx5-#m!<7(l}YY3>>2566T~M{cIMVdH7`acE~yNOehHuJ3P#e#xNo;!9^HDR zpCx0$u%W6v`ye62KN<}y%u;lzM+;8g+!KHrz#+b-vXH}`pVGl64>m&96kEd;4ZvRq N1y0KlTZ49v`41f(YfS(E literal 0 HcmV?d00001 diff --git a/sprites/wB.png b/sprites/wB.png new file mode 100644 index 0000000000000000000000000000000000000000..d457ce5c654f9a78302d1f5f1b951eb7e03f4e64 GIT binary patch literal 3404 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 UeDzjZz;`l{wuS+!3~3+sKV}e?2LJ#7 literal 0 HcmV?d00001 diff --git a/sprites/wN.png b/sprites/wN.png new file mode 100644 index 0000000000000000000000000000000000000000..520c3fba5121f022df030de5d052d952780248e2 GIT binary patch literal 3387 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 literal 0 HcmV?d00001 diff --git a/sprites/wP.png b/sprites/wP.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f806fedc77945f76cc0d8a690243262c488ae4 GIT binary patch literal 2385 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 literal 0 HcmV?d00001 diff --git a/sprites/wQ.png b/sprites/wQ.png new file mode 100644 index 0000000000000000000000000000000000000000..f87155cab1ebed30e616c0069be134fd0265348a GIT binary patch literal 4222 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 G