mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-11-04 08:35:41 +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
 |