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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user