From d357735c4fd3f61b540d0bd09adf77ad0e66c8fc Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 11:15:48 +0100 Subject: [PATCH 01/34] Testing inventory gui Testing: - inventory gui --- src/states/game_running.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/states/game_running.py b/src/states/game_running.py index 3edaa62..5494839 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -10,6 +10,7 @@ from src.states.base_state import BaseState from src.states.paused import Paused from src.inventory import Inventory +from src.inventory_gui import InventoryGUI from src.support import import_folder, coast_importer, all_character_import from src.sprites import AnimatedSprites @@ -32,8 +33,10 @@ def __init__(self, game_state_manager) -> None: super().__init__(game_state_manager) # Initialize player inventory + self.screen = pygame.display.get_surface() self.clock = pygame.Clock() self.player_inventory = Inventory() + self.draw_inventory = InventoryGUI(self.screen, self.player_inventory) self.load_inventory_from_json("data/inventory.json") self.all_sprites = src.sprites.AllSprites() @@ -120,5 +123,7 @@ def render(self, screen) -> None: self.all_sprites.draw( self.player.rect.center ) + self.draw_inventory.draw() + self.draw_inventory.draw_buttons(64, 0, "Hello") pygame.display.update() From 73dc93883642a32b9b6981dddde7ccfcce7680c3 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 11:17:16 +0100 Subject: [PATCH 02/34] Reverted some changes Removed: - two draw functions from the render method --- src/states/game_running.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 5494839..97f191e 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -123,7 +123,5 @@ def render(self, screen) -> None: self.all_sprites.draw( self.player.rect.center ) - self.draw_inventory.draw() - self.draw_inventory.draw_buttons(64, 0, "Hello") pygame.display.update() From 82c0a4898e681892108d37ae8aeb5aee5c3f28bc Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 11:32:15 +0100 Subject: [PATCH 03/34] Nevermind Danilo said nothing --- src/states/game_running.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 97f191e..c452d79 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -33,10 +33,8 @@ def __init__(self, game_state_manager) -> None: super().__init__(game_state_manager) # Initialize player inventory - self.screen = pygame.display.get_surface() self.clock = pygame.Clock() self.player_inventory = Inventory() - self.draw_inventory = InventoryGUI(self.screen, self.player_inventory) self.load_inventory_from_json("data/inventory.json") self.all_sprites = src.sprites.AllSprites() From d552977368adc10912331ab429353b3a73ba279b Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 11:34:13 +0100 Subject: [PATCH 04/34] Removing import Removed a import --- src/states/game_running.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index c452d79..3edaa62 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -10,7 +10,6 @@ from src.states.base_state import BaseState from src.states.paused import Paused from src.inventory import Inventory -from src.inventory_gui import InventoryGUI from src.support import import_folder, coast_importer, all_character_import from src.sprites import AnimatedSprites From ae74200f01117fba08e305db634ad8bca044b9fe Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 13:31:56 +0100 Subject: [PATCH 05/34] Added new object layer Added: - a object layer for buildings - for example: shop --- data/new_maps/100x100_map.tmx | 7 ++++++- src/states/game_running.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/data/new_maps/100x100_map.tmx b/data/new_maps/100x100_map.tmx index 78454f4..2f5b67e 100644 --- a/data/new_maps/100x100_map.tmx +++ b/data/new_maps/100x100_map.tmx @@ -1,5 +1,5 @@ - + @@ -948,6 +948,11 @@ + + + + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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/states/game_running.py b/src/states/game_running.py index 3edaa62..3247f35 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -69,6 +69,11 @@ def setup(self, player_start_pos): for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shallow Sea").tiles(): src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) + # buildings + for obj in self.tmx_map["map"].get_layer_by_name("Buildings"): + if obj.name == "Shop": + src.sprites.Sprite((obj.x * TILE_SIZE, obj.y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) + # Islands islands = self.tmx_map["map"].get_layer_by_name("Islands") for x, y, surface in islands.tiles(): From 76c8760e076fae9ea81739c4e3b4d110fbf4e6ce Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 13:35:13 +0100 Subject: [PATCH 06/34] Adding a property Added: - a custom property to the object --- data/new_maps/100x100_map.tmx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/new_maps/100x100_map.tmx b/data/new_maps/100x100_map.tmx index 2f5b67e..bee2ef9 100644 --- a/data/new_maps/100x100_map.tmx +++ b/data/new_maps/100x100_map.tmx @@ -950,6 +950,9 @@ + + + From a84bf249042a77458f65c820ea0d253573fe4590 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 13:48:29 +0100 Subject: [PATCH 07/34] Added new file Added: - shop file --- data/new_maps/100x100_map.tmx | 9 ++------- src/shop.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 src/shop.py diff --git a/data/new_maps/100x100_map.tmx b/data/new_maps/100x100_map.tmx index bee2ef9..55d46d1 100644 --- a/data/new_maps/100x100_map.tmx +++ b/data/new_maps/100x100_map.tmx @@ -1,5 +1,5 @@ - + @@ -949,12 +949,7 @@ - - - - - - + diff --git a/src/shop.py b/src/shop.py new file mode 100644 index 0000000..5f89b71 --- /dev/null +++ b/src/shop.py @@ -0,0 +1,11 @@ +import pygame + +# from src.settings import TILE_SIZE, SCREEN_HEIGHT, SCREEN_WIDTH, ANIMATION_SPEED, WORLD_LAYERS + +class Shop(pygame.sprite.Sprite): + def __init__(self, pos, surface, groups): + super().__init__(groups) + + self.image = pygame.Surface((32, 32)) + self.image.fill("white") + self.rect = self.image.get_frect(topleft = pos) \ No newline at end of file From d756eaecb31573763e759da7327cce91ab8bc3db Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 13:53:26 +0100 Subject: [PATCH 08/34] Changed shop and added to game running Added: - world layers to shop - shop to game running --- src/shop.py | 7 ++++--- src/states/game_running.py | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/shop.py b/src/shop.py index 5f89b71..6c2499b 100644 --- a/src/shop.py +++ b/src/shop.py @@ -1,11 +1,12 @@ import pygame -# from src.settings import TILE_SIZE, SCREEN_HEIGHT, SCREEN_WIDTH, ANIMATION_SPEED, WORLD_LAYERS +from src.settings import TILE_SIZE, SCREEN_HEIGHT, SCREEN_WIDTH, ANIMATION_SPEED, WORLD_LAYERS class Shop(pygame.sprite.Sprite): - def __init__(self, pos, surface, groups): + def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): super().__init__(groups) self.image = pygame.Surface((32, 32)) self.image.fill("white") - self.rect = self.image.get_frect(topleft = pos) \ No newline at end of file + self.rect = self.image.get_frect(topleft = pos) + self.z = z \ No newline at end of file diff --git a/src/states/game_running.py b/src/states/game_running.py index 3247f35..0652ca3 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -7,11 +7,13 @@ import pygame from pytmx.util_pygame import load_pygame # type: ignore +import src.shop from src.states.base_state import BaseState from src.states.paused import Paused from src.inventory import Inventory from src.support import import_folder, coast_importer, all_character_import from src.sprites import AnimatedSprites +from src.shop import Shop from src.settings import TILE_SIZE, WORLD_LAYERS import src.sprites @@ -72,7 +74,7 @@ def setup(self, player_start_pos): # buildings for obj in self.tmx_map["map"].get_layer_by_name("Buildings"): if obj.name == "Shop": - src.sprites.Sprite((obj.x * TILE_SIZE, obj.y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) + src.shop.Shop((obj.x * TILE_SIZE, obj.y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) # Islands islands = self.tmx_map["map"].get_layer_by_name("Islands") From ebfd6f33f7b0e73d97bf5ed8949a3ac23ca6dfc1 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 14:29:17 +0100 Subject: [PATCH 09/34] Drawing the rect Added: - drew the rect responsible for the shop --- data/new_maps/100x100_map.tmx | 108 +++++++++++++++++++++++++++++++++- src/shop.py | 5 +- src/states/game_running.py | 7 +-- 3 files changed, 112 insertions(+), 8 deletions(-) diff --git a/data/new_maps/100x100_map.tmx b/data/new_maps/100x100_map.tmx index 55d46d1..b19ccaa 100644 --- a/data/new_maps/100x100_map.tmx +++ b/data/new_maps/100x100_map.tmx @@ -1,5 +1,5 @@ - + @@ -948,8 +948,112 @@ + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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/shop.py b/src/shop.py index 6c2499b..7413c80 100644 --- a/src/shop.py +++ b/src/shop.py @@ -2,11 +2,12 @@ from src.settings import TILE_SIZE, SCREEN_HEIGHT, SCREEN_WIDTH, ANIMATION_SPEED, WORLD_LAYERS -class Shop(pygame.sprite.Sprite): +class ShowShop(pygame.sprite.Sprite): def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): super().__init__(groups) self.image = pygame.Surface((32, 32)) self.image.fill("white") self.rect = self.image.get_frect(topleft = pos) - self.z = z \ No newline at end of file + self.z = z +# class \ No newline at end of file diff --git a/src/states/game_running.py b/src/states/game_running.py index 0652ca3..688b0fe 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -13,7 +13,6 @@ from src.inventory import Inventory from src.support import import_folder, coast_importer, all_character_import from src.sprites import AnimatedSprites -from src.shop import Shop from src.settings import TILE_SIZE, WORLD_LAYERS import src.sprites @@ -72,9 +71,9 @@ def setup(self, player_start_pos): src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) # buildings - for obj in self.tmx_map["map"].get_layer_by_name("Buildings"): - if obj.name == "Shop": - src.shop.Shop((obj.x * TILE_SIZE, obj.y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) + for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): + src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"]) + print(x, y) # Islands islands = self.tmx_map["map"].get_layer_by_name("Islands") From 5a652e0acd3cb10d82c9893901b714cc1998d0b6 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 14:43:22 +0100 Subject: [PATCH 10/34] Added collision Added: - collision for the shop --- src/shop.py | 3 +-- src/states/game_running.py | 7 ++++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/shop.py b/src/shop.py index 7413c80..170df7e 100644 --- a/src/shop.py +++ b/src/shop.py @@ -1,6 +1,6 @@ import pygame -from src.settings import TILE_SIZE, SCREEN_HEIGHT, SCREEN_WIDTH, ANIMATION_SPEED, WORLD_LAYERS +from src.settings import WORLD_LAYERS class ShowShop(pygame.sprite.Sprite): def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): @@ -10,4 +10,3 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): self.image.fill("white") self.rect = self.image.get_frect(topleft = pos) self.z = z -# class \ No newline at end of file diff --git a/src/states/game_running.py b/src/states/game_running.py index 688b0fe..333cafa 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -72,7 +72,7 @@ def setup(self, player_start_pos): # buildings for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): - src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"]) + self.shop = src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"]) print(x, y) # Islands @@ -127,4 +127,9 @@ def render(self, screen) -> None: self.player.rect.center ) + point = self.shop.rect + collide = self.player.rect.colliderect(point) + if collide: + print("Welcome to the shop!") + pygame.display.update() From 3be53afea26a518a76154c8fd4ef06d3b133d83b Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 14:51:16 +0100 Subject: [PATCH 11/34] Adding message Added: - a message when interacting with the shop --- src/states/game_running.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 333cafa..6c6b786 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -42,6 +42,8 @@ def __init__(self, game_state_manager) -> None: # The start positions will be one of the 4 islands in the corners of the board self.setup(player_start_pos="top_left_island") + self.font = pygame.font.Font(None, 36) + def setup(self, player_start_pos): """ setup the map and player from the tiled file @@ -127,9 +129,11 @@ def render(self, screen) -> None: self.player.rect.center ) + self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) point = self.shop.rect collide = self.player.rect.colliderect(point) if collide: - print("Welcome to the shop!") + print("Welcome to the shop!") + screen.blit(self.welcome_message, (155, 155)) pygame.display.update() From 26eaacd62518f365d32740b7781ebc883edf5088 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 14:54:13 +0100 Subject: [PATCH 12/34] Adding interaction Added: - if pressing E message is shown --- src/states/game_running.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 6c6b786..87e088b 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -133,7 +133,11 @@ def render(self, screen) -> None: point = self.shop.rect collide = self.player.rect.colliderect(point) if collide: - print("Welcome to the shop!") + # print("Welcome to the shop!") screen.blit(self.welcome_message, (155, 155)) + keys = pygame.key.get_pressed() + if keys[pygame.K_e]: + print("Sick boots x 5") + pygame.display.update() From def34252c7e3f48245090130cfd0fb85403256e8 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 12 Mar 2025 15:34:32 +0100 Subject: [PATCH 13/34] added black window Added: - appearing black window when interacting with the shop --- src/states/game_running.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/states/game_running.py b/src/states/game_running.py index 87e088b..08b9708 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -43,6 +43,7 @@ def __init__(self, game_state_manager) -> None: self.setup(player_start_pos="top_left_island") self.font = pygame.font.Font(None, 36) + self.shop_window = pygame.Surface((800, 600)) def setup(self, player_start_pos): """ @@ -139,5 +140,7 @@ def render(self, screen) -> None: keys = pygame.key.get_pressed() if keys[pygame.K_e]: print("Sick boots x 5") + self.shop_window.fill((0, 0, 0)) + screen.blit(self.shop_window, (260, 40)) pygame.display.update() From 2e1f9846f33e34c824f50dec29ac662153d968a3 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Thu, 13 Mar 2025 17:03:19 +0100 Subject: [PATCH 14/34] Fixed dissapearing win Fixed: - window dissapearing after letting go of the E key --- src/shop.py | 1 + src/states/game_running.py | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/shop.py b/src/shop.py index 170df7e..6346c1a 100644 --- a/src/shop.py +++ b/src/shop.py @@ -1,6 +1,7 @@ import pygame from src.settings import WORLD_LAYERS +# from src.states.base_state import BaseState class ShowShop(pygame.sprite.Sprite): def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): diff --git a/src/states/game_running.py b/src/states/game_running.py index 08b9708..390f3bc 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -44,6 +44,7 @@ def __init__(self, game_state_manager) -> None: self.font = pygame.font.Font(None, 36) self.shop_window = pygame.Surface((800, 600)) + self.in_shop = False def setup(self, player_start_pos): """ @@ -137,10 +138,17 @@ def render(self, screen) -> None: # print("Welcome to the shop!") screen.blit(self.welcome_message, (155, 155)) - keys = pygame.key.get_pressed() - if keys[pygame.K_e]: - print("Sick boots x 5") - self.shop_window.fill((0, 0, 0)) - screen.blit(self.shop_window, (260, 40)) + keys = pygame.key.get_pressed() + if collide and keys[pygame.K_e]: + self.in_shop = True + + if self.in_shop: + print("Sick boots x 5") + self.shop_window.fill((0, 0, 0)) + screen.blit(self.shop_window, (260, 40)) + + if keys[pygame.K_q]: + self.in_shop = False + print("Exiting shop") pygame.display.update() From 0c19f9342098b18c8a22fb8a07ce92010b4103f1 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Thu, 13 Mar 2025 17:09:50 +0100 Subject: [PATCH 15/34] Debug statements Removed: - print statements for debugging --- src/states/game_running.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 390f3bc..7979aeb 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -135,15 +135,13 @@ def render(self, screen) -> None: point = self.shop.rect collide = self.player.rect.colliderect(point) if collide: - # print("Welcome to the shop!") screen.blit(self.welcome_message, (155, 155)) keys = pygame.key.get_pressed() if collide and keys[pygame.K_e]: self.in_shop = True - + if self.in_shop: - print("Sick boots x 5") self.shop_window.fill((0, 0, 0)) screen.blit(self.shop_window, (260, 40)) From 9ba97e1e4c6cbe6f522251966755a1639d4a91e6 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 17 Mar 2025 12:33:29 +0100 Subject: [PATCH 16/34] Added basestate Added: - base state and the methods to the shop class --- src/shop.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/shop.py b/src/shop.py index 6346c1a..d7769ef 100644 --- a/src/shop.py +++ b/src/shop.py @@ -1,9 +1,9 @@ import pygame from src.settings import WORLD_LAYERS -# from src.states.base_state import BaseState +from src.states.base_state import BaseState -class ShowShop(pygame.sprite.Sprite): +class ShowShop(pygame.sprite.Sprite, BaseState): def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): super().__init__(groups) @@ -11,3 +11,9 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): self.image.fill("white") self.rect = self.image.get_frect(topleft = pos) self.z = z + + def update(self, *args, **kwargs): + return super().update(*args, **kwargs) + + def render(self, screen): + return super().render(screen) From 1e721baada7b7b87d1a12652175c49b0874f632f Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 17 Mar 2025 12:42:14 +0100 Subject: [PATCH 17/34] Adding buttons Added: - function for the buttons --- src/shop.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/shop.py b/src/shop.py index d7769ef..cbe366a 100644 --- a/src/shop.py +++ b/src/shop.py @@ -2,6 +2,7 @@ from src.settings import WORLD_LAYERS from src.states.base_state import BaseState +from typing import Tuple, Dict class ShowShop(pygame.sprite.Sprite, BaseState): def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): @@ -11,9 +12,29 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): self.image.fill("white") self.rect = self.image.get_frect(topleft = pos) self.z = z + self.font = pygame.font.Font(None, 36) + self.screen = pygame.Surface((800, 600)) + + self.button_width = 100 + self.button_height = 50 def update(self, *args, **kwargs): return super().update(*args, **kwargs) def render(self, screen): return super().render(screen) + + def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: + use_button = pygame.Rect(x, y, self.button_width, self.button_height) + discard_button = pygame.Rect(x + self.button_width + 10, y, self.button_width, self.button_height) + + pygame.draw.rect(self.screen, (0, 255, 0), use_button) # Green + pygame.draw.rect(self.screen, (150, 75, 0), discard_button) # Brown + + use_text = self.font.render("Use", True, (0, 0, 0)) # Black + discard_text = self.font.render("Discard", True, (0, 0, 0)) + + self.screen.blit(use_text, (x + 10, y + 10)) + self.screen.blit(discard_text, (x + self.button_width + 20, y + 10)) + + return use_button, discard_button From 875503652131e9346826b961a466a43b7830aa3b Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 17 Mar 2025 12:53:22 +0100 Subject: [PATCH 18/34] Adding method Added: - a method for handling mouse clicks --- src/shop.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/shop.py b/src/shop.py index cbe366a..d4ece42 100644 --- a/src/shop.py +++ b/src/shop.py @@ -2,6 +2,7 @@ from src.settings import WORLD_LAYERS from src.states.base_state import BaseState +from src.inventory import Inventory from typing import Tuple, Dict class ShowShop(pygame.sprite.Sprite, BaseState): @@ -18,12 +19,24 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): self.button_width = 100 self.button_height = 50 + self.button_actions: Dict[str, Tuple[pygame.Rect, pygame.Rect]] = {} + self.inventory = Inventory() + def update(self, *args, **kwargs): return super().update(*args, **kwargs) def render(self, screen): return super().render(screen) + def handle_mouse_clicks(self, mouse_pos): + for item, (use_button, discard_button) in self.button_actions.items(): + if use_button.collidepoint(mouse_pos): + self.message = self.inventory.use_item(item) # `self.message` stores strings + self.message_end_time = pygame.time.get_ticks() + 3000 # 3 seconds + elif discard_button.collidepoint(mouse_pos): + self.message = self.inventory.remove_item(item, 1) + self.message_end_time = pygame.time.get_ticks() + 4000 # 4 seconds + def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: use_button = pygame.Rect(x, y, self.button_width, self.button_height) discard_button = pygame.Rect(x + self.button_width + 10, y, self.button_width, self.button_height) From f522fec617804ff42ee871604686420fcecb108f Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 17 Mar 2025 13:40:59 +0100 Subject: [PATCH 19/34] Finishing shop Finished: - methods for the shop --- src/shop.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/src/shop.py b/src/shop.py index d4ece42..4e6ed3d 100644 --- a/src/shop.py +++ b/src/shop.py @@ -21,12 +21,77 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): self.button_actions: Dict[str, Tuple[pygame.Rect, pygame.Rect]] = {} self.inventory = Inventory() + self.max_visible_items = 10 - def update(self, *args, **kwargs): - return super().update(*args, **kwargs) + def update(self, events): + for event in events: + match event.type: + case pygame.KEYDOWN: + if event.key == pygame.K_i: + self.game_state_manager.exit_state() + case pygame.MOUSEBUTTONDOWN: + if event.button == 1: + self.handle_mouse_clicks(event.pos) + case pygame.MOUSEWHEEL: + self.scroll_offset = max(0, self.scroll_offset - event.y) + max_offset = max(0, len(self.inventory.get_items()) - self.max_visible_items) + self.scroll_offset = min(self.scroll_offset, max_offset) - def render(self, screen): - return super().render(screen) + def render(self, screen: pygame.Surface): + + self.button_actions = {} + + items = list(self.inventory.get_items().items()) + visible_items = items[self.scroll_offset : self.scroll_offset + self.max_visible_items] + y_offset = 50 + + for item, quantity in visible_items: + # if item in self.ic + + quantity_text = self.font.render(f"x{quantity}", True, (255, 255, 255)) + self.screen.blit(quantity_text, (100, y_offset + 5)) + + text = self.font.render(item, True, (255, 255, 255)) + self.screen.blit(text, (100, y_offset + 5)) + + use_button, discard_button = self.draw_buttons(400, y_offset, item) + + self.button_actions[item] = (use_button, discard_button) + y_offset += 60 + + hint_text = self.font.render("Press Q to quit the shop!", True, (200, 200, 200)) + self.screen.blit(hint_text, (50, self.screen.get_height() - 60)) + + if self.message and pygame.time.get_ticks() < self.message_end_time: + # Render the message text + message_text = self.font.render(self.message, True, (255, 255, 0)) # Yellow + + # Measure the message text size + text_width, text_height = message_text.get_size() + + # Message background + message_bg_x = 40 + message_bg_y = self.screen.get_height() - 120 + message_bg_width = text_width + 20 # Add padding + message_bg_height = text_height + 10 # Add padding + + # Draw background rectangle for the message + pygame.draw.rect( + self.screen, + (0, 0, 0), # Black background + (message_bg_x, message_bg_y, message_bg_width, message_bg_height), + ) + + # Draw the message text on top of the background + self.screen.blit( + message_text, + (message_bg_x + 10, message_bg_y + 5), # Position text with padding + ) + + # blit tmp self.screen to the actual display (screen form the argument) + screen.blit(self.screen, dest=(0, 0)) + pygame.display.flip() # Update the display + def handle_mouse_clicks(self, mouse_pos): for item, (use_button, discard_button) in self.button_actions.items(): From 66336cced4e26693c56504f73ff4c86dd91301a4 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 17 Mar 2025 17:52:55 +0100 Subject: [PATCH 20/34] Splitting class in two Changed: - spltied class in two because it was not working as expected --- src/shop.py | 99 ++++++++++++++++++++++---------------- src/states/game_running.py | 40 ++++++++------- 2 files changed, 80 insertions(+), 59 deletions(-) diff --git a/src/shop.py b/src/shop.py index 4e6ed3d..4d05cc8 100644 --- a/src/shop.py +++ b/src/shop.py @@ -13,6 +13,11 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): self.image.fill("white") self.rect = self.image.get_frect(topleft = pos) self.z = z + + +class WindowShop(BaseState): + def __init__(self, game_state_manager): + super().__init__(game_state_manager) self.font = pygame.font.Font(None, 36) self.screen = pygame.Surface((800, 600)) @@ -23,11 +28,14 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): self.inventory = Inventory() self.max_visible_items = 10 + self.in_shop = False + self.collide = player.rect.colliderect(self.rect) + def update(self, events): for event in events: match event.type: case pygame.KEYDOWN: - if event.key == pygame.K_i: + if event.key == pygame.K_q: self.game_state_manager.exit_state() case pygame.MOUSEBUTTONDOWN: if event.button == 1: @@ -38,59 +46,68 @@ def update(self, events): self.scroll_offset = min(self.scroll_offset, max_offset) def render(self, screen: pygame.Surface): - - self.button_actions = {} + if self.collide: + welcome_message = self.font.render("Press 'E' to enter the shop!", True, (0, 0, 0)) + screen.blit(welcome_message, (155, 155)) + + if self.collide and pygame.K_e: + self.in_shop = True + + if self.in_shop: + screen.fill((0, 0, 0)) + + self.button_actions = {} - items = list(self.inventory.get_items().items()) - visible_items = items[self.scroll_offset : self.scroll_offset + self.max_visible_items] - y_offset = 50 + items = list(self.inventory.get_items().items()) + visible_items = items[self.scroll_offset : self.scroll_offset + self.max_visible_items] + y_offset = 50 - for item, quantity in visible_items: - # if item in self.ic + for item, quantity in visible_items: + # if item in self.ic - quantity_text = self.font.render(f"x{quantity}", True, (255, 255, 255)) - self.screen.blit(quantity_text, (100, y_offset + 5)) + quantity_text = self.font.render(f"x{quantity}", True, (255, 255, 255)) + self.screen.blit(quantity_text, (100, y_offset + 5)) - text = self.font.render(item, True, (255, 255, 255)) - self.screen.blit(text, (100, y_offset + 5)) + text = self.font.render(item, True, (255, 255, 255)) + self.screen.blit(text, (100, y_offset + 5)) - use_button, discard_button = self.draw_buttons(400, y_offset, item) + use_button, discard_button = self.draw_buttons(400, y_offset, item) - self.button_actions[item] = (use_button, discard_button) - y_offset += 60 + self.button_actions[item] = (use_button, discard_button) + y_offset += 60 - hint_text = self.font.render("Press Q to quit the shop!", True, (200, 200, 200)) - self.screen.blit(hint_text, (50, self.screen.get_height() - 60)) + hint_text = self.font.render("Press Q to quit the shop!", True, (200, 200, 200)) + self.screen.blit(hint_text, (50, self.screen.get_height() - 60)) - if self.message and pygame.time.get_ticks() < self.message_end_time: - # Render the message text - message_text = self.font.render(self.message, True, (255, 255, 0)) # Yellow + if self.message and pygame.time.get_ticks() < self.message_end_time: + # Render the message text + message_text = self.font.render(self.message, True, (255, 255, 0)) # Yellow - # Measure the message text size - text_width, text_height = message_text.get_size() + # Measure the message text size + text_width, text_height = message_text.get_size() - # Message background - message_bg_x = 40 - message_bg_y = self.screen.get_height() - 120 - message_bg_width = text_width + 20 # Add padding - message_bg_height = text_height + 10 # Add padding + # Message background + message_bg_x = 40 + message_bg_y = self.screen.get_height() - 120 + message_bg_width = text_width + 20 # Add padding + message_bg_height = text_height + 10 # Add padding - # Draw background rectangle for the message - pygame.draw.rect( - self.screen, - (0, 0, 0), # Black background - (message_bg_x, message_bg_y, message_bg_width, message_bg_height), - ) + # Draw background rectangle for the message + pygame.draw.rect( + self.screen, + (0, 0, 0), # Black background + (message_bg_x, message_bg_y, message_bg_width, message_bg_height), + ) - # Draw the message text on top of the background - self.screen.blit( - message_text, - (message_bg_x + 10, message_bg_y + 5), # Position text with padding - ) + # Draw the message text on top of the background + self.screen.blit( + message_text, + (message_bg_x + 10, message_bg_y + 5), # Position text with padding + ) - # blit tmp self.screen to the actual display (screen form the argument) - screen.blit(self.screen, dest=(0, 0)) - pygame.display.flip() # Update the display + # blit tmp self.screen to the actual display (screen form the argument) + screen.blit(self.screen, dest=(0, 0)) + pygame.display.flip() # Update the display def handle_mouse_clicks(self, mouse_pos): diff --git a/src/states/game_running.py b/src/states/game_running.py index 995d774..20fe08a 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -82,10 +82,6 @@ def setup(self, player_start_pos): for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shallow Sea").tiles(): src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) - # buildings - for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): - self.shop = src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"]) - print(x, y) # Islands islands = self.tmx_map["map"].get_layer_by_name("Islands") @@ -106,6 +102,11 @@ def setup(self, player_start_pos): groups=self.all_sprites, ) + # buildings + for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): + self.shop = src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, self.game_state_manager, self.player, WORLD_LAYERS["main"]) + print(x, y) + # Coast for obj in self.tmx_map["map"].get_layer_by_name("Coast"): terrain = obj.properties["terrain"] @@ -140,6 +141,9 @@ def update(self, events) -> None: if event.type == pygame.KEYDOWN: if event.key == pygame.K_i: # Toggle inventory with "I" key self.game_state_manager.enter_state(Paused(self.game_state_manager, self.player_inventory)) + if event.key == pygame.K_e: + for x, y, surf in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): + self.game_state_manager.enter_state(src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surf, self.all_sprites, self.game_state_manager, self.player, WORLD_LAYERS["main"])) def render(self, screen) -> None: """draw sprites to the canvas""" @@ -148,22 +152,22 @@ def render(self, screen) -> None: self.player.rect.center ) - self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) - point = self.shop.rect - collide = self.player.rect.colliderect(point) - if collide: - screen.blit(self.welcome_message, (155, 155)) + # self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) + # point = self.shop.rect + # collide = self.player.rect.colliderect(point) + # if collide: + # screen.blit(self.welcome_message, (155, 155)) - keys = pygame.key.get_pressed() - if collide and keys[pygame.K_e]: - self.in_shop = True + # keys = pygame.key.get_pressed() + # if collide and keys[pygame.K_e]: + # self.in_shop = True - if self.in_shop: - self.shop_window.fill((0, 0, 0)) - screen.blit(self.shop_window, (260, 40)) + # if self.in_shop: + # self.shop_window.fill((0, 0, 0)) + # screen.blit(self.shop_window, (260, 40)) - if keys[pygame.K_q]: - self.in_shop = False - print("Exiting shop") + # if keys[pygame.K_q]: + # self.in_shop = False + # print("Exiting shop") pygame.display.update() From 794d7b177ca40e65359e665176b1db524e6e95bd Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 17 Mar 2025 18:15:16 +0100 Subject: [PATCH 21/34] Managed to get it work (not really) Fixed: - some issues with the code and crashing - shop window not showing when clicking E --- src/shop.py | 26 ++++++++++++++++++-------- src/states/game_running.py | 12 +++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/shop.py b/src/shop.py index 4d05cc8..a078690 100644 --- a/src/shop.py +++ b/src/shop.py @@ -5,7 +5,7 @@ from src.inventory import Inventory from typing import Tuple, Dict -class ShowShop(pygame.sprite.Sprite, BaseState): +class ShowShop(pygame.sprite.Sprite): def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): super().__init__(groups) @@ -16,27 +16,40 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): class WindowShop(BaseState): - def __init__(self, game_state_manager): + def __init__(self, game_state_manager, player, show_shop): super().__init__(game_state_manager) self.font = pygame.font.Font(None, 36) self.screen = pygame.Surface((800, 600)) self.button_width = 100 self.button_height = 50 + self.scroll_offset = 0 self.button_actions: Dict[str, Tuple[pygame.Rect, pygame.Rect]] = {} self.inventory = Inventory() - self.max_visible_items = 10 + self.show_shop = show_shop + self.player = player + self.max_visible_items = 10 self.in_shop = False - self.collide = player.rect.colliderect(self.rect) + self.collide = False + + self.message = "" + self.message_end_time = 0 def update(self, events): + self.collide = self.player.rect.colliderect(self.show_shop.rect) + for event in events: match event.type: case pygame.KEYDOWN: - if event.key == pygame.K_q: + if event.key == pygame.K_q and self.in_shop: + self.in_shop = False self.game_state_manager.exit_state() + + if event.key == pygame.K_e and self.collide: + self.in_shop = True + case pygame.MOUSEBUTTONDOWN: if event.button == 1: self.handle_mouse_clicks(event.pos) @@ -50,9 +63,6 @@ def render(self, screen: pygame.Surface): welcome_message = self.font.render("Press 'E' to enter the shop!", True, (0, 0, 0)) screen.blit(welcome_message, (155, 155)) - if self.collide and pygame.K_e: - self.in_shop = True - if self.in_shop: screen.fill((0, 0, 0)) diff --git a/src/states/game_running.py b/src/states/game_running.py index 20fe08a..f847fda 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -82,6 +82,10 @@ def setup(self, player_start_pos): for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shallow Sea").tiles(): src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"]) + # buildings + for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): + self.shop = src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"]) + print(x, y) # Islands islands = self.tmx_map["map"].get_layer_by_name("Islands") @@ -102,11 +106,6 @@ def setup(self, player_start_pos): groups=self.all_sprites, ) - # buildings - for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): - self.shop = src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, self.game_state_manager, self.player, WORLD_LAYERS["main"]) - print(x, y) - # Coast for obj in self.tmx_map["map"].get_layer_by_name("Coast"): terrain = obj.properties["terrain"] @@ -142,8 +141,7 @@ def update(self, events) -> None: if event.key == pygame.K_i: # Toggle inventory with "I" key self.game_state_manager.enter_state(Paused(self.game_state_manager, self.player_inventory)) if event.key == pygame.K_e: - for x, y, surf in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): - self.game_state_manager.enter_state(src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surf, self.all_sprites, self.game_state_manager, self.player, WORLD_LAYERS["main"])) + self.game_state_manager.enter_state(src.shop.WindowShop(self.game_state_manager, self.player, self.shop)) def render(self, screen) -> None: """draw sprites to the canvas""" From b9a2c7047ee0cf86fcaf025aadc8fd8a79e14be4 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 09:52:58 +0100 Subject: [PATCH 22/34] Making buttons show Fixed: - buttons not showing up --- src/shop.py | 8 ++++---- src/states/game_running.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/shop.py b/src/shop.py index a078690..1d8370a 100644 --- a/src/shop.py +++ b/src/shop.py @@ -16,7 +16,7 @@ def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): class WindowShop(BaseState): - def __init__(self, game_state_manager, player, show_shop): + def __init__(self, game_state_manager, player, show_shop, inventory: Inventory): super().__init__(game_state_manager) self.font = pygame.font.Font(None, 36) self.screen = pygame.Surface((800, 600)) @@ -26,7 +26,7 @@ def __init__(self, game_state_manager, player, show_shop): self.scroll_offset = 0 self.button_actions: Dict[str, Tuple[pygame.Rect, pygame.Rect]] = {} - self.inventory = Inventory() + self.inventory = inventory self.show_shop = show_shop self.player = player @@ -61,10 +61,10 @@ def update(self, events): def render(self, screen: pygame.Surface): if self.collide: welcome_message = self.font.render("Press 'E' to enter the shop!", True, (0, 0, 0)) - screen.blit(welcome_message, (155, 155)) + self.screen.blit(welcome_message, (50, self.screen.get_height() - 60)) if self.in_shop: - screen.fill((0, 0, 0)) + self.screen.fill((0, 0, 0)) self.button_actions = {} diff --git a/src/states/game_running.py b/src/states/game_running.py index f847fda..6c38226 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -141,7 +141,7 @@ def update(self, events) -> None: if event.key == pygame.K_i: # Toggle inventory with "I" key self.game_state_manager.enter_state(Paused(self.game_state_manager, self.player_inventory)) if event.key == pygame.K_e: - self.game_state_manager.enter_state(src.shop.WindowShop(self.game_state_manager, self.player, self.shop)) + self.game_state_manager.enter_state(src.shop.WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory)) def render(self, screen) -> None: """draw sprites to the canvas""" From 9c5607b6867bfb4d54479c1589667a1d2b679d04 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 09:58:33 +0100 Subject: [PATCH 23/34] Changed visible items Changed: - the amount visible items --- src/shop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shop.py b/src/shop.py index 1d8370a..c0034bf 100644 --- a/src/shop.py +++ b/src/shop.py @@ -30,7 +30,7 @@ def __init__(self, game_state_manager, player, show_shop, inventory: Inventory): self.show_shop = show_shop self.player = player - self.max_visible_items = 10 + self.max_visible_items = 5 self.in_shop = False self.collide = False From 9cf3977d6a13a23821091363ccb18c1afaa36384 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 10:53:18 +0100 Subject: [PATCH 24/34] Typehints fixed Issues: - fixed by ruff --- src/shop.py | 22 ++++++++++++---------- src/states/game_running.py | 12 +++++++----- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/shop.py b/src/shop.py index c0034bf..afc1341 100644 --- a/src/shop.py +++ b/src/shop.py @@ -1,17 +1,19 @@ +from typing import Dict, Tuple + import pygame +from src.inventory import Inventory from src.settings import WORLD_LAYERS from src.states.base_state import BaseState -from src.inventory import Inventory -from typing import Tuple, Dict + class ShowShop(pygame.sprite.Sprite): - def __init__(self, pos, surface, groups, z = WORLD_LAYERS["main"]): + def __init__(self, pos, surface, groups, z=WORLD_LAYERS["main"]): super().__init__(groups) - self.image = pygame.Surface((32, 32)) + self.image = pygame.Surface((32, 32)) self.image.fill("white") - self.rect = self.image.get_frect(topleft = pos) + self.rect = self.image.get_frect(topleft=pos) self.z = z @@ -29,6 +31,7 @@ def __init__(self, game_state_manager, player, show_shop, inventory: Inventory): self.inventory = inventory self.show_shop = show_shop self.player = player + self.big_screen = pygame.Surface((1280, 720)) self.max_visible_items = 5 self.in_shop = False @@ -57,15 +60,15 @@ def update(self, events): self.scroll_offset = max(0, self.scroll_offset - event.y) max_offset = max(0, len(self.inventory.get_items()) - self.max_visible_items) self.scroll_offset = min(self.scroll_offset, max_offset) - + def render(self, screen: pygame.Surface): if self.collide: welcome_message = self.font.render("Press 'E' to enter the shop!", True, (0, 0, 0)) - self.screen.blit(welcome_message, (50, self.screen.get_height() - 60)) + self.big_screen.blit(welcome_message, (50, self.screen.get_height() - 60)) if self.in_shop: self.screen.fill((0, 0, 0)) - + self.button_actions = {} items = list(self.inventory.get_items().items()) @@ -119,7 +122,6 @@ def render(self, screen: pygame.Surface): screen.blit(self.screen, dest=(0, 0)) pygame.display.flip() # Update the display - def handle_mouse_clicks(self, mouse_pos): for item, (use_button, discard_button) in self.button_actions.items(): if use_button.collidepoint(mouse_pos): @@ -128,7 +130,7 @@ def handle_mouse_clicks(self, mouse_pos): elif discard_button.collidepoint(mouse_pos): self.message = self.inventory.remove_item(item, 1) self.message_end_time = pygame.time.get_ticks() + 4000 # 4 seconds - + def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: use_button = pygame.Rect(x, y, self.button_width, self.button_height) discard_button = pygame.Rect(x + self.button_width + 10, y, self.button_width, self.button_height) diff --git a/src/states/game_running.py b/src/states/game_running.py index 6c38226..7c82eb8 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -84,7 +84,9 @@ def setup(self, player_start_pos): # buildings for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shop").tiles(): - self.shop = src.shop.ShowShop((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"]) + self.shop = src.shop.ShowShop( + (x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"] + ) print(x, y) # Islands @@ -141,14 +143,14 @@ def update(self, events) -> None: if event.key == pygame.K_i: # Toggle inventory with "I" key self.game_state_manager.enter_state(Paused(self.game_state_manager, self.player_inventory)) if event.key == pygame.K_e: - self.game_state_manager.enter_state(src.shop.WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory)) + self.game_state_manager.enter_state( + src.shop.WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory) + ) def render(self, screen) -> None: """draw sprites to the canvas""" screen.fill("#000000") - self.all_sprites.draw( - self.player.rect.center - ) + self.all_sprites.draw(self.player.rect.center) # self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) # point = self.shop.rect From 8cef513b1e89435270cc335d8c72470e29bd5734 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 11:11:31 +0100 Subject: [PATCH 25/34] Fixed double E Fixed: - to show shop you have to press E twice --- src/shop.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shop.py b/src/shop.py index afc1341..017c919 100644 --- a/src/shop.py +++ b/src/shop.py @@ -34,7 +34,7 @@ def __init__(self, game_state_manager, player, show_shop, inventory: Inventory): self.big_screen = pygame.Surface((1280, 720)) self.max_visible_items = 5 - self.in_shop = False + self.in_shop = True self.collide = False self.message = "" @@ -50,8 +50,8 @@ def update(self, events): self.in_shop = False self.game_state_manager.exit_state() - if event.key == pygame.K_e and self.collide: - self.in_shop = True + # if event.key == pygame.K_e and self.collide: + # self.in_shop = True case pygame.MOUSEBUTTONDOWN: if event.button == 1: From 0e33c539dc2d550fe5fd1e98b80b0f7e86cd93a9 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 11:23:38 +0100 Subject: [PATCH 26/34] Fixed opening shop everywhere Fixed: - if outside the shop and use E the shop would still open --- src/states/game_running.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 7c82eb8..9ccef99 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -134,6 +134,7 @@ def update(self, events) -> None: """ update each sprites and handle events """ + collide = self.player.rect.colliderect(self.shop.rect) dt = self.clock.tick() / 1000 self.all_sprites.update(dt) @@ -142,7 +143,7 @@ def update(self, events) -> None: if event.type == pygame.KEYDOWN: if event.key == pygame.K_i: # Toggle inventory with "I" key self.game_state_manager.enter_state(Paused(self.game_state_manager, self.player_inventory)) - if event.key == pygame.K_e: + if collide and event.key == pygame.K_e: self.game_state_manager.enter_state( src.shop.WindowShop(self.game_state_manager, self.player, self.shop, self.player_inventory) ) From 4c75685ac58af4195ad9bec34674123f484c10ef Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 11:26:18 +0100 Subject: [PATCH 27/34] Removed code Removed: - old unused code --- src/shop.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/shop.py b/src/shop.py index 017c919..cc41372 100644 --- a/src/shop.py +++ b/src/shop.py @@ -50,9 +50,6 @@ def update(self, events): self.in_shop = False self.game_state_manager.exit_state() - # if event.key == pygame.K_e and self.collide: - # self.in_shop = True - case pygame.MOUSEBUTTONDOWN: if event.button == 1: self.handle_mouse_clicks(event.pos) From 00ee9e14121aea3d9b7984a21b3b7d830dbf5167 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 11:57:56 +0100 Subject: [PATCH 28/34] Updated button method and added messages Changed: - buttons from use and discard to buy and sell Added: - new messages to the json file for the shop --- data/messages.json | 7 +++++++ src/shop.py | 6 ++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/data/messages.json b/data/messages.json index 2dcf311..8d7e0be 100644 --- a/data/messages.json +++ b/data/messages.json @@ -6,5 +6,12 @@ "remove_fail": "Cannot remove {quantity} {item}(s), insufficient quantity.", "use_success": "You used {item}.", "use_fail": "You dont' have {item} in your inventory." + }, + + "shop_inventory": { + "buy_success": "Succesfully bought {quantity} {item}.", + "buy_fail": "Failed to buy {quantity} {item}", + "sell_success": "Succesfully sold {quantity} {item}(s) to the shopkeeper.", + "sell_fail": "Failed to sell {quantity} {item} to the shopkeeper." } } \ No newline at end of file diff --git a/src/shop.py b/src/shop.py index cc41372..529113c 100644 --- a/src/shop.py +++ b/src/shop.py @@ -73,8 +73,6 @@ def render(self, screen: pygame.Surface): y_offset = 50 for item, quantity in visible_items: - # if item in self.ic - quantity_text = self.font.render(f"x{quantity}", True, (255, 255, 255)) self.screen.blit(quantity_text, (100, y_offset + 5)) @@ -135,8 +133,8 @@ def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.R pygame.draw.rect(self.screen, (0, 255, 0), use_button) # Green pygame.draw.rect(self.screen, (150, 75, 0), discard_button) # Brown - use_text = self.font.render("Use", True, (0, 0, 0)) # Black - discard_text = self.font.render("Discard", True, (0, 0, 0)) + use_text = self.font.render("Buy", True, (0, 0, 0)) # Black + discard_text = self.font.render("Sell", True, (0, 0, 0)) self.screen.blit(use_text, (x + 10, y + 10)) self.screen.blit(discard_text, (x + self.button_width + 20, y + 10)) From 6b2dfd8083cbe8b8f17e80162c51e0650075986a Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 13:29:44 +0100 Subject: [PATCH 29/34] Added buy and sell Added (to inventory.py): - buy method - sell method --- src/inventory.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/inventory.py b/src/inventory.py index 5cd5d31..ac00c94 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -58,6 +58,22 @@ def use_item(self, item_name: str) -> str: if self.remove_item(item_name, 1) == get_message("inventory", "remove_success", item=item_name, quantity=1): return get_message("inventory", "use_success", item=item_name) return get_message("inventory", "use_fail", item=item_name) + + def buy_item(self, item_name, quantity): + if item_name in self.items: + self.items[item_name] += quantity + return get_message("shop_inventory", "buy_success", item=item_name, quantity=quantity) + else: + self.items[item_name] = quantity + return get_message("shop_inventory", "buy_success", item=item_name, quantity=quantity) + + def sell_item(self, item_name, quantity): + if item_name in self.items and self.items[item_name] >= quantity: + self.items[item_name] -= quantity + if self.items[item_name] == 0: + del self.items[item_name] + return get_message("shop_inventory", "sell_success", item=item_name, quantity=quantity) + return get_message("shop_inventory", "sell_fail", item=item_name, quantity=quantity) def get_items(self) -> dict[str, int]: """Return a copy of the items dictionary.""" From 3cd30875e18f4e8cef3317204f6f1aad28a04ffb Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 13:34:22 +0100 Subject: [PATCH 30/34] Implementing methods Implemented: - buy and sell into shop.py --- src/shop.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shop.py b/src/shop.py index 529113c..44faa3b 100644 --- a/src/shop.py +++ b/src/shop.py @@ -120,10 +120,10 @@ def render(self, screen: pygame.Surface): def handle_mouse_clicks(self, mouse_pos): for item, (use_button, discard_button) in self.button_actions.items(): if use_button.collidepoint(mouse_pos): - self.message = self.inventory.use_item(item) # `self.message` stores strings + self.message = self.inventory.buy_item(item, 1) # `self.message` stores strings self.message_end_time = pygame.time.get_ticks() + 3000 # 3 seconds elif discard_button.collidepoint(mouse_pos): - self.message = self.inventory.remove_item(item, 1) + self.message = self.inventory.sell_item(item, 1) self.message_end_time = pygame.time.get_ticks() + 4000 # 4 seconds def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: From 1da56a600d1cdec911bac8ed495cfdbc54c13b40 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 13:38:05 +0100 Subject: [PATCH 31/34] Adding icons Added: - icons dict - extract_icons method --- src/shop.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/shop.py b/src/shop.py index 44faa3b..0014559 100644 --- a/src/shop.py +++ b/src/shop.py @@ -40,6 +40,51 @@ def __init__(self, game_state_manager, player, show_shop, inventory: Inventory): self.message = "" self.message_end_time = 0 + self.sprite_sheet = pygame.image.load("images/tilesets/Treasure+.png").convert_alpha() + self.icons = { + "Gold Coin": self.extract_icon(0, 0), + "Silver Coin": self.extract_icon(16, 0), + "Coin Stack (1)": self.extract_icon(32, 0), + "Coin Stack (2)": self.extract_icon(48, 0), + "Circular Gem": self.extract_icon(64, 0), + "Single Gold Bar": self.extract_icon(0, 16), + "Gold Bar Stack": self.extract_icon(16, 16), + "Treasure Block": self.extract_icon(32, 16), + "Golden Crown": self.extract_icon(0, 32), + "Ornate Cup": self.extract_icon(16, 32), + "Golden Figurine": self.extract_icon(32, 32), + "Simple Sword": self.extract_icon(0, 48), + "Ornate Sword": self.extract_icon(16, 48), + "Double-Bladed Axe": self.extract_icon(32, 48), + "Spear": self.extract_icon(48, 48), + "Circular Shield": self.extract_icon(64, 48), + "Golden Trophy": self.extract_icon(0, 64), + "Candelabra": self.extract_icon(16, 64), + "Potion (Red)": self.extract_icon(0, 80), + "Potion (Blue)": self.extract_icon(16, 80), + "Potion (Green)": self.extract_icon(32, 80), + "Square Jar": self.extract_icon(48, 80), + "Cake": self.extract_icon(0, 96), + "Donut": self.extract_icon(16, 96), + "Bread": self.extract_icon(32, 96), + "Rug Tile": self.extract_icon(0, 112), + "Geometric Pattern": self.extract_icon(16, 112), + "Glowing Orb (Blue)": self.extract_icon(0, 128), + "Glowing Orb (Red)": self.extract_icon(16, 128), + "Glowing Orb (Green)": self.extract_icon(32, 128), + "Golden Ring": self.extract_icon(48, 128), + "Amulet": self.extract_icon(64, 128), + "Scroll": self.extract_icon(0, 144), + "Key": self.extract_icon(16, 144), + "Tool": self.extract_icon(32, 144), + "Dragon (Red)": self.extract_icon(0, 160), + "Dragon (Green)": self.extract_icon(16, 160), + "Dragon (Black)": self.extract_icon(32, 160), + "Dragon (White)": self.extract_icon(48, 160), + "Gem Cluster": self.extract_icon(0, 176), + "Glowing Crystal": self.extract_icon(16, 176), + } + def update(self, events): self.collide = self.player.rect.colliderect(self.show_shop.rect) @@ -126,6 +171,9 @@ def handle_mouse_clicks(self, mouse_pos): self.message = self.inventory.sell_item(item, 1) self.message_end_time = pygame.time.get_ticks() + 4000 # 4 seconds + def extract_icon(self, x, y, size=16): + return self.sprite_sheet.subsurface((x, y, size)) + def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: use_button = pygame.Rect(x, y, self.button_width, self.button_height) discard_button = pygame.Rect(x + self.button_width + 10, y, self.button_width, self.button_height) From d7cafb5cf394a48b93dfd95f0a63fb3fda9d1c63 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 13:41:40 +0100 Subject: [PATCH 32/34] Drawing the icons --- src/shop.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/shop.py b/src/shop.py index 0014559..f4b672f 100644 --- a/src/shop.py +++ b/src/shop.py @@ -118,6 +118,8 @@ def render(self, screen: pygame.Surface): y_offset = 50 for item, quantity in visible_items: + if item in self.icons: + self.screen.blit(self.icons[item], (50, y_offset)) quantity_text = self.font.render(f"x{quantity}", True, (255, 255, 255)) self.screen.blit(quantity_text, (100, y_offset + 5)) @@ -172,7 +174,7 @@ def handle_mouse_clicks(self, mouse_pos): self.message_end_time = pygame.time.get_ticks() + 4000 # 4 seconds def extract_icon(self, x, y, size=16): - return self.sprite_sheet.subsurface((x, y, size)) + return self.sprite_sheet.subsurface((x, y, size, size)) def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: use_button = pygame.Rect(x, y, self.button_width, self.button_height) From 26cdacaad5f2f6f6519ac9998780e69317b567f5 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 13:47:37 +0100 Subject: [PATCH 33/34] Small fix Fixed: - incorrect position of the quanitity sign --- src/shop.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/shop.py b/src/shop.py index f4b672f..724e32e 100644 --- a/src/shop.py +++ b/src/shop.py @@ -120,11 +120,12 @@ def render(self, screen: pygame.Surface): for item, quantity in visible_items: if item in self.icons: self.screen.blit(self.icons[item], (50, y_offset)) + quantity_text = self.font.render(f"x{quantity}", True, (255, 255, 255)) self.screen.blit(quantity_text, (100, y_offset + 5)) text = self.font.render(item, True, (255, 255, 255)) - self.screen.blit(text, (100, y_offset + 5)) + self.screen.blit(text, (150, y_offset)) use_button, discard_button = self.draw_buttons(400, y_offset, item) From a5008e8bd5b3948032628094c1c73261baf958ab Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Wed, 19 Mar 2025 14:48:43 +0100 Subject: [PATCH 34/34] Addressing feedback Removed: - the debug print statement --- src/states/game_running.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 9ccef99..b4993c6 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -87,7 +87,6 @@ def setup(self, player_start_pos): self.shop = src.shop.ShowShop( (x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["main"] ) - print(x, y) # Islands islands = self.tmx_map["map"].get_layer_by_name("Islands")