LevelBGNew.gd 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. @tool
  2. class_name LevelBG
  3. extends Node2D
  4. @export_enum("Day", "Night", "Auto") var time_of_day := 0:
  5. set(value):
  6. time_of_day = value
  7. update_visuals()
  8. @export_enum("Hills", "Bush", "None", "Auto") var primary_layer = 0:
  9. set(value):
  10. primary_layer = value
  11. update_visuals()
  12. @export_enum("None", "Mushrooms", "Trees") var second_layer = 0:
  13. set(value):
  14. second_layer = value
  15. update_visuals()
  16. @export_enum("Behind", "In Front") var second_layer_order = 0:
  17. set(value):
  18. second_layer_order = value
  19. update_visuals()
  20. @export var second_layer_offset := Vector2.ZERO:
  21. set(value):
  22. second_layer_offset = value
  23. update_visuals()
  24. @export_enum("None", "Snow", "Leaves", "Ember", "Auto") var particles := 0:
  25. set(value):
  26. particles = value
  27. update_visuals()
  28. @export_enum("None", "Water", "Lava", "Poison") var liquid_layer := 0:
  29. set(value):
  30. liquid_layer = value
  31. update_visuals()
  32. @export var liquid_offset := 8:
  33. set(value):
  34. liquid_offset = value
  35. update_visuals()
  36. @export var overlay_clouds := false:
  37. set(value):
  38. overlay_clouds = value
  39. update_visuals()
  40. func set_value(value := 0, value_name := "") -> void:
  41. set(value_name, value)
  42. var is_auto := false
  43. var combo_progress := 0.0
  44. var visual_progress := 0.0
  45. var can_tree_tint := true
  46. var top_edge_enabled := true
  47. var can_mushroom_tint := true
  48. var sky_scroll_speed := -4.0
  49. const disco_sfx_threshold := [0.05, 0.5, 0.8]
  50. func set_second_y_offset(value := 0.0) -> void:
  51. second_layer_offset.y = -value
  52. func _ready() -> void:
  53. if particles == 4:
  54. if ["", "Snow", "Jungle", "Castle"].has(Global.level_theme):
  55. particles = ["", "Snow", "Jungle", "Castle"].find(Global.level_theme)
  56. await get_parent().ready
  57. if Engine.is_editor_hint() == false:
  58. if time_of_day == 2:
  59. is_auto = true
  60. time_of_day = ["Day", "Night"].find(Global.theme_time)
  61. if primary_layer == 3:
  62. if ["Jungle", "Autumn"].has(Global.level_theme):
  63. if Global.world_num > 4 and Global.world_num <= 8 or time_of_day == 1:
  64. primary_layer = 1
  65. else:
  66. primary_layer = 0
  67. else:
  68. primary_layer = 0
  69. get_parent().move_child(self, 0)
  70. Global.level_theme_changed.connect(update_visuals)
  71. Global.level_time_changed.connect(update_visuals)
  72. update_visuals()
  73. func _physics_process(delta: float) -> void:
  74. handle_disco_visuals(delta)
  75. if Engine.is_editor_hint() == false:
  76. if Global.current_level != null:
  77. $PrimaryLayer/TopEdge.position.y = Global.current_level.vertical_height - $PrimaryLayer/TopEdge.size.y
  78. var repeat_times = (ceil(get_viewport_rect().size.x / 512) + 1) * 2
  79. for i in [$SkyLayer, $PrimaryLayer, $DiscoBits/Rainbow, $DiscoBits/SpotLights, $SecondaryLayer, $OverlayLayer/CloudLayer, $OverlayLayer/Particles, $LiquidLayer, $Parallax2D, $FGLayer]:
  80. i.repeat_times = repeat_times
  81. func handle_disco_visuals(delta: float) -> void:
  82. if Engine.is_editor_hint() or Global.current_level == null:
  83. return
  84. $DiscoBits.visible = DiscoLevel.in_disco_level
  85. $Parallax2D.visible = DiscoLevel.in_disco_level
  86. if DiscoLevel.in_disco_level == false:
  87. return
  88. if is_nan(combo_progress) or is_nan(visual_progress):
  89. combo_progress = 0
  90. visual_progress = 0
  91. combo_progress = inverse_lerp(0.0, DiscoLevel.max_combo_amount, DiscoLevel.combo_amount)
  92. combo_progress = clamp(combo_progress, 0, 1)
  93. if get_tree().get_first_node_in_group("Players") != null:
  94. if get_tree().get_first_node_in_group("Players").is_invincible:
  95. combo_progress = 1
  96. visual_progress = (lerp(visual_progress, combo_progress, delta))
  97. $DiscoBits.modulate.a = lerpf(0, 0.9, visual_progress)
  98. $DiscoBits/Rainbow/Joint.position.y = lerpf(256, 0, visual_progress)
  99. handle_toads(delta, visual_progress)
  100. func handle_toads(delta: float, toad_combo_progress := 0.0) -> void:
  101. if is_equal_approx(toad_combo_progress, 0) or DiscoLevel.combo_amount == 0:
  102. toad_combo_progress = 0
  103. var idx := 0.0
  104. for i in $Parallax2D/Toads.get_children():
  105. i.visible = DiscoLevel.in_disco_level
  106. var target_y = 64
  107. if (idx / $Parallax2D/Toads.get_child_count()) < toad_combo_progress:
  108. target_y = -8
  109. i.position.y = lerpf(i.position.y, target_y, delta * 5)
  110. idx += 1
  111. if is_inside_tree() == false:
  112. return
  113. await get_tree().physics_frame
  114. idx = 0
  115. for i in [$DiscoBits/Cheer1, $DiscoBits/Cheer2, $DiscoBits/Cheer3]:
  116. if toad_combo_progress >= disco_sfx_threshold[idx]:
  117. if i.is_playing() == false:
  118. i.play()
  119. i.stream_paused = (Global.game_paused)
  120. else:
  121. i.stop()
  122. idx += 1
  123. var auto_layers := false
  124. func update_visuals() -> void:
  125. if is_inside_tree() == false:
  126. return
  127. $PrimaryLayer.visible = primary_layer != 3
  128. $SecondaryLayer.scroll_scale.x = 0.4 if second_layer_order == 0 else 0.6
  129. var parallax_amount = $SecondaryLayer.scroll_scale.x
  130. if Engine.is_editor_hint() == false:
  131. for i in [$SkyLayer, $PrimaryLayer, $SecondaryLayer]:
  132. var scroll_scale := -1.0
  133. if Settings.file.visuals.parallax_style == 0:
  134. scroll_scale = 1
  135. elif Settings.file.visuals.parallax_style == 1:
  136. scroll_scale = 0.5
  137. if scroll_scale != -1:
  138. i.scroll_scale.x = scroll_scale
  139. $LiquidLayer.visible = liquid_layer > 0
  140. $LiquidLayer/Lava.visible = liquid_layer == 2
  141. $LiquidLayer/Water.visible = liquid_layer == 1
  142. $LiquidLayer/Poison.visible = liquid_layer == 3
  143. $LiquidLayer.scroll_offset.y = liquid_offset
  144. $OverlayLayer/Particles/Snow.visible = particles == 1
  145. $OverlayLayer/Particles/Leaves.visible = particles == 2
  146. $OverlayLayer/Particles.visible = Settings.file.visuals.bg_particles == 1
  147. $OverlayLayer/Particles/LavaEmber.visible = particles == 3
  148. $SkyLayer.autoscroll.x = sky_scroll_speed
  149. $PrimaryLayer/Hills.visible = primary_layer == 0
  150. $PrimaryLayer/Bush.visible = primary_layer == 1
  151. $SecondaryLayer.visible = second_layer > 0
  152. $SecondaryLayer.scroll_offset = Vector2(80, 64) + second_layer_offset
  153. if Engine.is_editor_hint() == false and get_viewport().get_camera_2d() != null:
  154. for i in [$PrimaryLayer, $SecondaryLayer, $SkyLayer]:
  155. i.screen_offset.x = get_viewport().get_camera_2d().get_screen_center_position().x / i.scroll_scale.x
  156. $SecondaryLayer/Mushrooms.visible = second_layer == 1
  157. $SecondaryLayer/Trees.visible = second_layer == 2
  158. for i in $Parallax2D/Toads.get_children():
  159. i.offset.y = randf_range(-5, 5)
  160. $SecondaryLayer/Mushrooms.get_node("Tint").visible = can_mushroom_tint
  161. $SecondaryLayer/Trees.get_node("Tint").visible = can_tree_tint
  162. var tree_tint_amount = inverse_lerp(1, 0, parallax_amount)
  163. var mushroom_tint_amount = tree_tint_amount
  164. if can_mushroom_tint == false:
  165. mushroom_tint_amount = 0
  166. if can_tree_tint == false:
  167. tree_tint_amount = 0
  168. $SecondaryLayer/Mushrooms.get_node("Tint").modulate.a = mushroom_tint_amount
  169. $SecondaryLayer/Trees.get_node("Tint").modulate.a = tree_tint_amount
  170. $PrimaryLayer.z_index = int(not bool(second_layer_order))
  171. $OverlayLayer/CloudLayer.visible = overlay_clouds and Settings.file.visuals.bg_particles == 1
  172. $PrimaryLayer/TopEdge.visible = ["Underground", "Castle", "GhostHouse", "Bonus"].has(Global.level_theme) and primary_layer == 0 and top_edge_enabled