extends MechCharacter var _heat: float = 0.0 var _damage: float = 0.0 @onready var camera_root: ThirdPersonCamera = $CameraRoot @onready var animation_player: AnimationPlayer = $AnimationPlayer @onready var _crosshair: Crosshair = get_tree().get_first_node_in_group("CrosshairGroup") @onready var _overlay: OverlayEffects = get_tree().get_first_node_in_group("OverlayEffectsGroup") @onready var _heat_meter: ProgressBar = get_tree().get_first_node_in_group("HeatMeterGroup") @onready var _damage_meter: ProgressBar = get_tree().get_first_node_in_group("DamageMeterGroup") @onready var _structure_meter: StructureMeter = get_tree().get_first_node_in_group("StructureMeterGroup") # gdlint: disable=class-definitions-order var structure: int: set(value): _structure_meter.structure_count = clamp( value, StructureMeter.MIN_STRUCTURE, StructureMeter.MAX_STRUCTURE ) get: return _structure_meter.structure_count # gdlint: enable=class-definitions-order func deal_damage(delta: float) -> void: _damage = clamp(_damage + delta, 0.0, 100.0) _damage_meter.value = _damage func deal_heat(delta: float) -> void: _heat = clamp(_heat + delta, 0.0, 100.0) _heat_meter.value = _heat func deal_structure(delta: int) -> void: structure += delta func _physics_process(delta: float) -> void: var delta_factor: float = delta * GameState.TARGET_FPS # DEBUG BLOCK {{{ if Input.is_action_just_pressed("ui_left"): deal_structure(-1) if Input.is_action_just_pressed("ui_right"): deal_structure(1) if Input.is_action_just_pressed("ui_up"): deal_heat(1) deal_damage(-1) if Input.is_action_just_pressed("ui_down"): deal_heat(-1) deal_damage(1) if Input.is_action_just_pressed("ui_cancel"): shutdown() # DEBUG BLOCK }}} if is_boosting(): _crosshair.jostle(Vector2(randf_range(-3, 3), randf_range(-3, 3))) # Handle jump. if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = JUMP_FORCE if is_boosting(): # Jump cancels boost animation_tree["parameters/boost/request"] = 2 # Abort # Get the input direction and handle the movement/deceleration. var movement: Vector3 = Vector3.ZERO var input_dir: Vector2 = Input.get_vector("left", "right", "forward", "backward") if input_dir: # Transform movement based on camera angle movement = ( ( camera_root.global_transform.basis * Vector3(input_dir.x, 0.0, input_dir.y) * Vector3(-1.0, 0.0, -1.0) ) . normalized() ) if Input.is_action_just_pressed("boost"): boost(movement) _overlay.play_boost() animation_player.play("boost_fov") animation_player.seek(0) # Slowly turn mesh towards camera vector when moving on ground if is_on_floor(): mesh.rotation.y = lerp_angle( mesh.rotation.y, camera_root.rotation.y, delta_factor * TURN_SENSITIVITY ) animation_tree["parameters/walk_space/blend_position"] = lerp( animation_tree["parameters/walk_space/blend_position"], input_dir, delta_factor * TURN_SENSITIVITY ) if Input.is_action_just_pressed("weapon_trigger"): _weapon.trigger() if Input.is_action_just_released("weapon_trigger"): _weapon.release() # Take heat if exposed to the sun: if not shadow_listener.in_shadow(): deal_heat(GameState.SOLAR_HEAT_RATE) super.physics_process(movement, delta) func _on_mech_stomp() -> void: _crosshair.jostle(Vector2(randf_range(-1, 1), randf_range(-1, 5))) # camera_root.jostle(randf_range(-2, 2))