godot-webrtc-mplayer-testing/scripts/objects/player.gd

132 lines
3.4 KiB
GDScript

extends KinematicBody2D
export var weight = 8
export var max_speed = 80 # ~5 tiles/sec at top speed
export var friction = 500
export var speed = 20
export var mana_per_sec = 10
export var health_per_sec = 1
export var health = 100 setget set_health
export var max_health = 100 setget set_max_health
export var mana = 50 setget set_mana
export var max_mana = 1000 setget set_max_mana
enum PlayerClass { WIZARD }
onready var viewport = get_viewport()
onready var sprite = $sprite
onready var collider = $collider
onready var name_displayer = $ui/c/player_name
onready var display_name = name
onready var player_class = PlayerClass.WIZARD
onready var skills = []
# {
# "name": "fireball",
# "cooldown": 1,
# "cast_time": 0,
# "mana_cost": 25,
# },
# {
# name: "crate",
# cooldown: 0.5,
# cast_time: 0.5,
# mana_cost: 12,
# },
# {
# name: "pillar",
# mana_cost: 50,
# cooldown: 3,
# cast_time: 3,
# },
#]
remotesync var acceleration = Vector2.ZERO
remotesync var velocity = Vector2.ZERO
func set_health(x):
health = x
$bars/health_bar.value = x
maybe_hide_health_bar()
func set_max_health(x):
max_health = x
$bars/health_bar.max_value = x
maybe_hide_health_bar()
func set_mana(x):
mana = x
$bars/mana_bar.value = x
maybe_hide_mana_bar()
func set_max_mana(x):
max_mana = x
$bars/mana_bar.max_value = x
maybe_hide_mana_bar()
func maybe_hide_mana_bar():
if mana >= max_mana:
$bars/mana_bar.hide()
else:
$bars/mana_bar.show()
func maybe_hide_health_bar():
if health >= max_health:
$bars/health_bar.hide()
else:
$bars/health_bar.show()
func _ready():
# rset_config("acceleration", MultiplayerAPI.RPC_MODE_REMOTESYNC)
# rset_config("velocity", MultiplayerAPI.RPC_MODE_REMOTESYNC)
# rset_config("position", MultiplayerAPI.RPC_MODE_SLAVE)
set_display_name(name)
func set_display_name(i_name):
display_name = i_name
name_displayer.text = display_name
static func int_input_action(actions) -> int:
if typeof(actions) == TYPE_ARRAY:
var result = false
for action in actions:
result = result or Input.is_action_pressed(action)
return int(result)
else:
return int(Input.is_action_pressed(actions))
func _physics_process(delta):
# if get_viewport().get_camera() != null: name_displayer.rect_scale = Vector2(get_viewport().get_camera().zoom)
self.mana += (mana_per_sec*delta)
self.health += (health_per_sec*delta)
_process_input()
_process_animation()
rset("velocity", move_and_slide((velocity + acceleration).clamped(max_speed), Vector2.ZERO, false, 4, 0.785398, false).move_toward(Vector2.ZERO, friction * delta))
for index in get_slide_count():
var collision = get_slide_collision(index)
if collision.collider is RigidBody2D:
collision.collider.apply_central_impulse(-collision.normal * weight)
# if is_network_master():
# rset_unreliable("position", position)
func _process_input():
if is_network_master():
var iv = Vector2()
# probably want to implement a "whichever one was pressed last" so that
# players move as fast as possible without having to worry about switching
# key frame perfectly
iv.x = int_input_action(["ui_right", "right"]) - int_input_action(["ui_left", "left"])
iv.y = int_input_action(["ui_down", "down"]) - int_input_action(["ui_up", "up"])
rset("acceleration", iv.normalized() * speed)
func _process_animation():
if velocity == Vector2.ZERO:
sprite.animation = "idle"
else:
sprite.animation = "run"
if velocity.x < 0:
sprite.flip_h = true
elif velocity.x > 0:
sprite.flip_h = false