mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-10-22 15:38:14 +00:00
76 lines
2.1 KiB
GDScript
76 lines
2.1 KiB
GDScript
class_name BasicEnemyMovement
|
|
extends Node
|
|
|
|
@export var ledge_detection_cast: RayCast2D = null
|
|
|
|
var can_move := true
|
|
|
|
@export var auto_call := true
|
|
|
|
@export var move_speed := 32
|
|
@export var second_quest_speed := 36
|
|
|
|
@onready var current_speed := move_speed
|
|
@export var bounce_on_land := false
|
|
@export var bounce_height := -200
|
|
@export var visuals: Node2D
|
|
|
|
@export var follow_player := false
|
|
|
|
var can_hit := true
|
|
|
|
var can_bounce := true
|
|
|
|
var active := true
|
|
|
|
func _ready() -> void:
|
|
if owner is CharacterBody2D:
|
|
owner.floor_constant_speed = true
|
|
owner.floor_max_angle = 0.80
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if auto_call:
|
|
handle_movement(delta)
|
|
if visuals != null:
|
|
visuals.scale.x = owner.direction
|
|
|
|
func handle_movement(delta: float) -> void:
|
|
if active == false: return
|
|
if Global.second_quest and owner is Enemy:
|
|
move_speed = second_quest_speed
|
|
apply_gravity(delta)
|
|
if owner.is_on_wall():
|
|
wall_hit()
|
|
elif ledge_detection_cast != null and owner.is_on_floor():
|
|
ledge_detection_cast.floor_normal = owner.get_floor_normal()
|
|
ledge_detection_cast.position.x = abs(ledge_detection_cast.position.x) * owner.direction
|
|
if ledge_detection_cast.is_colliding() == false:
|
|
wall_hit()
|
|
if follow_player and owner.is_on_floor():
|
|
player_direction_check()
|
|
current_speed = abs(owner.velocity.x)
|
|
if current_speed < move_speed:
|
|
current_speed = move_speed
|
|
if owner.is_on_floor():
|
|
current_speed = move_speed
|
|
if bounce_on_land:
|
|
owner.velocity.y = bounce_height
|
|
owner.velocity.x = (current_speed if can_move else 0) * owner.direction
|
|
owner.move_and_slide()
|
|
|
|
func apply_gravity(delta: float) -> void:
|
|
owner.velocity.y += (Global.entity_gravity / delta) * delta
|
|
owner.velocity.y = clamp(owner.velocity.y, -INF, Global.entity_max_fall_speed)
|
|
|
|
func player_direction_check() -> void:
|
|
var target_player = get_tree().get_first_node_in_group("Players")
|
|
owner.direction = sign(target_player.global_position.x - owner.global_position.x)
|
|
|
|
func wall_hit() -> void:
|
|
if can_hit == false:
|
|
return
|
|
can_hit = false
|
|
owner.direction *= -1
|
|
await get_tree().create_timer(0.1, false).timeout
|
|
can_hit = true
|