65 lines
1.9 KiB
GDScript
65 lines
1.9 KiB
GDScript
## 建筑管理器(Autoload 单例)。
|
|
## 负责建筑建造/升级与每日产出结算,产出直接进入 SectManager 资源。
|
|
## 本期每种建筑至多一座(面板按类型一行展示);多实例留待后续扩展。
|
|
extends Node
|
|
|
|
## 建筑列表变化时发出(建造/升级/重置)。
|
|
signal buildings_changed
|
|
|
|
## 宗门建筑列表。
|
|
var buildings: Array[Building] = []
|
|
|
|
|
|
## 挂接每日推进信号,结算建筑产出。
|
|
func _ready() -> void:
|
|
# 每日推进时结算各建筑产出
|
|
TimeSystem.day_passed.connect(_on_day_passed)
|
|
|
|
## 建造建筑:检查灵石足够 → 扣费入列。
|
|
## 同类型已存在时拒绝(本期一座一型)。
|
|
## @param type: 建筑种类
|
|
## @return 是否建造成功
|
|
func build(type: Building.Type) -> bool:
|
|
if _find(type) != null:
|
|
return false
|
|
var b := Building.new()
|
|
b.type = type
|
|
if SectManager.spirit_stones < b.get_build_cost():
|
|
return false
|
|
SectManager.remove_spirit_stones(b.get_build_cost())
|
|
buildings.append(b)
|
|
buildings_changed.emit()
|
|
return true
|
|
|
|
## 升级建筑:检查灵石足够 → 扣费提升等级。
|
|
## @param b: 要升级的建筑
|
|
## @return 是否升级成功
|
|
func upgrade(b: Building) -> bool:
|
|
if b.is_max_level() or SectManager.spirit_stones < b.get_upgrade_cost():
|
|
return false
|
|
SectManager.remove_spirit_stones(b.get_upgrade_cost())
|
|
b.level += 1
|
|
buildings_changed.emit()
|
|
return true
|
|
|
|
## 清空建筑列表(新游戏开局调用)。
|
|
func reset() -> void:
|
|
buildings.clear()
|
|
buildings_changed.emit()
|
|
|
|
## 每日结算:各建筑产出进入 SectManager 对应资源。
|
|
func _on_day_passed(_year: int, _month: int, _day: int) -> void:
|
|
for b in buildings:
|
|
match b.type:
|
|
Building.Type.MINE:
|
|
SectManager.add_spirit_stones(b.get_output())
|
|
Building.Type.FIELD:
|
|
SectManager.add_food(b.get_output())
|
|
|
|
## 查找指定类型的建筑,不存在返回 null。
|
|
func _find(type: Building.Type) -> Building:
|
|
for b in buildings:
|
|
if b.type == type:
|
|
return b
|
|
return null
|