From 59d733d5ba2c235d46e2dd839052f77bfa13bad6 Mon Sep 17 00:00:00 2001 From: tcsenpai Date: Sat, 11 Jan 2025 14:02:38 +0100 Subject: [PATCH] first commit --- .gitignore | 5 + .python-version | 1 + README.md | 63 ++++ env.example | 2 + pyproject.toml | 14 + requirements.txt | 6 + screenshot.png | Bin 0 -> 199178 bytes src/config/colors.py | 20 ++ src/config/settings.py | 10 + src/effects/weather.py | 65 ++++ src/entities/npc.py | 671 +++++++++++++++++++++++++++++++++++ src/entities/player.py | 51 +++ src/entities/world_object.py | 45 +++ src/main.py | 508 ++++++++++++++++++++++++++ src/menu/main_menu.py | 148 ++++++++ src/ui/footer_bar.py | 25 ++ src/ui/header_bar.py | 57 +++ src/utils/dialog.py | 92 +++++ src/utils/memory.py | 9 + src/utils/name_generator.py | 53 +++ src/utils/save_manager.py | 114 ++++++ src/world/camera.py | 26 ++ src/world/world.py | 467 ++++++++++++++++++++++++ uv.lock | 366 +++++++++++++++++++ 24 files changed, 2818 insertions(+) create mode 100644 .gitignore create mode 100644 .python-version create mode 100644 README.md create mode 100644 env.example create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 screenshot.png create mode 100644 src/config/colors.py create mode 100644 src/config/settings.py create mode 100644 src/effects/weather.py create mode 100644 src/entities/npc.py create mode 100644 src/entities/player.py create mode 100644 src/entities/world_object.py create mode 100644 src/main.py create mode 100644 src/menu/main_menu.py create mode 100644 src/ui/footer_bar.py create mode 100644 src/ui/header_bar.py create mode 100644 src/utils/dialog.py create mode 100644 src/utils/memory.py create mode 100644 src/utils/name_generator.py create mode 100644 src/utils/save_manager.py create mode 100644 src/world/camera.py create mode 100644 src/world/world.py create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fbb0eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +saves +.DS_Store +.venv +.env \ No newline at end of file diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2c07333 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e42eaad --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# LLMRPG + +A simple 2D RPG game using LLMs to control NPCs behavior. + +![LLMRPG](./screenshot.png) + +## Important note + +This project is made for fun and learning purposes. It is not meant to be a finished product or a good example of how to use LLMs in a game. It is a proof of concept and a starting point for further development. It is created with heavy help from an LLM too, on purpose. This is to demonstrate the potential of LLMs to control complex systems and create interesting behaviors. + +## Features + +- 2D top-down view +- Procedural world generation with simple rules and objects +- NPCs with unique personalities and behaviors +- NPCs store memories and learn from them +- Weather system with different weather effects +- Time system based on real time +- Save and load game + +## Installation + +Copy the `env.example` file to `.env` and fill in the missing values if needed. + +### Using pip / venv + +#### Optional (create virtual environment) + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +#### Install dependencies + +```bash +pip install -r requirements.txt +``` + +### Using uv + +```bash +uv venv .venv +uv pip install -r requirements.txt +``` + +## Run the game + +### Using python + +```bash +python src/main.py +``` + +### Using uv + +```bash +uv run python src/main.py +``` + +## Requirements + +- An Ollama server running locally or in the location defined in the `.env` file. diff --git a/env.example b/env.example new file mode 100644 index 0000000..f5ac605 --- /dev/null +++ b/env.example @@ -0,0 +1,2 @@ +OLLAMA_URL=http://localhost:11434 +OLLAMA_MODEL=llama3.1:latest \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..21ac75e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "lmmrpg" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "noise>=1.2.2", + "numpy>=2.2.1", + "ollama>=0.4.5", + "pygame>=2.6.1", + "python-dotenv>=1.0.1", + "requests>=2.32.3", +] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2ee6539 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +noise +numpy +ollama +pygame +python-dotenv +requests \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd01f74c0ff12cee69662b1b85dba611b66f119 GIT binary patch literal 199178 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

j7)5;aEw7ae5B#k8N6npf(k$^2HlFOHq-M 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 self.height: + self.rain_drops.remove(drop) + + def draw(self, screen, weather): + if weather == "rainy": + # Update and draw rain + self.update_rain() + for drop in self.rain_drops: + pygame.draw.line( + screen, (200, 200, 255), (drop[0], drop[1]), (drop[0], drop[1] + 5) + ) + # Add rain overlay + screen.blit(self.cloud_overlay, (0, 0)) + + elif weather == "cloudy": + # Just add cloud overlay + screen.blit(self.cloud_overlay, (0, 0)) + + elif weather == "sunny": + # Add sunny overlay + screen.blit(self.sunny_overlay, (0, 0)) diff --git a/src/entities/npc.py b/src/entities/npc.py new file mode 100644 index 0000000..b6864ea --- /dev/null +++ b/src/entities/npc.py @@ -0,0 +1,671 @@ +import random +import math +import pygame +import logging +from config.colors import COLORS +from datetime import datetime +import json +from enum import Enum + +# Configure logger for NPC class +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + +# Create console handler with a higher log level +ch = logging.StreamHandler() +ch.setLevel(logging.DEBUG) + +# Create formatter +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +ch.setFormatter(formatter) + +# Add the console handler to the logger +logger.addHandler(ch) + + +class MemoryType(Enum): + OBSERVATION = "observation" + INTERACTION = "interaction" + WEATHER = "weather" + TIME = "time" + SOCIAL = "social" + ACTIVITY = "activity" + + +class Memory: + def __init__(self, event, memory_type, importance=1.0): + self.event = event + self.timestamp = datetime.now().isoformat() + self.type = memory_type + self.importance = importance # 0.0 to 1.0 + self.age = 0 # Will increase over time + + +class NPC: + # List of first names and surnames for more realistic naming + FIRST_NAMES = [ + "Emma", + "Liam", + "Olivia", + "Noah", + "Ava", + "Oliver", + "Isabella", + "William", + "Sophia", + "James", + "Mia", + "Benjamin", + "Charlotte", + "Lucas", + "Amelia", + "Mason", + "Harper", + "Ethan", + "Evelyn", + "Alexander", + "Abigail", + "Henry", + "Emily", + "Sebastian", + "Elizabeth", + "Jack", + "Sofia", + "Owen", + "Avery", + "Daniel", + "Ella", + "Matthew", + "Scarlett", + "Joseph", + "Victoria", + ] + + SURNAMES = [ + "Smith", + "Johnson", + "Williams", + "Brown", + "Jones", + "Garcia", + "Miller", + "Davis", + "Rodriguez", + "Martinez", + "Hernandez", + "Lopez", + "Gonzalez", + "Wilson", + "Anderson", + "Thomas", + "Taylor", + "Moore", + "Jackson", + "Martin", + "Lee", + "Perez", + "Thompson", + "White", + "Harris", + "Sanchez", + "Clark", + "Ramirez", + "Lewis", + "Robinson", + "Walker", + "Young", + "Allen", + "King", + ] + + def __init__(self, x, y, name): + self.x = x + self.y = y + self.name = name + self.radius = 15 + self.speed = 1.0 + self.interaction_radius = 50 + self.memories = [] + self.memory_limit = 50 + self.last_weather_check = pygame.time.get_ticks() + self.weather_check_interval = 300 + self.long_term_memories = { + "player_name": None, + "conversations": [], + "important_facts": {}, + "relationships": {}, + "daily_routine": [], + "preferences": self.generate_preferences(), + } + self.home_x = x + self.home_y = y + self.mood = random.choice(["happy", "neutral", "thoughtful", "busy"]) + self.current_activity = None + self.color = self.generate_npc_color() + # Simple movement variables + self.move_angle = random.uniform(0, 2 * math.pi) + self.move_timer = 0 + self.is_talking = False # Add this flag + self.original_pos = None # Store position when conversation starts + + def generate_preferences(self): + """Generate random preferences for the NPC""" + return { + "favorite_time": random.choice( + ["morning", "afternoon", "evening", "night"] + ), + "favorite_weather": random.choice(["sunny", "rainy", "cloudy"]), + "favorite_activity": random.choice( + ["walking", "talking", "observing", "working"] + ), + "personality": random.choice(["outgoing", "shy", "curious", "reserved"]), + } + + def generate_npc_color(self): + """Generate a pleasant, unique color for the NPC""" + # Base colors for villagers (warm, earthy tones) + base_colors = [ + (139, 69, 19), # Saddle brown + (160, 82, 45), # Sienna + (205, 133, 63), # Peru + (210, 105, 30), # Chocolate + (184, 134, 11), # Dark goldenrod + (165, 42, 42), # Brown + (128, 70, 27), # Russet + (139, 90, 43), # Leather + (153, 101, 21), # Golden brown + (130, 102, 68), # Beaver + ] + return random.choice(base_colors) + + def update(self, world, npcs, player, current_time=None, weather=None): + """Movement system with conversation handling""" + # If in conversation, stay still + if self.is_talking: + logger.debug(f"NPC {self.name} is in conversation, staying still") + return + + # Debug current position and planned movement + #logger.debug( + # f"NPC {self.name} current position: ({int(self.x)}, {int(self.y)})" + #) + + # Check if on or near a road/path + on_path = False + nearest_path = None + nearest_path_dist = float("inf") + + for obj in world.objects: + if getattr(obj, "type", None) in ["road", "path"]: + dx = self.x - obj.x + dy = self.y - obj.y + dist = math.sqrt(dx * dx + dy * dy) + if dist < (self.radius + obj.radius): + on_path = True + self.speed = 1.5 # Slightly faster on paths + elif dist < nearest_path_dist: + nearest_path_dist = dist + nearest_path = obj + + if not on_path: + self.speed = 1.0 # Normal speed off paths + # Try to move towards nearest path occasionally + if ( + nearest_path and random.random() < 0.02 + ): # 2% chance to head towards path + angle = math.atan2(nearest_path.y - self.y, nearest_path.x - self.x) + self.move_angle = angle + #logger.debug(f"NPC {self.name} heading towards path") + + # Check if NPC is stuck inside a house + for obj in world.objects: + # Skip roads for collision + if getattr(obj, "type", None) in ["road", "path"]: + continue + + dx = self.x - obj.x + dy = self.y - obj.y + distance = math.sqrt(dx * dx + dy * dy) + if distance < (self.radius + obj.radius): + logger.debug( + f"NPC {self.name} is inside object {obj.__class__.__name__} at ({int(obj.x)}, {int(obj.y)})" + ) + # Try to escape by moving away from object center + escape_angle = math.atan2(dy, dx) + self.x = obj.x + math.cos(escape_angle) * (obj.radius + self.radius + 5) + self.y = obj.y + math.sin(escape_angle) * (obj.radius + self.radius + 5) + logger.debug( + f"NPC {self.name} escaped to ({int(self.x)}, {int(self.y)})" + ) + return + + # Try to move in X direction first + move_x = math.cos(self.move_angle) * self.speed + new_x = self.x + move_x + new_x = max(self.radius, min(world.size - self.radius, new_x)) + + # Check X movement with more lenient collision + can_move_x = True + for obj in world.objects: + # Skip roads for collision + if getattr(obj, "type", None) in ["road", "path"]: + continue + + dx = new_x - obj.x + dy = self.y - obj.y + distance = math.sqrt(dx * dx + dy * dy) + if distance < (self.radius + obj.radius + 2): # Small buffer + can_move_x = False + logger.debug( + f"X collision with {obj.__class__.__name__} at ({int(obj.x)}, {int(obj.y)})" + ) + break + + if can_move_x: + self.x = new_x + #logger.debug(f"NPC {self.name} moved X to {int(self.x)}") + + # Then try Y movement separately + move_y = math.sin(self.move_angle) * self.speed + new_y = self.y + move_y + new_y = max(self.radius, min(world.size - self.radius, new_y)) + + # Check Y movement with more lenient collision + can_move_y = True + for obj in world.objects: + # Skip roads for collision + if getattr(obj, "type", None) in ["road", "path"]: + continue + + dx = self.x - obj.x + dy = new_y - obj.y + distance = math.sqrt(dx * dx + dy * dy) + if distance < (self.radius + obj.radius + 2): # Small buffer + can_move_y = False + logger.debug( + f"Y collision with {obj.__class__.__name__} at ({int(obj.x)}, {int(obj.y)})" + ) + break + + if can_move_y: + self.y = new_y + logger.debug(f"NPC {self.name} moved Y to {int(self.y)}") + + # If both movements failed, try to move away from nearby objects + if not (can_move_x or can_move_y): + # Find nearest object + nearest_obj = None + nearest_dist = float("inf") + for obj in world.objects: + dx = self.x - obj.x + dy = self.y - obj.y + dist = math.sqrt(dx * dx + dy * dy) + if dist < nearest_dist: + nearest_dist = dist + nearest_obj = obj + + if nearest_obj: + # Move away from nearest object + dx = self.x - nearest_obj.x + dy = self.y - nearest_obj.y + angle = math.atan2(dy, dx) + self.move_angle = angle + logger.debug( + f"NPC {self.name} moving away from object at angle {angle}" + ) + else: + # Random new direction if no nearby objects + self.move_angle = random.uniform(0, 2 * math.pi) + logger.debug( + f"NPC {self.name} changing to random direction {self.move_angle}" + ) + + # Update memories and observations + self.age_memories() + self.observe_environment(world, npcs, player, current_time, weather) + self.update_activity(current_time) + + def age_memories(self): + """Age memories and remove old ones""" + for memory in self.memories: + memory.age += 1 + + # Remove very old memories unless they're important + self.memories = [m for m in self.memories if m.age < 1000 or m.importance > 0.8] + + def observe_environment(self, world, npcs, player, current_time, weather): + """Generate diverse observations about the environment""" + # Time-based observations + if current_time: + time_of_day = self.get_time_of_day(current_time) + if random.random() < 0.1: + self.add_memory( + f"It's {time_of_day} now", MemoryType.TIME, importance=0.3 + ) + + # Weather observations + if ( + weather + and (self.last_weather_check + self.weather_check_interval) + <= pygame.time.get_ticks() + ): + self.add_memory( + f"The weather is {weather}", MemoryType.WEATHER, importance=0.4 + ) + self.last_weather_check = pygame.time.get_ticks() + + # Social observations + for npc in npcs: + if npc != self and self.distance_to(npc) < 100: + if random.random() < 0.05: + activity = random.choice( + [ + "walking around", + "looking at the surroundings", + "heading somewhere", + "working", + ] + ) + self.add_memory( + f"Saw {npc.name} {activity}", MemoryType.SOCIAL, importance=0.6 + ) + + # Environment observations + nearby_objects = self.get_nearby_objects(world) + if nearby_objects and random.random() < 0.1: + obj = random.choice(nearby_objects) + observation = self.generate_object_observation(obj) + self.add_memory(observation, MemoryType.OBSERVATION, importance=0.5) + + def generate_object_observation(self, obj): + """Generate varied observations about objects""" + if obj.type == "tree": + return random.choice( + [ + "The trees are providing nice shade", + "The leaves are rustling in the wind", + "This tree looks particularly old", + ] + ) + elif obj.type == "flower": + return random.choice( + [ + "The flowers are blooming beautifully", + "There's a pleasant floral scent in the air", + "These flowers add color to the village", + ] + ) + elif obj.type == "house": + return random.choice( + [ + "That's a well-maintained house", + "Someone's home looks cozy", + "The house has an interesting design", + ] + ) + elif obj.type == "path": + return random.choice( + [ + "The path is well-worn from use", + "This path connects different parts of the village", + "People often use this route", + ] + ) + return f"I noticed a {obj.type} nearby" + + def add_memory(self, event, memory_type, importance=1.0): + """Add a new memory with type and importance""" + memory = Memory(event, memory_type, importance) + self.memories.append(memory) + + # Keep memories within limit, remove oldest and least important first + if len(self.memories) > self.memory_limit: + self.memories.sort(key=lambda m: m.importance * (1.0 / (1.0 + m.age))) + self.memories.pop(0) + + def get_memory_context(self): + """Get enhanced context from memories for conversation""" + context = [] + + # Add personality and preferences (safely) + personality = self.long_term_memories.get("preferences", {}).get( + "personality", "friendly" + ) + favorite_activity = self.long_term_memories.get("preferences", {}).get( + "favorite_activity", "chatting" + ) + context.append(f"You are {personality} and prefer {favorite_activity}") + + # Add current mood and activity + context.append( + f"You are currently {self.mood} and {self.current_activity or 'not doing anything specific'}" + ) + + # Add player knowledge + if self.long_term_memories["player_name"]: + context.append( + f"You know the player as {self.long_term_memories['player_name']}" + ) + + # Add recent memories, weighted by type and importance + weighted_memories = sorted( + self.memories, + key=lambda m: m.importance * (1.0 / (1.0 + m.age)), + reverse=True, + )[ + :5 + ] # Take top 5 memories + + for memory in weighted_memories: + context.append(memory.event) + + return " ".join(context) + + def get_nearby_objects(self, world): + """Get objects within observation range""" + nearby = [] + for obj in world.objects: + if self.distance_to_pos(obj.x, obj.y) < 150: # Observation range + nearby.append(obj) + return nearby + + def distance_to(self, other): + """Calculate distance to another entity""" + return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5 + + def distance_to_pos(self, x, y): + """Calculate distance to a position""" + dx = x - self.x + dy = y - self.y + return math.sqrt(dx * dx + dy * dy) + + def get_time_of_day(self, current_time): + """Convert time to period of day""" + hour = current_time.hour + if 5 <= hour < 12: + return "morning" + elif 12 <= hour < 17: + return "afternoon" + elif 17 <= hour < 21: + return "evening" + else: + return "night" + + def update_activity(self, current_time): + """Update NPC's current activity based on time""" + if not current_time: + return + + hour = current_time.hour + if 6 <= hour < 10: + self.current_activity = "starting the day" + elif 10 <= hour < 12: + self.current_activity = "working in the morning" + elif 12 <= hour < 14: + self.current_activity = "having lunch" + elif 14 <= hour < 18: + self.current_activity = "working in the afternoon" + elif 18 <= hour < 21: + self.current_activity = "spending evening time" + else: + self.current_activity = "resting" + + def remember_conversation(self, player_message, npc_response): + """Store important conversation details""" + timestamp = datetime.now().isoformat() + self.long_term_memories["conversations"].append( + { + "timestamp": timestamp, + "player_said": player_message, + "npc_said": npc_response, + } + ) + + # Try to extract player name if mentioned + if "my name is" in player_message.lower(): + try: + name = player_message.lower().split("my name is")[1].strip() + self.long_term_memories["player_name"] = name + self.long_term_memories["important_facts"]["player_name"] = name + except: + pass + + def choose_next_action(self, world): + """Choose what to do next based on time and location""" + logger.debug(f"NPC {self.name} choosing next action") + + time_of_day = self.get_time_of_day(datetime.now()) + current_weather = getattr(self, "current_weather", "sunny") + + action = random.choice( + ["wander", "visit_point_of_interest", "return_home", "wait"] + ) + + logger.debug(f"NPC {self.name} chose action: {action}") + + if action == "wander": + angle = random.uniform(0, 2 * math.pi) + distance = random.uniform(50, self.wander_radius) + target_x = self.x + math.cos(angle) * distance + target_y = self.y + math.sin(angle) * distance + logger.debug( + f"NPC {self.name} wandering to ({int(target_x)}, {int(target_y)})" + ) + self.set_target(target_x, target_y) + + elif action == "visit_point_of_interest": + # Find nearby interesting points (buildings, wells, etc.) + points = self.find_points_of_interest(world) + if points: + point = random.choice(points) + self.set_target(point.x, point.y) + else: + self.state = "waiting" + self.wait_time = random.randint(60, 180) + + elif action == "return_home": + self.set_target(self.home_x, self.home_y) + + elif action == "wait": + self.state = "waiting" + self.wait_time = random.randint(60, 180) + + def set_target(self, x, y): + """Set a new movement target""" + self.target_x = max(0, min(x, 3000)) # Assume world size is 3000 + self.target_y = max(0, min(y, 3000)) + self.state = "walking" + self.state_timer = 0 + + def find_points_of_interest(self, world): + """Find interesting points within observation range""" + points = [] + for obj in world.objects: + if ( + obj.type in ["house", "well", "tree"] + and self.distance_to_pos(obj.x, obj.y) < self.wander_radius + ): + points.append(obj) + return points + + def force_random_movement(self, world): + """Force NPC to move in a random direction""" + angle = random.uniform(0, 2 * math.pi) + distance = 50 # Short distance for default movement + + # Try 8 different directions if initial direction is blocked + for _ in range(8): + target_x = self.x + math.cos(angle) * distance + target_y = self.y + math.sin(angle) * distance + + # Check if movement is possible + if not world.check_collision(target_x, target_y, self.radius): + self.target_x = target_x + self.target_y = target_y + self.state = "walking" + self.state_timer = 0 + logger.debug( + f"NPC {self.name} forced movement to ({int(target_x)}, {int(target_y)})" + ) + return + + # Try next direction + angle += math.pi / 4 + + logger.debug(f"NPC {self.name} couldn't find valid movement direction") + + def move_to_target(self, world): + """Handle movement towards target""" + dx = self.target_x - self.x + dy = self.target_y - self.y + distance = math.sqrt(dx * dx + dy * dy) + + logger.debug(f"NPC {self.name} walking to target. Distance: {distance:.2f}") + + if distance < self.speed: # Reached target + self.x = self.target_x + self.y = self.target_y + self.state = "idle" + self.state_timer = 0 + self.target_x = None + self.target_y = None + logger.debug(f"NPC {self.name} reached target") + else: + # Smooth movement towards target + move_x = (dx / distance) * self.speed + move_y = (dy / distance) * self.speed + + # Check for collision before moving + new_x = self.x + move_x + new_y = self.y + move_y + + if not world.check_collision(new_x, new_y, self.radius): + self.x = new_x + self.y = new_y + logger.debug(f"NPC {self.name} moved to ({int(self.x)}, {int(self.y)})") + else: + logger.debug(f"NPC {self.name} collision detected") + self.force_random_movement(world) # Try moving in a different direction + + def debug_collision(self, world, x, y): + """Debug helper to check what's causing collisions""" + # Check world bounds + if ( + x < self.radius + or x > world.size - self.radius + or y < self.radius + or y > world.size - self.radius + ): + logger.debug(f"World bounds collision at ({int(x)}, {int(y)})") + return True + + # Check objects + for obj in world.objects: + dx = x - obj.x + dy = y - obj.y + distance = math.sqrt(dx * dx + dy * dy) + if distance < (self.radius + obj.radius): + logger.debug(f"Object collision with {obj} at ({int(x)}, {int(y)})") + return True + + return False diff --git a/src/entities/player.py b/src/entities/player.py new file mode 100644 index 0000000..cf6d160 --- /dev/null +++ b/src/entities/player.py @@ -0,0 +1,51 @@ +import pygame +import math +from config.colors import COLORS + + +class Player: + def __init__(self, x: float, y: float): + self.x = x + self.y = y + self.color = COLORS["player"] + self.radius = 15 + self.speed = 3.0 + + def update(self, keys, world): + """Update player position based on keyboard input""" + new_x = self.x + new_y = self.y + + # Calculate movement based on key presses + if keys[pygame.K_w] or keys[pygame.K_UP]: + new_y -= self.speed + if keys[pygame.K_s] or keys[pygame.K_DOWN]: + new_y += self.speed + if keys[pygame.K_a] or keys[pygame.K_LEFT]: + new_x -= self.speed + if keys[pygame.K_d] or keys[pygame.K_RIGHT]: + new_x += self.speed + + # Normalize diagonal movement + if ( + keys[pygame.K_w] + or keys[pygame.K_UP] + or keys[pygame.K_s] + or keys[pygame.K_DOWN] + ) and ( + keys[pygame.K_a] + or keys[pygame.K_LEFT] + or keys[pygame.K_d] + or keys[pygame.K_RIGHT] + ): + new_x = self.x + (new_x - self.x) / math.sqrt(2) + new_y = self.y + (new_y - self.y) / math.sqrt(2) + + # Check world boundaries + new_x = max(self.radius, min(world.size - self.radius, new_x)) + new_y = max(self.radius, min(world.size - self.radius, new_y)) + + # Check collision with solid objects + if not world.check_collision(new_x, new_y, self.radius): + self.x = new_x + self.y = new_y diff --git a/src/entities/world_object.py b/src/entities/world_object.py new file mode 100644 index 0000000..68eb292 --- /dev/null +++ b/src/entities/world_object.py @@ -0,0 +1,45 @@ +from config.colors import COLORS + + +class WorldObject: + def __init__(self, x: float, y: float, obj_type: str): + self.x = x + self.y = y + self.type = obj_type + self.color = COLORS[obj_type] + self.radius = 10 # Default radius + + # Set attributes based on type + if obj_type == "house": + self.radius = 30 + self.solid = True + self.render_layer = 2 + elif obj_type == "well": + self.radius = 20 + self.solid = True + self.render_layer = 2 + elif obj_type == "tree": + self.radius = 15 + self.solid = True + self.render_layer = 2 + elif obj_type == "water": + self.radius = 10 + self.solid = True + self.render_layer = 0 + self.is_water = True + elif obj_type == "path": + self.radius = 10 + self.solid = False + self.render_layer = 0 + self.is_path = True + elif obj_type in ["flower", "mushroom", "tall_grass", "berry_bush"]: + self.radius = 5 + self.solid = False + self.render_layer = 1 + else: + self.solid = False + self.render_layer = 1 + + # Initialize all possible attributes to prevent AttributeError + self.is_water = getattr(self, "is_water", False) + self.is_path = getattr(self, "is_path", False) diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..fb857aa --- /dev/null +++ b/src/main.py @@ -0,0 +1,508 @@ +import pygame +import asyncio +import math +import random +from ollama import Client +import logging +from datetime import datetime + +from config.settings import WINDOW_SIZE, OLLAMA_URL, OLLAMA_MODEL +from config.colors import COLORS +from entities.npc import NPC +from utils.memory import Memory +from world.world import World +from world.camera import Camera +from entities.player import Player +from utils.dialog import DialogBox +from utils.save_manager import SaveManager +from menu.main_menu import MainMenu +from ui.header_bar import HeaderBar +from utils.name_generator import NameGenerator +from ui.footer_bar import FooterBar +from effects.weather import WeatherEffect + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Initialize Pygame +pygame.init() +screen = pygame.display.set_mode(WINDOW_SIZE) +pygame.display.set_caption("LMMRPG") + + +def draw_world_object(screen, obj, x, y): + """Draw a world object with appropriate shape and color""" + # Ensure color is a valid RGB tuple + color = obj.color if isinstance(obj.color, tuple) else (0, 0, 0) + + if obj.type == "path": + # Draw paths as rectangles + pygame.draw.rect(screen, color, (x - 10, y - 10, 20, 20)) + elif obj.type == "water": + # Draw water as blue rectangles with slight transparency + surface = pygame.Surface((20, 20), pygame.SRCALPHA) + pygame.draw.rect(surface, (*color, 180), (0, 0, 20, 20)) # Add alpha channel + screen.blit(surface, (x - 10, y - 10)) + elif obj.type == "house": + # Draw houses as brown rectangles with a triangular roof + pygame.draw.rect( + screen, + color, + (x - obj.radius, y - obj.radius, obj.radius * 2, obj.radius * 2), + ) + # Roof + pygame.draw.polygon( + screen, + (139, 69, 19), # Darker brown for roof + [ + (x - obj.radius - 5, y - obj.radius), + (x + obj.radius + 5, y - obj.radius), + (x, y - obj.radius - 15), + ], + ) + elif obj.type == "well": + # Draw wells as circles with a darker border + pygame.draw.circle(screen, color, (int(x), int(y)), obj.radius) + pygame.draw.circle(screen, (100, 100, 100), (int(x), int(y)), obj.radius, 2) + elif obj.type == "tree": + # Draw trees as green circles with brown trunks + # Trunk + pygame.draw.rect(screen, (139, 69, 19), (x - 3, y - 5, 6, 10)) # Brown + # Leaves + pygame.draw.circle(screen, color, (int(x), int(y - 10)), obj.radius) + elif obj.type in ["flower", "mushroom", "tall_grass", "berry_bush"]: + # Draw small decorative elements + if obj.type == "flower": + # Flowers as small colored circles with a center + pygame.draw.circle(screen, color, (int(x), int(y)), obj.radius) + pygame.draw.circle( + screen, (255, 255, 0), (int(x), int(y)), 2 + ) # Yellow center + elif obj.type == "mushroom": + # Mushrooms as small stems with caps + pygame.draw.rect(screen, (210, 180, 140), (x - 1, y - 3, 2, 6)) # Stem + pygame.draw.circle(screen, color, (int(x), int(y - 3)), 4) # Cap + elif obj.type == "tall_grass": + # Tall grass as small vertical lines + for i in range(-2, 3): + pygame.draw.line( + screen, color, (x + i, y), (x + i, y - random.randint(5, 8)) + ) + elif obj.type == "berry_bush": + # Berry bushes as green circles with red dots + pygame.draw.circle( + screen, (0, 100, 0), (int(x), int(y)), obj.radius + ) # Bush + for _ in range(3): # Add berries + berry_x = x + random.randint(-3, 3) + berry_y = y + random.randint(-3, 3) + pygame.draw.circle(screen, (139, 0, 0), (int(berry_x), int(berry_y)), 2) + else: + # Default drawing for unknown objects + pygame.draw.circle(screen, color, (int(x), int(y)), obj.radius) + + +def draw_header(screen, world): + font = pygame.font.Font(None, 32) + header_height = 40 + + # Draw header background + pygame.draw.rect(screen, (0, 0, 0, 180), (0, 0, WINDOW_SIZE[0], header_height)) + + # Draw seed information + seed_text = f"World Seed: {world.seed}" + seed_surface = font.render(seed_text, True, (255, 255, 255)) + screen.blit(seed_surface, (10, 10)) + + +def draw_chat_input(screen, input_text, active): + # Draw chat input box at the very bottom + input_box_height = 40 + input_box_width = WINDOW_SIZE[0] * 0.8 + x = (WINDOW_SIZE[0] - input_box_width) / 2 + y = WINDOW_SIZE[1] - input_box_height - 10 # Always at bottom + + # Draw input box background + pygame.draw.rect( + screen, + (0, 0, 0, 180) if active else (50, 50, 50, 180), + (x, y, input_box_width, input_box_height), + ) + + # Draw input text + font = pygame.font.Font(None, 32) + if input_text: + text_surface = font.render(input_text, True, (255, 255, 255)) + else: + text_surface = font.render( + "Type your message and press Enter...", True, (150, 150, 150) + ) + + screen.blit(text_surface, (x + 10, y + 10)) + + +async def main(): + pygame.init() + screen = pygame.display.set_mode(WINDOW_SIZE) + pygame.display.set_caption("LMMRPG") + + save_manager = SaveManager() + menu = MainMenu(save_manager) + + # Initialize save counter + save_counter = 0 + save_cooldown = 300 + + # Start with menu + current_state = "menu" + world = None + player = None + camera = None + + # Add time and weather system + current_time = datetime.now() + weather_conditions = ["sunny", "cloudy", "rainy"] + current_weather = random.choice(weather_conditions) + weather_change_counter = 0 + + header_bar = HeaderBar() + footer_bar = FooterBar() + weather_effect = WeatherEffect(WINDOW_SIZE[0], WINDOW_SIZE[1]) + + # Update world generation to use proper names + def generate_npcs(world): + for village_x, village_y in world.village_centers: + num_npcs = random.randint(3, 6) + for _ in range(num_npcs): + x = village_x + random.randint(-100, 100) + y = village_y + random.randint(-100, 100) + npc = NPC(x, y, NameGenerator.generate_name()) + world.npcs.append(npc) + + running = True + while running: + if current_state == "menu": + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + continue + + result = menu.handle_input(event) + if result: + action, seed = result + if action == "quit": + running = False + elif action == "new": + world = World(seed=seed) + # Find valid spawn for player + spawn_x, spawn_y = world.find_valid_spawn( + world.size // 2, world.size // 2 + ) + player = Player(spawn_x, spawn_y) + camera = Camera() + current_state = "game" + elif action == "load": + save_data = save_manager.load_world(seed) + if save_data: + world_data, npc_data = save_data + world = World(seed=seed) + # Restore NPCs and their memories + for npc_info in npc_data: + for npc in world.npcs: + if npc.name == npc_info["name"]: + npc.memories = [ + Memory( + m["event"], + m["timestamp"], + m["location"], + ) + for m in npc_info["memories"] + ] + npc.long_term_memories = npc_info.get( + "long_term_memories", [] + ) + player = Player(world.size // 2, world.size // 2) + camera = Camera() + current_state = "game" + + menu.draw(screen) + pygame.display.flip() + continue + + # Regular game loop + clock = pygame.time.Clock() + world = World() + player = Player(world.size // 2, world.size // 2) + camera = Camera() + ollama_client = Client(host=OLLAMA_URL) + dialog_box = DialogBox() + + # Keep track of the last NPC we talked to + current_npc = None + conversation_history = [] + + input_text = "" + chat_active = False + + running = True + while running: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.KEYDOWN: + if chat_active: + if event.key == pygame.K_RETURN and input_text.strip(): + # Handle chat input + dialog_box.show_message("You", input_text) + + # Add to conversation history + conversation_history.append( + {"role": "user", "content": input_text} + ) + + # Generate NPC response + try: + # Get memory context from NPC + memory_context = current_npc.get_memory_context() + context = ( + f"You are {current_npc.name}, a villager. " + f"{memory_context} " + f"Recent events: {[m.event for m in current_npc.memories[-3:]]}" + ) + + messages = [{"role": "system", "content": context}] + messages.extend(conversation_history[-6:]) + + response = ollama_client.chat( + model=OLLAMA_MODEL, messages=messages + ) + + # Store the conversation in NPC's memory + current_npc.remember_conversation( + input_text, response["message"]["content"] + ) + + # Add NPC response to history + conversation_history.append( + { + "role": "assistant", + "content": response["message"]["content"], + } + ) + + # Show NPC response + dialog_box.show_message( + current_npc.name, response["message"]["content"] + ) + + except Exception as e: + logger.error(f"Ollama error details: {str(e)}") + if hasattr(e, "response"): + logger.error( + f"Response status: {e.response.status_code}" + ) + logger.error(f"Response content: {e.response.text}") + dialog_box.show_message( + current_npc.name, + f"I'm sorry, I didn't quite catch that... (Error: {str(e)})", + ) + + input_text = "" # Clear input + + elif event.key == pygame.K_BACKSPACE: + input_text = input_text[:-1] + elif event.key == pygame.K_ESCAPE: + chat_active = False + dialog_box.hide() + current_npc = None + conversation_history = [] + elif event.key == pygame.K_UP: + dialog_box.scroll_up() + elif event.key == pygame.K_DOWN: + dialog_box.scroll_down() + elif len(input_text) < 50 and event.unicode.isprintable(): + input_text += event.unicode + else: + # Only handle non-chat keys when not chatting + if event.key == pygame.K_SPACE: + # Find nearby NPCs + nearby_npcs = [] + for npc in world.npcs: + dist = math.sqrt( + (npc.x - player.x) ** 2 + (npc.y - player.y) ** 2 + ) + if dist <= npc.interaction_radius: + nearby_npcs.append(npc) + + if nearby_npcs: + nearest_npc = min( + nearby_npcs, + key=lambda n: ( + (n.x - player.x) ** 2 + (n.y - player.y) ** 2 + ), + ) + + if not chat_active: + # Start new conversation + current_npc = nearest_npc + chat_active = True + conversation_history = [] + + # Initial greeting + try: + context = f"You are {current_npc.name}, a villager. Your recent memories: {[m.event for m in current_npc.memories[-3:]]}" + response = ollama_client.chat( + model=OLLAMA_MODEL, + messages=[ + {"role": "system", "content": context}, + {"role": "user", "content": "Hello!"}, + ], + ) + dialog_box.show_message( + current_npc.name, + response["message"]["content"], + ) + conversation_history.append( + { + "role": "assistant", + "content": response["message"][ + "content" + ], + } + ) + except Exception as e: + logger.error(f"Ollama error: {e}") + dialog_box.show_message( + current_npc.name, + "Hello traveler! (Ollama connection failed)", + ) + else: + dialog_box.show_message( + "Info", "No NPCs nearby to talk to!" + ) + + # Only update player and world when not chatting + if not chat_active: + keys = pygame.key.get_pressed() + player.update(keys, world) + camera.update(player) + + for npc in world.npcs: + npc.update(world, world.npcs, player) + + # Drawing + screen.fill((34, 139, 34)) # Background grass + + # Draw world objects by layer + for obj in world.objects: + screen_x = obj.x - camera.x + screen_y = obj.y - camera.y + if ( + -50 <= screen_x <= WINDOW_SIZE[0] + 50 + and -50 <= screen_y <= WINDOW_SIZE[1] + 50 + ): + draw_world_object(screen, obj, screen_x, screen_y) + + # Draw NPCs + for npc in world.npcs: + screen_x = npc.x - camera.x + screen_y = npc.y - camera.y + if 0 <= screen_x <= WINDOW_SIZE[0] and 0 <= screen_y <= WINDOW_SIZE[1]: + # Draw interaction radius for nearby NPCs + dist_to_player = math.sqrt( + (npc.x - player.x) ** 2 + (npc.y - player.y) ** 2 + ) + if dist_to_player <= npc.interaction_radius: + pygame.draw.circle( + screen, + (255, 255, 255, 50), + (int(screen_x), int(screen_y)), + npc.interaction_radius, + 1, + ) + + # Draw NPC + pygame.draw.circle( + screen, npc.color, (int(screen_x), int(screen_y)), npc.radius + ) + pygame.draw.circle( + screen, + npc.color, + (int(screen_x), int(screen_y - npc.radius - 5)), + npc.radius - 5, + ) + + # Draw player + player_screen_x = WINDOW_SIZE[0] // 2 + player_screen_y = WINDOW_SIZE[1] // 2 + pygame.draw.circle( + screen, player.color, (player_screen_x, player_screen_y), player.radius + ) + pygame.draw.circle( + screen, + player.color, + (player_screen_x, player_screen_y - player.radius - 5), + player.radius - 5, + ) + + # Draw weather effects last (on top of everything except UI) + weather_effect.draw(screen, current_weather) + + # Draw UI elements after weather + header_bar.draw( + screen, current_time, current_weather, (player.x, player.y), world.size + ) + footer_bar.draw(screen, world) + + # Draw dialog box + dialog_box.draw(screen) + + # Draw chat input if active + if chat_active: + draw_chat_input(screen, input_text, True) + + pygame.display.flip() + clock.tick(60) + + # Handle manual save on key press + keys = pygame.key.get_pressed() + if keys[pygame.K_F5]: # F5 to save + save_manager.save_world(world) + dialog_box.show_message("System", "Game saved!") + + # Auto-save less frequently + save_counter += 1 + if save_counter >= save_cooldown: + save_manager.save_world(world) + save_counter = 0 + + # Update NPC memories immediately after conversation + if chat_active and current_npc: + current_npc.remember_conversation(input_text, dialog_box.message) + save_manager.save_world(world) # Save immediately after memory update + + # Update time every minute + if datetime.now().minute != current_time.minute: + current_time = datetime.now() + + # Change weather occasionally + weather_change_counter += 1 + if weather_change_counter >= 3600: # Change weather every ~1 minute + current_weather = random.choice(weather_conditions) + weather_change_counter = 0 + + # Update NPCs with time and weather + for npc in world.npcs: + npc.current_weather = current_weather # Set weather before update + npc.update(world, world.npcs, player, current_time, current_weather) + + # Update world's weather + world.current_weather = current_weather + + # When quitting + pygame.quit() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/src/menu/main_menu.py b/src/menu/main_menu.py new file mode 100644 index 0000000..79d5fcd --- /dev/null +++ b/src/menu/main_menu.py @@ -0,0 +1,148 @@ +import pygame +import random +from config.settings import WINDOW_SIZE +from config.colors import COLORS + + +class MainMenu: + def __init__(self, save_manager): + self.save_manager = save_manager + self.font = pygame.font.Font(None, 48) + self.small_font = pygame.font.Font(None, 32) + self.selected = 0 + self.input_seed = "" + self.state = "main" # main, load, enter_seed + self.saves = [] + self.bg_color = (0, 0, 0) + self.text_color = (255, 255, 255) + self.highlight_color = (255, 255, 0) + + def update_saves(self): + self.saves = self.save_manager.get_available_saves() + + def draw(self, screen): + screen.fill(self.bg_color) + + if self.state == "main": + options = [ + "New Game (Random Seed)", + "New Game (Enter Seed)", + "Load Game", + "Quit", + ] + + for i, option in enumerate(options): + color = self.highlight_color if i == self.selected else self.text_color + text = self.font.render(option, True, color) + x = WINDOW_SIZE[0] // 2 - text.get_width() // 2 + y = WINDOW_SIZE[1] // 2 - len(options) * 30 + i * 60 + screen.blit(text, (x, y)) + + elif self.state == "load": + # Draw back option + back_text = self.font.render( + "Back", + True, + self.highlight_color if self.selected == -1 else self.text_color, + ) + screen.blit(back_text, (20, 20)) + + if not self.saves: + text = self.font.render("No saves found", True, self.text_color) + screen.blit( + text, + (WINDOW_SIZE[0] // 2 - text.get_width() // 2, WINDOW_SIZE[1] // 2), + ) + else: + for i, save in enumerate(self.saves): + color = ( + self.highlight_color if i == self.selected else self.text_color + ) + text = self.font.render( + f"World {save['seed']} - {save['timestamp'][:10]}", True, color + ) + x = WINDOW_SIZE[0] // 2 - text.get_width() // 2 + y = 100 + i * 60 + screen.blit(text, (x, y)) + + elif self.state == "enter_seed": + prompt = self.font.render( + "Enter Seed (numbers only):", True, self.text_color + ) + seed_text = self.font.render( + self.input_seed or "...", True, self.highlight_color + ) + + screen.blit( + prompt, + ( + WINDOW_SIZE[0] // 2 - prompt.get_width() // 2, + WINDOW_SIZE[1] // 2 - 60, + ), + ) + screen.blit( + seed_text, + (WINDOW_SIZE[0] // 2 - seed_text.get_width() // 2, WINDOW_SIZE[1] // 2), + ) + + instruction = self.small_font.render( + "Press Enter to confirm, Escape to cancel", True, self.text_color + ) + screen.blit( + instruction, + ( + WINDOW_SIZE[0] // 2 - instruction.get_width() // 2, + WINDOW_SIZE[1] // 2 + 60, + ), + ) + + def handle_input(self, event): + if self.state == "main": + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_UP: + self.selected = (self.selected - 1) % 4 + elif event.key == pygame.K_DOWN: + self.selected = (self.selected + 1) % 4 + elif event.key == pygame.K_RETURN: + if self.selected == 0: # New Game (Random) + return ("new", random.randint(1, 999999)) + elif self.selected == 1: # New Game (Seed) + self.state = "enter_seed" + self.input_seed = "" + elif self.selected == 2: # Load Game + self.state = "load" + self.selected = 0 # Start with first save selected + self.update_saves() + elif self.selected == 3: # Quit + return ("quit", None) + + elif self.state == "load": + if event.type == pygame.KEYDOWN: + max_index = len(self.saves) + if event.key == pygame.K_UP: + self.selected = (self.selected - 1) % (max_index + 1) + elif event.key == pygame.K_DOWN: + self.selected = (self.selected + 1) % (max_index + 1) + elif event.key == pygame.K_RETURN: + if self.selected == max_index: # Back option + self.state = "main" + self.selected = 0 + elif self.saves: # Load selected save + return ("load", self.saves[self.selected]["seed"]) + elif event.key == pygame.K_ESCAPE: + self.state = "main" + self.selected = 0 + + elif self.state == "enter_seed": + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_RETURN and self.input_seed: + return ("new", int(self.input_seed)) + elif event.key == pygame.K_ESCAPE: + self.state = "main" + self.selected = 1 + elif event.key == pygame.K_BACKSPACE: + self.input_seed = self.input_seed[:-1] + elif event.unicode.isnumeric() and len(self.input_seed) < 6: + self.input_seed += event.unicode + + return None diff --git a/src/ui/footer_bar.py b/src/ui/footer_bar.py new file mode 100644 index 0000000..9ec267e --- /dev/null +++ b/src/ui/footer_bar.py @@ -0,0 +1,25 @@ +import pygame + + +class FooterBar: + def __init__(self): + self.height = 30 + self.font = pygame.font.Font(None, 24) + self.bg_color = (0, 0, 0, 180) + self.text_color = (255, 255, 255) + + def draw(self, screen, world): + # Create semi-transparent surface + footer_surface = pygame.Surface( + (screen.get_width(), self.height), pygame.SRCALPHA + ) + pygame.draw.rect( + footer_surface, self.bg_color, (0, 0, screen.get_width(), self.height) + ) + + # Create seed text + seed_text = self.font.render(f"World Seed: {world.seed}", True, self.text_color) + + # Position at bottom of screen + screen.blit(footer_surface, (0, screen.get_height() - self.height)) + screen.blit(seed_text, (20, screen.get_height() - self.height + 5)) diff --git a/src/ui/header_bar.py b/src/ui/header_bar.py new file mode 100644 index 0000000..539b46d --- /dev/null +++ b/src/ui/header_bar.py @@ -0,0 +1,57 @@ +import pygame +from datetime import datetime + + +class HeaderBar: + def __init__(self): + self.height = 30 + self.font = pygame.font.Font(None, 24) + self.bg_color = (0, 0, 0, 180) + self.text_color = (255, 255, 255) + self.weather_colors = { + "sunny": (255, 223, 0), + "cloudy": (169, 169, 169), + "rainy": (0, 191, 255), + } + + def draw(self, screen, current_time, weather, player_pos, world_size): + # Create semi-transparent surface + header_surface = pygame.Surface( + (screen.get_width(), self.height), pygame.SRCALPHA + ) + pygame.draw.rect( + header_surface, self.bg_color, (0, 0, screen.get_width(), self.height) + ) + + # Format time + time_str = current_time.strftime("%H:%M") + + # Format position as percentage of world size + pos_x = round((player_pos[0] / world_size) * 100) + pos_y = round((player_pos[1] / world_size) * 100) + + # Create text elements + time_text = self.font.render(f"Time: {time_str}", True, self.text_color) + weather_text = self.font.render(f"Weather: ", True, self.text_color) + weather_value = self.font.render( + weather, True, self.weather_colors.get(weather, self.text_color) + ) + position_text = self.font.render( + f"Position: {pos_x}%, {pos_y}%", True, self.text_color + ) + + # Draw elements + screen.blit(header_surface, (0, 0)) + + # Layout elements with padding + padding = 20 + screen.blit(time_text, (padding, 5)) + + # Weather (text + value) + weather_x = time_text.get_width() + padding * 2 + screen.blit(weather_text, (weather_x, 5)) + screen.blit(weather_value, (weather_x + weather_text.get_width(), 5)) + + # Position on the right side + position_x = screen.get_width() - position_text.get_width() - padding + screen.blit(position_text, (position_x, 5)) diff --git a/src/utils/dialog.py b/src/utils/dialog.py new file mode 100644 index 0000000..7af15fc --- /dev/null +++ b/src/utils/dialog.py @@ -0,0 +1,92 @@ +import pygame +from config.settings import WINDOW_SIZE + + +class DialogBox: + def __init__(self): + self.active = False + self.message = "" + self.speaker = "" + self.width = WINDOW_SIZE[0] * 0.8 + self.min_height = 100 # Minimum height + self.max_height = 250 # Maximum height + self.x = (WINDOW_SIZE[0] - self.width) / 2 + self.font = pygame.font.Font(None, 32) + self.small_font = pygame.font.Font(None, 24) + self.padding = 20 + self.text_color = (255, 255, 255) + self.bg_color = (0, 0, 0, 180) + self.line_height = 30 + + def calculate_height(self, speaker_text, message_lines): + """Calculate required height based on content""" + content_height = ( + self.padding * 2 # Top and bottom padding + + len(message_lines) * self.line_height # Message lines + + 40 # Space for instructions + ) + return min(max(self.min_height, content_height), self.max_height) + + def show_message(self, speaker, message): + self.active = True + self.message = message + self.speaker = speaker + + def hide(self): + self.active = False + + def draw(self, screen): + if not self.active: + return + + # Calculate speaker text dimensions + speaker_color = (255, 255, 0) if self.speaker == "You" else self.text_color + speaker_text = self.font.render(f"{self.speaker}:", True, speaker_color) + + # Word wrap message + words = self.message.split() + lines = [] + current_line = [] + for word in words: + current_line.append(word) + text = " ".join(current_line) + if self.font.size(text)[0] > self.width - ( + self.padding * 3 + speaker_text.get_width() + ): + current_line.pop() + lines.append(" ".join(current_line)) + current_line = [word] + lines.append(" ".join(current_line)) + + # Calculate required height + self.height = self.calculate_height(speaker_text, lines) + + # Update y position based on height + self.y = WINDOW_SIZE[1] - self.height - 60 # Space for input box + + # Create background + dialog_surface = pygame.Surface((self.width, self.height), pygame.SRCALPHA) + pygame.draw.rect(dialog_surface, self.bg_color, (0, 0, self.width, self.height)) + screen.blit(dialog_surface, (self.x, self.y)) + + # Draw speaker name + screen.blit(speaker_text, (self.x + self.padding, self.y + self.padding)) + + # Draw all message lines + for i, line in enumerate(lines): + text = self.font.render(line, True, self.text_color) + screen.blit( + text, + ( + self.x + self.padding * 2 + speaker_text.get_width(), + self.y + self.padding + i * self.line_height, + ), + ) + + # Draw chat instructions at bottom of box + prompt_text = self.small_font.render( + "Type your message and press Enter, ESC to end conversation", + True, + (200, 200, 200), + ) + screen.blit(prompt_text, (self.x + self.padding, self.y + self.height - 30)) diff --git a/src/utils/memory.py b/src/utils/memory.py new file mode 100644 index 0000000..84fcaab --- /dev/null +++ b/src/utils/memory.py @@ -0,0 +1,9 @@ +from dataclasses import dataclass +from typing import Tuple + + +@dataclass +class Memory: + event: str + timestamp: float + location: Tuple[float, float] diff --git a/src/utils/name_generator.py b/src/utils/name_generator.py new file mode 100644 index 0000000..ebc9f85 --- /dev/null +++ b/src/utils/name_generator.py @@ -0,0 +1,53 @@ +import random + + +class NameGenerator: + first_names = [ + "Ada", + "Finn", + "Luna", + "Kai", + "Nova", + "Zara", + "Ash", + "Milo", + "Iris", + "Theo", + "Sage", + "Remy", + "Jade", + "Leo", + "Aria", + "Owen", + "Ivy", + "Cole", + "Maya", + "Axel", + ] + + last_names = [ + "Thorne", + "Frost", + "Rivers", + "Storm", + "Woods", + "Drake", + "Stone", + "Vale", + "Brook", + "Field", + "Grove", + "Swift", + "Dale", + "Marsh", + "Hill", + "Lake", + "Reed", + "Glen", + "Shaw", + "Ford", + ] + + @classmethod + def generate_name(cls): + return f"{random.choice(cls.first_names)} {random.choice(cls.last_names)}" diff --git a/src/utils/save_manager.py b/src/utils/save_manager.py new file mode 100644 index 0000000..8abad74 --- /dev/null +++ b/src/utils/save_manager.py @@ -0,0 +1,114 @@ +import os +import json +import logging +from datetime import datetime + +# Configure logger for save manager +logger = logging.getLogger(__name__) +logger.setLevel(logging.WARNING) # Only show warnings and errors + + +class SaveManager: + def __init__(self): + self.save_dir = "saves" + self.ensure_save_directory() + + def ensure_save_directory(self): + """Ensure save directory exists""" + if not os.path.exists(self.save_dir): + os.makedirs(self.save_dir) + + def get_world_path(self, seed): + """Get path for a specific world save""" + return os.path.join(self.save_dir, f"world_{seed}") + + def save_world(self, world): + """Save world state including NPCs and their memories""" + try: + world_dir = self.get_world_path(world.seed) + if not os.path.exists(world_dir): + os.makedirs(world_dir) + + # Save world data + world_data = { + "seed": world.seed, + "size": world.size, + "timestamp": datetime.now().isoformat(), + "village_centers": world.village_centers, + } + + with open(os.path.join(world_dir, "world.json"), "w") as f: + json.dump(world_data, f) + + # Save NPCs and their memories + npc_data = [] + for npc in world.npcs: + npc_info = { + "name": npc.name, + "x": npc.x, + "y": npc.y, + "home_x": npc.home_x, + "home_y": npc.home_y, + "memories": [ + { + "event": m.event, + "timestamp": m.timestamp, + "type": m.type.value, + "importance": m.importance, + "age": m.age, + } + for m in npc.memories + ], + "long_term_memories": npc.long_term_memories, + } + npc_data.append(npc_info) + + with open(os.path.join(world_dir, "npcs.json"), "w") as f: + json.dump(npc_data, f) + + logger.debug(f"Saved world with seed {world.seed}") + except Exception as e: + logger.error(f"Failed to save world: {e}") + + def load_world(self, seed): + """Load world state including NPCs and their memories""" + world_dir = self.get_world_path(seed) + if not os.path.exists(world_dir): + logger.error(f"No save found for seed {seed}") + return None + + try: + # Load world data + with open(os.path.join(world_dir, "world.json"), "r") as f: + world_data = json.load(f) + + # Load NPCs data + with open(os.path.join(world_dir, "npcs.json"), "r") as f: + npc_data = json.load(f) + + return world_data, npc_data + + except Exception as e: + logger.error(f"Error loading save for seed {seed}: {e}") + return None + + def get_available_saves(self): + """Get list of available saves""" + saves = [] + for item in os.listdir(self.save_dir): + if item.startswith("world_"): + try: + world_path = os.path.join(self.save_dir, item, "world.json") + if os.path.exists(world_path): + with open(world_path, "r") as f: + data = json.load(f) + saves.append( + { + "seed": data["seed"], + "timestamp": data["timestamp"], + "path": item, + } + ) + except Exception as e: + logger.error(f"Error reading save {item}: {e}") + return saves diff --git a/src/world/camera.py b/src/world/camera.py new file mode 100644 index 0000000..26bc14c --- /dev/null +++ b/src/world/camera.py @@ -0,0 +1,26 @@ +from config.settings import WINDOW_SIZE + + +class Camera: + def __init__(self): + self.x = 0 + self.y = 0 + self.smoothness = 0.1 # Lower = smoother camera + + def update(self, target): + """Smoothly follow the target (usually the player)""" + # Calculate desired position (centered on target) + desired_x = target.x - WINDOW_SIZE[0] // 2 + desired_y = target.y - WINDOW_SIZE[1] // 2 + + # Smooth movement + self.x += (desired_x - self.x) * self.smoothness + self.y += (desired_y - self.y) * self.smoothness + + def apply(self, x, y): + """Convert world coordinates to screen coordinates""" + return (int(x - self.x), int(y - self.y)) + + def reverse_apply(self, screen_x, screen_y): + """Convert screen coordinates to world coordinates""" + return (screen_x + self.x, screen_y + self.y) diff --git a/src/world/world.py b/src/world/world.py new file mode 100644 index 0000000..8b503d3 --- /dev/null +++ b/src/world/world.py @@ -0,0 +1,467 @@ +import random +import noise +import math +from entities.world_object import WorldObject +from entities.npc import NPC +import logging + +from utils.name_generator import NameGenerator + +logger = logging.getLogger(__name__) + + +class World: + def __init__(self, seed=None): + logger.info(f"Initializing world with seed {seed}") + self.size = 3000 + self.objects = [] + self.npcs = [] + self.seed = seed if seed is not None else random.randint(1, 99999) + self.village_centers = [] + self.min_house_distance = 120 + self.current_weather = "sunny" # Default weather + random.seed(self.seed) + self.generate_world() + + def check_collision( + self, x: float, y: float, radius: float, ignore_entity=None + ) -> bool: + """Check if a position would result in a collision""" + # Check world boundaries + if ( + x - radius < 0 + or x + radius > self.size + or y - radius < 0 + or y + radius > self.size + ): + return True + + # Check collision with solid objects + for obj in self.objects: + if not getattr(obj, "solid", False): # Skip non-solid objects + continue + + distance = math.sqrt((x - obj.x) ** 2 + (y - obj.y) ** 2) + min_distance = radius + obj.radius + + if distance < min_distance: + return True + + # Check collision with NPCs (if not checking for an NPC itself) + if ignore_entity is None or not isinstance(ignore_entity, NPC): + for npc in self.npcs: + if npc == ignore_entity: + continue + + distance = math.sqrt((x - npc.x) ** 2 + (y - npc.y) ** 2) + min_distance = radius + npc.radius + + if distance < min_distance: + return True + + return False + + def is_position_valid( + self, x: float, y: float, radius: float, min_distance: float = None + ) -> bool: + """Check if a position is valid for object placement""" + # Check world boundaries + if ( + x - radius < 0 + or x + radius > self.size + or y - radius < 0 + or y + radius > self.size + ): + return False + + # Check distance from other objects + for obj in self.objects: + if getattr(obj, "solid", False): # Only check solid objects + dist = math.sqrt((x - obj.x) ** 2 + (y - obj.y) ** 2) + min_dist = min_distance if min_distance else (radius + obj.radius) + if dist < min_dist: + return False + return True + + def generate_village(self, center_x, center_y, size): + """Generate a village with better spacing and organization""" + houses = [] + + # Create central plaza with well + well = WorldObject(center_x, center_y, "well") + well.render_layer = 2 + well.solid = True + self.objects.append(well) + + # Generate houses in a circular pattern with better spacing + num_houses = random.randint(4, 6) # Fewer houses for better spacing + base_distance = 150 # Increased base distance from center + + for i in range(num_houses): + angle = (i / num_houses) * 2 * math.pi + distance = random.randint(base_distance, base_distance + 60) + attempts = 0 + + while attempts < 10: + house_x = center_x + math.cos(angle) * distance + house_y = center_y + math.sin(angle) * distance + + # Add slight randomness to position + house_x += random.randint(-20, 20) + house_y += random.randint(-20, 20) + + if self.is_position_valid( + house_x, house_y, 30, self.min_house_distance + ): + house = WorldObject(house_x, house_y, "house") + house.solid = True + house.render_layer = 2 # Top layer + houses.append(house) + self.objects.append(house) + + # Create paths from house to well + path_tiles = self.create_path( + (house_x, house_y), (center_x, center_y) + ) + self.objects.extend(path_tiles) + + # Add decorative elements around house + self.add_house_decorations(house_x, house_y) + + # Add NPC + self.add_house_npc(house_x, house_y) + break + + attempts += 1 + + return houses + + def add_house_decorations(self, house_x, house_y): + """Add decorative elements around a house""" + for _ in range(3): + attempts = 0 + while attempts < 5: + dx = random.randint(-25, 25) + dy = random.randint(-25, 25) + dec_x = house_x + dx + dec_y = house_y + dy + + if self.is_position_valid(dec_x, dec_y, 5): + if random.random() < 0.5: + self.objects.append(WorldObject(dec_x, dec_y, "flower")) + else: + self.objects.append(WorldObject(dec_x, dec_y, "berry_bush")) + break + attempts += 1 + + def add_house_npc(self, house_x, house_y): + """Add an NPC near a house in a valid position""" + # Always try to place NPC on the path in front of the house + attempts = 0 + while attempts < 30: # More attempts + # Try to place NPC on the path side of the house + angle = random.uniform(0, 2 * math.pi) + distance = random.randint(40, 60) # Much larger distance from house + + npc_x = house_x + math.cos(angle) * distance + npc_y = house_y + math.sin(angle) * distance + + # More thorough position validation + valid_position = ( + 0 <= npc_x <= self.size + and 0 <= npc_y <= self.size + and + # Check for path nearby (NPCs prefer to stand near paths) + any( + math.sqrt((obj.x - npc_x) ** 2 + (obj.y - npc_y) ** 2) < 30 + for obj in self.objects + if getattr(obj, "is_path", False) + ) + and + # Ensure no collision with solid objects + not any( + math.sqrt((obj.x - npc_x) ** 2 + (obj.y - npc_y) ** 2) < 30 + for obj in self.objects + if getattr(obj, "solid", False) + ) + ) + + if valid_position: + npc = NPC(npc_x, npc_y, f"Villager_{len(self.npcs)}") + npc.home_x = house_x + npc.home_y = house_y + self.npcs.append(npc) + logger.info(f"Created NPC {npc.name} at ({npc_x:.2f}, {npc_y:.2f})") + return True + + attempts += 1 + + logger.warning( + f"Failed to place NPC for house at ({house_x:.2f}, {house_y:.2f})" + ) + return False + + def create_water_body(self, x, y, size): + """Create a water body using tiles""" + water_tiles = [] + tile_size = 20 + + for i in range(-size, size + 1): + for j in range(-size, size + 1): + # Create circular-ish water body + if (i * i + j * j) <= size * size: + water_x = x + i * tile_size + water_y = y + j * tile_size + + if self.is_position_valid(water_x, water_y, tile_size / 2): + water = WorldObject(water_x, water_y, "water") + water.is_water = True + water_tiles.append(water) + + return water_tiles + + def create_river(self, start_x, start_y, length, width=30): + """Generate a meandering river using rectangular tiles""" + river_tiles = [] + current_x, current_y = start_x, start_y + angle = random.uniform(0, 2 * math.pi) + tile_size = 20 # Size of each water tile + + for _ in range(length): + # Meander the river + angle += random.uniform(-0.2, 0.2) + + # Create main river tiles (rectangular pattern) + for w in range(-width // 2, width // 2, tile_size): + perpendicular = angle + math.pi / 2 + offset_x = math.cos(perpendicular) * w + offset_y = math.sin(perpendicular) * w + + water = WorldObject(current_x + offset_x, current_y + offset_y, "water") + water.render_layer = 0 + water.is_water = True + water.solid = True + water.width = tile_size # Add width for rectangular rendering + water.height = tile_size # Add height for rectangular rendering + river_tiles.append(water) + + # Move to next position + current_x += math.cos(angle) * ( + tile_size / 2 + ) # Overlap slightly for continuity + current_y += math.sin(angle) * (tile_size / 2) + + # Add riverbank decoration + if random.random() < 0.1: + side = random.choice([-1, 1]) + bank_x = current_x + math.cos(angle + math.pi / 2) * width * side + bank_y = current_y + math.sin(angle + math.pi / 2) * width * side + + decor = WorldObject( + bank_x, bank_y, random.choice(["tall_grass", "flower"]) + ) + decor.render_layer = 1 + river_tiles.append(decor) + + return river_tiles + + def create_forest(self, center_x, center_y, radius): + """Generate a forest area""" + forest_objects = [] + num_trees = int(radius * radius / 1000) # Scale number of trees with area + + for _ in range(num_trees): + angle = random.uniform(0, 2 * math.pi) + distance = random.uniform(0, radius) + tree_x = center_x + math.cos(angle) * distance + tree_y = center_y + math.sin(angle) * distance + + if self.is_position_valid(tree_x, tree_y, 15): + tree = WorldObject(tree_x, tree_y, "tree") + tree.render_layer = 2 + tree.solid = True + forest_objects.append(tree) + + # Add forest floor decoration + if random.random() < 0.3: + decor_x = tree_x + random.uniform(-20, 20) + decor_y = tree_y + random.uniform(-20, 20) + decor = WorldObject( + decor_x, + decor_y, + random.choice(["mushroom", "tall_grass", "flower"]), + ) + decor.render_layer = 1 + forest_objects.append(decor) + + return forest_objects + + def generate_world(self): + self.objects = [] + self.npcs = [] + self.village_centers = [] + + # Generate rivers first + num_rivers = random.randint(2, 4) + for _ in range(num_rivers): + start_x = random.randint(0, self.size) + start_y = random.randint(0, self.size) + river_tiles = self.create_river( + start_x, start_y, length=random.randint(30, 50) + ) + self.objects.extend(river_tiles) + + # Generate forests + num_forests = random.randint(4, 8) + for _ in range(num_forests): + forest_x = random.randint(200, self.size - 200) + forest_y = random.randint(200, self.size - 200) + + # Check if position is valid (not in water) + if not any( + obj.is_water + for obj in self.objects + if math.sqrt((obj.x - forest_x) ** 2 + (obj.y - forest_y) ** 2) < 100 + ): + forest = self.create_forest( + forest_x, forest_y, random.randint(150, 300) + ) + self.objects.extend(forest) + + # Generate villages with proper spacing + num_villages = random.randint(3, 5) + min_village_distance = 400 + + for i in range(num_villages): + attempts = 0 + while attempts < 50: + center_x = random.randint(300, self.size - 300) + center_y = random.randint(300, self.size - 300) + + # Check if position is valid (not in water or forest) + if ( + not any( + obj.is_water + for obj in self.objects + if math.sqrt((obj.x - center_x) ** 2 + (obj.y - center_y) ** 2) + < 200 + ) + and not any( + obj.type == "tree" + for obj in self.objects + if math.sqrt((obj.x - center_x) ** 2 + (obj.y - center_y) ** 2) + < 150 + ) + and ( + not self.village_centers + or all( + math.sqrt((x - center_x) ** 2 + (y - center_y) ** 2) + > min_village_distance + for x, y in self.village_centers + ) + ) + ): + + self.village_centers.append((center_x, center_y)) + break + attempts += 1 + + # Generate paths between villages (avoiding water) + for i in range(len(self.village_centers)): + for j in range(i + 1, len(self.village_centers)): + path_tiles = self.create_path( + self.village_centers[i], self.village_centers[j] + ) + self.objects.extend(path_tiles) + + # Generate villages + for center_x, center_y in self.village_centers: + self.generate_village(center_x, center_y, random.randint(80, 120)) + + # Sort objects by render layer + self.objects.sort(key=lambda obj: getattr(obj, "render_layer", 1)) + + def create_path(self, start, end): + """Create a path between two points using rectangular tiles""" + path_tiles = [] + dx = end[0] - start[0] + dy = end[1] - start[1] + distance = math.sqrt(dx * dx + dy * dy) + tile_size = 20 + steps = int(distance / (tile_size / 2)) # Overlap tiles slightly for continuity + + # Add some natural curve to the path + curve_strength = random.uniform(0.1, 0.3) + mid_point = ( + (start[0] + end[0]) / 2 + random.randint(-100, 100) * curve_strength, + (start[1] + end[1]) / 2 + random.randint(-100, 100) * curve_strength, + ) + + # Create main path tiles + for i in range(steps + 1): + t = i / steps + # Quadratic Bezier curve + x = (1 - t) ** 2 * start[0] + 2 * (1 - t) * t * mid_point[0] + t**2 * end[0] + y = (1 - t) ** 2 * start[1] + 2 * (1 - t) * t * mid_point[1] + t**2 * end[1] + + path = WorldObject(x, y, "path") + path.render_layer = 0 # Bottom layer + path.is_path = True + path.solid = False # Paths are walkable + path_tiles.append(path) + + # Add path borders (decorative) + if random.random() < 0.05: # Reduced frequency of decorations + offset = random.randint(-15, 15) + if random.random() < 0.5: + flower = WorldObject(x + offset, y + offset, "flower") + flower.render_layer = 1 + path_tiles.append(flower) + + return path_tiles + + def create_village_paths(self, houses, well): + """Create paths connecting houses to the central well""" + for house in houses: + path_tiles = self.create_path((house.x, house.y), (well.x, well.y)) + self.objects.extend(path_tiles) + + def find_valid_spawn(self, x, y, radius=15, max_attempts=100): + """Find a nearby valid spawn point that doesn't collide with solids""" + original_x, original_y = x, y + attempt = 0 + + while attempt < max_attempts: + # Try the current position + if not self.check_collision(x, y, radius): + return x, y + + # Spiral out from original position + angle = 2 * math.pi * attempt / max_attempts + distance = (attempt / max_attempts) * 200 # Max 200 pixels from original + x = original_x + math.cos(angle) * distance + y = original_y + math.sin(angle) * distance + + attempt += 1 + + # If no valid position found, try a completely random position + for _ in range(max_attempts): + x = random.randint(radius, self.size - radius) + y = random.randint(radius, self.size - radius) + if not self.check_collision(x, y, radius): + return x, y + + logger.warning("Could not find valid spawn point!") + return original_x, original_y # Return original as last resort + + def generate_npcs(self): + """Generate NPCs in valid positions near village centers""" + for village_x, village_y in self.village_centers: + num_npcs = random.randint(3, 6) + for _ in range(num_npcs): + base_x = village_x + random.randint(-100, 100) + base_y = village_y + random.randint(-100, 100) + # Find valid spawn point near the intended position + x, y = self.find_valid_spawn(base_x, base_y) + npc = NPC(x, y, NameGenerator.generate_name()) + self.npcs.append(npc) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..15a12f6 --- /dev/null +++ b/uv.lock @@ -0,0 +1,366 @@ +version = 1 +requires-python = ">=3.11" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "certifi" +version = "2024.12.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/82/08f8c936781f67d9e6b9eeb8a0c8b4e406136ea4c3d1f89a5db71d42e0e6/httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2", size = 144189 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", size = 76395 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "lmmrpg" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "noise" }, + { name = "numpy" }, + { name = "ollama" }, + { name = "pygame" }, + { name = "python-dotenv" }, + { name = "requests" }, +] + +[package.metadata] +requires-dist = [ + { name = "noise", specifier = ">=1.2.2" }, + { name = "numpy", specifier = ">=2.2.1" }, + { name = "ollama", specifier = ">=0.4.5" }, + { name = "pygame", specifier = ">=2.6.1" }, + { name = "python-dotenv", specifier = ">=1.0.1" }, + { name = "requests", specifier = ">=2.32.3" }, +] + +[[package]] +name = "noise" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/29/bb830ee6d934311e17a7a4fa1368faf3e73fbb09c0d80fc44e41828df177/noise-1.2.2.tar.gz", hash = "sha256:57a2797436574391ff63a111e852e53a4164ecd81ad23639641743cd1a209b65", size = 125615 } + +[[package]] +name = "numpy" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/fdbf6a7871703df6160b5cf3dd774074b086d278172285c52c2758b76305/numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918", size = 20227662 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/14/645887347124e101d983e1daf95b48dc3e136bf8525cb4257bf9eab1b768/numpy-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484", size = 21217379 }, + { url = "https://files.pythonhosted.org/packages/9f/fd/2279000cf29f58ccfd3778cbf4670dfe3f7ce772df5e198c5abe9e88b7d7/numpy-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7", size = 14388520 }, + { url = "https://files.pythonhosted.org/packages/58/b0/034eb5d5ba12d66ab658ff3455a31f20add0b78df8203c6a7451bd1bee21/numpy-2.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb", size = 5389286 }, + { url = "https://files.pythonhosted.org/packages/5d/69/6f3cccde92e82e7835fdb475c2bf439761cbf8a1daa7c07338e1e132dfec/numpy-2.2.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5", size = 6930345 }, + { url = "https://files.pythonhosted.org/packages/d1/72/1cd38e91ab563e67f584293fcc6aca855c9ae46dba42e6b5ff4600022899/numpy-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73", size = 14335748 }, + { url = "https://files.pythonhosted.org/packages/f2/d4/f999444e86986f3533e7151c272bd8186c55dda554284def18557e013a2a/numpy-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591", size = 16391057 }, + { url = "https://files.pythonhosted.org/packages/99/7b/85cef6a3ae1b19542b7afd97d0b296526b6ef9e3c43ea0c4d9c4404fb2d0/numpy-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8", size = 15556943 }, + { url = "https://files.pythonhosted.org/packages/69/7e/b83cc884c3508e91af78760f6b17ab46ad649831b1fa35acb3eb26d9e6d2/numpy-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0", size = 18180785 }, + { url = "https://files.pythonhosted.org/packages/b2/9f/eb4a9a38867de059dcd4b6e18d47c3867fbd3795d4c9557bb49278f94087/numpy-2.2.1-cp311-cp311-win32.whl", hash = "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd", size = 6568983 }, + { url = "https://files.pythonhosted.org/packages/6d/1e/be3b9f3073da2f8c7fa361fcdc231b548266b0781029fdbaf75eeab997fd/numpy-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16", size = 12917260 }, + { url = "https://files.pythonhosted.org/packages/62/12/b928871c570d4a87ab13d2cc19f8817f17e340d5481621930e76b80ffb7d/numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab", size = 20909861 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/59df91ae1d8ad7c5e03efd63fd785dec62d96b0fe56d1f9ab600b55009af/numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa", size = 14095776 }, + { url = "https://files.pythonhosted.org/packages/af/4e/8ed5868efc8e601fb69419644a280e9c482b75691466b73bfaab7d86922c/numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315", size = 5126239 }, + { url = "https://files.pythonhosted.org/packages/1a/74/dd0bbe650d7bc0014b051f092f2de65e34a8155aabb1287698919d124d7f/numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355", size = 6659296 }, + { url = "https://files.pythonhosted.org/packages/7f/11/4ebd7a3f4a655764dc98481f97bd0a662fb340d1001be6050606be13e162/numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7", size = 14047121 }, + { url = "https://files.pythonhosted.org/packages/7f/a7/c1f1d978166eb6b98ad009503e4d93a8c1962d0eb14a885c352ee0276a54/numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d", size = 16096599 }, + { url = "https://files.pythonhosted.org/packages/3d/6d/0e22afd5fcbb4d8d0091f3f46bf4e8906399c458d4293da23292c0ba5022/numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51", size = 15243932 }, + { url = "https://files.pythonhosted.org/packages/03/39/e4e5832820131ba424092b9610d996b37e5557180f8e2d6aebb05c31ae54/numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046", size = 17861032 }, + { url = "https://files.pythonhosted.org/packages/5f/8a/3794313acbf5e70df2d5c7d2aba8718676f8d054a05abe59e48417fb2981/numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2", size = 6274018 }, + { url = "https://files.pythonhosted.org/packages/17/c1/c31d3637f2641e25c7a19adf2ae822fdaf4ddd198b05d79a92a9ce7cb63e/numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8", size = 12613843 }, + { url = "https://files.pythonhosted.org/packages/20/d6/91a26e671c396e0c10e327b763485ee295f5a5a7a48c553f18417e5a0ed5/numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780", size = 20896464 }, + { url = "https://files.pythonhosted.org/packages/8c/40/5792ccccd91d45e87d9e00033abc4f6ca8a828467b193f711139ff1f1cd9/numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821", size = 14111350 }, + { url = "https://files.pythonhosted.org/packages/c0/2a/fb0a27f846cb857cef0c4c92bef89f133a3a1abb4e16bba1c4dace2e9b49/numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e", size = 5111629 }, + { url = "https://files.pythonhosted.org/packages/eb/e5/8e81bb9d84db88b047baf4e8b681a3e48d6390bc4d4e4453eca428ecbb49/numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348", size = 6645865 }, + { url = "https://files.pythonhosted.org/packages/7a/1a/a90ceb191dd2f9e2897c69dde93ccc2d57dd21ce2acbd7b0333e8eea4e8d/numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59", size = 14043508 }, + { url = "https://files.pythonhosted.org/packages/f1/5a/e572284c86a59dec0871a49cd4e5351e20b9c751399d5f1d79628c0542cb/numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af", size = 16094100 }, + { url = "https://files.pythonhosted.org/packages/0c/2c/a79d24f364788386d85899dd280a94f30b0950be4b4a545f4fa4ed1d4ca7/numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51", size = 15239691 }, + { url = "https://files.pythonhosted.org/packages/cf/79/1e20fd1c9ce5a932111f964b544facc5bb9bde7865f5b42f00b4a6a9192b/numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716", size = 17856571 }, + { url = "https://files.pythonhosted.org/packages/be/5b/cc155e107f75d694f562bdc84a26cc930569f3dfdfbccb3420b626065777/numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e", size = 6270841 }, + { url = "https://files.pythonhosted.org/packages/44/be/0e5cd009d2162e4138d79a5afb3b5d2341f0fe4777ab6e675aa3d4a42e21/numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60", size = 12606618 }, + { url = "https://files.pythonhosted.org/packages/a8/87/04ddf02dd86fb17c7485a5f87b605c4437966d53de1e3745d450343a6f56/numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e", size = 20921004 }, + { url = "https://files.pythonhosted.org/packages/6e/3e/d0e9e32ab14005425d180ef950badf31b862f3839c5b927796648b11f88a/numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712", size = 14119910 }, + { url = "https://files.pythonhosted.org/packages/b5/5b/aa2d1905b04a8fb681e08742bb79a7bddfc160c7ce8e1ff6d5c821be0236/numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008", size = 5153612 }, + { url = "https://files.pythonhosted.org/packages/ce/35/6831808028df0648d9b43c5df7e1051129aa0d562525bacb70019c5f5030/numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84", size = 6668401 }, + { url = "https://files.pythonhosted.org/packages/b1/38/10ef509ad63a5946cc042f98d838daebfe7eaf45b9daaf13df2086b15ff9/numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631", size = 14014198 }, + { url = "https://files.pythonhosted.org/packages/df/f8/c80968ae01df23e249ee0a4487fae55a4c0fe2f838dfe9cc907aa8aea0fa/numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d", size = 16076211 }, + { url = "https://files.pythonhosted.org/packages/09/69/05c169376016a0b614b432967ac46ff14269eaffab80040ec03ae1ae8e2c/numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5", size = 15220266 }, + { url = "https://files.pythonhosted.org/packages/f1/ff/94a4ce67ea909f41cf7ea712aebbe832dc67decad22944a1020bb398a5ee/numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71", size = 17852844 }, + { url = "https://files.pythonhosted.org/packages/46/72/8a5dbce4020dfc595592333ef2fbb0a187d084ca243b67766d29d03e0096/numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2", size = 6326007 }, + { url = "https://files.pythonhosted.org/packages/7b/9c/4fce9cf39dde2562584e4cfd351a0140240f82c0e3569ce25a250f47037d/numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268", size = 12693107 }, +] + +[[package]] +name = "ollama" +version = "0.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/fd/a130173a62fd6dc7f7875919593b1e7a47bf3870a913c35d51ea013cfe41/ollama-0.4.5.tar.gz", hash = "sha256:e7fb71a99147046d028ab8b75e51e09437099aea6f8f9a0d91a71f787e97439e", size = 13104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/71/44e508b6be7cc12efc498217bf74f443dbc1a31b145c87421d20fe61b70b/ollama-0.4.5-py3-none-any.whl", hash = "sha256:74936de89a41c87c9745f09f2e1db964b4783002188ac21241bfab747f46d925", size = 13205 }, +] + +[[package]] +name = "pydantic" +version = "2.10.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/c7/ca334c2ef6f2e046b1144fe4bb2a5da8a4c574e7f2ebf7e16b34a6a2fa92/pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff", size = 761287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/26/82663c79010b28eddf29dcdd0ea723439535fa917fce5905885c0e9ba562/pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53", size = 431426 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pygame" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/cc/08bba60f00541f62aaa252ce0cfbd60aebd04616c0b9574f755b583e45ae/pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f", size = 14808125 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/ca/8f367cb9fe734c4f6f6400e045593beea2635cd736158f9fabf58ee14e3c/pygame-2.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20349195326a5e82a16e351ed93465a7845a7e2a9af55b7bc1b2110ea3e344e1", size = 13113753 }, + { url = "https://files.pythonhosted.org/packages/83/47/6edf2f890139616b3219be9cfcc8f0cb8f42eb15efd59597927e390538cb/pygame-2.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3935459109da4bb0b3901da9904f0a3e52028a3332a355d298b1673a334cf21", size = 12378146 }, + { url = "https://files.pythonhosted.org/packages/00/9e/0d8aa8cf93db2d2ee38ebaf1c7b61d0df36ded27eb726221719c150c673d/pygame-2.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31dbdb5d0217f32764797d21c2752e258e5fb7e895326538d82b5f75a0cd856", size = 13611760 }, + { url = "https://files.pythonhosted.org/packages/d7/9e/d06adaa5cc65876bcd7a24f59f67e07f7e4194e6298130024ed3fb22c456/pygame-2.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:173badf82fa198e6888017bea40f511cb28e69ecdd5a72b214e81e4dcd66c3b1", size = 14298054 }, + { url = "https://files.pythonhosted.org/packages/7a/a1/9ae2852ebd3a7cc7d9ae7ff7919ab983e4a5c1b7a14e840732f23b2b48f6/pygame-2.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce8cc108b92de9b149b344ad2e25eedbe773af0dc41dfb24d1f07f679b558c60", size = 13977107 }, + { url = "https://files.pythonhosted.org/packages/31/df/6788fd2e9a864d0496a77670e44a7c012184b7a5382866ab0e60c55c0f28/pygame-2.6.1-cp311-cp311-win32.whl", hash = "sha256:811e7b925146d8149d79193652cbb83e0eca0aae66476b1cb310f0f4226b8b5c", size = 10250863 }, + { url = "https://files.pythonhosted.org/packages/d2/55/ca3eb851aeef4f6f2e98a360c201f0d00bd1ba2eb98e2c7850d80aabc526/pygame-2.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:91476902426facd4bb0dad4dc3b2573bc82c95c71b135e0daaea072ed528d299", size = 10622016 }, + { url = "https://files.pythonhosted.org/packages/92/16/2c602c332f45ff9526d61f6bd764db5096ff9035433e2172e2d2cadae8db/pygame-2.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ee7f2771f588c966fa2fa8b829be26698c9b4836f82ede5e4edc1a68594942e", size = 13118279 }, + { url = "https://files.pythonhosted.org/packages/cd/53/77ccbc384b251c6e34bfd2e734c638233922449a7844e3c7a11ef91cee39/pygame-2.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8040ea2ab18c6b255af706ec01355c8a6b08dc48d77fd4ee783f8fc46a843bf", size = 12384524 }, + { url = "https://files.pythonhosted.org/packages/06/be/3ed337583f010696c3b3435e89a74fb29d0c74d0931e8f33c0a4246307a9/pygame-2.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47a6938de93fa610accd4969e638c2aebcb29b2fca518a84c3a39d91ab47116", size = 13587123 }, + { url = "https://files.pythonhosted.org/packages/fd/ca/b015586a450db59313535662991b34d24c1f0c0dc149cc5f496573900f4e/pygame-2.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33006f784e1c7d7e466fcb61d5489da59cc5f7eb098712f792a225df1d4e229d", size = 14275532 }, + { url = "https://files.pythonhosted.org/packages/b9/f2/d31e6ad42d657af07be2ffd779190353f759a07b51232b9e1d724f2cda46/pygame-2.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1206125f14cae22c44565c9d333607f1d9f59487b1f1432945dfc809aeaa3e88", size = 13952653 }, + { url = "https://files.pythonhosted.org/packages/f3/42/8ea2a6979e6fa971702fece1747e862e2256d4a8558fe0da6364dd946c53/pygame-2.6.1-cp312-cp312-win32.whl", hash = "sha256:84fc4054e25262140d09d39e094f6880d730199710829902f0d8ceae0213379e", size = 10252421 }, + { url = "https://files.pythonhosted.org/packages/5f/90/7d766d54bb95939725e9a9361f9c06b0cfbe3fe100aa35400f0a461a278a/pygame-2.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:3a9e7396be0d9633831c3f8d5d82dd63ba373ad65599628294b7a4f8a5a01a65", size = 10624591 }, + { url = "https://files.pythonhosted.org/packages/e1/91/718acf3e2a9d08a6ddcc96bd02a6f63c99ee7ba14afeaff2a51c987df0b9/pygame-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6039f3a55d800db80e8010f387557b528d34d534435e0871326804df2a62f2", size = 13090765 }, + { url = "https://files.pythonhosted.org/packages/0e/c6/9cb315de851a7682d9c7568a41ea042ee98d668cb8deadc1dafcab6116f0/pygame-2.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a3a1288e2e9b1e5834e425bedd5ba01a3cd4902b5c2bff8ed4a740ccfe98171", size = 12381704 }, + { url = "https://files.pythonhosted.org/packages/9f/8f/617a1196e31ae3b46be6949fbaa95b8c93ce15e0544266198c2266cc1b4d/pygame-2.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27eb17e3dc9640e4b4683074f1890e2e879827447770470c2aba9f125f74510b", size = 13581091 }, + { url = "https://files.pythonhosted.org/packages/3b/87/2851a564e40a2dad353f1c6e143465d445dab18a95281f9ea458b94f3608/pygame-2.6.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1623180e70a03c4a734deb9bac50fc9c82942ae84a3a220779062128e75f3b", size = 14273844 }, + { url = "https://files.pythonhosted.org/packages/85/b5/aa23aa2e70bcba42c989c02e7228273c30f3b44b9b264abb93eaeff43ad7/pygame-2.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef07c0103d79492c21fced9ad68c11c32efa6801ca1920ebfd0f15fb46c78b1c", size = 13951197 }, + { url = "https://files.pythonhosted.org/packages/a6/06/29e939b34d3f1354738c7d201c51c250ad7abefefaf6f8332d962ff67c4b/pygame-2.6.1-cp313-cp313-win32.whl", hash = "sha256:3acd8c009317190c2bfd81db681ecef47d5eb108c2151d09596d9c7ea9df5c0e", size = 10249309 }, + { url = "https://files.pythonhosted.org/packages/7e/11/17f7f319ca91824b86557e9303e3b7a71991ef17fd45286bf47d7f0a38e6/pygame-2.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:813af4fba5d0b2cb8e58f5d95f7910295c34067dcc290d34f1be59c48bd1ea6a", size = 10620084 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +]