EG/plugins/user/vegetation_ecosystem/seasons/seasonal_effects.py
2025-10-30 11:46:41 +08:00

772 lines
26 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
季节效应系统
负责模拟季节变化对植被和生态系统的影响
"""
import time
from typing import Dict, Any, List, Optional
import math
import random
class SeasonalEffects:
"""
季节效应系统
负责模拟季节变化对植被生长、动物行为和生态系统动态的影响
"""
def __init__(self, plugin):
"""
初始化季节效应系统
Args:
plugin: 植被和生态系统插件实例
"""
self.plugin = plugin
self.enabled = False
self.initialized = False
# 季节定义
self.seasons = {
'spring': {
'name': '春季',
'description': '万物复苏的季节',
'temperature_modifier': 10.0, # 温度修正
'humidity_modifier': 15.0, # 湿度修正
'light_duration': 13.0, # 光照时长(小时)
'growth_factor': 1.5, # 生长因子
'reproduction_factor': 2.0, # 繁殖因子
'color_tint': (1.0, 1.0, 0.8), # 颜色色调
'duration': 90 # 持续天数
},
'summer': {
'name': '夏季',
'description': '炎热的季节',
'temperature_modifier': 20.0,
'humidity_modifier': 10.0,
'light_duration': 15.0,
'growth_factor': 1.2,
'reproduction_factor': 1.5,
'color_tint': (1.0, 0.9, 0.7),
'duration': 90
},
'autumn': {
'name': '秋季',
'description': '收获的季节',
'temperature_modifier': 5.0,
'humidity_modifier': 5.0,
'light_duration': 11.0,
'growth_factor': 0.5,
'reproduction_factor': 0.8,
'color_tint': (1.0, 0.7, 0.5),
'duration': 90
},
'winter': {
'name': '冬季',
'description': '寒冷的季节',
'temperature_modifier': -10.0,
'humidity_modifier': 0.0,
'light_duration': 9.0,
'growth_factor': 0.1,
'reproduction_factor': 0.2,
'color_tint': (0.8, 0.8, 1.0),
'duration': 90
}
}
# 当前季节状态
self.current_season = 'spring'
self.season_progress = 0.0 # 季节进度 (0.0-1.0)
self.season_day = 0 # 当前季节中的天数
self.total_days = 0 # 总天数
# 季节过渡参数
self.transition_params = {
'duration': 7.0, # 过渡持续时间(天)
'transition_active': False,
'transition_progress': 0.0,
'target_season': 'spring'
}
# 季节性事件
self.seasonal_events = {
'spring': ['花开', '鸟类迁徙回归', '动物繁殖季开始'],
'summer': ['高温', '干旱', '虫害高发'],
'autumn': ['叶色变化', '果实成熟', '动物准备过冬'],
'winter': ['降雪', '动物冬眠', '植物休眠']
}
# 季节性动物行为
self.animal_behaviors = {
'migration': {
'spring': 0.8, # 春季迁徙概率
'summer': 0.1,
'autumn': 0.9,
'winter': 0.2
},
'hibernation': {
'spring': 0.1,
'summer': 0.05,
'autumn': 0.3,
'winter': 0.9
},
'breeding': {
'spring': 0.9,
'summer': 0.7,
'autumn': 0.3,
'winter': 0.1
}
}
# 季节性植被变化
self.vegetation_changes = {
'leaf_color': {
'spring': (0.3, 0.7, 0.3), # 绿色
'summer': (0.2, 0.8, 0.2),
'autumn': (0.8, 0.5, 0.2), # 橙色
'winter': (0.7, 0.7, 0.7) # 灰色
},
'flowering': {
'spring': 0.8,
'summer': 0.4,
'autumn': 0.1,
'winter': 0.0
},
'fruiting': {
'spring': 0.0,
'summer': 0.2,
'autumn': 0.9,
'winter': 0.0
}
}
# 时间配置
self.time_config = {
'day_length': 24.0, # 一天长度(小时)
'simulation_speed': 1.0, # 模拟速度
'current_time': 0.0 # 当前时间
}
# 统计信息
self.season_stats = {
'seasons_passed': 0,
'transitions_completed': 0,
'events_triggered': 0,
'total_simulation_time': 0.0
}
print("✓ 季节效应系统已创建")
def initialize(self) -> bool:
"""
初始化季节效应系统
Returns:
是否初始化成功
"""
try:
self.initialized = True
print("✓ 季节效应系统初始化完成")
return True
except Exception as e:
print(f"✗ 季节效应系统初始化失败: {e}")
import traceback
traceback.print_exc()
return False
def enable(self) -> bool:
"""
启用季节效应系统
Returns:
是否启用成功
"""
try:
if not self.initialized:
print("✗ 季节效应系统未初始化")
return False
self.enabled = True
print("✓ 季节效应系统已启用")
return True
except Exception as e:
print(f"✗ 季节效应系统启用失败: {e}")
import traceback
traceback.print_exc()
return False
def disable(self):
"""禁用季节效应系统"""
try:
self.enabled = False
print("✓ 季节效应系统已禁用")
except Exception as e:
print(f"✗ 季节效应系统禁用失败: {e}")
import traceback
traceback.print_exc()
def finalize(self):
"""清理季节效应系统资源"""
try:
self.disable()
self.initialized = False
print("✓ 季节效应系统资源已清理")
except Exception as e:
print(f"✗ 季节效应系统资源清理失败: {e}")
import traceback
traceback.print_exc()
def update(self, dt: float):
"""
更新季节效应系统状态
Args:
dt: 时间增量
"""
try:
if not self.enabled:
return
# 更新时间
self.time_config['current_time'] += dt * self.time_config['simulation_speed']
# 更新季节进度
self._update_season_progress(dt)
# 更新季节过渡
if self.transition_params['transition_active']:
self._update_season_transition(dt)
# 更新统计信息
self.season_stats['total_simulation_time'] += dt
except Exception as e:
print(f"✗ 季节效应系统更新失败: {e}")
import traceback
traceback.print_exc()
def _update_season_progress(self, dt: float):
"""
更新季节进度
Args:
dt: 时间增量
"""
try:
# 将时间增量转换为小时
hours_passed = dt / 3600 * self.time_config['simulation_speed']
# 更新当前季节中的天数
self.season_day += hours_passed / 24.0
self.total_days += hours_passed / 24.0
# 更新季节进度
current_season_info = self.seasons[self.current_season]
self.season_progress = min(1.0, self.season_day / current_season_info['duration'])
# 检查是否需要切换季节
if self.season_day >= current_season_info['duration']:
self._transition_to_next_season()
except Exception as e:
print(f"✗ 季节进度更新失败: {e}")
def _transition_to_next_season(self):
"""过渡到下一个季节"""
try:
# 季节顺序
season_order = ['spring', 'summer', 'autumn', 'winter']
# 找到当前季节在顺序中的位置
current_index = season_order.index(self.current_season)
# 计算下一个季节
next_index = (current_index + 1) % len(season_order)
next_season = season_order[next_index]
# 开始季节过渡
self.start_season_transition(next_season)
except Exception as e:
print(f"✗ 季节切换失败: {e}")
def start_season_transition(self, target_season: str):
"""
开始季节过渡
Args:
target_season: 目标季节
"""
try:
if target_season not in self.seasons:
print(f"✗ 无效的目标季节: {target_season}")
return
if target_season == self.current_season:
return # 季节未变化
self.transition_params['target_season'] = target_season
self.transition_params['transition_active'] = True
self.transition_params['transition_progress'] = 0.0
print(f"✓ 开始季节过渡: {self.seasons[self.current_season]['name']} -> {self.seasons[target_season]['name']}")
except Exception as e:
print(f"✗ 季节过渡启动失败: {e}")
def _update_season_transition(self, dt: float):
"""
更新季节过渡
Args:
dt: 时间增量
"""
try:
if not self.transition_params['transition_active']:
return
# 计算过渡进度增量
transition_duration = self.transition_params['duration']
if transition_duration > 0:
progress_delta = dt / (transition_duration * 86400) * self.time_config['simulation_speed']
self.transition_params['transition_progress'] += progress_delta
# 检查过渡是否完成
if self.transition_params['transition_progress'] >= 1.0:
self._complete_season_transition()
except Exception as e:
print(f"✗ 季节过渡更新失败: {e}")
def _complete_season_transition(self):
"""完成季节过渡"""
try:
# 更新当前季节
self.current_season = self.transition_params['target_season']
# 重置季节内天数
self.season_day = 0
self.season_progress = 0.0
# 重置过渡状态
self.transition_params['transition_active'] = False
self.transition_params['transition_progress'] = 0.0
# 更新统计信息
self.season_stats['seasons_passed'] += 1
self.season_stats['transitions_completed'] += 1
print(f"✓ 季节过渡完成: 现在是{self.seasons[self.current_season]['name']}")
# 触发季节事件
self._trigger_seasonal_events()
# 通知其他系统季节已变化
self._notify_systems_of_season_change()
except Exception as e:
print(f"✗ 季节过渡完成失败: {e}")
def _trigger_seasonal_events(self):
"""触发季节性事件"""
try:
events = self.seasonal_events.get(self.current_season, [])
if events:
# 随机触发一个事件
event = random.choice(events)
print(f"✓ 季节性事件触发: {event}")
self.season_stats['events_triggered'] += 1
except Exception as e:
print(f"✗ 季节性事件触发失败: {e}")
def _notify_systems_of_season_change(self):
"""通知其他系统季节已变化"""
try:
# 通知植被管理器
if self.plugin.vegetation_manager:
# 更新环境因子
current_season_info = self.seasons[self.current_season]
environment_factors = {
'temperature': 20.0 + current_season_info['temperature_modifier'],
'humidity': 50.0 + current_season_info['humidity_modifier']
}
self.plugin.vegetation_manager.update_environment_factors(environment_factors)
except Exception as e:
print(f"✗ 系统通知失败: {e}")
def get_current_season(self) -> str:
"""
获取当前季节
Returns:
当前季节名称
"""
return self.current_season
def get_season_info(self, season: str = None) -> Optional[Dict[str, Any]]:
"""
获取季节信息
Args:
season: 季节名称如果为None则返回当前季节信息
Returns:
季节信息字典或None
"""
try:
if season is None:
season = self.current_season
if season in self.seasons:
return self.seasons[season].copy()
return None
except Exception as e:
print(f"✗ 季节信息获取失败: {e}")
return None
def get_season_progress(self) -> float:
"""
获取季节进度
Returns:
季节进度 (0.0-1.0)
"""
return self.season_progress
def get_season_day(self) -> int:
"""
获取当前季节中的天数
Returns:
当前季节中的天数
"""
return int(self.season_day)
def set_current_season(self, season: str):
"""
设置当前季节
Args:
season: 季节名称
"""
try:
if season in self.seasons:
self.current_season = season
self.season_day = 0
self.season_progress = 0.0
print(f"✓ 当前季节设置为: {self.seasons[season]['name']}")
else:
print(f"✗ 无效的季节: {season}")
except Exception as e:
print(f"✗ 当前季节设置失败: {e}")
def set_season_duration(self, season: str, duration: int):
"""
设置季节持续时间
Args:
season: 季节名称
duration: 持续时间(天)
"""
try:
if season in self.seasons:
self.seasons[season]['duration'] = max(1, duration)
print(f"{self.seasons[season]['name']} 持续时间设置为: {duration}")
else:
print(f"✗ 无效的季节: {season}")
except Exception as e:
print(f"✗ 季节持续时间设置失败: {e}")
def get_interpolated_season_params(self) -> Dict[str, Any]:
"""
获取插值后的季节参数(考虑季节过渡)
Returns:
插值后的季节参数字典
"""
try:
if not self.transition_params['transition_active'] or self.transition_params['transition_progress'] <= 0.0:
# 没有过渡,返回当前季节参数
return self.seasons[self.current_season].copy()
if self.transition_params['transition_progress'] >= 1.0:
# 过渡完成,返回目标季节参数
return self.seasons[self.transition_params['target_season']].copy()
# 进行插值计算
current_params = self.seasons[self.current_season]
target_params = self.seasons[self.transition_params['target_season']]
interpolated_params = {}
# 对数值参数进行线性插值
numeric_params = [
'temperature_modifier', 'humidity_modifier', 'light_duration',
'growth_factor', 'reproduction_factor'
]
for param in numeric_params:
current_value = current_params[param]
target_value = target_params[param]
interpolated_value = current_value + (target_value - current_value) * self.transition_params['transition_progress']
interpolated_params[param] = interpolated_value
# 对颜色进行插值
current_color = current_params['color_tint']
target_color = target_params['color_tint']
interpolated_color = tuple(
current_color[i] + (target_color[i] - current_color[i]) * self.transition_params['transition_progress']
for i in range(3)
)
interpolated_params['color_tint'] = interpolated_color
# 复制非数值参数
interpolated_params['name'] = f"{current_params['name']}{target_params['name']}"
interpolated_params['description'] = f"过渡季节 ({self.transition_params['transition_progress']*100:.1f}%)"
interpolated_params['duration'] = target_params['duration']
return interpolated_params
except Exception as e:
print(f"✗ 插值季节参数获取失败: {e}")
return self.seasons[self.current_season].copy()
def get_seasonal_events(self, season: str = None) -> List[str]:
"""
获取季节性事件
Args:
season: 季节名称如果为None则返回当前季节事件
Returns:
季节性事件列表
"""
try:
if season is None:
season = self.current_season
return self.seasonal_events.get(season, []).copy()
except Exception as e:
print(f"✗ 季节性事件获取失败: {e}")
return []
def add_seasonal_event(self, season: str, event: str):
"""
添加季节性事件
Args:
season: 季节名称
event: 事件名称
"""
try:
if season in self.seasonal_events:
if event not in self.seasonal_events[season]:
self.seasonal_events[season].append(event)
print(f"✓ 季节性事件已添加: {season} - {event}")
else:
print(f"✗ 事件已存在: {event}")
else:
print(f"✗ 无效的季节: {season}")
except Exception as e:
print(f"✗ 季节性事件添加失败: {e}")
def remove_seasonal_event(self, season: str, event: str):
"""
移除季节性事件
Args:
season: 季节名称
event: 事件名称
"""
try:
if season in self.seasonal_events and event in self.seasonal_events[season]:
self.seasonal_events[season].remove(event)
print(f"✓ 季节性事件已移除: {season} - {event}")
else:
print(f"✗ 事件不存在: {season} - {event}")
except Exception as e:
print(f"✗ 季节性事件移除失败: {e}")
def get_animal_behavior_factor(self, behavior: str) -> float:
"""
获取动物行为因子
Args:
behavior: 行为类型
Returns:
行为因子 (0.0-1.0)
"""
try:
if behavior in self.animal_behaviors and self.current_season in self.animal_behaviors[behavior]:
return self.animal_behaviors[behavior][self.current_season]
return 0.5
except Exception as e:
print(f"✗ 动物行为因子获取失败: {e}")
return 0.5
def get_vegetation_change_factor(self, change_type: str) -> float:
"""
获取植被变化因子
Args:
change_type: 变化类型
Returns:
变化因子 (0.0-1.0)
"""
try:
if change_type in self.vegetation_changes and self.current_season in self.vegetation_changes[change_type]:
if change_type == 'leaf_color':
# 颜色返回RGB元组
return self.vegetation_changes[change_type][self.current_season]
else:
# 其他因子返回数值
return self.vegetation_changes[change_type][self.current_season]
return 0.5 if change_type != 'leaf_color' else (0.5, 0.5, 0.5)
except Exception as e:
print(f"✗ 植被变化因子获取失败: {e}")
return 0.5 if change_type != 'leaf_color' else (0.5, 0.5, 0.5)
def set_time_config(self, config: Dict[str, float]):
"""
设置时间配置
Args:
config: 时间配置字典
"""
try:
self.time_config.update(config)
print(f"✓ 时间配置已更新: {self.time_config}")
except Exception as e:
print(f"✗ 时间配置更新失败: {e}")
def get_time_config(self) -> Dict[str, float]:
"""
获取时间配置
Returns:
时间配置字典
"""
return self.time_config.copy()
def set_transition_duration(self, duration: float):
"""
设置过渡持续时间
Args:
duration: 持续时间(天)
"""
try:
self.transition_params['duration'] = max(0.1, duration)
print(f"✓ 过渡持续时间设置为: {duration}")
except Exception as e:
print(f"✗ 过渡持续时间设置失败: {e}")
def get_transition_progress(self) -> float:
"""
获取季节过渡进度
Returns:
过渡进度 (0.0-1.0)
"""
return self.transition_params['transition_progress']
def is_transition_active(self) -> bool:
"""
检查是否正在进行季节过渡
Returns:
是否正在进行季节过渡
"""
return self.transition_params['transition_active']
def get_season_list(self) -> List[str]:
"""
获取所有季节列表
Returns:
季节名称列表
"""
return list(self.seasons.keys())
def get_season_name(self, season: str) -> str:
"""
获取季节显示名称
Args:
season: 季节名称
Returns:
季节显示名称
"""
if season in self.seasons:
return self.seasons[season]['name']
return season
def get_season_stats(self) -> Dict[str, Any]:
"""
获取季节统计信息
Returns:
统计信息字典
"""
return self.season_stats.copy()
def reset_season_stats(self):
"""重置季节统计信息"""
try:
self.season_stats = {
'seasons_passed': 0,
'transitions_completed': 0,
'events_triggered': 0,
'total_simulation_time': 0.0
}
print("✓ 季节统计信息已重置")
except Exception as e:
print(f"✗ 季节统计信息重置失败: {e}")
def fast_forward_to_season(self, target_season: str):
"""
快进到目标季节
Args:
target_season: 目标季节
"""
try:
if target_season not in self.seasons:
print(f"✗ 无效的目标季节: {target_season}")
return
# 直接设置季节
self.current_season = target_season
self.season_day = 0
self.season_progress = 0.0
# 重置过渡状态
self.transition_params['transition_active'] = False
self.transition_params['transition_progress'] = 0.0
print(f"✓ 快进到季节: {self.seasons[target_season]['name']}")
# 触发季节事件
self._trigger_seasonal_events()
# 通知其他系统
self._notify_systems_of_season_change()
except Exception as e:
print(f"✗ 快进到季节失败: {e}")