创建新工程
This commit is contained in:
288
scripts/CharacterStatusManager.gd
Normal file
288
scripts/CharacterStatusManager.gd
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user