extends Node signal stage_state_changed(state: State) var state: State : set(value): state = value stage_state_changed.emit(value) var current_stage: Stage var player: Player: get(): return Network.get_player(multiplayer.get_unique_id()) func _ready(): pass func initialize_stage(stage: Stage): current_stage = stage func place_tower(tower: Tower): var network_id = multiplayer.get_unique_id() tower.owner_id = network_id tower.name = "Tower@" + str(network_id) + "@" + str(Time.get_ticks_usec()) current_stage.place_tower.rpc(inst_to_dict(tower.to_network_data())) func remove_tower(tower: Tower): if tower.owner_id == multiplayer.get_unique_id(): destroy_tower(tower) func destroy_tower(tower: Tower): current_stage.destroy_tower(tower) Network.destroy_tower.rpc(tower.global_position) player.towers.erase(tower.global_position) func select_tower(tower: Tower): if tower.owner_id == multiplayer.get_unique_id(): tower.is_selected = true func deselect_tower(): if not Tower.selected_towers.is_empty(): for tower in Tower.selected_towers: tower.is_selected = false func update_tower(path: NodePath, data: Tower.NetworkData): Network.update_tower.rpc(path, inst_to_dict(data)) func spawn_unit(unit: Unit, spawn: Spawn, overwrite_target: PathNode = null): var network_id = multiplayer.get_unique_id() unit.owner_id = network_id unit.name = "Unit@" + str(network_id) + "@" + str(Time.get_ticks_usec()) unit.global_position = spawn.spawn_position unit.target = spawn.next_node unit.hp = randi_range(50, 150) #20000b unit.speed = randi_range(100, 150) if overwrite_target: unit.target = overwrite_target #var data := UnitCreationData.fromUnit(unit) current_stage.spawn_unit.rpc(inst_to_dict(unit.to_network_data())) func array_intersect(first, second): var compare = {} for value in first: compare[value] = true for value in second: if compare.get(value, false): return true return false