From 7571df4e956c1ecc214904ed25fb7f2112c17be0 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 14:14:36 +0200 Subject: [PATCH 01/19] Added new class Added: - new state for obstacles - state methods within this class --- src/states/obstacle_state.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/states/obstacle_state.py diff --git a/src/states/obstacle_state.py b/src/states/obstacle_state.py new file mode 100644 index 0000000..b7cbe4d --- /dev/null +++ b/src/states/obstacle_state.py @@ -0,0 +1,13 @@ +import pygame + +from src.states.base_state import BaseState + +class ObstacleSate(BaseState): + def __init__(self, game_state_manager): + super().__init__(game_state_manager) + + def render(self): + pass + + def update(self, events): + pass \ No newline at end of file From 4e20da54e6cd6f94eb163742c3111a6294581310 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 14:55:47 +0200 Subject: [PATCH 02/19] Added obstacles Added: - obstacles to the map - in setup drew the obstacles onto the map - in obstacle state added logic for collision --- data/new_maps/100x100_map.tmx | 106 ++++++++++++++++++++++++++++++++- src/sprites/entities/player.py | 3 + src/states/game_running.py | 18 ++++++ src/states/obstacle_state.py | 27 +++++++-- 4 files changed, 148 insertions(+), 6 deletions(-) diff --git a/data/new_maps/100x100_map.tmx b/data/new_maps/100x100_map.tmx index b19ccaa..9ed3a6f 100644 --- a/data/new_maps/100x100_map.tmx +++ b/data/new_maps/100x100_map.tmx @@ -1,5 +1,5 @@ - + @@ -948,6 +948,110 @@ + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,2222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2225,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,2222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2226,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2225,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,2226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2225,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2226,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/src/sprites/entities/player.py b/src/sprites/entities/player.py index d6933fc..2d3d622 100644 --- a/src/sprites/entities/player.py +++ b/src/sprites/entities/player.py @@ -40,6 +40,9 @@ def __init__( # Input handling self.mouse_have_been_pressed: bool = False + # Hp points + self.player_hp = 100 + def input(self) -> None: """move the player and show a ghost to preview the move""" diff --git a/src/states/game_running.py b/src/states/game_running.py index 35e7788..a64700c 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -15,6 +15,7 @@ from src.sprites.camera.player import PlayerCamera from src.sprites.entities.player import Player from src.states.base_state import BaseState +from src.states.obstacle_state import ObstacleSate from src.states.paused import Paused from src.states.shop_state import ShowShop, WindowShop from src.support import all_character_import, coast_importer, import_folder @@ -95,6 +96,16 @@ def setup(self, player_start_pos: str) -> None: pos=(x * TILE_SIZE, y * TILE_SIZE), surface=surface, groups=(self.all_sprites,), z=WORLD_LAYERS["main"] ) + self.obstacle_group: pygame.sprite.Group = pygame.sprite.Group() + obstacles = self.tmx_map["map"].get_layer_by_name("Obstacles") + for x, y, surface in obstacles.tiles(): + BaseSprite( + pos=(x * TILE_SIZE, y * TILE_SIZE), + surf=surface, + groups=(self.all_sprites,), + z=WORLD_LAYERS["bg"] + ) + # Islands islands = self.tmx_map["map"].get_layer_by_name("Islands") for x, y, surface in islands.tiles(): @@ -142,6 +153,7 @@ def update(self, events) -> None: """ collide = self.player.rect.colliderect(self.shop.rect) if self.player else False + self.obstacle_collision = pygame.sprite.spritecollideany(self.player, self.obstacle_group) dt = self.clock.tick() / 1000 self.all_sprites.update(dt) @@ -154,11 +166,17 @@ def update(self, events) -> None: self.game_state_manager.enter_state( WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory) ) + if self.obstacle_collision: + self.game_state_manager.enter_state(ObstacleSate(self.game_state_manager, self.player, self.obstacle_group)) def render(self, screen) -> None: """draw sprites to the canvas""" screen.fill("#000000") self.all_sprites.draw(self.player.rect.center) + self.message = self.font.render( + f"Player's Health: {self.player.player_hp}", True, (0, 0, 0) + ) + screen.blit(self.message, (50, screen.get_height() - 100)) # self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) # point = self.shop.rect diff --git a/src/states/obstacle_state.py b/src/states/obstacle_state.py index b7cbe4d..a5d2fd2 100644 --- a/src/states/obstacle_state.py +++ b/src/states/obstacle_state.py @@ -3,11 +3,28 @@ from src.states.base_state import BaseState class ObstacleSate(BaseState): - def __init__(self, game_state_manager): + def __init__(self, game_state_manager, player, obstacles): super().__init__(game_state_manager) - - def render(self): - pass + self.player = player + self.obstacles = obstacles + self.obstacle_damage = 15 + self.font = pygame.font.Font(None, 36) + self.screen: pygame.Surface = pygame.Surface((500, 400)) def update(self, events): - pass \ No newline at end of file + self.collide = pygame.sprite.spritecollideany(self.player, self.obstacles) + + for event in events: + if self.collide: + self.player.player_hp -= self.obstacle_damage + if self.collide == False: + self.game_state_manager.exit_state() + + def render(self, screen: pygame.Surface): + if self.collide: + self.message = self.font.render(f"The player has recieved -{self.obstacle_damage} damage!", True, (255, 255, 255)) + self.screen.blit(self.message, (50, self.screen.get_height() - 100)) + + screen.blit(self.screen, (155, 155)) + pygame.display.flip() + From c7c2f6acb65de15b7ebbade3f9bfa42b440bf3d0 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 15:02:59 +0200 Subject: [PATCH 03/19] fixed some small issues Fixed: - in game running: Typo from the imported class - obstacle state: logical issues with collision --- src/states/game_running.py | 4 ++-- src/states/obstacle_state.py | 33 +++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index a64700c..47d1bd1 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -15,7 +15,7 @@ from src.sprites.camera.player import PlayerCamera from src.sprites.entities.player import Player from src.states.base_state import BaseState -from src.states.obstacle_state import ObstacleSate +from src.states.obstacle_state import ObstacleState from src.states.paused import Paused from src.states.shop_state import ShowShop, WindowShop from src.support import all_character_import, coast_importer, import_folder @@ -167,7 +167,7 @@ def update(self, events) -> None: WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory) ) if self.obstacle_collision: - self.game_state_manager.enter_state(ObstacleSate(self.game_state_manager, self.player, self.obstacle_group)) + self.game_state_manager.enter_state(ObstacleState(self.game_state_manager, self.player, self.obstacle_group)) def render(self, screen) -> None: """draw sprites to the canvas""" diff --git a/src/states/obstacle_state.py b/src/states/obstacle_state.py index a5d2fd2..79f0f1a 100644 --- a/src/states/obstacle_state.py +++ b/src/states/obstacle_state.py @@ -1,8 +1,7 @@ import pygame - from src.states.base_state import BaseState -class ObstacleSate(BaseState): +class ObstacleState(BaseState): def __init__(self, game_state_manager, player, obstacles): super().__init__(game_state_manager) self.player = player @@ -11,20 +10,34 @@ def __init__(self, game_state_manager, player, obstacles): self.font = pygame.font.Font(None, 36) self.screen: pygame.Surface = pygame.Surface((500, 400)) + self.collide = None + self.damage_applied = False + self.message_end_time = 0 + def update(self, events): self.collide = pygame.sprite.spritecollideany(self.player, self.obstacles) - for event in events: - if self.collide: - self.player.player_hp -= self.obstacle_damage - if self.collide == False: - self.game_state_manager.exit_state() + if self.collide and not self.damage_applied: + self.player.player_hp -= self.obstacle_damage + self.damage_applied = True + self.message_end_time = pygame.time.get_ticks() + 2000 # Show message for 2s + + if not self.collide and self.damage_applied: + self.damage_applied = False + self.game_state_manager.exit_state() def render(self, screen: pygame.Surface): - if self.collide: - self.message = self.font.render(f"The player has recieved -{self.obstacle_damage} damage!", True, (255, 255, 255)) - self.screen.blit(self.message, (50, self.screen.get_height() - 100)) + self.screen.fill((0, 0, 0)) # Clear UI + + if self.collide and pygame.time.get_ticks() < self.message_end_time: + message = self.font.render( + f"The player has received -{self.obstacle_damage} damage!", + True, + (255, 80, 80) + ) + self.screen.blit(message, (50, self.screen.get_height() - 100)) screen.blit(self.screen, (155, 155)) pygame.display.flip() + From 269dd041d0d1896bbea7b82ebbcb2abc0bcd2a09 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 18:55:14 +0200 Subject: [PATCH 04/19] Changing some file structure Changed: - Removed the object state from states and refactored it to not use state anymore - Changed file name and the file place --- src/{states/obstacle_state.py => obstacle_handler.py} | 8 +++----- src/states/game_running.py | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) rename src/{states/obstacle_state.py => obstacle_handler.py} (85%) diff --git a/src/states/obstacle_state.py b/src/obstacle_handler.py similarity index 85% rename from src/states/obstacle_state.py rename to src/obstacle_handler.py index 79f0f1a..0119341 100644 --- a/src/states/obstacle_state.py +++ b/src/obstacle_handler.py @@ -1,9 +1,7 @@ import pygame -from src.states.base_state import BaseState -class ObstacleState(BaseState): - def __init__(self, game_state_manager, player, obstacles): - super().__init__(game_state_manager) +class ObstacleHandler: + def __init__(self, player, obstacles): self.player = player self.obstacles = obstacles self.obstacle_damage = 15 @@ -14,7 +12,7 @@ def __init__(self, game_state_manager, player, obstacles): self.damage_applied = False self.message_end_time = 0 - def update(self, events): + def update(self): self.collide = pygame.sprite.spritecollideany(self.player, self.obstacles) if self.collide and not self.damage_applied: diff --git a/src/states/game_running.py b/src/states/game_running.py index 47d1bd1..449f570 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -15,7 +15,7 @@ from src.sprites.camera.player import PlayerCamera from src.sprites.entities.player import Player from src.states.base_state import BaseState -from src.states.obstacle_state import ObstacleState +from src.obstacle_handler import ObstacleHandler from src.states.paused import Paused from src.states.shop_state import ShowShop, WindowShop from src.support import all_character_import, coast_importer, import_folder @@ -166,8 +166,8 @@ def update(self, events) -> None: self.game_state_manager.enter_state( WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory) ) - if self.obstacle_collision: - self.game_state_manager.enter_state(ObstacleState(self.game_state_manager, self.player, self.obstacle_group)) + # if self.obstacle_collision: + # self.game_state_manager.enter_state(ObstacleState(self.game_state_manager, self.player, self.obstacle_group)) def render(self, screen) -> None: """draw sprites to the canvas""" From 5b56c2d26734760e15044992d430de316dc963e8 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 19:06:47 +0200 Subject: [PATCH 05/19] Calling the class in game running Called: - object handler in game running --- src/obstacle_handler.py | 3 +-- src/states/game_running.py | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 0119341..792b416 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -6,7 +6,7 @@ def __init__(self, player, obstacles): self.obstacles = obstacles self.obstacle_damage = 15 self.font = pygame.font.Font(None, 36) - self.screen: pygame.Surface = pygame.Surface((500, 400)) + self.screen: pygame.Surface = pygame.Surface((200, 100)) self.collide = None self.damage_applied = False @@ -22,7 +22,6 @@ def update(self): if not self.collide and self.damage_applied: self.damage_applied = False - self.game_state_manager.exit_state() def render(self, screen: pygame.Surface): self.screen.fill((0, 0, 0)) # Clear UI diff --git a/src/states/game_running.py b/src/states/game_running.py index 449f570..06e2923 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -49,6 +49,8 @@ def __init__(self, game_state_manager) -> None: self.shop_window = pygame.Surface((800, 600)) self.in_shop = False + self.obstacle_handler = ObstacleHandler(self.player, self.obstacle_group) + def setup(self, player_start_pos: str) -> None: """ set up the map and player from the tiled file @@ -103,7 +105,7 @@ def setup(self, player_start_pos: str) -> None: pos=(x * TILE_SIZE, y * TILE_SIZE), surf=surface, groups=(self.all_sprites,), - z=WORLD_LAYERS["bg"] + z=WORLD_LAYERS["main"], ) # Islands @@ -156,6 +158,7 @@ def update(self, events) -> None: self.obstacle_collision = pygame.sprite.spritecollideany(self.player, self.obstacle_group) dt = self.clock.tick() / 1000 self.all_sprites.update(dt) + self.obstacle_handler.update() # get events like keypress or mouse clicks for event in events: @@ -173,6 +176,7 @@ def render(self, screen) -> None: """draw sprites to the canvas""" screen.fill("#000000") self.all_sprites.draw(self.player.rect.center) + self.obstacle_handler.render(screen) self.message = self.font.render( f"Player's Health: {self.player.player_hp}", True, (0, 0, 0) ) From 708fc25b0b9719659422be01fc1c9bcdd4c672c0 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 19:17:16 +0200 Subject: [PATCH 06/19] Fixed setup issue Fixed: - issue where message of dealing damage was not showing up Changed: - commentend display flip method in object handler to save frames --- src/obstacle_handler.py | 4 ++-- src/states/game_running.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 792b416..3fcee2b 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -6,7 +6,7 @@ def __init__(self, player, obstacles): self.obstacles = obstacles self.obstacle_damage = 15 self.font = pygame.font.Font(None, 36) - self.screen: pygame.Surface = pygame.Surface((200, 100)) + self.screen: pygame.Surface = pygame.Surface((600, 100)) self.collide = None self.damage_applied = False @@ -35,6 +35,6 @@ def render(self, screen: pygame.Surface): self.screen.blit(message, (50, self.screen.get_height() - 100)) screen.blit(self.screen, (155, 155)) - pygame.display.flip() + # pygame.display.flip() diff --git a/src/states/game_running.py b/src/states/game_running.py index 06e2923..37bf38d 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -104,8 +104,8 @@ def setup(self, player_start_pos: str) -> None: BaseSprite( pos=(x * TILE_SIZE, y * TILE_SIZE), surf=surface, - groups=(self.all_sprites,), - z=WORLD_LAYERS["main"], + groups=(self.all_sprites, self.obstacle_group), + z=WORLD_LAYERS["bg"], ) # Islands From 7d7616158dbaaac00e68c145e4503ff47ebc463a Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 19:24:32 +0200 Subject: [PATCH 07/19] Making the black screen transparent Changed: - the black block for the message transparent --- src/obstacle_handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 3fcee2b..59e0dd4 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -6,7 +6,7 @@ def __init__(self, player, obstacles): self.obstacles = obstacles self.obstacle_damage = 15 self.font = pygame.font.Font(None, 36) - self.screen: pygame.Surface = pygame.Surface((600, 100)) + self.screen: pygame.Surface = pygame.Surface((600, 100), pygame.SRCALPHA) self.collide = None self.damage_applied = False @@ -24,7 +24,7 @@ def update(self): self.damage_applied = False def render(self, screen: pygame.Surface): - self.screen.fill((0, 0, 0)) # Clear UI + self.screen.fill((0, 0, 0, 0)) # Clear UI if self.collide and pygame.time.get_ticks() < self.message_end_time: message = self.font.render( From 65c59f25a415ca9829b648483c98884e66090749 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 26 May 2025 20:01:46 +0200 Subject: [PATCH 08/19] Changed color Changed: - the color of the message --- src/obstacle_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 59e0dd4..f417cf3 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -30,7 +30,7 @@ def render(self, screen: pygame.Surface): message = self.font.render( f"The player has received -{self.obstacle_damage} damage!", True, - (255, 80, 80) + "red2" ) self.screen.blit(message, (50, self.screen.get_height() - 100)) From 126c7a6eba7e9bcea7df78d6847707b5d901b436 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 10:54:14 +0200 Subject: [PATCH 09/19] Small fix Small fix groups --- src/states/game_running.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 29a0e37..bce4b08 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -117,7 +117,7 @@ def setup(self, player_start_pos: str, sprite_group=None) -> None: BaseSprite( pos=(x * TILE_SIZE, y * TILE_SIZE), surf=surface, - groups=(self.all_sprites, self.obstacle_group), + groups=(sprite_group, self.obstacle_group), z=WORLD_LAYERS["bg"], ) @@ -127,7 +127,7 @@ def setup(self, player_start_pos: str, sprite_group=None) -> None: BaseSprite( pos=(x * TILE_SIZE, y * TILE_SIZE), surf=surface, - groups=(self.all_sprites, self.obstacle_group), + groups=(sprite_group, self.obstacle_group), z=WORLD_LAYERS["bg"], ) From 6637ed5ecf6155ff1628f294ace8d677c1d6c5ec Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 11:02:32 +0200 Subject: [PATCH 10/19] Typehints check Fixed all the typehints --- src/obstacle_handler.py | 9 ++--- src/sprites/entities/player.py | 3 +- src/sprites/tiles/grid_manager.py | 58 +++++++++++++++---------------- src/states/game_running.py | 19 ++++------ 4 files changed, 39 insertions(+), 50 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index f417cf3..4319e0b 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -1,5 +1,6 @@ import pygame + class ObstacleHandler: def __init__(self, player, obstacles): self.player = player @@ -27,14 +28,8 @@ def render(self, screen: pygame.Surface): self.screen.fill((0, 0, 0, 0)) # Clear UI if self.collide and pygame.time.get_ticks() < self.message_end_time: - message = self.font.render( - f"The player has received -{self.obstacle_damage} damage!", - True, - "red2" - ) + message = self.font.render(f"The player has received -{self.obstacle_damage} damage!", True, "red2") self.screen.blit(message, (50, self.screen.get_height() - 100)) screen.blit(self.screen, (155, 155)) # pygame.display.flip() - - diff --git a/src/sprites/entities/player.py b/src/sprites/entities/player.py index 28ac4df..aa7b654 100644 --- a/src/sprites/entities/player.py +++ b/src/sprites/entities/player.py @@ -91,8 +91,7 @@ def input(self, grid, camera_offset: pygame.math.Vector2 | None = None, camera_s self.path = path[1:] def update( - self, dt: float, grid=None, camera_offset: pygame.math.Vector2 | None = None, - camera_scale: float | None = None + self, dt: float, grid=None, camera_offset: pygame.math.Vector2 | None = None, camera_scale: float | None = None ) -> None: """Update the player's position and state.""" if grid: diff --git a/src/sprites/tiles/grid_manager.py b/src/sprites/tiles/grid_manager.py index a27cac8..9ff4809 100644 --- a/src/sprites/tiles/grid_manager.py +++ b/src/sprites/tiles/grid_manager.py @@ -9,7 +9,7 @@ class GridManager: def __init__( - self, tmx_map: pytmx.TiledMap = None, tile_size: int = TILE_SIZE, grid_matrix: np.ndarray | None = None + self, tmx_map: pytmx.TiledMap = None, tile_size: int = TILE_SIZE, grid_matrix: np.ndarray | None = None ): if grid_matrix is not None: self.grid_matrix = grid_matrix @@ -60,10 +60,10 @@ def find_path(self, start: tuple[int, int], end: tuple[int, int]) -> list[list[i return self.path_finder.find_path(start, end) def get_tile_coordinates( - self, - mouse_pos: tuple[int, int], - camera_offset: pygame.math.Vector2 | None = None, - camera_scale: float | None = None, + self, + mouse_pos: tuple[int, int], + camera_offset: pygame.math.Vector2 | None = None, + camera_scale: float | None = None, ) -> tuple[int, int]: """ Get the tile indices (x, y) based on mouse position. @@ -84,7 +84,7 @@ def get_tile_coordinates( @staticmethod def _convert_mouse_to_world( - mouse_pos: tuple[int, int], camera_offset: pygame.math.Vector2, camera_scale: float + mouse_pos: tuple[int, int], camera_offset: pygame.math.Vector2, camera_scale: float ) -> tuple[float, float]: # Adjust the mouse position to world coordinates by reversing the camera's position and scale world_x = (mouse_pos[0] - camera_offset.x) / camera_scale @@ -104,12 +104,12 @@ def _clamp_grid_coordinates(self, grid_x: int, grid_y: int) -> tuple[int, int]: return grid_x, grid_y def draw( - self, - player_pos: tuple[int, int], - mouse_pos: tuple[int, int], - camera_offset: pygame.math.Vector2 | None = None, - camera_scale: float | None = None, - visible_radius: int | None = None, + self, + player_pos: tuple[int, int], + mouse_pos: tuple[int, int], + camera_offset: pygame.math.Vector2 | None = None, + camera_scale: float | None = None, + visible_radius: int | None = None, ) -> None: """ Draw the grid on the screen. @@ -144,7 +144,7 @@ def draw( self._draw_mouse_indicator(mouse_grid_x, mouse_grid_y, camera_offset, camera_scale) def _calculate_visible_area( - self, player_grid_x: int, player_grid_y: int, visible_radius: int + self, player_grid_x: int, player_grid_y: int, visible_radius: int ) -> tuple[int, int, int, int]: visible_start_x = max(0, player_grid_x - visible_radius) visible_start_y = max(0, player_grid_y - visible_radius) @@ -153,13 +153,13 @@ def _calculate_visible_area( return visible_start_x, visible_start_y, visible_end_x, visible_end_y def _draw_grid_lines( - self, - visible_start_x: int, - visible_start_y: int, - visible_end_x: int, - visible_end_y: int, - camera_offset: pygame.math.Vector2, - camera_scale: float, + self, + visible_start_x: int, + visible_start_y: int, + visible_end_x: int, + visible_end_y: int, + camera_offset: pygame.math.Vector2, + camera_scale: float, ) -> None: for y in range(visible_start_y, visible_end_y): for x in range(visible_start_x, visible_end_x): @@ -176,7 +176,7 @@ def _draw_grid_lines( self.display_surface.blit(text_surface, text_rect) def _convert_to_screen_coordinates( - self, x: int, y: int, camera_offset: pygame.math.Vector2, camera_scale: float + self, x: int, y: int, camera_offset: pygame.math.Vector2, camera_scale: float ) -> tuple[float, float]: world_x = x * self.tile_size world_y = y * self.tile_size @@ -185,13 +185,13 @@ def _convert_to_screen_coordinates( return screen_x, screen_y def _draw_path( - self, - start_x: int, - start_y: int, - end_x: int, - end_y: int, - camera_offset: pygame.math.Vector2, - camera_scale: float, + self, + start_x: int, + start_y: int, + end_x: int, + end_y: int, + camera_offset: pygame.math.Vector2, + camera_scale: float, ) -> None: start = (start_x, start_y) end = (end_x, end_y) @@ -206,7 +206,7 @@ def _draw_path( pygame.draw.rect(self.display_surface, "green", rect, 2) # Draw path tiles def _draw_mouse_indicator( - self, mouse_grid_x: int, mouse_grid_y: int, camera_offset: pygame.math.Vector2, camera_scale: float + self, mouse_grid_x: int, mouse_grid_y: int, camera_offset: pygame.math.Vector2, camera_scale: float ) -> None: if self.display_surface is None: raise RuntimeError("Display surface must be initialized") diff --git a/src/states/game_running.py b/src/states/game_running.py index bce4b08..b0dec6f 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -9,6 +9,7 @@ from pytmx.util_pygame import load_pygame # type: ignore from src.inventory import Inventory +from src.obstacle_handler import ObstacleHandler from src.settings import TILE_SIZE, WORLD_LAYERS from src.sprites.animations import AnimatedSprites from src.sprites.base import BaseSprite @@ -16,7 +17,6 @@ from src.sprites.entities.player import Player from src.sprites.tiles.grid_manager import GridManager from src.states.base_state import BaseState -from src.obstacle_handler import ObstacleHandler from src.states.paused import Paused from src.states.shop_state import ShowShop, WindowShop from src.support import all_character_import, coast_importer, import_folder @@ -121,7 +121,6 @@ def setup(self, player_start_pos: str, sprite_group=None) -> None: z=WORLD_LAYERS["bg"], ) - self.obstacle_group: pygame.sprite.Group = pygame.sprite.Group() obstacles = self.tmx_map["map"].get_layer_by_name("Obstacles") for x, y, surface in obstacles.tiles(): BaseSprite( @@ -182,11 +181,11 @@ def update(self, events) -> None: """ collide: bool = ( - self.player is not None - and self.shop is not None - and isinstance(self.player.rect, (pygame.Rect, pygame.FRect)) - and isinstance(self.shop.rect, (pygame.Rect, pygame.FRect)) - and self.player.rect.colliderect(self.shop.rect) + self.player is not None + and self.shop is not None + and isinstance(self.player.rect, (pygame.Rect, pygame.FRect)) + and isinstance(self.shop.rect, (pygame.Rect, pygame.FRect)) + and self.player.rect.colliderect(self.shop.rect) ) self.obstacle_collision = pygame.sprite.spritecollideany(self.player, self.obstacle_group) dt = self.clock.tick() / 1000 @@ -213,8 +212,6 @@ def update(self, events) -> None: self.game_state_manager.enter_state( WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory) ) - # if self.obstacle_collision: - # self.game_state_manager.enter_state(ObstacleState(self.game_state_manager, self.player, self.obstacle_group)) def render(self, screen) -> None: """Draw sprites to the canvas.""" @@ -222,9 +219,7 @@ def render(self, screen) -> None: if isinstance(self.all_sprites, PlayerCamera): self.all_sprites.draw(self.player.rect.center, show_grid=self.show_grid) self.obstacle_handler.render(screen) - self.message = self.font.render( - f"Player's Health: {self.player.player_hp}", True, (0, 0, 0) - ) + self.message = self.font.render(f"Player's Health: {self.player.player_hp}", True, (0, 0, 0)) screen.blit(self.message, (50, screen.get_height() - 100)) # Pass the player's position to the draw method From d80164d648f21f54d1e9285a600dd5a22c30face Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 11:40:21 +0200 Subject: [PATCH 11/19] Fixed health issue Fixed: - Health going infinitly low --- src/obstacle_handler.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 4319e0b..4265e24 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -24,6 +24,10 @@ def update(self): if not self.collide and self.damage_applied: self.damage_applied = False + if self.player.player_hp <= 0: + self.damage_applied = False + self.player.player_hp = 0 + def render(self, screen: pygame.Surface): self.screen.fill((0, 0, 0, 0)) # Clear UI From 0e54be92b644c61ab126e50cab9cda187b408909 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 12:33:01 +0200 Subject: [PATCH 12/19] Created a flash Added: - a flashing effect when the player gets hurt by the obstacles --- src/obstacle_handler.py | 18 ++++++++++++++++++ src/sprites/entities/player.py | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 4265e24..c88a3e7 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -8,11 +8,18 @@ def __init__(self, player, obstacles): self.obstacle_damage = 15 self.font = pygame.font.Font(None, 36) self.screen: pygame.Surface = pygame.Surface((600, 100), pygame.SRCALPHA) + self.clock = pygame.time.Clock() self.collide = None self.damage_applied = False self.message_end_time = 0 + self.dt = self.clock.tick(60) + self.is_flashing = False + self.flashing_duration = 2000 + self.flashing_start_time = 0 + self.flash_color = "white" + def update(self): self.collide = pygame.sprite.spritecollideany(self.player, self.obstacles) @@ -35,5 +42,16 @@ def render(self, screen: pygame.Surface): message = self.font.render(f"The player has received -{self.obstacle_damage} damage!", True, "red2") self.screen.blit(message, (50, self.screen.get_height() - 100)) + if self.collide: + self.is_flashing = True + self.flashing_start_time = pygame.time.get_ticks() + + current_time = pygame.time.get_ticks() + if self.is_flashing and (current_time - self.flashing_start_time > self.flashing_duration): + self.is_flashing = False + + color = self.flash_color if self.is_flashing else self.player.player_square.fill("red") + self.player.player_square.fill(color) + screen.blit(self.screen, (155, 155)) # pygame.display.flip() diff --git a/src/sprites/entities/player.py b/src/sprites/entities/player.py index aa7b654..c2640fa 100644 --- a/src/sprites/entities/player.py +++ b/src/sprites/entities/player.py @@ -26,9 +26,9 @@ def __init__( """ # Initialize the player sprite - player_square = frames[0] if isinstance(frames, (list, tuple)) and frames else Surface((TILE_SIZE, TILE_SIZE)) - player_square.fill("red") - super().__init__(pos=pos, surf=player_square, groups=groups) + self.player_square = frames[0] if isinstance(frames, (list, tuple)) and frames else Surface((TILE_SIZE, TILE_SIZE)) + self.player_square.fill("red") + super().__init__(pos=pos, surf=self.player_square, groups=groups) # Animation frames self.frames = frames From f0ef8ff5f71952ca0b6417f0290a0b8710b85725 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 13:23:56 +0200 Subject: [PATCH 13/19] Changed the location of the dt Changed: - the location of the dt from the handler to the game loop --- src/obstacle_handler.py | 5 ++--- src/states/game_running.py | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index c88a3e7..8ab9328 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -2,7 +2,7 @@ class ObstacleHandler: - def __init__(self, player, obstacles): + def __init__(self, player, obstacles, dt): self.player = player self.obstacles = obstacles self.obstacle_damage = 15 @@ -14,7 +14,7 @@ def __init__(self, player, obstacles): self.damage_applied = False self.message_end_time = 0 - self.dt = self.clock.tick(60) + self.dt = dt self.is_flashing = False self.flashing_duration = 2000 self.flashing_start_time = 0 @@ -54,4 +54,3 @@ def render(self, screen: pygame.Surface): self.player.player_square.fill(color) screen.blit(self.screen, (155, 155)) - # pygame.display.flip() diff --git a/src/states/game_running.py b/src/states/game_running.py index b0dec6f..66eb6f8 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -189,8 +189,9 @@ def update(self, events) -> None: ) self.obstacle_collision = pygame.sprite.spritecollideany(self.player, self.obstacle_group) dt = self.clock.tick() / 1000 + dt2 = self.clock.tick(60) self.all_sprites.update(dt) - self.obstacle_handler.update() + self.obstacle_handler.update(dt2) # Handle player movement and grid snapping if isinstance(self.all_sprites, PlayerCamera): From 8290836363732a4568dbfc4211f2118d3d776768 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 13:31:51 +0200 Subject: [PATCH 14/19] Fixed some minor issues with the flash Fixed: - Flash not working properly Removed: - unnecessary delta time --- src/obstacle_handler.py | 10 +++++----- src/states/game_running.py | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 8ab9328..944b51b 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -2,19 +2,17 @@ class ObstacleHandler: - def __init__(self, player, obstacles, dt): + def __init__(self, player, obstacles): self.player = player self.obstacles = obstacles self.obstacle_damage = 15 self.font = pygame.font.Font(None, 36) self.screen: pygame.Surface = pygame.Surface((600, 100), pygame.SRCALPHA) - self.clock = pygame.time.Clock() self.collide = None self.damage_applied = False self.message_end_time = 0 - self.dt = dt self.is_flashing = False self.flashing_duration = 2000 self.flashing_start_time = 0 @@ -50,7 +48,9 @@ def render(self, screen: pygame.Surface): if self.is_flashing and (current_time - self.flashing_start_time > self.flashing_duration): self.is_flashing = False - color = self.flash_color if self.is_flashing else self.player.player_square.fill("red") - self.player.player_square.fill(color) + if self.is_flashing: + self.player.player_square.fill(self.flash_color) + else: + self.player.player_square.fill("red") screen.blit(self.screen, (155, 155)) diff --git a/src/states/game_running.py b/src/states/game_running.py index 66eb6f8..fd9e165 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -61,7 +61,7 @@ def __init__(self, game_state_manager) -> None: self.shop_window = pygame.Surface((800, 600)) self.in_shop = False - self.obstacle_handler = ObstacleHandler(self.player, self.obstacle_group) + self.obstacle_handler = ObstacleHandler(self.player, self.obstacle_group,) def setup(self, player_start_pos: str, sprite_group=None) -> None: if sprite_group is None: @@ -189,9 +189,8 @@ def update(self, events) -> None: ) self.obstacle_collision = pygame.sprite.spritecollideany(self.player, self.obstacle_group) dt = self.clock.tick() / 1000 - dt2 = self.clock.tick(60) self.all_sprites.update(dt) - self.obstacle_handler.update(dt2) + self.obstacle_handler.update() # Handle player movement and grid snapping if isinstance(self.all_sprites, PlayerCamera): From 58084ddcf0cef2e5a12f500ca0c63b103c53de73 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 13:41:44 +0200 Subject: [PATCH 15/19] Finished flashing feature Finished: - when the player comes in contact with a obstacle the rect will flash --- src/obstacle_handler.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 944b51b..2bc9b93 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -17,6 +17,9 @@ def __init__(self, player, obstacles): self.flashing_duration = 2000 self.flashing_start_time = 0 self.flash_color = "white" + self.flash_toggle_interval = 200 + self.last_flash_toggle_time = 0 + self.current_flash_color = "red" def update(self): self.collide = pygame.sprite.spritecollideany(self.player, self.obstacles) @@ -41,15 +44,23 @@ def render(self, screen: pygame.Surface): self.screen.blit(message, (50, self.screen.get_height() - 100)) if self.collide: - self.is_flashing = True - self.flashing_start_time = pygame.time.get_ticks() + if not self.is_flashing: + self.is_flashing = True + self.flashing_start_time = pygame.time.get_ticks() + self.last_flash_toggle_time = self.flash_toggle_interval current_time = pygame.time.get_ticks() - if self.is_flashing and (current_time - self.flashing_start_time > self.flashing_duration): - self.is_flashing = False - if self.is_flashing: - self.player.player_square.fill(self.flash_color) + if current_time - self.last_flash_toggle_time >= self.flash_toggle_interval: + self.last_flash_toggle_time = current_time + self.current_flash_color = ( + "white" if self.current_flash_color == "red" else "red" + ) + self.player.player_square.fill(self.current_flash_color) + + if current_time - self.flashing_start_time > self.flashing_duration: + self.is_flashing = False + self.current_flash_color = "red" else: self.player.player_square.fill("red") From 368d34583ea4b8c04f3a35eb7d0fde9d9e09aa6a Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 14:05:00 +0200 Subject: [PATCH 16/19] Added respawning Added: - when the player reaches 0 health, he will respawn at the start position with the maximum amount of health --- src/obstacle_handler.py | 8 +++++++- src/states/game_running.py | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 2bc9b93..256aa03 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -21,7 +21,7 @@ def __init__(self, player, obstacles): self.last_flash_toggle_time = 0 self.current_flash_color = "red" - def update(self): + def update(self, start_pos): self.collide = pygame.sprite.spritecollideany(self.player, self.obstacles) if self.collide and not self.damage_applied: @@ -36,6 +36,12 @@ def update(self): self.damage_applied = False self.player.player_hp = 0 + if hasattr(self.player, "rect"): + self.player.rect.topleft = start_pos + + if self.player.rect.topleft == start_pos: + self.player.player_hp = 100 + def render(self, screen: pygame.Surface): self.screen.fill((0, 0, 0, 0)) # Clear UI diff --git a/src/states/game_running.py b/src/states/game_running.py index fd9e165..c826b4c 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -152,6 +152,7 @@ def setup(self, player_start_pos: str, sprite_group=None) -> None: frames=self.world_frames["ships"]["player_test_ship"], groups=(sprite_group,), ) + self.player_start_pos = (grid_x, grid_y) # Coast for obj in self.tmx_map["map"].get_layer_by_name("Coast"): @@ -190,7 +191,7 @@ def update(self, events) -> None: self.obstacle_collision = pygame.sprite.spritecollideany(self.player, self.obstacle_group) dt = self.clock.tick() / 1000 self.all_sprites.update(dt) - self.obstacle_handler.update() + self.obstacle_handler.update(self.player_start_pos) # Handle player movement and grid snapping if isinstance(self.all_sprites, PlayerCamera): @@ -219,7 +220,7 @@ def render(self, screen) -> None: if isinstance(self.all_sprites, PlayerCamera): self.all_sprites.draw(self.player.rect.center, show_grid=self.show_grid) self.obstacle_handler.render(screen) - self.message = self.font.render(f"Player's Health: {self.player.player_hp}", True, (0, 0, 0)) + self.message = self.font.render(f"Player's Health: {self.player.player_hp}", True, "grey40") screen.blit(self.message, (50, screen.get_height() - 100)) # Pass the player's position to the draw method From 823453de6b8be341e2c302739c6951895a12b7a3 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 2 Jun 2025 14:07:37 +0200 Subject: [PATCH 17/19] Fixed some typehint issues Fixed: - typehint issues --- src/obstacle_handler.py | 4 +--- src/sprites/entities/player.py | 4 +++- src/states/game_running.py | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index 256aa03..d373291 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -59,9 +59,7 @@ def render(self, screen: pygame.Surface): if self.is_flashing: if current_time - self.last_flash_toggle_time >= self.flash_toggle_interval: self.last_flash_toggle_time = current_time - self.current_flash_color = ( - "white" if self.current_flash_color == "red" else "red" - ) + self.current_flash_color = "white" if self.current_flash_color == "red" else "red" self.player.player_square.fill(self.current_flash_color) if current_time - self.flashing_start_time > self.flashing_duration: diff --git a/src/sprites/entities/player.py b/src/sprites/entities/player.py index c2640fa..191dbcf 100644 --- a/src/sprites/entities/player.py +++ b/src/sprites/entities/player.py @@ -26,7 +26,9 @@ def __init__( """ # Initialize the player sprite - self.player_square = frames[0] if isinstance(frames, (list, tuple)) and frames else Surface((TILE_SIZE, TILE_SIZE)) + self.player_square = ( + frames[0] if isinstance(frames, (list, tuple)) and frames else Surface((TILE_SIZE, TILE_SIZE)) + ) self.player_square.fill("red") super().__init__(pos=pos, surf=self.player_square, groups=groups) diff --git a/src/states/game_running.py b/src/states/game_running.py index c826b4c..3f91949 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -61,7 +61,10 @@ def __init__(self, game_state_manager) -> None: self.shop_window = pygame.Surface((800, 600)) self.in_shop = False - self.obstacle_handler = ObstacleHandler(self.player, self.obstacle_group,) + self.obstacle_handler = ObstacleHandler( + self.player, + self.obstacle_group, + ) def setup(self, player_start_pos: str, sprite_group=None) -> None: if sprite_group is None: From 741a6d2b3feda059a833cf737f5652dd18c472e2 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 4 Jun 2025 12:55:08 +0200 Subject: [PATCH 18/19] Fixed constant flashing Fixed: - constant flashing when the player stays on the obstacle. --- src/obstacle_handler.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/obstacle_handler.py b/src/obstacle_handler.py index d373291..9494b60 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_handler.py @@ -20,6 +20,7 @@ def __init__(self, player, obstacles): self.flash_toggle_interval = 200 self.last_flash_toggle_time = 0 self.current_flash_color = "red" + self.flash_triggered = False def update(self, start_pos): self.collide = pygame.sprite.spritecollideany(self.player, self.obstacles) @@ -50,10 +51,13 @@ def render(self, screen: pygame.Surface): self.screen.blit(message, (50, self.screen.get_height() - 100)) if self.collide: - if not self.is_flashing: + if not self.flash_triggered: self.is_flashing = True + self.flash_triggered = True self.flashing_start_time = pygame.time.get_ticks() self.last_flash_toggle_time = self.flash_toggle_interval + else: + self.flash_triggered = False current_time = pygame.time.get_ticks() if self.is_flashing: From 718d170d7bc4b20600f9189c3d3d8e39485b91ef Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 4 Jun 2025 12:59:23 +0200 Subject: [PATCH 19/19] Changed file name Changed: - the file name to object_manager - class name to ObjectManager - as requested --- src/{obstacle_handler.py => obstacle_manager.py} | 2 +- src/states/game_running.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/{obstacle_handler.py => obstacle_manager.py} (99%) diff --git a/src/obstacle_handler.py b/src/obstacle_manager.py similarity index 99% rename from src/obstacle_handler.py rename to src/obstacle_manager.py index 9494b60..4eaadc4 100644 --- a/src/obstacle_handler.py +++ b/src/obstacle_manager.py @@ -1,7 +1,7 @@ import pygame -class ObstacleHandler: +class ObstacleManager: def __init__(self, player, obstacles): self.player = player self.obstacles = obstacles diff --git a/src/states/game_running.py b/src/states/game_running.py index 3f91949..3f59ccc 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -9,7 +9,7 @@ from pytmx.util_pygame import load_pygame # type: ignore from src.inventory import Inventory -from src.obstacle_handler import ObstacleHandler +from src.obstacle_manager import ObstacleManager from src.settings import TILE_SIZE, WORLD_LAYERS from src.sprites.animations import AnimatedSprites from src.sprites.base import BaseSprite @@ -61,7 +61,7 @@ def __init__(self, game_state_manager) -> None: self.shop_window = pygame.Surface((800, 600)) self.in_shop = False - self.obstacle_handler = ObstacleHandler( + self.obstacle_handler = ObstacleManager( self.player, self.obstacle_group, )