diff --git a/scripts/Contents/Panels/MakeFeed.gd b/scripts/Contents/Panels/MakeFeed.gd index 82c93e8..0dd10f5 100644 --- a/scripts/Contents/Panels/MakeFeed.gd +++ b/scripts/Contents/Panels/MakeFeed.gd @@ -50,7 +50,7 @@ func updateValue(): countLabel.text = str(UIState.player.fields[FieldStore.Entity.FEED_COUNT_CAN_MADE] - selectedCount) needBB.count = refreshNeedBaseballCount func finish(): - Wave.next() + WorldManager.rootNode.spawnWave() UIState.closeCurrentPanel() func regenerateCards(): updateValue() diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index db9e6d2..cb71bb9 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -54,16 +54,16 @@ func rebuildAllPlayers(playerNames: Array[String]): @rpc("any_peer") func startMultiplayerGame(): MultiplayerState.isMultiplayer = true - WorldManager.rootNode.multiplayer.multiplayer_peer = MultiplayerState.connection MultiplayerState.playerName = playerNameInput.text MultiplayerState.connection = multiplayer.multiplayer_peer + WorldManager.rootNode.multiplayer.multiplayer_peer = multiplayer.multiplayer_peer for i in getPlayerNames(): EntityBase.generatePlayer(i) UIState.closeCurrentPanel() func startSingleplayerGame(): MultiplayerState.isMultiplayer = false EntityBase.generatePlayer(playerNameInput.text) - Wave.next() + WorldManager.rootNode.spawnWave() UIState.closeCurrentPanel() func _ready(): diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index 722fe1d..9496d4c 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -1,5 +1,6 @@ class_name Wave +# 元数据 var entity: String var minCount: int = 1 var maxCount: int = 1 @@ -7,6 +8,19 @@ var isBoss: bool = false var from: float = 0 var to: float = 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 WAVE_NORMAL = [ @@ -32,12 +46,6 @@ static var WAVE_TESTBOSS_CHICK = [ static var WAVE_EMPTY = [] 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( entity_: String, minCount_: int = 1, @@ -63,15 +71,18 @@ static func entityCountOf(wave: Wave) -> int: else: return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current))) return 0 -static func spawn(): +static func spawn() -> Array[Wave]: + var result: Array[Wave] = [] for i in range(len(data)): - var wave = data[i] + var wave: Wave = data[i] for j in range(entityCountOf(wave)): - EntityBase.generate(ComponentManager.getCharacter(wave.entity), MathTool.randv2_range(500), true, wave.isBoss) -static func next(): - if current == 0: - customStart() - spawn() + var currentWave = wave.duplicate() + currentWave.entityPosition = MathTool.randv2_range(500) + result.append(currentWave) + return result +static func next(waves: Array[Wave]): + for wave in waves: + EntityBase.generate(ComponentManager.getCharacter(wave.entity), wave.entityPosition, true, wave.isBoss) current += 1 static func startWith(wave: int): return wave - 1 diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index aa7f6ef..55d6944 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -445,7 +445,7 @@ func enterStage(_stage: int): func kill(): pass -static func generatePlayer(playerName: String): +static func generatePlayer(playerName: String) -> EntityBase: var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true) player.displayName = playerName player.name = "Player_%s" % playerName diff --git a/scripts/Tools/Managers/WorldManager.gd b/scripts/Tools/Managers/WorldManager.gd index 7c4c8f4..5e2e582 100644 --- a/scripts/Tools/Managers/WorldManager.gd +++ b/scripts/Tools/Managers/WorldManager.gd @@ -12,10 +12,18 @@ func _ready(): ComponentManager.init() func _physics_process(delta): runningTime += delta * 1000 - if multiplayer.is_server() or not MultiplayerState.isMultiplayer: - if EntityBase.mobCount() == 0 and runningTime > 3000: - Wave.next() - UIState.setPanel("MakeFeed") + if EntityBase.mobCount() == 0 and runningTime > 1000: + 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(): return runningTime