Files
net-gunner/scripts/character_select.gd

153 lines
4.9 KiB
GDScript

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