创建新工程

This commit is contained in:
moyin
2025-12-05 19:00:14 +08:00
commit ff4fa5fffd
227 changed files with 32804 additions and 0 deletions

View File

@@ -0,0 +1,288 @@
extends Node
class_name CharacterStatusManager
## 角色状态和心情管理器
## 处理角色的状态变化、心情系统和相关UI
# 状态持续时间(秒)
const STATUS_DURATIONS = {
"busy": 300, # 5分钟
"away": 900, # 15分钟
}
# 心情自动变化的触发条件
const MOOD_TRIGGERS = {
"achievement_earned": "happy",
"level_up": "excited",
"long_idle": "tired",
"social_interaction": "happy",
"problem_solved": "excited"
}
# 心情持续时间(秒)
const MOOD_DURATION = 600 # 10分钟
# 当前管理的角色数据
var character_data: Dictionary = {}
var status_timer: Timer
var mood_timer: Timer
# 信号
signal status_changed(old_status: String, new_status: String)
signal mood_changed(old_mood: String, new_mood: String)
signal status_expired(status: String)
func _ready():
"""初始化状态管理器"""
_setup_timers()
## 设置定时器
func _setup_timers():
"""设置状态和心情定时器"""
# 状态定时器
status_timer = Timer.new()
status_timer.one_shot = true
status_timer.timeout.connect(_on_status_timer_timeout)
add_child(status_timer)
# 心情定时器
mood_timer = Timer.new()
mood_timer.one_shot = true
mood_timer.timeout.connect(_on_mood_timer_timeout)
add_child(mood_timer)
## 设置角色数据
func set_character_data(data: Dictionary):
"""
设置要管理的角色数据
@param data: 角色数据字典
"""
character_data = data
# 检查当前状态是否需要定时器
var current_status = data.get(CharacterData.FIELD_STATUS, "active")
if current_status in STATUS_DURATIONS:
var duration = STATUS_DURATIONS[current_status]
status_timer.start(duration)
## 设置角色状态
func set_status(new_status: String, auto_revert: bool = true):
"""
设置角色状态
@param new_status: 新状态
@param auto_revert: 是否自动恢复到active状态
"""
if character_data.is_empty():
push_error("No character data set")
return
var old_status = character_data.get(CharacterData.FIELD_STATUS, "active")
if old_status == new_status:
return
# 更新状态
CharacterData.set_status(character_data, new_status)
status_changed.emit(old_status, new_status)
# 停止现有定时器
status_timer.stop()
# 如果需要自动恢复且状态有持续时间
if auto_revert and new_status in STATUS_DURATIONS:
var duration = STATUS_DURATIONS[new_status]
status_timer.start(duration)
print("Character status changed from %s to %s" % [old_status, new_status])
## 设置角色心情
func set_mood(new_mood: String, duration: float = MOOD_DURATION):
"""
设置角色心情
@param new_mood: 新心情
@param duration: 心情持续时间(秒)
"""
if character_data.is_empty():
push_error("No character data set")
return
var old_mood = character_data.get(CharacterData.FIELD_MOOD, "neutral")
if old_mood == new_mood:
return
# 更新心情
CharacterData.set_mood(character_data, new_mood)
mood_changed.emit(old_mood, new_mood)
# 设置心情恢复定时器
mood_timer.stop()
if new_mood != "neutral" and duration > 0:
mood_timer.start(duration)
print("Character mood changed from %s to %s" % [old_mood, new_mood])
## 触发心情变化
func trigger_mood_change(trigger: String):
"""
根据触发条件改变心情
@param trigger: 触发条件
"""
if trigger in MOOD_TRIGGERS:
var new_mood = MOOD_TRIGGERS[trigger]
set_mood(new_mood)
## 获取当前状态
func get_current_status() -> String:
"""获取当前状态"""
return character_data.get(CharacterData.FIELD_STATUS, "active")
## 获取当前心情
func get_current_mood() -> String:
"""获取当前心情"""
return character_data.get(CharacterData.FIELD_MOOD, "neutral")
## 获取状态显示文本
func get_status_display_text() -> String:
"""获取状态的显示文本"""
var status = get_current_status()
var mood = get_current_mood()
var status_text = ""
match status:
"active":
status_text = "在线"
"busy":
status_text = "忙碌"
"away":
status_text = "离开"
"offline":
status_text = "离线"
_:
status_text = status
var personalization = preload("res://scripts/CharacterPersonalization.gd")
var mood_emoji = personalization.get_mood_emoji(mood)
return "%s %s" % [status_text, mood_emoji]
## 获取状态颜色
func get_status_color() -> Color:
"""获取状态对应的颜色"""
var status = get_current_status()
var personalization = preload("res://scripts/CharacterPersonalization.gd")
return personalization.get_status_color(status)
## 状态定时器超时
func _on_status_timer_timeout():
"""状态定时器超时恢复到active状态"""
var current_status = get_current_status()
set_status("active", false)
status_expired.emit(current_status)
## 心情定时器超时
func _on_mood_timer_timeout():
"""心情定时器超时恢复到neutral心情"""
set_mood("neutral", 0)
## 处理活动事件
func handle_activity_event(event_type: String, _data: Dictionary = {}):
"""
处理角色活动事件,可能触发状态或心情变化
@param event_type: 事件类型
@param _data: 事件数据(暂未使用)
"""
match event_type:
"dialogue_started":
# 开始对话时设为忙碌
set_status("busy")
trigger_mood_change("social_interaction")
"dialogue_ended":
# 对话结束后恢复活跃
set_status("active")
"achievement_earned":
trigger_mood_change("achievement_earned")
"level_up":
trigger_mood_change("level_up")
"idle_too_long":
trigger_mood_change("long_idle")
"problem_solved":
trigger_mood_change("problem_solved")
"manual_away":
# 手动设置离开状态
set_status("away")
"manual_busy":
# 手动设置忙碌状态
set_status("busy")
## 创建状态选择菜单
func create_status_menu() -> PopupMenu:
"""
创建状态选择菜单
@return: PopupMenu节点
"""
var menu = PopupMenu.new()
menu.add_item("🟢 在线", 0)
menu.add_item("🟡 忙碌", 1)
menu.add_item("🟠 离开", 2)
menu.id_pressed.connect(_on_status_menu_selected)
return menu
## 状态菜单选择回调
func _on_status_menu_selected(id: int):
"""状态菜单选择回调"""
match id:
0:
set_status("active", false)
1:
handle_activity_event("manual_busy")
2:
handle_activity_event("manual_away")
## 创建心情选择菜单
func create_mood_menu() -> PopupMenu:
"""
创建心情选择菜单
@return: PopupMenu节点
"""
var menu = PopupMenu.new()
menu.add_item("😊 开心", 0)
menu.add_item("😢 难过", 1)
menu.add_item("🤩 兴奋", 2)
menu.add_item("😴 疲惫", 3)
menu.add_item("😐 平静", 4)
menu.id_pressed.connect(_on_mood_menu_selected)
return menu
## 心情菜单选择回调
func _on_mood_menu_selected(id: int):
"""心情菜单选择回调"""
var moods = ["happy", "sad", "excited", "tired", "neutral"]
if id >= 0 and id < moods.size():
set_mood(moods[id])
## 获取状态统计信息
func get_status_stats() -> Dictionary:
"""
获取状态统计信息
@return: 统计信息字典
"""
return {
"current_status": get_current_status(),
"current_mood": get_current_mood(),
"status_display": get_status_display_text(),
"status_color": get_status_color(),
"has_active_timer": not status_timer.is_stopped(),
"timer_remaining": status_timer.time_left if not status_timer.is_stopped() else 0.0
}