added wave viewer which required adding determinism to wave generation

This commit is contained in:
2025-11-06 22:16:59 +11:00
parent 19b5589b27
commit 3cb37faf4b
38 changed files with 438 additions and 312 deletions

View File

@@ -16,7 +16,7 @@ signal switch_to_main_menu
var root_scene: Node
var level_scene: PackedScene = load("res://Worlds/GreenPlanet/Levels/Bridge/bridge.tscn")
var player_scene: PackedScene = load("res://PCs/hero.tscn")
var game_end_scene: PackedScene = load("res://Scenes/Menus/GameEndScreen/game_end_screen.tscn")
var game_end_scene: PackedScene = load("res://UI/Menus/GameEndScreen/game_end_screen.tscn")
var connected_players_nodes: Dictionary = {}
var game_active: bool = false
var gamemode: GameMode = null
@@ -157,11 +157,37 @@ func spawn_enemy_wave() -> void:
wave_started.emit()
func pre_generate_waves() -> Array[Wave]:
var wave_list: Array[Wave] = []
for i: int in range(wave, wave_limit + 1):
var spawn_power: int = WaveManager.calculate_spawn_power(i, connected_players_nodes.size())
var generated_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool)
wave_list.append(generated_wave)
return wave_list
func set_wave_to_spawners(wave_thing: Wave, wave_number: int) -> void:
var spawners: Array[EnemySpawner] = level.enemy_spawns
var ground_spawners: Array[EnemySpawner] = []
var air_spawners: Array[EnemySpawner] = []
for spawner: EnemySpawner in spawners:
if spawner.type == Data.EnemyType.LAND:
ground_spawners.append(spawner)
else:
air_spawners.append(spawner)
for card: EnemyCard in wave_thing.enemy_groups:
if card.enemy.target_type == Data.EnemyType.LAND:
ground_spawners[NoiseRandom.randi_in_range(wave_number, 0, ground_spawners.size() - 1)].add_card(card)
else:
air_spawners[NoiseRandom.randi_in_range(wave_number, 0, air_spawners.size() - 1)].add_card(card)
func set_upcoming_wave() -> void:
if is_multiplayer_authority():
var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size())
#var new_wave: Dictionary = WaveManager.generate_wave(spawn_power, level.enemy_pool)
var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool, level.enemy_spawns)
var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool)
set_wave_to_spawners(new_wave, wave)
temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size()))
#networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 70.0))

View File

@@ -2,10 +2,9 @@ class_name Lobby
extends Control
@export var character_select_screen: PackedScene
#@export var scoreboard: Scoreboard
@export var chatbox: Chatbox
#@export var ready_button: Button
@export var audio_player: AudioStreamPlayer
@export var chatbox_scene: PackedScene
var game_manager: GameManager
var gamemode: GameMode = null
@@ -14,19 +13,19 @@ var connected_players_profiles: Dictionary = {}
var enet_peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new()
func setup_the_ui() -> void:
#scoreboard.unready_all_players()
#scoreboard.set_visible(true)
loadout_editor.set_visible(true)
chatbox = chatbox_scene.instantiate()
game_manager.UILayer.add_child(chatbox)
chatbox.set_visible(true)
chatbox.game_manager = game_manager
#ready_button.set_visible(true)
chatbox.anchor_bottom = 0.98
chatbox.anchor_left = 0.02
chatbox.anchor_top = 0.7
chatbox.anchor_right = 0.4
func start_game() -> void:
game_manager.setup()
#scoreboard.set_visible(false)
loadout_editor.queue_free()
#ready_button.set_visible(false)
game_manager.connected_player_profiles = connected_players_profiles
game_manager.start()

View File

@@ -12,7 +12,7 @@ static func set_seed(value: int) -> void:
noise.fractal_gain = 0.1
noise.seed = value
## output_end is inclusive
static func randi_in_range(sample: float, output_start: int, output_end: int) -> int:
return floori(remap(noise.get_noise_1d(sample), -1.0, 1.0, float(output_start), float(output_end + 1)))

View File

@@ -17,4 +17,3 @@ func setup_game() -> void:
Data.player_profile.display_name_changed.connect(chatbox.change_username)
loadout_editor.hero_selected.connect(Data.player_profile.set_preferred_class)
connected_players_profiles[1] = Data.player_profile
setup_the_ui()

View File

@@ -25,17 +25,16 @@ static func calculate_pot(wave_number: int, number_of_players: int) -> int:
## Uses a spawn power budget to "buy" cards of enemies at random selection from
## the given spawn pool, returns the resulting wave but also assigns the cards
## among the given set of enemy spawners
static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy], spawners: Array[EnemySpawner]) -> Wave:
static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy]) -> Wave:
var wave: Wave = Wave.new()
var points: int = int(spawn_power / 10.0)
#print("Generating wave with " + str(points) + " points to spend")
while points > 0:
var new_card: EnemyCard = EnemyCard.new()
#First, choose an enemy at random
#TODO: Use seeded random
new_card.enemy = spawn_pool.pick_random()
new_card.enemy = spawn_pool[NoiseRandom.randi_in_range(spawn_power, 0, spawn_pool.size() - 1)]
#Next, we have to figure out if we can actually buy that enemy
#and, if not, then we have to pick a different enemy, repeat until
@@ -71,7 +70,7 @@ static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy], spawners:
#Now that we know which rarities we could afford, lets just choose a
#random one
var chosen_rarity: int = randi_range(0, highest_rarity)
var chosen_rarity: int = NoiseRandom.randi_in_range(spawn_power, 0, highest_rarity)
new_card.rarity = chosen_rarity as Data.Rarity
#Add that new enemy to the wave and spend the points!
@@ -86,18 +85,4 @@ static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy], spawners:
points -= new_card.enemy.epic_cost
elif chosen_rarity == Data.Rarity.LEGENDARY:
points -= new_card.enemy.legendary_cost
var ground_spawners: Array[EnemySpawner] = []
var air_spawners: Array[EnemySpawner] = []
for spawner: EnemySpawner in spawners:
if spawner.type == Data.EnemyType.LAND:
ground_spawners.append(spawner)
else:
air_spawners.append(spawner)
for card: EnemyCard in wave.enemy_groups:
if card.enemy.target_type == Data.EnemyType.LAND:
#TODO: make this use determinisic noise rng
ground_spawners.pick_random().add_card(card)
else:
air_spawners.pick_random().add_card(card)
return wave