BlockClass.gd 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. @icon("res://Assets/Sprites/Editor/Block.png")
  2. class_name Block
  3. extends AnimatableBody2D
  4. signal player_block_hit(player: Player)
  5. signal shell_block_hit(shell: Shell)
  6. @export var visuals: Node = null
  7. const EMPTY_BLOCK = ("res://Scenes/Prefabs/Blocks/EmptyBlock.tscn")
  8. @export var item: PackedScene = null
  9. @export var destructable := true
  10. @export var destruction_particle_scene: PackedScene = null
  11. @export_range(1, 99) var item_amount := 1
  12. @export var combo_meter_amount := 25
  13. @export var mushroom_if_small := false
  14. const SUPER_MUSHROOM = ("res://Scenes/Prefabs/Entities/Items/SuperMushroom.tscn")
  15. var can_hit := true
  16. var bouncing := false
  17. const NO_SFX_ITEMS := ["res://Scenes/Prefabs/Entities/Items/SpinningRedCoin.tscn","res://Scenes/Prefabs/Entities/Items/SpinningCoin.tscn", "res://Scenes/Prefabs/Entities/Items/Vine.tscn" ]
  18. @export var start_z := -1
  19. signal block_emptied
  20. signal block_destroyed
  21. func _enter_tree() -> void:
  22. z_index = start_z
  23. sync_to_physics = false
  24. if item != null:
  25. if item.resource_path.contains(Global.current_level.scene_file_path):
  26. Global.log_error("ITEM SCENE IS NULL! BLOCK NAME: " + str(name) + " PLEASE REPORT!")
  27. func dispense_item() -> void:
  28. if can_hit == false:
  29. return
  30. can_hit = false
  31. await get_tree().create_timer(0.1, false).timeout
  32. DiscoLevel.combo_meter += combo_meter_amount
  33. var item_to_dispense = player_mushroom_check(get_tree().get_first_node_in_group("Players"))
  34. var node = item_to_dispense.instantiate()
  35. if node is PowerUpItem or node.has_meta("is_item"):
  36. for i in get_tree().get_nodes_in_group("Players"):
  37. node.position = position + Vector2(0, -1)
  38. node.hide()
  39. add_sibling(node)
  40. if node is PowerUpItem:
  41. if Global.connected_players > 1:
  42. AudioManager.play_sfx("item_appear", global_position)
  43. node.player_multiplayer_launch_spawn(i)
  44. else:
  45. node.block_dispense_tween()
  46. else:
  47. if item.resource_path == "res://Scenes/Prefabs/Entities/Items/SpinningRedCoin.tscn":
  48. if has_meta("r_coin_id"):
  49. node.id = get_meta("r_coin_id", 0)
  50. var parent = get_parent()
  51. node.global_position = global_position + Vector2(0, -8) + node.get_meta("block_spawn_offset", Vector2.ZERO)
  52. if get_parent().get_parent() is TrackRider:
  53. parent = get_parent().get_parent().get_parent()
  54. parent.add_child(node)
  55. parent.move_child(node, get_index() - 1)
  56. print("FUCK: " + str(item.resource_path))
  57. if NO_SFX_ITEMS.has(item.resource_path) == false:
  58. AudioManager.play_sfx("item_appear", global_position)
  59. node.set("velocity", Vector2(0, node.get_meta("block_launch_velocity", -150)))
  60. can_hit = true
  61. item_amount -= 1
  62. if item_amount == 1:
  63. if has_meta("red_coin") == true:
  64. item = load("res://Scenes/Prefabs/Entities/Items/SpinningRedCoin.tscn")
  65. if item_amount <= 0:
  66. spawn_empty_block()
  67. func player_mushroom_check(player: Player = null) -> PackedScene:
  68. if player.power_state.hitbox_size == "Small" and mushroom_if_small:
  69. return load(SUPER_MUSHROOM)
  70. return item
  71. func spawn_empty_block() -> void:
  72. var block = load(EMPTY_BLOCK).instantiate()
  73. block.position = position
  74. add_sibling(block)
  75. if get_parent().get_parent() is TrackRider:
  76. get_parent().get_parent().attached_entity = block
  77. block_emptied.emit()
  78. queue_free()
  79. func destroy() -> void:
  80. block_destroyed.emit()
  81. DiscoLevel.combo_meter += combo_meter_amount
  82. AudioManager.play_sfx("block_break", global_position)
  83. var particles = destruction_particle_scene.instantiate()
  84. particles.global_position = global_position
  85. add_sibling(particles)
  86. queue_free()