mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-10-26 09:20:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
| class_name Thwomp
 | |
| extends Enemy
 | |
| 
 | |
| enum States{IDLE, FALLING, LANDED, RISING}
 | |
| 
 | |
| var current_state := States.IDLE
 | |
| 
 | |
| @onready var starting_y := global_position.y
 | |
| 
 | |
| var can_fall := true
 | |
| 
 | |
| func _physics_process(delta: float) -> void:
 | |
| 	velocity.x = move_toward(velocity.x, 0, 20)
 | |
| 	match current_state:
 | |
| 		States.IDLE:
 | |
| 			handle_idle(delta)
 | |
| 		States.FALLING:
 | |
| 			handle_falling(delta)
 | |
| 		States.RISING:
 | |
| 			handle_rising(delta)
 | |
| 		_:
 | |
| 			pass
 | |
| 	move_and_slide()
 | |
| 
 | |
| func handle_idle(delta: float) -> void:
 | |
| 	var target_player = get_tree().get_first_node_in_group("Players")
 | |
| 	var x_distance = abs(target_player.global_position.x - global_position.x)
 | |
| 	velocity = Vector2.ZERO
 | |
| 	if x_distance < 24 and can_fall:
 | |
| 		can_fall = false
 | |
| 		current_state = States.FALLING
 | |
| 		$TrackJoint.detach()
 | |
| 	elif x_distance < 48:
 | |
| 		%Sprite.play("Look")
 | |
| 	else:
 | |
| 		%Sprite.play("Idle")
 | |
| 
 | |
| func handle_falling(delta: float) -> void:
 | |
| 	%Sprite.play("Fall")
 | |
| 	velocity.y += (15 / delta) * delta
 | |
| 	velocity.y = clamp(velocity.y, -INF, Global.entity_max_fall_speed)
 | |
| 	handle_block_breaking()
 | |
| 	if is_on_floor():
 | |
| 		land()
 | |
| 
 | |
| func handle_block_breaking() -> void:
 | |
| 	for i in %BlockBreakingHitbox.get_overlapping_bodies():
 | |
| 		if i is Block and i.get("destructable") == true:
 | |
| 			i.destroy()
 | |
| 
 | |
| func land() -> void:
 | |
| 	AudioManager.play_sfx("cannon", global_position)
 | |
| 	current_state = States.LANDED
 | |
| 	await get_tree().create_timer(1, false).timeout
 | |
| 	current_state = States.RISING
 | |
| 
 | |
| func handle_rising(delta: float) -> void:
 | |
| 	velocity.y = -50
 | |
| 	%Sprite.play("Idle")
 | |
| 	if global_position.y <= starting_y:
 | |
| 		global_position.y = starting_y
 | |
| 	if global_position.y <= starting_y or is_on_ceiling():
 | |
| 		current_state = States.IDLE
 | |
| 		await get_tree().create_timer(0.5, false).timeout
 | |
| 		can_fall = true
 | 
