class_name CharacterSelect extends Control const p_colors : Array[Color] = [ Color.ROYAL_BLUE, Color.RED ] const selector_template = preload("res://templates/pawn_selector.tscn") const pawn_pick_portrait_template = preload("res://templates/pawn_pick_portrait.tscn") var selector_wait : float = 0 var selected : int = -1 var selectors : Dictionary[int,PawnSelector] = {} var displays : Dictionary[int, PawnDisplay] = {} var portraits : Dictionary[Vector2i, PawnPickPortrait] = {} var announce_tween : Tween = null @onready var announcer : AudioStreamPlayer = %Announcer @onready var selector_start : Control = %SelectorStart @onready var switch_sound : AudioStreamPlayer = %SwitchSound @onready var select_sound : AudioStreamPlayer = %SelectSound @onready var portrait_grid : GridContainer = %PawnPickPortraits @onready var pawn_displays : Control = %PawnDisplays func _ready() -> void: var i : int = 0 var idx : Vector2i = Vector2i.ZERO for pawn in Game.pawns.values(): var pp : PawnPickPortrait = pawn_pick_portrait_template.instantiate() portrait_grid.add_child(pp) pp.setup(pawn, i) portraits[idx] = pp i+=1 idx.x += 1 if idx.x >= portrait_grid.columns: idx.y += 1 idx.x -= portrait_grid.columns Multiplayer.waiting = true var plist if Game.is_multiplayer(): plist = Multiplayer.players.values() for id in range(Game.num_players): var display : PawnDisplay = pawn_displays.get_child(id) displays[plist[id]] = display display.visible = true portraits[Vector2i.ZERO].num_players += 1 change_display(plist[id], 0) else: displays[1] = pawn_displays.get_child(0) displays[1].visible = true change_display(1, 0) portraits[Vector2i.ZERO].num_players += 1 Multiplayer.all_ready.connect(add_selector, CONNECT_ONE_SHOT) Multiplayer.set_player_ready.rpc(Multiplayer.id) #Set up each pawn on bottom #Highlight P1 pawn as 0 func add_selector() -> void: spawn_selector.rpc_id(1, Multiplayer.id) @rpc("call_local","any_peer","reliable") func spawn_selector(peer_id) -> void: var selector = selector_template.instantiate() selector.setup(peer_id, p_colors[0] if Multiplayer.is_host() else p_colors[1]) selector.name = selector.name + str(peer_id) selector_start.add_child(selector) selector.set_multiplayer_authority(peer_id) #print("Character select spawned selector %s for player %d" % [selector.name, Multiplayer.id]) func _process(delta : float) -> void: if !selectors.has(Multiplayer.id): return var locked = true var pawns_selected : Dictionary[int, StringName] = {} for selector : PawnSelector in selectors.values(): if !selector.selected: locked = false else: pawns_selected[selector.player_id] = portraits[selector.selection].pawn.name if locked: Game.start_level(pawns_selected) if selectors[Multiplayer.id].selected != false: return var selector = selectors[Multiplayer.id] if Input.is_action_just_pressed("ui_accept"): lock_selector.rpc(selector.player_id) if selector_wait > 0: selector_wait -= delta return var input_vector : Vector2 input_vector = Input.get_vector("west","east","north","south") var move_dir : Vector2i = Vector2.ZERO move_dir = Vector2i((input_vector + .499 * sign(input_vector)).round()) if move_dir.length_squared() != 0: var selection : Vector2i = selector.selection + move_dir selection.x = wrapi(selection.x, 0, portrait_grid.columns) selection.y = wrapi(selection.y, 0, ceili(float(portrait_grid.get_child_count()) / portrait_grid.columns)) move_selector.rpc(selector.player_id, selection) selector_wait = 0.25 @rpc("any_peer","call_local","reliable") func move_selector(peer_id : int, selection : Vector2i) -> void: var selector : PawnSelector = selectors[peer_id] portraits[selector.selection].num_players -= 1 selector.selection = selection portraits[selector.selection].num_players += 1 change_display(peer_id, portraits[selector.selection].pawn_idx) var v = Vector2(154 * selector.selection.x, 154 * selector.selection.y) selector.position = v switch_sound.play() if announce_tween != null and announce_tween.is_running(): announce_tween.stop() if announcer.playing: announcer.stop() announce_tween = create_tween() announce_tween.tween_interval(.25) announcer.stream = portraits[selection].pawn.name_audio announce_tween.tween_callback(announcer.play) @rpc("any_peer","call_local","reliable") func lock_selector(peer_id : int) -> void: var selector : PawnSelector = selectors[peer_id] selector.selected = true selector.play_animation("selected") select_sound.play() func change_display(player : int, selection: int) -> void: var pd : PawnDisplay = displays[player] var pawn : PawnBaseData = Game.pawns.values()[selection] pd.set_pawn_name(pawn.name) pd.set_portrait(pawn.portrait) pd.set_hacks(pawn.starting_hacks) func _on_selector_start_child_entered_tree(node: Node) -> void: selectors[node.player_id] = node func _on_selector_spawner_spawned(node: Node) -> void: selectors[node.player_id] = node