1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-07-07 10:42:13 +08:00

refactor(wave): 重构波次生成逻辑以支持多人游戏

将波次生成逻辑拆分为数据准备和实体生成两个阶段,便于多人游戏同步
修改 Wave 类以支持实例数据复制
更新相关调用点使用新的波次生成方式
This commit is contained in:
2025-11-13 22:39:36 +08:00
parent 8ed0837c9d
commit 12191f4233
5 changed files with 40 additions and 21 deletions
+1 -1
View File
@@ -50,7 +50,7 @@ func updateValue():
countLabel.text = str(UIState.player.fields[FieldStore.Entity.FEED_COUNT_CAN_MADE] - selectedCount) countLabel.text = str(UIState.player.fields[FieldStore.Entity.FEED_COUNT_CAN_MADE] - selectedCount)
needBB.count = refreshNeedBaseballCount needBB.count = refreshNeedBaseballCount
func finish(): func finish():
Wave.next() WorldManager.rootNode.spawnWave()
UIState.closeCurrentPanel() UIState.closeCurrentPanel()
func regenerateCards(): func regenerateCards():
updateValue() updateValue()
+2 -2
View File
@@ -54,16 +54,16 @@ func rebuildAllPlayers(playerNames: Array[String]):
@rpc("any_peer") @rpc("any_peer")
func startMultiplayerGame(): func startMultiplayerGame():
MultiplayerState.isMultiplayer = true MultiplayerState.isMultiplayer = true
WorldManager.rootNode.multiplayer.multiplayer_peer = MultiplayerState.connection
MultiplayerState.playerName = playerNameInput.text MultiplayerState.playerName = playerNameInput.text
MultiplayerState.connection = multiplayer.multiplayer_peer MultiplayerState.connection = multiplayer.multiplayer_peer
WorldManager.rootNode.multiplayer.multiplayer_peer = multiplayer.multiplayer_peer
for i in getPlayerNames(): for i in getPlayerNames():
EntityBase.generatePlayer(i) EntityBase.generatePlayer(i)
UIState.closeCurrentPanel() UIState.closeCurrentPanel()
func startSingleplayerGame(): func startSingleplayerGame():
MultiplayerState.isMultiplayer = false MultiplayerState.isMultiplayer = false
EntityBase.generatePlayer(playerNameInput.text) EntityBase.generatePlayer(playerNameInput.text)
Wave.next() WorldManager.rootNode.spawnWave()
UIState.closeCurrentPanel() UIState.closeCurrentPanel()
func _ready(): func _ready():
+24 -13
View File
@@ -1,5 +1,6 @@
class_name Wave class_name Wave
# 元数据
var entity: String var entity: String
var minCount: int = 1 var minCount: int = 1
var maxCount: int = 1 var maxCount: int = 1
@@ -7,6 +8,19 @@ var isBoss: bool = false
var from: float = 0 var from: float = 0
var to: float = 0 var to: float = 0
var per: int = 0 var per: int = 0
# 实例数据
var entityPosition: Vector2
func duplicate() -> Wave:
var wave = Wave.new()
wave.entity = entity
wave.minCount = minCount
wave.maxCount = maxCount
wave.isBoss = isBoss
wave.from = from
wave.to = to
wave.per = per
return wave
static var current: int = startWith(1) static var current: int = startWith(1)
static var WAVE_NORMAL = [ static var WAVE_NORMAL = [
@@ -32,12 +46,6 @@ static var WAVE_TESTBOSS_CHICK = [
static var WAVE_EMPTY = [] static var WAVE_EMPTY = []
static var data = WAVE_NORMAL static var data = WAVE_NORMAL
static func customStart():
if false:
var furryr = EntityBase.generate(ComponentManager.getCharacter("Bear"), MathTool.randv2_range(500), true, false)
var kukemc = EntityBase.generate(ComponentManager.getCharacter("KukeMC"), MathTool.randv2_range(500), true, false)
furryr.currentFocusedBoss = kukemc
kukemc.currentFocusedBoss = furryr
static func create( static func create(
entity_: String, entity_: String,
minCount_: int = 1, minCount_: int = 1,
@@ -63,15 +71,18 @@ static func entityCountOf(wave: Wave) -> int:
else: else:
return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current))) return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current)))
return 0 return 0
static func spawn(): static func spawn() -> Array[Wave]:
var result: Array[Wave] = []
for i in range(len(data)): for i in range(len(data)):
var wave = data[i] var wave: Wave = data[i]
for j in range(entityCountOf(wave)): for j in range(entityCountOf(wave)):
EntityBase.generate(ComponentManager.getCharacter(wave.entity), MathTool.randv2_range(500), true, wave.isBoss) var currentWave = wave.duplicate()
static func next(): currentWave.entityPosition = MathTool.randv2_range(500)
if current == 0: result.append(currentWave)
customStart() return result
spawn() static func next(waves: Array[Wave]):
for wave in waves:
EntityBase.generate(ComponentManager.getCharacter(wave.entity), wave.entityPosition, true, wave.isBoss)
current += 1 current += 1
static func startWith(wave: int): static func startWith(wave: int):
return wave - 1 return wave - 1
+1 -1
View File
@@ -445,7 +445,7 @@ func enterStage(_stage: int):
func kill(): func kill():
pass pass
static func generatePlayer(playerName: String): static func generatePlayer(playerName: String) -> EntityBase:
var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true) var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true)
player.displayName = playerName player.displayName = playerName
player.name = "Player_%s" % playerName player.name = "Player_%s" % playerName
+12 -4
View File
@@ -12,10 +12,18 @@ func _ready():
ComponentManager.init() ComponentManager.init()
func _physics_process(delta): func _physics_process(delta):
runningTime += delta * 1000 runningTime += delta * 1000
if multiplayer.is_server() or not MultiplayerState.isMultiplayer: if EntityBase.mobCount() == 0 and runningTime > 1000:
if EntityBase.mobCount() == 0 and runningTime > 3000: UIState.setPanel("MakeFeed")
Wave.next()
UIState.setPanel("MakeFeed") @rpc("authority")
func nextWave(waves: Array[Wave]):
Wave.next(waves)
func spawnWave():
var waves = Wave.spawn()
nextWave(waves)
if MultiplayerState.isMultiplayer and multiplayer.is_server():
nextWave.rpc(waves)
static func getTime(): static func getTime():
return runningTime return runningTime