game.gd 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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 main_menu: PackedScene = load("res://screens/main_menu.tscn")
  13. @onready var bot_scene: PackedScene = load("res://assets/scenes/bot.tscn")
  14. @onready var game_over_scene: PackedScene = load("res://assets/scenes/game_over.tscn")
  15. @onready var victory_scene: PackedScene = load("res://assets/scenes/victory.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. enum Loot {
  27. LOOT_SURVIVOR,
  28. LOOT_HEAL,
  29. LOOT_LOWER_COOLDOWN,
  30. }
  31. var phase: Phase = Phase.PHASE_SETUP:
  32. set(new_value):
  33. phase = new_value
  34. match new_value:
  35. Phase.PHASE_SETUP:
  36. phase_label.text = "PHASE: SETUP"
  37. Phase.PHASE_COMBAT:
  38. phase_label.text = "PHASE: COMBAT"
  39. Phase.PHASE_LOOT:
  40. phase_label.text = "PHASE: LOOT"
  41. var waves_completed: int = 0:
  42. set(new_value):
  43. waves_completed = new_value
  44. wave_label.text = "WAVE: %d" % (new_value + 1)
  45. func _ready() -> void:
  46. waves_completed = 0
  47. phase = Phase.PHASE_SETUP
  48. overlay.visible = true
  49. transition.slide_out()
  50. await transition.game_fully_visible
  51. func _process(_delta: float) -> void:
  52. if Input.is_action_pressed("ui_cancel"):
  53. go_to_main_menu()
  54. if phase == Phase.PHASE_COMBAT:
  55. if get_foes().is_empty():
  56. end_combat()
  57. func go_to_main_menu() -> void:
  58. var tree = get_tree()
  59. transition.text = ""
  60. tree.paused = true
  61. transition.slide_in()
  62. await transition.game_fully_hidden
  63. tree.change_scene_to_packed(main_menu)
  64. tree.paused = false
  65. func spawn_bot(spawn: Marker2D) -> void:
  66. var bot: Bot = bot_scene.instantiate()
  67. bot.global_position = spawn.global_position
  68. bot.visible = false
  69. add_child(bot)
  70. func get_foes() -> Array[Area2D]:
  71. var foes: Array[Area2D] = []
  72. foes.assign(get_tree().get_nodes_in_group("foe"))
  73. return foes
  74. func get_survivors() -> Array[Area2D]:
  75. var survivors: Array[Area2D] = []
  76. survivors.assign(get_tree().get_nodes_in_group("survivor"))
  77. return survivors
  78. func get_waiting_foes() -> Array[Area2D]:
  79. return get_foes().filter(func (foe): return not foe.visible)
  80. func get_active_foes() -> Array[Area2D]:
  81. return get_foes().filter(func (foe): return foe.visible)
  82. func activate_foe() -> void:
  83. var foes = get_waiting_foes()
  84. if not foes.is_empty():
  85. foes.pick_random().visible = true
  86. func reset_survivors() -> void:
  87. var survivors = get_survivors()
  88. for survivor in survivors:
  89. survivor.reparent(self)
  90. for survivor in survivors:
  91. player_spawn.drop(survivor)
  92. survivor.position = Vector2.ZERO
  93. survivor.rotation = 0.0
  94. func _on_timer_timeout() -> void:
  95. activate_foe()
  96. func base_hit() -> void:
  97. health_bar.health -= 1
  98. if health_bar.health == 0:
  99. game_over()
  100. func game_over() -> void:
  101. spawn_timer.stop()
  102. var foes = get_tree().get_nodes_in_group("foe")
  103. for foe in foes:
  104. foe.queue_free()
  105. var gos: GameOver = game_over_scene.instantiate()
  106. gos.message = "YOU DIED AFTER\nCOMPLETING %d WAVES!" % waves_completed
  107. ui_root.add_child(gos)
  108. await gos.closed
  109. await go_to_main_menu()
  110. func _on_base_area_entered(area: Area2D) -> void:
  111. if area.is_in_group("foe") || area.is_in_group("foe_weapons"):
  112. base_hit()
  113. func start_combat() -> void:
  114. GlobalInput.dragging_disabled = true
  115. for n in (waves_completed + 1):
  116. var spawner = spawn_points.pick_random()
  117. spawn_bot(spawner)
  118. spawn_timer.wait_time = lerpf(3.5, 0.5, minf(float(waves_completed)/20.0, 1.0))
  119. spawn_timer.start()
  120. combat_start_sound.play()
  121. activate_foe()
  122. func end_combat() -> void:
  123. phase = Phase.PHASE_LOOT
  124. spawn_timer.stop()
  125. var vs: Victory = victory_scene.instantiate()
  126. ui_root.add_child(vs)
  127. vs.set_loot_options("+1 SURVIVOR", "+3 HEALTH", "FASTER SHOTS")
  128. await vs.loot_selected
  129. var loot = vs.selection
  130. print("selected loot: " + str(loot))
  131. var next_wave = waves_completed + 2
  132. await transition.transition("WAVE %d" % next_wave, func ():
  133. self.waves_completed += 1
  134. self.phase = Phase.PHASE_SETUP
  135. self.next_phase_button.disabled = false
  136. self.reset_survivors()
  137. match loot:
  138. 0:
  139. self.player_spawn.add_survivor()
  140. 1:
  141. self.health_bar.health += 3
  142. 2:
  143. pass # TODO: increase fire rate
  144. )
  145. GlobalInput.dragging_disabled = false
  146. func _on_next_phase_button_pressed() -> void:
  147. match phase:
  148. Phase.PHASE_SETUP:
  149. phase = Phase.PHASE_COMBAT
  150. next_phase_button.disabled = true
  151. start_combat()
  152. Phase.PHASE_COMBAT:
  153. pass # this should not happen
  154. Phase.PHASE_LOOT:
  155. pass # this should not happen