12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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
|