made the first changes towards multiplayer working
This commit is contained in:
@ -11,9 +11,11 @@ var astar := AStar3D.new()
|
||||
@export var end : Node3D
|
||||
@export var spawner : EnemySpawner
|
||||
@export var visualized_path : VisualizedPath
|
||||
@export var tower_path : Node
|
||||
var tower_base_scene = load("res://Scenes/tower_base.tscn")
|
||||
var tower_frame_scene = load("res://Scenes/tower_frame.tscn")
|
||||
var tower_bases = []
|
||||
var wall_id = 0
|
||||
|
||||
|
||||
func toggle_point(point_id):
|
||||
@ -43,11 +45,19 @@ func networked_toggle_point(point_id):
|
||||
astar.set_point_disabled(point_id, false)
|
||||
else:
|
||||
astar.set_point_disabled(point_id, true)
|
||||
var base = tower_base_scene.instantiate()
|
||||
base.position = astar.get_point_position(point_id)
|
||||
tower_bases.append(base)
|
||||
add_child(base)
|
||||
find_path()
|
||||
if is_multiplayer_authority():
|
||||
networked_spawn_wall.rpc(astar.get_point_position(point_id), wall_id)
|
||||
wall_id += 1
|
||||
|
||||
|
||||
@rpc("reliable", "call_local")
|
||||
func networked_spawn_wall(pos : Vector3, name_id : int):
|
||||
var base = tower_base_scene.instantiate()
|
||||
base.position = pos
|
||||
base.name = "Wall" + str(name_id)
|
||||
tower_bases.append(base)
|
||||
tower_path.add_child(base)
|
||||
|
||||
|
||||
func find_path() -> bool:
|
||||
|
@ -58,13 +58,16 @@ func enemy_count_down(enemy):
|
||||
func set_upcoming_wave(value):
|
||||
var frame_count = 0
|
||||
enemy_names = []
|
||||
var wave = {}
|
||||
for index in value:
|
||||
wave[Data.enemies[index]] = value[index]
|
||||
for x in enemy_sprites.size():
|
||||
enemy_sprites[x].set_visible(false)
|
||||
enemy_counts[x].set_visible(false)
|
||||
for enemy in value:
|
||||
for enemy in wave:
|
||||
enemy_names.append(enemy.title)
|
||||
enemy_sprites[frame_count].texture = enemy.icon
|
||||
enemy_counts[frame_count].text = str(value[enemy])
|
||||
enemy_counts[frame_count].text = str(wave[enemy])
|
||||
enemy_sprites[frame_count].set_visible(true)
|
||||
enemy_counts[frame_count].set_visible(true)
|
||||
frame_count += 1
|
||||
@ -87,6 +90,8 @@ func maximise_minimap(anchor):
|
||||
minimap.offset_right = -40
|
||||
minimap_viewport.size = Vector2(1840, 1000)
|
||||
minimap_cam.size = 30
|
||||
$TextureRect3.set_visible(false)
|
||||
$Currency.set_visible(false)
|
||||
|
||||
|
||||
func minimize_minimap(anchor):
|
||||
@ -98,3 +103,5 @@ func minimize_minimap(anchor):
|
||||
minimap.offset_bottom = 256
|
||||
minimap_viewport.size = Vector2(256, 256)
|
||||
minimap_cam.size = 15
|
||||
$TextureRect3.set_visible(true)
|
||||
$Currency.set_visible(true)
|
||||
|
@ -2,5 +2,5 @@ extends StatusEffect
|
||||
class_name StatusOnFire
|
||||
|
||||
|
||||
func proc(affected, stacks, existing_effects):
|
||||
func proc(affected, stacks, _existing_effects):
|
||||
affected.damage(stats.potency * stacks)
|
||||
|
@ -1,9 +1,9 @@
|
||||
extends StatusEffect
|
||||
class_name StatusCold
|
||||
|
||||
func on_attached(affected, existing_effects):
|
||||
func on_attached(affected, _existing_effects):
|
||||
affected.movement_speed_penalty -= stats.potency
|
||||
|
||||
|
||||
func on_removed(affected, existing_effects):
|
||||
func on_removed(affected, _existing_effects):
|
||||
affected.movement_speed_penalty += stats.potency
|
||||
|
@ -7,13 +7,13 @@ var time_since_proc := 0.0
|
||||
var time_existed := 0.0
|
||||
|
||||
|
||||
func on_attached(affected, existing_effects):
|
||||
func on_attached(_affected, _existing_effects):
|
||||
pass
|
||||
|
||||
|
||||
func on_removed(affected, existing_effects):
|
||||
func on_removed(_affected, _existing_effects):
|
||||
pass
|
||||
|
||||
|
||||
func proc(affected, stacks, existing_effects):
|
||||
func proc(_affected, _stacks, _existing_effects):
|
||||
pass
|
||||
|
@ -2,5 +2,5 @@ extends StatusEffect
|
||||
class_name StatusPoison
|
||||
|
||||
|
||||
func proc(affected, stacks, existing_effects):
|
||||
func proc(affected, stacks, _existing_effects):
|
||||
affected.damage(stats.potency * stacks)
|
||||
|
@ -1,5 +1,5 @@
|
||||
extends StatusEffect
|
||||
class_name StatusRadioactive
|
||||
|
||||
func proc(affected, stacks, existing_effects):
|
||||
func proc(affected, stacks, _existing_effects):
|
||||
affected.damage(stats.potency * stacks)
|
||||
|
@ -2,9 +2,9 @@ extends StatusEffect
|
||||
class_name StatusSticky
|
||||
|
||||
|
||||
func on_attached(affected, existing_effects):
|
||||
func on_attached(affected, _existing_effects):
|
||||
affected.movement_speed_penalty -= stats.potency
|
||||
|
||||
|
||||
func on_removed(affected, existing_effects):
|
||||
func on_removed(affected, _existing_effects):
|
||||
affected.movement_speed_penalty += stats.potency
|
||||
|
@ -1,9 +1,11 @@
|
||||
extends Node3D
|
||||
class_name EnemySpawner
|
||||
|
||||
@export var own_id : int = 0
|
||||
@export var path : VisualizedPath
|
||||
@export var type : Data.EnemyType
|
||||
@export var dest : Node3D
|
||||
@export var enemy_path : Node
|
||||
|
||||
var signal_for_after_enemy_died
|
||||
var signal_for_after_enemy_reached_goal
|
||||
@ -14,6 +16,7 @@ var enemy_spawn_timers = {}
|
||||
var enemies_spawned = {}
|
||||
var enemies_to_spawn := 0
|
||||
var done_spawning = true
|
||||
var enemy_id = 0
|
||||
|
||||
@export var land_enemy_scene : PackedScene
|
||||
@export var air_enemy_scene : PackedScene
|
||||
@ -27,40 +30,59 @@ func _process(delta: float) -> void:
|
||||
for x in enemy_spawn_timers:
|
||||
if enemies_spawned[x] == current_wave[x]:
|
||||
continue
|
||||
|
||||
var enemy_stats = x
|
||||
enemy_spawn_timers[x] += delta
|
||||
|
||||
if enemy_spawn_timers[x] >= enemy_stats.spawn_cooldown:
|
||||
if type == Data.EnemyType.LAND:
|
||||
var enemy = land_enemy_scene.instantiate() as EnemyController
|
||||
enemy.stats = enemy_stats
|
||||
enemy.died.connect(signal_for_after_enemy_died)
|
||||
enemy.reached_goal.connect(signal_for_after_enemy_reached_goal)
|
||||
enemy.movement_controller.path = path.curve
|
||||
add_child(enemy)
|
||||
enemy_spawn_timers[x] -= enemy_stats.spawn_cooldown
|
||||
signal_for_when_enemy_spawns.emit()
|
||||
if type == Data.EnemyType.AIR:
|
||||
var enemy = air_enemy_scene.instantiate() as EnemyController
|
||||
var radius = 10.0
|
||||
var random_dir = Vector3(randf_range(-1, 1), randf_range(-1, 1), randf_range(-1, 1))
|
||||
var random_pos = randf_range(0, radius) * random_dir.normalized()
|
||||
enemy.position = random_pos
|
||||
enemy.stats = enemy_stats
|
||||
enemy.died.connect(signal_for_after_enemy_died)
|
||||
enemy.reached_goal.connect(signal_for_after_enemy_reached_goal)
|
||||
enemy.movement_controller.goal = dest
|
||||
add_child(enemy)
|
||||
enemy_spawn_timers[x] -= enemy_stats.spawn_cooldown
|
||||
signal_for_when_enemy_spawns.emit()
|
||||
if is_multiplayer_authority():
|
||||
if type == Data.EnemyType.LAND:
|
||||
networked_spawn_land_enemy.rpc(var_to_str(enemy_stats), own_id, enemy_id)
|
||||
if type == Data.EnemyType.AIR:
|
||||
var radius = 10.0
|
||||
var random_dir = Vector3(randf_range(-1, 1), randf_range(-1, 1), randf_range(-1, 1))
|
||||
var random_pos = randf_range(0, radius) * random_dir.normalized()
|
||||
networked_spawn_air_enemy.rpc(var_to_str(enemy_stats), random_pos, own_id, enemy_id)
|
||||
|
||||
enemy_spawn_timers[x] -= enemy_stats.spawn_cooldown
|
||||
signal_for_when_enemy_spawns.emit()
|
||||
enemy_id += 1
|
||||
enemies_spawned[x] += 1
|
||||
enemies_to_spawn -= 1
|
||||
|
||||
|
||||
@rpc("reliable", "call_local")
|
||||
func networked_spawn_land_enemy(enemy_stats, id1, id2):
|
||||
var enemy = land_enemy_scene.instantiate() as EnemyController
|
||||
enemy.name = str(id1) + str(id2)
|
||||
enemy.stats = str_to_var(enemy_stats)
|
||||
enemy.died.connect(signal_for_after_enemy_died)
|
||||
enemy.reached_goal.connect(signal_for_after_enemy_reached_goal)
|
||||
enemy.movement_controller.path = path.curve
|
||||
enemy.position = global_position
|
||||
enemy_path.add_child(enemy)
|
||||
|
||||
|
||||
@rpc("reliable", "call_local")
|
||||
func networked_spawn_air_enemy(enemy_stats, pos, id1, id2):
|
||||
var enemy = air_enemy_scene.instantiate() as EnemyController
|
||||
enemy.name = str(id1) + str(id2)
|
||||
enemy.position = pos + global_position
|
||||
enemy.stats = str_to_var(enemy_stats)
|
||||
enemy.died.connect(signal_for_after_enemy_died)
|
||||
enemy.reached_goal.connect(signal_for_after_enemy_reached_goal)
|
||||
enemy.movement_controller.goal = dest
|
||||
enemy_path.add_child(enemy)
|
||||
|
||||
|
||||
func spawn_wave(value):
|
||||
var relevant_enemies = {}
|
||||
for x in value:
|
||||
var wave = {}
|
||||
for index in value:
|
||||
wave[Data.enemies[index]] = value[index]
|
||||
for x in wave:
|
||||
if x.target_type == type:
|
||||
relevant_enemies[x] = value[x]
|
||||
relevant_enemies[x] = wave[x]
|
||||
current_wave = relevant_enemies
|
||||
enemies_to_spawn = 0
|
||||
enemy_spawn_timers = {}
|
||||
|
@ -81,8 +81,6 @@ func ready_player(_value):
|
||||
for key in connected_players_nodes:
|
||||
if connected_players_nodes[key].ready_state == false:
|
||||
return
|
||||
for key in connected_players_nodes:
|
||||
connected_players_nodes[key].ready_state = false
|
||||
spawn_enemy_wave()
|
||||
|
||||
|
||||
@ -96,9 +94,18 @@ func spawn_enemy_wave():
|
||||
|
||||
|
||||
func set_upcoming_wave():
|
||||
var spawn_power = WaveManager.calculate_spawn_power(wave + 1, connected_players_nodes.size())
|
||||
upcoming_wave = WaveManager.generate_wave(spawn_power, level.enemy_pool)
|
||||
pot = 6 + (spawn_power / 100)
|
||||
if is_multiplayer_authority():
|
||||
var spawn_power = WaveManager.calculate_spawn_power(wave + 1, connected_players_nodes.size())
|
||||
var new_wave = WaveManager.generate_wave(spawn_power, level.enemy_pool)
|
||||
networked_set_upcoming_wave.rpc(new_wave, 6 + (spawn_power / 100))
|
||||
|
||||
|
||||
@rpc("reliable", "call_local")
|
||||
func networked_set_upcoming_wave(wave_dict, coins):
|
||||
upcoming_wave = wave_dict
|
||||
pot = coins
|
||||
for key in connected_players_nodes:
|
||||
connected_players_nodes[key].hud.set_upcoming_wave(upcoming_wave)
|
||||
|
||||
|
||||
func increase_enemy_count():
|
||||
@ -137,13 +144,11 @@ func damage_goal(enemy, penalty):
|
||||
|
||||
func end_wave():
|
||||
for peer_id in connected_players_nodes:
|
||||
connected_players_nodes[peer_id].currency += pot / connected_players_nodes.size()
|
||||
connected_players_nodes[peer_id].currency += ceili(pot / connected_players_nodes.size())
|
||||
connected_players_nodes[peer_id].ready_state = false
|
||||
level.a_star_graph_3d.visualized_path.enable_visualization()
|
||||
wave_finished.emit(wave)
|
||||
set_upcoming_wave()
|
||||
if wave < 20:
|
||||
for key in connected_players_nodes:
|
||||
connected_players_nodes[key].hud.set_upcoming_wave(upcoming_wave)
|
||||
|
||||
|
||||
func remove_player(peer_id):
|
||||
@ -158,7 +163,6 @@ func start_game():
|
||||
set_upcoming_wave()
|
||||
for peer_id in connected_players_nodes:
|
||||
connected_players_nodes[peer_id].currency = 20
|
||||
connected_players_nodes[peer_id].hud.set_upcoming_wave(upcoming_wave)
|
||||
game_started.emit()
|
||||
|
||||
|
||||
|
@ -10,10 +10,10 @@ signal health_changed(health)
|
||||
var current_health
|
||||
|
||||
func take_damage(damage):
|
||||
var marker = damage_particle_scene.instantiate()
|
||||
get_tree().root.add_child(marker)
|
||||
marker.set_number(damage)
|
||||
marker.position = get_parent().global_position + Vector3.UP
|
||||
#var marker = damage_particle_scene.instantiate()
|
||||
#get_tree().root.add_child(marker)
|
||||
#marker.set_number(damage)
|
||||
#marker.position = get_parent().global_position + Vector3.UP
|
||||
|
||||
current_health -= damage
|
||||
health_changed.emit(current_health)
|
||||
@ -25,3 +25,4 @@ func heal_damage(healing):
|
||||
current_health += healing
|
||||
if current_health > max_health:
|
||||
current_health = max_health
|
||||
health_changed.emit(current_health)
|
||||
|
@ -5,9 +5,4 @@ signal took_damage(amount)
|
||||
|
||||
|
||||
func damage(amount):
|
||||
networked_damage.rpc(amount)
|
||||
|
||||
|
||||
@rpc("any_peer","call_local")
|
||||
func networked_damage(amount):
|
||||
took_damage.emit(amount)
|
||||
|
@ -9,7 +9,7 @@ var contents : Array[Card] = []
|
||||
var selected_index := 0
|
||||
var selected_item : Card :
|
||||
get:
|
||||
return contents[selected_index]
|
||||
return contents[selected_index] if contents.size() > 0 else null
|
||||
set(_value):
|
||||
return
|
||||
|
||||
@ -44,6 +44,7 @@ func increment_selected():
|
||||
selected_index += 1
|
||||
if selected_index >= contents.size():
|
||||
selected_index = 0
|
||||
networked_set_selected.rpc(selected_index)
|
||||
|
||||
|
||||
func decrement_selected():
|
||||
@ -51,16 +52,22 @@ func decrement_selected():
|
||||
selected_index -= 1
|
||||
if selected_index < 0:
|
||||
selected_index = contents.size() - 1
|
||||
networked_set_selected.rpc(selected_index)
|
||||
|
||||
|
||||
@rpc("reliable")
|
||||
@rpc("reliable", "any_peer")
|
||||
func networked_add(value):
|
||||
contents.append(Data.cards[value])
|
||||
item_added.emit(Data.cards[value])
|
||||
|
||||
|
||||
@rpc("reliable")
|
||||
@rpc("reliable", "any_peer")
|
||||
func networked_remove_at(value):
|
||||
var item = contents[value]
|
||||
contents.remove_at(value)
|
||||
item_removed.emit(item)
|
||||
|
||||
|
||||
@rpc("reliable", "any_peer")
|
||||
func networked_set_selected(value):
|
||||
selected_index = value
|
||||
|
@ -17,17 +17,12 @@ var has_card : bool :
|
||||
func add_card(card: Card) -> bool:
|
||||
var result = inventory.add(card)
|
||||
if result:
|
||||
tower = card.turret.instantiate() as Tower
|
||||
tower.stats = card.tower_stats
|
||||
minimap_icon.modulate = Color.RED
|
||||
add_child(tower)
|
||||
networked_spawn_tower.rpc()
|
||||
return result
|
||||
|
||||
|
||||
func remove_card() -> Card:
|
||||
tower.queue_free()
|
||||
tower = null
|
||||
minimap_icon.modulate = Color.GREEN
|
||||
networked_remove_tower.rpc()
|
||||
return inventory.remove()
|
||||
|
||||
|
||||
@ -37,3 +32,19 @@ func set_material(value: StandardMaterial3D):
|
||||
|
||||
func toggle_collision():
|
||||
collider.disabled = !collider.disabled
|
||||
|
||||
|
||||
@rpc("reliable", "call_local", "any_peer")
|
||||
func networked_spawn_tower():
|
||||
tower = inventory.selected_item.turret.instantiate() as Tower
|
||||
tower.stats = inventory.selected_item.tower_stats
|
||||
tower.name = "tower"
|
||||
minimap_icon.modulate = Color.RED
|
||||
add_child(tower)
|
||||
|
||||
|
||||
@rpc("reliable", "call_local", "any_peer")
|
||||
func networked_remove_tower():
|
||||
tower.queue_free()
|
||||
tower = null
|
||||
minimap_icon.modulate = Color.GREEN
|
||||
|
@ -15,7 +15,7 @@ func generate_wave(spawn_power : int, spawn_pool : Array[Enemy]) -> Dictionary:
|
||||
var choice = enemy_choices.pick_random()
|
||||
enemy_choices.erase(choice)
|
||||
if sp_allotment / choice.spawn_power > 0:
|
||||
wave[choice] = sp_allotment / choice.spawn_power
|
||||
wave[Data.enemies.find(choice)] = sp_allotment / choice.spawn_power
|
||||
#sp_used += wave[choice] * choice.spawn_power
|
||||
#print("tried to generate wave with " + str(spawn_power) + " spawn power, used " + str(sp_used))
|
||||
return wave
|
||||
|
Reference in New Issue
Block a user