|
from core.constants import GameConfig |
|
from typing import List |
|
from api.models import StoryResponse |
|
|
|
class GameState: |
|
def __init__(self): |
|
self.story_beat = GameConfig.STORY_BEAT_INTRO |
|
self.story_history: List[StoryResponse] = [] |
|
self.current_time = GameConfig.STARTING_TIME |
|
self.current_location = GameConfig.STARTING_LOCATION |
|
|
|
self.universe_style = None |
|
self.universe_genre = None |
|
self.universe_epoch = None |
|
self.universe_story = None |
|
|
|
def reset(self): |
|
"""Reset game state while keeping universe information.""" |
|
|
|
universe_style = self.universe_style |
|
universe_genre = self.universe_genre |
|
universe_epoch = self.universe_epoch |
|
universe_story = self.universe_story |
|
|
|
|
|
self.story_beat = GameConfig.STORY_BEAT_INTRO |
|
self.story_history = [] |
|
self.current_time = GameConfig.STARTING_TIME |
|
self.current_location = GameConfig.STARTING_LOCATION |
|
|
|
|
|
self.universe_style = universe_style |
|
self.universe_genre = universe_genre |
|
self.universe_epoch = universe_epoch |
|
self.universe_story = universe_story |
|
|
|
def set_universe(self, style: str, genre: str, epoch: str, base_story: str): |
|
"""Configure the game universe.""" |
|
self.universe_style = style |
|
self.universe_genre = genre |
|
self.universe_epoch = epoch |
|
self.universe_story = base_story |
|
|
|
def has_universe(self) -> bool: |
|
"""Check if universe is configured.""" |
|
return all([ |
|
self.universe_style is not None, |
|
self.universe_genre is not None, |
|
self.universe_epoch is not None, |
|
self.universe_story is not None |
|
]) |
|
|
|
def format_history(self) -> str: |
|
"""Format story history for the prompt. |
|
Returns only the last 4 segments of the story (or less if not available).""" |
|
if not self.story_history: |
|
return "" |
|
|
|
|
|
last_segments = self.story_history[-4:] if len(self.story_history) > 4 else self.story_history |
|
|
|
segments = [] |
|
for story_response in last_segments: |
|
|
|
segment_parts = [] |
|
if story_response.previous_choice and story_response.previous_choice != "none": |
|
segment_parts.append(f"[Previous choice: {story_response.previous_choice}]") |
|
|
|
|
|
segment_parts.append(story_response.story_text) |
|
|
|
|
|
if story_response.choices: |
|
choices_text = "\nAvailable choices were:" |
|
for choice in story_response.choices: |
|
choices_text += f"\n- {choice.text}" |
|
segment_parts.append(choices_text) |
|
|
|
|
|
segments.append("\n".join(segment_parts)) |
|
|
|
|
|
if len(self.story_history) > 4: |
|
segments.insert(0, f"[...{len(self.story_history) - 4} earlier segments omitted...]") |
|
|
|
return "\n\n---\n\n".join(segments) |
|
|
|
def add_to_history(self, story_response: StoryResponse): |
|
"""Add a story response to history.""" |
|
self.story_history.append(story_response) |
|
self.current_time = story_response.time |
|
self.current_location = story_response.location |