mirror of
https://github.com/Relintai/pandemonium_demo_projects.git
synced 2024-12-21 13:56:50 +01:00
97 lines
2.1 KiB
GDScript3
97 lines
2.1 KiB
GDScript3
|
extends KinematicBody2D
|
||
|
|
||
|
const MOTION_SPEED = 90.0
|
||
|
|
||
|
puppet var puppet_pos = Vector2()
|
||
|
puppet var puppet_motion = Vector2()
|
||
|
|
||
|
export var stunned = false
|
||
|
|
||
|
# Use sync because it will be called everywhere
|
||
|
remotesync func setup_bomb(bomb_name, pos, by_who):
|
||
|
var bomb = preload("res://bomb.tscn").instance()
|
||
|
bomb.set_name(bomb_name) # Ensure unique name for the bomb
|
||
|
bomb.position = pos
|
||
|
bomb.from_player = by_who
|
||
|
# No need to set network master to bomb, will be owned by server by default
|
||
|
get_node("../..").add_child(bomb)
|
||
|
|
||
|
var current_anim = ""
|
||
|
var prev_bombing = false
|
||
|
var bomb_index = 0
|
||
|
|
||
|
|
||
|
func _physics_process(_delta):
|
||
|
var motion = Vector2()
|
||
|
|
||
|
if is_network_master():
|
||
|
if Input.is_action_pressed("move_left"):
|
||
|
motion += Vector2(-1, 0)
|
||
|
if Input.is_action_pressed("move_right"):
|
||
|
motion += Vector2(1, 0)
|
||
|
if Input.is_action_pressed("move_up"):
|
||
|
motion += Vector2(0, -1)
|
||
|
if Input.is_action_pressed("move_down"):
|
||
|
motion += Vector2(0, 1)
|
||
|
|
||
|
var bombing = Input.is_action_pressed("set_bomb")
|
||
|
|
||
|
if stunned:
|
||
|
bombing = false
|
||
|
motion = Vector2()
|
||
|
|
||
|
if bombing and not prev_bombing:
|
||
|
var bomb_name = String(get_name()) + str(bomb_index)
|
||
|
var bomb_pos = position
|
||
|
rpc("setup_bomb", bomb_name, bomb_pos, get_tree().get_network_unique_id())
|
||
|
|
||
|
prev_bombing = bombing
|
||
|
|
||
|
rset("puppet_motion", motion)
|
||
|
rset("puppet_pos", position)
|
||
|
else:
|
||
|
position = puppet_pos
|
||
|
motion = puppet_motion
|
||
|
|
||
|
var new_anim = "standing"
|
||
|
if motion.y < 0:
|
||
|
new_anim = "walk_up"
|
||
|
elif motion.y > 0:
|
||
|
new_anim = "walk_down"
|
||
|
elif motion.x < 0:
|
||
|
new_anim = "walk_left"
|
||
|
elif motion.x > 0:
|
||
|
new_anim = "walk_right"
|
||
|
|
||
|
if stunned:
|
||
|
new_anim = "stunned"
|
||
|
|
||
|
if new_anim != current_anim:
|
||
|
current_anim = new_anim
|
||
|
get_node("anim").play(current_anim)
|
||
|
|
||
|
# FIXME: Use move_and_slide
|
||
|
move_and_slide(motion * MOTION_SPEED)
|
||
|
if not is_network_master():
|
||
|
puppet_pos = position # To avoid jitter
|
||
|
|
||
|
|
||
|
puppet func stun():
|
||
|
stunned = true
|
||
|
|
||
|
|
||
|
master func exploded(_by_who):
|
||
|
if stunned:
|
||
|
return
|
||
|
rpc("stun") # Stun puppets
|
||
|
stun() # Stun master - could use sync to do both at once
|
||
|
|
||
|
|
||
|
func set_player_name(new_name):
|
||
|
get_node("label").set_text(new_name)
|
||
|
|
||
|
|
||
|
func _ready():
|
||
|
stunned = false
|
||
|
puppet_pos = position
|