game.gd 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. extends Node2D
  2. @onready var health_bar: HealthBar = $HealthBar
  3. @onready var overlay: CanvasLayer = $Overlay
  4. @onready var transition: Transition = $Overlay/Transition
  5. @onready var player_spawn: PlayerSpawnZone = $PlayerSpawnZone
  6. @onready var spawn_timer: Timer = $Timer
  7. @onready var ui_root: Control = $UI/Root
  8. @onready var wave_label: Label = $UI/Root/WaveLabel
  9. @onready var phase_label: Label = $UI/Root/PhaseLabel
  10. @onready var next_phase_button: Button = $UI/Root/NextPhaseButton
  11. @onready var combat_start_sound: AudioStreamPlayer = $Sounds/CombatStartSound
  12. @onready var combat_end_sound: AudioStreamPlayer = $Sounds/CombatEndSound
  13. @onready var main_menu: PackedScene = load("res://screens/main_menu.tscn")
  14. @onready var bot_scene: PackedScene = load("res://assets/scenes/bot.tscn")
  15. @onready var game_over_scene: PackedScene = load("res://assets/scenes/game_over.tscn")
  16. @onready var spawn_points: Array[Marker2D] = [
  17. $EnemySpawns/EnemySpawn_1,
  18. $EnemySpawns/EnemySpawn_2,
  19. $EnemySpawns/EnemySpawn_3,
  20. ]
  21. enum Phase {
  22. PHASE_SETUP,
  23. PHASE_COMBAT,
  24. PHASE_LOOT,
  25. }
  26. var phase: Phase = Phase.PHASE_SETUP:
  27. set(new_value):
  28. phase = new_value
  29. match new_value:
  30. Phase.PHASE_SETUP:
  31. phase_label.text = "PHASE: SETUP"
  32. Phase.PHASE_COMBAT:
  33. phase_label.text = "PHASE: COMBAT"
  34. Phase.PHASE_LOOT:
  35. phase_label.text = "PHASE: LOOT"
  36. var waves_completed: int = 0:
  37. set(new_value):
  38. waves_completed = new_value
  39. wave_label.text = "WAVE: %d" % (new_value + 1)
  40. func _ready() -> void:
  41. waves_completed = 0
  42. phase = Phase.PHASE_SETUP
  43. overlay.visible = true
  44. transition.slide_out()
  45. await transition.game_fully_visible
  46. func _process(_delta: float) -> void:
  47. if Input.is_action_pressed("ui_cancel"):
  48. go_to_main_menu()
  49. if phase == Phase.PHASE_COMBAT:
  50. if get_foes().is_empty():
  51. end_combat()
  52. func go_to_main_menu() -> void:
  53. var tree = get_tree()
  54. transition.text = ""
  55. tree.paused = true
  56. transition.slide_in()
  57. await transition.game_fully_hidden
  58. tree.change_scene_to_packed(main_menu)
  59. tree.paused = false
  60. func spawn_bot(spawn: Marker2D) -> void:
  61. var bot: Bot = bot_scene.instantiate()
  62. bot.global_position = spawn.global_position
  63. bot.visible = false
  64. add_child(bot)
  65. func get_foes() -> Array[Area2D]:
  66. var foes: Array[Area2D] = []
  67. foes.assign(get_tree().get_nodes_in_group("foe"))
  68. return foes
  69. func get_survivors() -> Array[Area2D]:
  70. var survivors: Array[Area2D] = []
  71. survivors.assign(get_tree().get_nodes_in_group("survivor"))
  72. return survivors
  73. func get_waiting_foes() -> Array[Area2D]:
  74. return get_foes().filter(func (foe): return not foe.visible)
  75. func get_active_foes() -> Array[Area2D]:
  76. return get_foes().filter(func (foe): return foe.visible)
  77. func activate_foe() -> void:
  78. var foes = get_waiting_foes()
  79. if not foes.is_empty():
  80. foes.pick_random().visible = true
  81. func reset_survivors() -> void:
  82. var survivors = get_survivors()
  83. for survivor in survivors:
  84. survivor.reparent(self)
  85. for survivor in survivors:
  86. player_spawn.drop(survivor)
  87. survivor.position = Vector2.ZERO
  88. func _on_timer_timeout() -> void:
  89. activate_foe()
  90. func base_hit() -> void:
  91. health_bar.health -= 1
  92. if health_bar.health == 0:
  93. game_over()
  94. func game_over() -> void:
  95. spawn_timer.stop()
  96. var foes = get_tree().get_nodes_in_group("foe")
  97. for foe in foes:
  98. foe.queue_free()
  99. var gos: GameOver = game_over_scene.instantiate()
  100. gos.message = "YOU DIED AFTER\nCOMPLETING %d WAVES!" % waves_completed
  101. ui_root.add_child(gos)
  102. await gos.closed
  103. go_to_main_menu()
  104. func _on_base_area_entered(area: Area2D) -> void:
  105. if area.is_in_group("foe") || area.is_in_group("foe_weapons"):
  106. base_hit()
  107. func start_combat() -> void:
  108. for n in (waves_completed + 1):
  109. var spawner = spawn_points.pick_random()
  110. spawn_bot(spawner)
  111. spawn_timer.wait_time = 3.5
  112. spawn_timer.start()
  113. combat_start_sound.play()
  114. activate_foe()
  115. func end_combat() -> void:
  116. phase = Phase.PHASE_LOOT
  117. next_phase_button.disabled = false
  118. next_phase_button.text = "ACCEPT"
  119. spawn_timer.stop()
  120. combat_end_sound.play()
  121. func _on_next_phase_button_pressed() -> void:
  122. match phase:
  123. Phase.PHASE_SETUP:
  124. phase = Phase.PHASE_COMBAT
  125. next_phase_button.disabled = true
  126. start_combat()
  127. Phase.PHASE_COMBAT:
  128. pass # this should not happen
  129. Phase.PHASE_LOOT:
  130. var next_wave = waves_completed + 2
  131. transition.transition("WAVE %d" % next_wave, func ():
  132. self.waves_completed += 1
  133. self.phase = Phase.PHASE_SETUP
  134. self.next_phase_button.text = "NEXT PHASE"
  135. self.reset_survivors()
  136. )