enemy movement should be deterministic now

This commit is contained in:
2026-02-11 05:37:55 +11:00
parent b72b05f33b
commit a2dc8f1630
15 changed files with 75 additions and 45 deletions

View File

@@ -8,7 +8,6 @@ var speed: float = 0.0
func _ready() -> void:
#TODO: make deterministic random
var variance: float = randf_range(-1.0, 1.0)
var variance: float = NoiseRandom.randf_in_range(character.name.to_int(), -1.0, 1.0)
var variance_max: float = 0.03 # Enemy speed can vary by 3% from their base speed
speed = character.stats.movement_speed + (variance * variance_max)

View File

@@ -1,8 +1,7 @@
class_name PathingController
extends EnemyMovement
#var path: Curve3D
#var path_progress: float = 0.0
var random_points_generated: int
var flow_field: FlowField
var next_node: FlowNodeData :
get():
@@ -13,9 +12,12 @@ var next_node: FlowNodeData :
return
var found_point: bool = false
while !found_point:
#TODO: make deterministic random
var x: float = randf_range(-1, 1)
var y: float = randf_range(-1, 1)
random_points_generated += 1
var sample: int = random_points_generated + character.name.to_int()
var r: float = 1.0 * sqrt(NoiseRandom.randf_in_range(sample, 0.0, 1.0))
var theta: float = NoiseRandom.randf_in_range(sample * 4, 0.0, 1.0) * 2.0 * PI
var x: float = r * cos(theta)
var y: float = r * sin(theta)
if Vector3(next_node.position.x + x, next_node.position.y, next_node.position.z + y).distance_to(next_node.position) <= 1.0:
found_point = true
next_pos = Vector3(next_node.position.x + x, next_node.position.y, next_node.position.z + y)

View File

@@ -5,7 +5,7 @@ enum Faction {
GENERIC = 0,
ENGINEER = 1,
MAGE = 2,
}
}
@export var cost: int
@export var rarity: Data.Rarity

View File

@@ -27,6 +27,17 @@ var mage_cards_bought: int = 0
var mage_unlocked: bool = 0
func get_unlocked_classes() -> Array[HeroClass]:
var arr: Array[HeroClass] = []
for character: HeroClass in Data.characters:
if character.faction == Card.Faction.ENGINEER:
arr.append(Data.characters)
#TODO: When mage cards are good to show up in the shop, replace false with mage_unlocked
if false and character.faction == Card.Faction.MAGE:
arr.append(Data.characters)
return arr
func check_high_score(level_title: String, wave_reached: int, endless: bool) -> void:
if !endless_high_scores.has(level_title):
endless_high_scores[level_title] = 0

View File

@@ -206,19 +206,14 @@ func set_wave_to_spawners(wave_thing: WaveConfig, wave_number: int) -> void:
func set_upcoming_wave() -> void:
if is_multiplayer_authority():
#print(wave)
#print(level_config.waves.size())
if wave > level_config.waves.size():
#print("added new wave on top")
var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size())
var new_wave: WaveConfig = WaveManager.generate_wave(spawn_power, level.enemy_pool, level.enemy_spawns.size())
level_config.waves.append(new_wave)
if wave > level_config.waves.size():
var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size())
var new_wave: WaveConfig = WaveManager.generate_wave(spawn_power, level.enemy_pool, level.enemy_spawns.size())
level_config.waves.append(new_wave)
var new_wave: WaveConfig = get_upcoming_waves(1)[0]
#print(new_wave)
set_wave_to_spawners(new_wave, wave)
temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size()))
var new_wave: WaveConfig = get_upcoming_waves(1)[0]
set_wave_to_spawners(new_wave, wave)
temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size()))
func temp_set_upcoming_wave(new_wave: WaveConfig, coins: int) -> void:
@@ -407,15 +402,14 @@ func continue_with_game() -> void:
gamemode.endless = true
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
connected_players_nodes[multiplayer.get_unique_id()].unpause()
#TODO: This shouldn't happen. instead, the wave generator should generate level_config waves
#FIXME: this really needs to be changed because otherwise endless mode cant have shit like
#stations and shop respawns. it all needs to be part of the one system u know
set_upcoming_wave()
func quit_to_desktop() -> void:
multiplayer.multiplayer_peer.close()
multiplayer.multiplayer_peer = null
#for player: Hero in connected_players_nodes.values():
# player.queue_free()
#multiplayer.multiplayer_peer.close()
#multiplayer.multiplayer_peer = null
get_tree().quit()
@@ -424,8 +418,10 @@ func scene_switch_main_menu() -> void:
node.queue_free()
level = null
connected_players_nodes.clear()
multiplayer.multiplayer_peer.close()
multiplayer.multiplayer_peer = null
if multiplayer.multiplayer_peer:
multiplayer.multiplayer_peer.close()
multiplayer.multiplayer_peer = null
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
switch_to_main_menu.emit()

View File

@@ -87,6 +87,7 @@ func networked_ready_player(peer_id: int) -> void:
start_game = false
if start_game:
setup_game()
visible = false
func ready_player(peer_id: int = multiplayer.get_unique_id()) -> void:
@@ -99,11 +100,14 @@ func ready_player(peer_id: int = multiplayer.get_unique_id()) -> void:
start_game = false
if start_game:
setup_game()
visible = false
@rpc("any_peer", "reliable")
func networked_select_class(peer_id: int) -> void:
player_character_selected_states[connected_players_profiles[peer_id]] = true
if chatbox:
chatbox.append_message("SERVER", Color.TOMATO, connected_players_profiles[peer_id].display_name + " has chosen a class!")
var start_game: bool = true
for state: bool in player_character_selected_states.values():
if !state:
@@ -125,7 +129,6 @@ func select_class(peer_id: int = multiplayer.get_unique_id()) -> void:
func start_game() -> void:
enet_peer.refuse_new_connections = true
visible = false
super.start_game()