91 lines
3.1 KiB
Python
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 |