From 3a3f666c19271ec6602e234881ea1df4ebeadb9f Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Thu, 20 Mar 2025 14:46:47 +0100 Subject: [PATCH 01/17] Added a "wallet" Added: - a json file that stores the amount of gold --- data/wallet.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/wallet.json diff --git a/data/wallet.json b/data/wallet.json new file mode 100644 index 0000000..2163107 --- /dev/null +++ b/data/wallet.json @@ -0,0 +1,3 @@ +{ + "player_wallet": {"quantity": 0} +} \ No newline at end of file From 370871372bc45afb21be899d7ea836f06d8f3124 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Thu, 20 Mar 2025 15:05:16 +0100 Subject: [PATCH 02/17] Added new class Added: - new class for player graphical user interface - changed the quantity in the player wallet --- data/wallet.json | 2 +- src/states/player_gui.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/states/player_gui.py diff --git a/data/wallet.json b/data/wallet.json index 2163107..99b0a6e 100644 --- a/data/wallet.json +++ b/data/wallet.json @@ -1,3 +1,3 @@ { - "player_wallet": {"quantity": 0} + "player_wallet": {"quantity": 100000} } \ No newline at end of file diff --git a/src/states/player_gui.py b/src/states/player_gui.py new file mode 100644 index 0000000..7c55300 --- /dev/null +++ b/src/states/player_gui.py @@ -0,0 +1,10 @@ +from typing import Dict, Tuple + +import pygame + +from src.states.base_state import BaseState + +class Player_gui(BaseState): + def __init__(self, game_state_manager): + super().__init__(game_state_manager) + \ No newline at end of file From 2d28d2ea2db60970d0d8d656b0b9a53751296c01 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Thu, 20 Mar 2025 19:31:37 +0100 Subject: [PATCH 03/17] Putting logic behind player_gui Added: - basic logic to the player gui --- src/states/player_gui.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/states/player_gui.py b/src/states/player_gui.py index 7c55300..b69f944 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -3,8 +3,21 @@ import pygame from src.states.base_state import BaseState +from settings import SCREEN_WIDTH, SCREEN_HEIGHT class Player_gui(BaseState): def __init__(self, game_state_manager): super().__init__(game_state_manager) - \ No newline at end of file + self.font = pygame.font.Font(None, 36) + self.screen = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT)) + + def udpate(self, events): + for event in events: + match event.type: + case pygame.KEYDOWN: + if pygame.K_o: + self.game_state_manager.exit_state() + + def render(self, screen: pygame.Surface): + player_money = self.font.render("Gold: N/A", True, (200, 200, 200)) + screen.blit(player_money, (50, self.screen.get_height() - 60)) \ No newline at end of file From 83fd970c12c95fd1c8a4193538f6c114b119600c Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Fri, 21 Mar 2025 00:21:01 +0100 Subject: [PATCH 04/17] Drawing gui Added: - drew the gui onto the screen --- src/states/game_running.py | 3 +++ src/states/player_gui.py | 28 +++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index b4993c6..26c31df 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -15,6 +15,7 @@ from src.sprites import AnimatedSprites from src.states.base_state import BaseState from src.states.paused import Paused +from src.states.player_gui import Player_gui from src.support import all_character_import, coast_importer, import_folder @@ -151,6 +152,8 @@ def render(self, screen) -> None: """draw sprites to the canvas""" screen.fill("#000000") self.all_sprites.draw(self.player.rect.center) + player_gui = Player_gui(screen) + player_gui.draw_gui(screen) # self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) # point = self.shop.rect diff --git a/src/states/player_gui.py b/src/states/player_gui.py index b69f944..fc0d7a0 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -3,21 +3,23 @@ import pygame from src.states.base_state import BaseState -from settings import SCREEN_WIDTH, SCREEN_HEIGHT +from src.settings import SCREEN_WIDTH, SCREEN_HEIGHT -class Player_gui(BaseState): - def __init__(self, game_state_manager): - super().__init__(game_state_manager) +class Player_gui(): + def __init__(self, screen): self.font = pygame.font.Font(None, 36) - self.screen = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT)) + self.screen = screen - def udpate(self, events): - for event in events: - match event.type: - case pygame.KEYDOWN: - if pygame.K_o: - self.game_state_manager.exit_state() + # def update(self, events): + # for event in events: + # match event.type: + # case pygame.KEYDOWN: + # if pygame.K_o: + # self.game_state_manager.exit_state() - def render(self, screen: pygame.Surface): + def draw_gui(self, screen: pygame.Surface): player_money = self.font.render("Gold: N/A", True, (200, 200, 200)) - screen.blit(player_money, (50, self.screen.get_height() - 60)) \ No newline at end of file + self.screen.blit(player_money, (50, screen.get_height() - 60)) + + screen.blit(self.screen, dest=(0, 0)) + pygame.display.flip() # Update the display \ No newline at end of file From 20480feb33cbbd64f7c00f00fde3d5d775030bd2 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Fri, 21 Mar 2025 00:23:20 +0100 Subject: [PATCH 05/17] Removed code Removed: - unused code --- src/states/player_gui.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/states/player_gui.py b/src/states/player_gui.py index fc0d7a0..e3729e5 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -5,18 +5,12 @@ from src.states.base_state import BaseState from src.settings import SCREEN_WIDTH, SCREEN_HEIGHT + class Player_gui(): def __init__(self, screen): self.font = pygame.font.Font(None, 36) self.screen = screen - # def update(self, events): - # for event in events: - # match event.type: - # case pygame.KEYDOWN: - # if pygame.K_o: - # self.game_state_manager.exit_state() - def draw_gui(self, screen: pygame.Surface): player_money = self.font.render("Gold: N/A", True, (200, 200, 200)) self.screen.blit(player_money, (50, screen.get_height() - 60)) From 8c79550a9662b2981c2ac0a8681fff699d68edb1 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Fri, 21 Mar 2025 00:37:39 +0100 Subject: [PATCH 06/17] Drawin text elsewhere Changed: - position of the text to top right - setup to use the json data --- src/states/player_gui.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/states/player_gui.py b/src/states/player_gui.py index e3729e5..564c0c8 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -10,10 +10,17 @@ class Player_gui(): def __init__(self, screen): self.font = pygame.font.Font(None, 36) self.screen = screen + self.margin = 20 + self.wallet = {} def draw_gui(self, screen: pygame.Surface): - player_money = self.font.render("Gold: N/A", True, (200, 200, 200)) - self.screen.blit(player_money, (50, screen.get_height() - 60)) + for item, quantity in self.wallet: + player_money = self.font.render(f"Gold: {quantity}", True, (255, 255, 255)) + + text_wdith, text_height = player_money.get_size() + x_pos = screen.get_width() - text_wdith - self.margin + y_pos = self.margin + self.screen.blit(player_money, (x_pos, y_pos)) screen.blit(self.screen, dest=(0, 0)) pygame.display.flip() # Update the display \ No newline at end of file From 31790d905cafa8628c17e6c4e2aeda732035a41a Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sat, 22 Mar 2025 22:27:30 +0100 Subject: [PATCH 07/17] Money changed dynamically Changed: - money changes dynamically --- src/inventory.py | 5 ++++- src/states/game_running.py | 2 +- src/states/player_gui.py | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/inventory.py b/src/inventory.py index ac00c94..c61a3a9 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -25,7 +25,7 @@ class Inventory: def __init__(self) -> None: # Currency - self.money: int = 0 + self.money: int = 10000 # Item management self.items: dict[str, int] = {} # name: quantity @@ -78,6 +78,9 @@ def sell_item(self, item_name, quantity): def get_items(self) -> dict[str, int]: """Return a copy of the items dictionary.""" return self.items.copy() + + def get_money(self): + return self.money # Methods for Chest and Quest def add_chest(self, chest: Chest) -> None: diff --git a/src/states/game_running.py b/src/states/game_running.py index 26c31df..1cda673 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -152,7 +152,7 @@ def render(self, screen) -> None: """draw sprites to the canvas""" screen.fill("#000000") self.all_sprites.draw(self.player.rect.center) - player_gui = Player_gui(screen) + player_gui = Player_gui(screen, self.player_inventory) player_gui.draw_gui(screen) # self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) diff --git a/src/states/player_gui.py b/src/states/player_gui.py index 564c0c8..2af08a0 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -7,15 +7,15 @@ class Player_gui(): - def __init__(self, screen): + def __init__(self, screen, inventory): self.font = pygame.font.Font(None, 36) self.screen = screen self.margin = 20 - self.wallet = {} + self.wallet = inventory.get_money() def draw_gui(self, screen: pygame.Surface): - for item, quantity in self.wallet: - player_money = self.font.render(f"Gold: {quantity}", True, (255, 255, 255)) + # for quantity in self.wallet: + player_money = self.font.render(f"Gold: {self.wallet}", True, (255, 255, 255)) text_wdith, text_height = player_money.get_size() x_pos = screen.get_width() - text_wdith - self.margin From 9a63c63c8ba922777a4dbcf9c9e64780448433ae Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sat, 22 Mar 2025 22:34:29 +0100 Subject: [PATCH 08/17] Testing selling and buying Added: - when buying, a placeholder amount will be taken from the players money - when selling, a placeholder amount will be given to the player --- src/inventory.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/inventory.py b/src/inventory.py index c61a3a9..2d9b15f 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -62,6 +62,7 @@ def use_item(self, item_name: str) -> str: def buy_item(self, item_name, quantity): if item_name in self.items: self.items[item_name] += quantity + self.money -= 10 return get_message("shop_inventory", "buy_success", item=item_name, quantity=quantity) else: self.items[item_name] = quantity @@ -70,6 +71,7 @@ def buy_item(self, item_name, 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 + self.money += 15 if self.items[item_name] == 0: del self.items[item_name] return get_message("shop_inventory", "sell_success", item=item_name, quantity=quantity) From e011e31dc2f71f89c0cb65d279d682ab127ff10c Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sat, 22 Mar 2025 22:44:15 +0100 Subject: [PATCH 09/17] Testing Testing something with the price --- data/inventory.json | 2 +- src/inventory.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data/inventory.json b/data/inventory.json index ae04b5d..c842f3d 100644 --- a/data/inventory.json +++ b/data/inventory.json @@ -1,5 +1,5 @@ { - "Gold Coin": {"type": "currency", "effect": "collect", "quantity": 1}, + "Gold Coin": {"type": "currency", "effect": "collect", "quantity": 1, "price": 23}, "Silver Coin": {"type": "currency", "effect": "collect", "quantity": 1}, "Coin Stack (1)": {"type": "currency", "effect": "collect", "quantity": 3}, "Coin Stack (2)": {"type": "currency", "effect": "collect", "quantity": 5}, diff --git a/src/inventory.py b/src/inventory.py index 2d9b15f..6de816f 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -25,7 +25,7 @@ class Inventory: def __init__(self) -> None: # Currency - self.money: int = 10000 + self.money: int = 0 # Item management self.items: dict[str, int] = {} # name: quantity @@ -62,7 +62,7 @@ def use_item(self, item_name: str) -> str: def buy_item(self, item_name, quantity): if item_name in self.items: self.items[item_name] += quantity - self.money -= 10 + self.money -= 50 return get_message("shop_inventory", "buy_success", item=item_name, quantity=quantity) else: self.items[item_name] = quantity @@ -71,7 +71,7 @@ def buy_item(self, item_name, 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 - self.money += 15 + self.money += 60 if self.items[item_name] == 0: del self.items[item_name] return get_message("shop_inventory", "sell_success", item=item_name, quantity=quantity) From 8281fc0342431b95135e0c708524f24a64867bc2 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sun, 23 Mar 2025 12:47:34 +0100 Subject: [PATCH 10/17] Add helper methods Added: - helper methods for using the wallet json file --- src/utils/currency.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/utils/currency.py diff --git a/src/utils/currency.py b/src/utils/currency.py new file mode 100644 index 0000000..6a89d91 --- /dev/null +++ b/src/utils/currency.py @@ -0,0 +1,13 @@ +import json + +def load_wallet(): + with open("wallet.json", "r") as file: + return json.load(file) + +def save_wallet(wallet_data): + with open("wallet.json", "w") as file: + return json.dump(wallet_data, file, indent=4) + +def load_inventory(): + with open("inventory.json", "r") as file: + return json.load(file) \ No newline at end of file From 5aebef9b76ff3739b05a4305276a49c557dd6bc5 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sun, 23 Mar 2025 17:52:38 +0100 Subject: [PATCH 11/17] Buying, selling, price and gui Fixed: - gui not using the json file - when changing wallet.json the json file would save differently - selling gave a error Added: - buying works correctly - selling works correctly - every item has a price --- data/inventory.json | 80 ++++++++++++++++++++-------------------- data/wallet.json | 4 +- src/inventory.py | 20 +++++++--- src/states/player_gui.py | 6 ++- src/utils/currency.py | 9 +++-- 5 files changed, 66 insertions(+), 53 deletions(-) diff --git a/data/inventory.json b/data/inventory.json index c842f3d..1fa2279 100644 --- a/data/inventory.json +++ b/data/inventory.json @@ -1,43 +1,43 @@ { "Gold Coin": {"type": "currency", "effect": "collect", "quantity": 1, "price": 23}, - "Silver Coin": {"type": "currency", "effect": "collect", "quantity": 1}, - "Coin Stack (1)": {"type": "currency", "effect": "collect", "quantity": 3}, - "Coin Stack (2)": {"type": "currency", "effect": "collect", "quantity": 5}, - "Circular Gem": {"type": "gem", "effect": "trade", "quantity": 1}, - "Single Gold Bar": {"type": "treasure", "effect": "trade", "quantity": 1}, - "Gold Bar Stack": {"type": "treasure", "effect": "trade", "quantity": 3}, - "Treasure Block": {"type": "treasure", "effect": "open_for_reward", "quantity": 1}, - "Golden Crown": {"type": "artifact", "effect": "boost_status", "quantity": 1}, - "Ornate Cup": {"type": "artifact", "effect": "boost_status", "quantity": 1}, - "Golden Figurine": {"type": "artifact", "effect": "boost_status", "quantity": 1}, - "Simple Sword": {"type": "weapon", "effect": "melee_attack", "quantity": 1}, - "Ornate Sword": {"type": "weapon", "effect": "melee_attack", "quantity": 1}, - "Double-Bladed Axe": {"type": "weapon", "effect": "melee_attack", "quantity": 1}, - "Spear": {"type": "weapon", "effect": "melee_attack", "quantity": 1}, - "Circular Shield": {"type": "armor", "effect": "defense_boost", "quantity": 1}, - "Golden Trophy": {"type": "reward", "effect": "achievement", "quantity": 1}, - "Candelabra": {"type": "decorative", "effect": "none", "quantity": 1}, - "Potion (Red)": {"type": "consumable", "effect": "restore_health", "quantity": 1}, - "Potion (Blue)": {"type": "consumable", "effect": "restore_mana", "quantity": 1}, - "Potion (Green)": {"type": "consumable", "effect": "poison_resistance", "quantity": 1}, - "Square Jar": {"type": "consumable", "effect": "unknown", "quantity": 1}, - "Cake": {"type": "food", "effect": "restore_health", "quantity": 1}, - "Donut": {"type": "food", "effect": "restore_health", "quantity": 1}, - "Bread": {"type": "food", "effect": "restore_health", "quantity": 1}, - "Rug Tile": {"type": "decorative", "effect": "none", "quantity": 1}, - "Geometric Pattern": {"type": "decorative", "effect": "none", "quantity": 1}, - "Glowing Orb (Blue)": {"type": "artifact", "effect": "magic_boost", "quantity": 1}, - "Glowing Orb (Red)": {"type": "artifact", "effect": "fire_boost", "quantity": 1}, - "Glowing Orb (Green)": {"type": "artifact", "effect": "nature_boost", "quantity": 1}, - "Golden Ring": {"type": "artifact", "effect": "magic_resistance", "quantity": 1}, - "Amulet": {"type": "artifact", "effect": "protection", "quantity": 1}, - "Scroll": {"type": "scroll", "effect": "learn_spell", "quantity": 1}, - "Key": {"type": "tool", "effect": "unlock", "quantity": 1}, - "Tool": {"type": "tool", "effect": "repair", "quantity": 1}, - "Dragon (Red)": {"type": "creature", "effect": "fire_attack", "quantity": 1}, - "Dragon (Green)": {"type": "creature", "effect": "nature_attack", "quantity": 1}, - "Dragon (Black)": {"type": "creature", "effect": "dark_attack", "quantity": 1}, - "Dragon (White)": {"type": "creature", "effect": "light_attack", "quantity": 1}, - "Gem Cluster": {"type": "treasure", "effect": "trade", "quantity": 1}, - "Glowing Crystal": {"type": "treasure", "effect": "magic_boost", "quantity": 1} + "Silver Coin": {"type": "currency", "effect": "collect", "quantity": 1, "price": 23}, + "Coin Stack (1)": {"type": "currency", "effect": "collect", "quantity": 3, "price": 23}, + "Coin Stack (2)": {"type": "currency", "effect": "collect", "quantity": 5, "price": 23}, + "Circular Gem": {"type": "gem", "effect": "trade", "quantity": 1, "price": 23}, + "Single Gold Bar": {"type": "treasure", "effect": "trade", "quantity": 1, "price": 23}, + "Gold Bar Stack": {"type": "treasure", "effect": "trade", "quantity": 3, "price": 23}, + "Treasure Block": {"type": "treasure", "effect": "open_for_reward", "quantity": 1, "price": 23}, + "Golden Crown": {"type": "artifact", "effect": "boost_status", "quantity": 1, "price": 23}, + "Ornate Cup": {"type": "artifact", "effect": "boost_status", "quantity": 1, "price": 23}, + "Golden Figurine": {"type": "artifact", "effect": "boost_status", "quantity": 1, "price": 23}, + "Simple Sword": {"type": "weapon", "effect": "melee_attack", "quantity": 1, "price": 23}, + "Ornate Sword": {"type": "weapon", "effect": "melee_attack", "quantity": 1, "price": 23}, + "Double-Bladed Axe": {"type": "weapon", "effect": "melee_attack", "quantity": 1, "price": 23}, + "Spear": {"type": "weapon", "effect": "melee_attack", "quantity": 1, "price": 23}, + "Circular Shield": {"type": "armor", "effect": "defense_boost", "quantity": 1, "price": 23}, + "Golden Trophy": {"type": "reward", "effect": "achievement", "quantity": 1, "price": 23}, + "Candelabra": {"type": "decorative", "effect": "none", "quantity": 1, "price": 23}, + "Potion (Red)": {"type": "consumable", "effect": "restore_health", "quantity": 1, "price": 23}, + "Potion (Blue)": {"type": "consumable", "effect": "restore_mana", "quantity": 1, "price": 23}, + "Potion (Green)": {"type": "consumable", "effect": "poison_resistance", "quantity": 1, "price": 23}, + "Square Jar": {"type": "consumable", "effect": "unknown", "quantity": 1, "price": 23}, + "Cake": {"type": "food", "effect": "restore_health", "quantity": 1, "price": 23}, + "Donut": {"type": "food", "effect": "restore_health", "quantity": 1, "price": 23}, + "Bread": {"type": "food", "effect": "restore_health", "quantity": 1, "price": 23}, + "Rug Tile": {"type": "decorative", "effect": "none", "quantity": 1, "price": 23}, + "Geometric Pattern": {"type": "decorative", "effect": "none", "quantity": 1, "price": 23}, + "Glowing Orb (Blue)": {"type": "artifact", "effect": "magic_boost", "quantity": 1, "price": 23}, + "Glowing Orb (Red)": {"type": "artifact", "effect": "fire_boost", "quantity": 1, "price": 23}, + "Glowing Orb (Green)": {"type": "artifact", "effect": "nature_boost", "quantity": 1, "price": 23}, + "Golden Ring": {"type": "artifact", "effect": "magic_resistance", "quantity": 1, "price": 23}, + "Amulet": {"type": "artifact", "effect": "protection", "quantity": 1, "price": 23}, + "Scroll": {"type": "scroll", "effect": "learn_spell", "quantity": 1, "price": 23}, + "Key": {"type": "tool", "effect": "unlock", "quantity": 1, "price": 23}, + "Tool": {"type": "tool", "effect": "repair", "quantity": 1, "price": 23}, + "Dragon (Red)": {"type": "creature", "effect": "fire_attack", "quantity": 1, "price": 23}, + "Dragon (Green)": {"type": "creature", "effect": "nature_attack", "quantity": 1, "price": 23}, + "Dragon (Black)": {"type": "creature", "effect": "dark_attack", "quantity": 1, "price": 23}, + "Dragon (White)": {"type": "creature", "effect": "light_attack", "quantity": 1, "price": 23}, + "Gem Cluster": {"type": "treasure", "effect": "trade", "quantity": 1, "price": 23}, + "Glowing Crystal": {"type": "treasure", "effect": "magic_boost", "quantity": 1, "price": 23} } diff --git a/data/wallet.json b/data/wallet.json index 99b0a6e..c7d7660 100644 --- a/data/wallet.json +++ b/data/wallet.json @@ -1,3 +1,5 @@ { - "player_wallet": {"quantity": 100000} + "player_wallet": { + "quantity": 98942 + } } \ No newline at end of file diff --git a/src/inventory.py b/src/inventory.py index 6de816f..e6947c0 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -4,6 +4,7 @@ """ from src.utils.messaging import get_message +from src.utils.currency import load_inventory, load_wallet, save_wallet class Chest: @@ -26,6 +27,9 @@ class Inventory: def __init__(self) -> None: # Currency self.money: int = 0 + self.wallet = load_wallet() + self.price = load_inventory() + self.player_wallet = self.wallet["player_wallet"]["quantity"] # Item management self.items: dict[str, int] = {} # name: quantity @@ -62,7 +66,8 @@ def use_item(self, item_name: str) -> str: def buy_item(self, item_name, quantity): if item_name in self.items: self.items[item_name] += quantity - self.money -= 50 + self.player_wallet -= 50 + self.save_gold = save_wallet(self.player_wallet) return get_message("shop_inventory", "buy_success", item=item_name, quantity=quantity) else: self.items[item_name] = quantity @@ -70,11 +75,14 @@ def buy_item(self, item_name, 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 - self.money += 60 - if self.items[item_name] == 0: - del self.items[item_name] - return get_message("shop_inventory", "sell_success", item=item_name, quantity=quantity) + if "price" in self.price.get(item_name, {}): + self.item_price = self.price[item_name]["price"] + self.items[item_name] -= quantity + self.player_wallet += self.item_price + self.save_gold = save_wallet(self.player_wallet) + 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]: diff --git a/src/states/player_gui.py b/src/states/player_gui.py index 2af08a0..4609a46 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -4,6 +4,7 @@ from src.states.base_state import BaseState from src.settings import SCREEN_WIDTH, SCREEN_HEIGHT +from src.utils.currency import load_wallet class Player_gui(): @@ -11,11 +12,12 @@ def __init__(self, screen, inventory): self.font = pygame.font.Font(None, 36) self.screen = screen self.margin = 20 - self.wallet = inventory.get_money() + self.wallet = load_wallet() + self.player_wallet = self.wallet["player_wallet"]["quantity"] def draw_gui(self, screen: pygame.Surface): # for quantity in self.wallet: - player_money = self.font.render(f"Gold: {self.wallet}", True, (255, 255, 255)) + player_money = self.font.render(f"Gold: {self.player_wallet}", True, (255, 255, 255)) text_wdith, text_height = player_money.get_size() x_pos = screen.get_width() - text_wdith - self.margin diff --git a/src/utils/currency.py b/src/utils/currency.py index 6a89d91..f412d76 100644 --- a/src/utils/currency.py +++ b/src/utils/currency.py @@ -1,13 +1,14 @@ import json def load_wallet(): - with open("wallet.json", "r") as file: + with open("data/wallet.json", "r") as file: return json.load(file) -def save_wallet(wallet_data): - with open("wallet.json", "w") as file: +def save_wallet(player_wallet): + wallet_data = {"player_wallet": {"quantity": player_wallet}} + with open("data/wallet.json", "w") as file: return json.dump(wallet_data, file, indent=4) def load_inventory(): - with open("inventory.json", "r") as file: + with open("data/inventory.json", "r") as file: return json.load(file) \ No newline at end of file From 31b46b014041d811bc578aeff157fb456eec2def Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sun, 23 Mar 2025 18:05:28 +0100 Subject: [PATCH 12/17] Making price visible in shop Added: - when opening shop the price is now visible of each item --- data/wallet.json | 2 +- src/shop.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/data/wallet.json b/data/wallet.json index c7d7660..68aff96 100644 --- a/data/wallet.json +++ b/data/wallet.json @@ -1,5 +1,5 @@ { "player_wallet": { - "quantity": 98942 + "quantity": 98692 } } \ No newline at end of file diff --git a/src/shop.py b/src/shop.py index 724e32e..4722075 100644 --- a/src/shop.py +++ b/src/shop.py @@ -3,6 +3,7 @@ import pygame from src.inventory import Inventory +from src.utils.currency import load_inventory from src.settings import WORLD_LAYERS from src.states.base_state import BaseState @@ -40,6 +41,7 @@ def __init__(self, game_state_manager, player, show_shop, inventory: Inventory): self.message = "" self.message_end_time = 0 + self.price_tag = load_inventory() self.sprite_sheet = pygame.image.load("images/tilesets/Treasure+.png").convert_alpha() self.icons = { "Gold Coin": self.extract_icon(0, 0), @@ -121,8 +123,13 @@ def render(self, screen: pygame.Surface): 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)) + # quantity_text = self.font.render(f"x{quantity}", True, (255, 255, 255)) + # self.screen.blit(quantity_text, (100, y_offset + 5)) + if "price" in self.price_tag.get(item, {}): + item_price = self.price_tag[item]["price"] + + price_text = self.font.render(f"${item_price}", True, (255, 255, 255)) + self.screen.blit(price_text, (100, y_offset + 5)) text = self.font.render(item, True, (255, 255, 255)) self.screen.blit(text, (150, y_offset)) From e3f02d8eef72e1fe4328e58cbebe48c40f80c4f4 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sun, 23 Mar 2025 18:15:43 +0100 Subject: [PATCH 13/17] Fixed buying Fixed: - when buying a placeholder amount was deducted instead of the actual price --- data/wallet.json | 2 +- src/inventory.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/data/wallet.json b/data/wallet.json index 68aff96..366ea13 100644 --- a/data/wallet.json +++ b/data/wallet.json @@ -1,5 +1,5 @@ { "player_wallet": { - "quantity": 98692 + "quantity": 98646 } } \ No newline at end of file diff --git a/src/inventory.py b/src/inventory.py index e6947c0..11b76a1 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -66,8 +66,11 @@ def use_item(self, item_name: str) -> str: def buy_item(self, item_name, quantity): if item_name in self.items: self.items[item_name] += quantity - self.player_wallet -= 50 - self.save_gold = save_wallet(self.player_wallet) + if "price" in self.price.get(item_name, {}): + self.item_price = self.price[item_name]["price"] + if self.player_wallet >= self.item_price: + self.player_wallet -= self.item_price + self.save_gold = save_wallet(self.player_wallet) return get_message("shop_inventory", "buy_success", item=item_name, quantity=quantity) else: self.items[item_name] = quantity From 624d282fcca3e9a16b5dd0f411c5a79601867aa4 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sun, 23 Mar 2025 18:17:07 +0100 Subject: [PATCH 14/17] Testing Tested: - if player has 0 monye, would he go under 0 gold --- data/wallet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/wallet.json b/data/wallet.json index 366ea13..4793d57 100644 --- a/data/wallet.json +++ b/data/wallet.json @@ -1,5 +1,5 @@ { "player_wallet": { - "quantity": 98646 + "quantity": 100000 } } \ No newline at end of file From f2ad10ad947c2b394800ca19e7e7ca0cba18e694 Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sun, 23 Mar 2025 18:18:28 +0100 Subject: [PATCH 15/17] Removind code Removed: - code in player gui --- src/states/player_gui.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/states/player_gui.py b/src/states/player_gui.py index 4609a46..c9a2eaa 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -1,14 +1,10 @@ -from typing import Dict, Tuple - import pygame -from src.states.base_state import BaseState -from src.settings import SCREEN_WIDTH, SCREEN_HEIGHT from src.utils.currency import load_wallet class Player_gui(): - def __init__(self, screen, inventory): + def __init__(self, screen): self.font = pygame.font.Font(None, 36) self.screen = screen self.margin = 20 @@ -16,7 +12,6 @@ def __init__(self, screen, inventory): self.player_wallet = self.wallet["player_wallet"]["quantity"] def draw_gui(self, screen: pygame.Surface): - # for quantity in self.wallet: player_money = self.font.render(f"Gold: {self.player_wallet}", True, (255, 255, 255)) text_wdith, text_height = player_money.get_size() From ae67883fe982e486711935bf61374a7ed4df321c Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Sun, 23 Mar 2025 18:19:21 +0100 Subject: [PATCH 16/17] Removed Removed: - 1 attribute 4 fun --- src/states/game_running.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/states/game_running.py b/src/states/game_running.py index 1cda673..26c31df 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -152,7 +152,7 @@ def render(self, screen) -> None: """draw sprites to the canvas""" screen.fill("#000000") self.all_sprites.draw(self.player.rect.center) - player_gui = Player_gui(screen, self.player_inventory) + player_gui = Player_gui(screen) player_gui.draw_gui(screen) # self.welcome_message = self.font.render("Press 'E' to interact!", True, (100, 100, 100)) From 4ba56fcb901a3fb5d8a4c40fdc6f3f3f2afb215b Mon Sep 17 00:00:00 2001 From: Davidek523 Date: Mon, 24 Mar 2025 12:02:40 +0100 Subject: [PATCH 17/17] Fixed typehints Fixed: - typehints with ruff --- src/inventory.py | 6 +++--- src/shop.py | 4 ++-- src/states/player_gui.py | 4 ++-- src/utils/currency.py | 7 +++++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/inventory.py b/src/inventory.py index 11b76a1..84e34ae 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -3,8 +3,8 @@ this file contain types of items, like Chest """ -from src.utils.messaging import get_message from src.utils.currency import load_inventory, load_wallet, save_wallet +from src.utils.messaging import get_message class Chest: @@ -62,7 +62,7 @@ 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 @@ -91,7 +91,7 @@ def sell_item(self, item_name, quantity): def get_items(self) -> dict[str, int]: """Return a copy of the items dictionary.""" return self.items.copy() - + def get_money(self): return self.money diff --git a/src/shop.py b/src/shop.py index 4722075..33eb15d 100644 --- a/src/shop.py +++ b/src/shop.py @@ -3,9 +3,9 @@ import pygame from src.inventory import Inventory -from src.utils.currency import load_inventory from src.settings import WORLD_LAYERS from src.states.base_state import BaseState +from src.utils.currency import load_inventory class ShowShop(pygame.sprite.Sprite): @@ -122,7 +122,7 @@ 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)) if "price" in self.price_tag.get(item, {}): diff --git a/src/states/player_gui.py b/src/states/player_gui.py index c9a2eaa..abd04f4 100644 --- a/src/states/player_gui.py +++ b/src/states/player_gui.py @@ -3,7 +3,7 @@ from src.utils.currency import load_wallet -class Player_gui(): +class Player_gui: def __init__(self, screen): self.font = pygame.font.Font(None, 36) self.screen = screen @@ -20,4 +20,4 @@ def draw_gui(self, screen: pygame.Surface): self.screen.blit(player_money, (x_pos, y_pos)) screen.blit(self.screen, dest=(0, 0)) - pygame.display.flip() # Update the display \ No newline at end of file + pygame.display.flip() # Update the display diff --git a/src/utils/currency.py b/src/utils/currency.py index f412d76..e22c248 100644 --- a/src/utils/currency.py +++ b/src/utils/currency.py @@ -1,14 +1,17 @@ import json + def load_wallet(): with open("data/wallet.json", "r") as file: return json.load(file) + def save_wallet(player_wallet): - wallet_data = {"player_wallet": {"quantity": player_wallet}} + wallet_data = {"player_wallet": {"quantity": player_wallet}} with open("data/wallet.json", "w") as file: return json.dump(wallet_data, file, indent=4) + def load_inventory(): with open("data/inventory.json", "r") as file: - return json.load(file) \ No newline at end of file + return json.load(file)