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