HotelAmara/src/game.py

91 lines
3.1 KiB
Python

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