""" Sample Weather Plugin for MMORPG Adds weather effects and seasonal changes to the game world """ from src.interfaces.plugin_interfaces import IWeatherPlugin, PluginMetadata, PluginType from typing import Dict, List, Any import random import time class WeatherPlugin(IWeatherPlugin): """Plugin that adds dynamic weather system to the game.""" def __init__(self): self._metadata = PluginMetadata( id="weather_system", name="Weather System", version="1.0.0", author="MMORPG Dev Team", description="Adds dynamic weather effects and seasonal changes", plugin_type=PluginType.SERVICE, dependencies=[], config={ "weather_change_interval": 300, "enable_seasons": True, "weather_effects_enabled": True } ) self._enabled = False self._weather_state = { "current_weather": "sunny", "temperature": 20, "season": "spring", "last_change": time.time() } self._weather_types = [ "sunny", "cloudy", "rainy", "stormy", "foggy", "snowy" ] @property def metadata(self) -> PluginMetadata: return self._metadata def initialize(self, context: Dict[str, Any]) -> bool: """Initialize the weather plugin.""" try: self._config = self._metadata.config self._enabled = True print("Weather Plugin initialized successfully") self._update_weather() return True except Exception as e: print(f"Failed to initialize Weather Plugin: {e}") return False def shutdown(self) -> bool: """Shutdown the weather plugin.""" try: self._enabled = False print("Weather Plugin shut down") return True except Exception as e: print(f"Error shutting down Weather Plugin: {e}") return False def get_status(self) -> Dict[str, Any]: """Get weather plugin status.""" return { "enabled": self._enabled, "current_weather": self._weather_state["current_weather"], "temperature": self._weather_state["temperature"], "season": self._weather_state["season"], "effects_enabled": self._config.get("weather_effects_enabled", True) if hasattr(self, '_config') else True } def get_weather_info(self) -> Dict[str, Any]: """Get current weather information.""" if not self._enabled: return {} return { "weather": self._weather_state["current_weather"], "temperature": self._weather_state["temperature"], "season": self._weather_state["season"], "description": self._get_weather_description() } def update_weather(self) -> Dict[str, Any]: """Update weather conditions.""" if not self._enabled: return {} current_time = time.time() interval = self._config.get("weather_change_interval", 300) if current_time - self._weather_state["last_change"] > interval: self._update_weather() self._weather_state["last_change"] = current_time return self.get_weather_info() def apply_weather_effects(self, player_data: Dict[str, Any]) -> Dict[str, Any]: """Apply weather effects to player.""" if not self._enabled or not self._config.get("weather_effects_enabled", True): return player_data effects = player_data.copy() weather_modifier = self._get_weather_modifier() if "stats" not in effects: effects["stats"] = {} effects["stats"]["weather_modifier"] = weather_modifier effects["weather_description"] = self._get_weather_description() return effects def _update_weather(self): """Internal method to update weather conditions.""" self._weather_state["current_weather"] = random.choice(self._weather_types) base_temp = self._get_seasonal_base_temperature() weather_modifier = self._get_weather_temperature_modifier() self._weather_state["temperature"] = base_temp + weather_modifier + random.randint(-5, 5) if self._config.get("enable_seasons", True): seasons = ["spring", "summer", "autumn", "winter"] if random.random() < 0.01: current_season_idx = seasons.index(self._weather_state["season"]) self._weather_state["season"] = seasons[(current_season_idx + 1) % len(seasons)] def _get_seasonal_base_temperature(self) -> int: """Get base temperature for current season.""" season_temps = { "spring": 15, "summer": 25, "autumn": 10, "winter": 0 } return season_temps.get(self._weather_state["season"], 15) def _get_weather_temperature_modifier(self) -> int: """Get temperature modifier based on weather.""" weather_mods = { "sunny": 5, "cloudy": 0, "rainy": -3, "stormy": -5, "foggy": -2, "snowy": -10 } return weather_mods.get(self._weather_state["current_weather"], 0) def _get_weather_description(self) -> str: """Get descriptive text for current weather.""" weather = self._weather_state["current_weather"] temp = self._weather_state["temperature"] season = self._weather_state["season"] descriptions = { "sunny": f"Bright and sunny {season} day ({temp} degrees C)", "cloudy": f"Overcast {season} sky ({temp} degrees C)", "rainy": f"Light rain falling in {season} ({temp} degrees C)", "stormy": f"Thunderstorm brewing this {season} ({temp} degrees C)", "foggy": f"Thick fog blankets the {season} landscape ({temp} degrees C)", "snowy": f"Snow falling gently in {season} ({temp} degrees C)" } return descriptions.get(weather, f"Unknown weather in {season} ({temp} degrees C)") def _get_weather_modifier(self) -> Dict[str, float]: """Get weather-based stat modifiers.""" weather = self._weather_state["current_weather"] modifiers = { "sunny": {"movement_speed": 1.1, "visibility": 1.0, "morale": 1.1}, "cloudy": {"movement_speed": 1.0, "visibility": 0.95, "morale": 0.95}, "rainy": {"movement_speed": 0.8, "visibility": 0.9, "morale": 0.9}, "stormy": {"movement_speed": 0.6, "visibility": 0.7, "morale": 0.8}, "foggy": {"movement_speed": 0.9, "visibility": 0.5, "morale": 0.85}, "snowy": {"movement_speed": 0.7, "visibility": 0.8, "morale": 0.9} } return modifiers.get(weather, {"movement_speed": 1.0, "visibility": 1.0, "morale": 1.0}) def create_plugin(): """Factory function to create the plugin instance.""" return WeatherPlugin()