Renamed a bunch of player stuff to pawn stuff and implemented extensive work on getting single-address 'netplay' code working. Not sure if I've created issues with single player but in theory it should all transfer across as if the player is simply always the host.

This commit is contained in:
2026-01-08 07:15:20 -05:00
parent 9fe376e27e
commit ec02685065
69 changed files with 1525 additions and 708 deletions

View File

@@ -1,6 +1,6 @@
extends Control
var pawns : Array[PawnData] = [
const pawns : Array[PawnBaseData] = [
preload("res://data/pawns/van_reily.tres"),
preload("res://data/pawns/lou_riche.tres"),
preload("res://data/pawns/tico.tres"),
@@ -9,35 +9,83 @@ var pawns : Array[PawnData] = [
preload("res://data/pawns/tenrou_ugetsu.tres")
]
const p_colors : Array[Color] = [
Color.ROYAL_BLUE,
Color.RED
]
const selector_template = preload("res://templates/pawn_selector.tscn")
@onready var pawn_displays : Array[PawnDisplay] = [
%P1PawnDisplay,
%P2PawnDisplay
]
var selector_wait : float = 0
var selection : int = 0
var selected : int = -1
@onready var selector = %Selector
var selectors : Dictionary[int,PawnSelector] = {}
var displays : Dictionary[int, PawnDisplay] = {}
@onready var selector_start : Control = %SelectorStart
@onready var p1_pawn_display : PawnDisplay = %P1PawnDisplay
@onready var switch_sound : AudioStreamPlayer = %SwitchSound
@onready var select_sound : AudioStreamPlayer = %SelectSound
func _ready() -> void:
Multiplayer.waiting = true
var plist
if Game.is_multiplayer():
plist = Multiplayer.players.values()
for i in range(Game.num_players):
displays[plist[i]] = pawn_displays[i]
change_display(plist[i], 0)
else:
displays[1] = pawn_displays[0]
change_display(1, 0)
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
change_display(1, 0)
pass
func _process(delta : float) -> void:
if selected != -1:
return
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, PawnBaseData] = {}
for selector : PawnSelector in selectors.values():
if !selector.selected:
locked = false
else:
pawns_selected[selector.player_id] = pawns[selector.selection]
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"):
selected = selection
selector.play_animation("selected")
select_sound.play()
lock_selector.rpc(selector.player_id)
if selector_wait > 0:
selector_wait -= delta
return
var input_vector = Input.get_vector("west","east","north","south")
var input_vector : Vector2
if Multiplayer.is_host():
input_vector = Input.get_vector("west","east","north","south")
else:
input_vector = Input.get_vector("ui_focus_prev","ui_focus_next","north","south")
var move_dir : Vector2 = Vector2.ZERO
if input_vector.x < 0:
@@ -47,15 +95,35 @@ func _process(delta : float) -> void:
move_dir.x += 1
if move_dir.x != 0:
selection = wrapi(selection + sign(move_dir.x),0, len(pawns))
change_display(1, selection)
selector.position = selector_start.position + Vector2(175 * selection, 0)
switch_sound.play()
move_selector.rpc(selector.player_id, wrapi(selector.selection + sign(move_dir.x),0, len(pawns)))
selector_wait = 0.25
@rpc("any_peer","call_local","reliable")
func move_selector(peer_id : int, selection : int) -> void:
var selector : PawnSelector = selectors[peer_id]
selector.selection = selection
change_display(peer_id, selector.selection)
var v = Vector2(175 * selector.selection, 0)
selector.position = Vector2(175 * selector.selection, 0)
switch_sound.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
if player == 1:
pd = p1_pawn_display
var pd : PawnDisplay = displays[player]
pd.set_pawn_name(pawns[selection].name)
pd.set_portrait(pawns[selection].portrait)
pd.set_traps(pawns[selection].starting_traps)
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