added wave viewer which required adding determinism to wave generation
This commit is contained in:
@@ -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))
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)))
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user