@abstract class_name Machine extends CharacterBody2D @export var model_name : StringName @export var carry_capacity : float @export var hit_points : float @export var fuel_tank_capacity : float @export var movement_speed : float signal change_animation(anim_to_change_to) var animation_state_machine : MachineGlobals.regular_states var look_dir : MachineGlobals.look_direction var effects : Array var add_on_slots : int var machine_upgrades : Dictionary var ability_timer : Timer var action_timer : Timer var current_fuel_in_tank : float @abstract func primary_action() -> float @abstract func secondary_action() -> float @abstract func model_ability() -> float @abstract func class_ability() -> float @abstract func listen_to_animation_signals(next_anim_state : MachineGlobals.regular_states) -> void func _ready() -> void: connect("change_animation",listen_to_animation_signals) func interact() -> void : pass func _physics_process(delta: float) -> void: _movement(delta) _ability_process(delta) _action_process(delta) move_and_slide() func _movement(delta: float) -> void : DebugGlobal.set_debug_info("Velocity", self.velocity ) var input_direction = Input.get_vector("move_left", "move_right", "move_up", "move_down") self.velocity = input_direction * movement_speed if self.velocity != Vector2.ZERO && animation_state_machine in [MachineGlobals.regular_states.IDLING,MachineGlobals.regular_states.INTERACTING] : animation_state_machine = MachineGlobals.regular_states.WALKING if self.velocity.y < 0 : look_dir = MachineGlobals.look_direction.UP elif self.velocity.y > 0 : look_dir = MachineGlobals.look_direction.DOWN elif self.velocity.x > 0 : look_dir = MachineGlobals.look_direction.RIGHT elif self.velocity.x < 0 : look_dir = MachineGlobals.look_direction.LEFT else : animation_state_machine = MachineGlobals.regular_states.IDLING func _action_process(delta:float) -> void : if action_timer != null && action_timer.is_stopped(): if Input.is_action_just_pressed("primary_action") : action_timer.start(primary_action()) elif Input.is_action_just_pressed("secondary_action") : action_timer.start(secondary_action()) func _ability_process(delta:float) -> void : if ability_timer != null && ability_timer.is_stopped() : if Input.is_action_just_pressed("class_ability") : ability_timer.start(class_ability()) elif Input.is_action_just_pressed("model_ability") : ability_timer.start(model_ability()) func _get_body_parts() -> Array : var clist : Array for a in self.get_children() : if a is BodyPart : clist.append(a) return clist func _animate(b : BodyPart, animation_type : String) -> void : for anim_name : String in b.sprite_frames.get_animation_names() : if anim_name.contains(animation_type) && anim_name.contains(model_name) && anim_name.contains(str(MachineGlobals.look_direction.keys()[look_dir])) : b.play(anim_name)