import io import os import json from inventory import Inventory from room import Room from interactable import Interactable class Game: def __init__(self) -> None: self.is_running : bool = True self.inventory : Inventory = None self.game_data : dict = None self.rooms : list[Room] = [] self.current_room : Room = None def load_game(self, file: str) -> None: try: with open(file, 'r') as f: raw_game_data = f.read() self.game_data = json.loads(raw_game_data) self.inventory = Inventory(self.game_data["items"]) if 'rooms' in self.game_data: for room_id in self.game_data['rooms']: room = self.game_data['rooms'][room_id] g_room = Room(room_id, room['name']) g_room.enter_text = room['enter_text'] g_room.doors = room['doors'] g_room.interactables = [] g_room.is_start = room['is_start'] if 'is_start' in room else False # Check if we had a starting room already if g_room.is_start: for r in self.rooms: if r.is_start: print(f"Error: {g_room.name} is marked as the starting room, but {r.name} is already marked as the starting room.") os._exit(1) if 'interactables' in room: for interactable in room['interactables']: i = Interactable(self, g_room, interactable) g_room.interactables.append(i) self.rooms.append(g_room) self.current_room = self.get_start_room() except FileNotFoundError: print("File not found.") def get_rooms(self) -> list[Room]: if not self.rooms or len(self.rooms) == 0: return [] else: return self.rooms def get_room(self, id : str) -> Room | None: for room in self.rooms: if room.id == id: return room return None def get_start_room(self) -> Room | None: for room in self.rooms: if room.is_start: return room return None def run_action(self, action : str) -> bool: print(f"[DEBUG] run_action('{action}')") action_parts = action.split(' ') action_cmd = action_parts[0] action_args = action_parts[1:] if len(action_parts) >= 2 else [] if action_cmd == "set_room_flag": room = self.get_room(action_args[0]) if room is not None: room.set_flag(action_args[1]) else: print(f"[DEBUG] Error: {action} (Room not found)") elif action_cmd == "add_item": self.inventory.add_item(action_args[0]) else: return False