game.gd 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. extends Node2D
  2. class_name Game
  3. @onready var health_bar: HealthBar = $HealthBar
  4. @onready var overlay: CanvasLayer = $Overlay
  5. @onready var transition: Transition = $Overlay/Transition
  6. @onready var player_spawn: PlayerSpawnZone = $PlayerSpawnZone
  7. @onready var spawn_timer: Timer = $Timer
  8. @onready var ui_root: Control = $UI/Root
  9. @onready var wave_label: Label = $UI/Root/WaveLabel
  10. @onready var phase_label: Label = $UI/Root/PhaseLabel
  11. @onready var next_phase_button: Button = $UI/Root/NextPhaseButton
  12. @onready var combat_start_sound: AudioStreamPlayer = $Sounds/CombatStartSound
  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 victory_scene: PackedScene = load("res://assets/scenes/victory.tscn")
  17. @onready var spawn_points: Array[Marker2D] = [
  18. $EnemySpawns/EnemySpawn_1,
  19. $EnemySpawns/EnemySpawn_2,
  20. $EnemySpawns/EnemySpawn_3,
  21. ]
  22. enum Phase {
  23. PHASE_SETUP,
  24. PHASE_COMBAT,
  25. PHASE_LOOT,
  26. }
  27. enum Loot {
  28. LOOT_SURVIVOR,
  29. LOOT_HEAL,
  30. LOOT_LOWER_COOLDOWN,
  31. }
  32. const RELOAD_TIME: float = 4.0
  33. static var reload_time: float = RELOAD_TIME # seconds
  34. static var max_ammo: int = 1 # shots
  35. var phase: Phase = Phase.PHASE_SETUP:
  36. set(new_value):
  37. phase = new_value
  38. match new_value:
  39. Phase.PHASE_SETUP:
  40. phase_label.text = "PHASE: SETUP"
  41. Phase.PHASE_COMBAT:
  42. phase_label.text = "PHASE: COMBAT"
  43. Phase.PHASE_LOOT:
  44. phase_label.text = "PHASE: LOOT"
  45. var waves_completed: int = 0:
  46. set(new_value):
  47. waves_completed = new_value
  48. wave_label.text = "WAVE: %d" % (new_value + 1)
  49. func _ready() -> void:
  50. Game.reload_time = RELOAD_TIME # seconds
  51. Game.max_ammo = 1 # shots
  52. waves_completed = 0
  53. phase = Phase.PHASE_SETUP
  54. overlay.visible = true
  55. player_spawn.add_survivor()
  56. transition.slide_out()
  57. await transition.game_fully_visible
  58. func _process(_delta: float) -> void:
  59. if Input.is_action_pressed("ui_cancel"):
  60. go_to_main_menu()
  61. if phase == Phase.PHASE_COMBAT:
  62. if get_foes().is_empty() and health_bar.health != 0:
  63. end_combat()
  64. func go_to_main_menu() -> void:
  65. var tree = get_tree()
  66. transition.text = ""
  67. tree.paused = true
  68. transition.slide_in()
  69. await transition.game_fully_hidden
  70. tree.change_scene_to_packed(main_menu)
  71. tree.paused = false
  72. func spawn_bot(spawn: Marker2D) -> void:
  73. var bot: Bot = bot_scene.instantiate()
  74. bot.global_position = spawn.global_position
  75. bot.speed += waves_completed
  76. bot.visible = false
  77. add_child(bot)
  78. func get_foes() -> Array[Area2D]:
  79. var foes: Array[Area2D] = []
  80. foes.assign(get_tree().get_nodes_in_group("foe"))
  81. return foes
  82. func get_survivors() -> Array[Area2D]:
  83. var survivors: Array[Area2D] = []
  84. survivors.assign(get_tree().get_nodes_in_group("survivor"))
  85. return survivors
  86. func get_waiting_foes() -> Array[Area2D]:
  87. return get_foes().filter(func (foe): return not foe.visible)
  88. func get_active_foes() -> Array[Area2D]:
  89. return get_foes().filter(func (foe): return foe.visible)
  90. func activate_foe() -> void:
  91. var foes = get_waiting_foes()
  92. if not foes.is_empty():
  93. foes.pick_random().visible = true
  94. func reset_survivors() -> void:
  95. var survivors = get_survivors()
  96. #for survivor in survivors:
  97. # survivor.reparent(self)
  98. for survivor in survivors:
  99. #player_spawn.drop(survivor)
  100. #survivor.position = Vector2.ZERO
  101. #survivor.rotation = 0.0
  102. survivor.ammo = Game.max_ammo
  103. func _on_timer_timeout() -> void:
  104. activate_foe()
  105. func base_hit() -> void:
  106. health_bar.health -= 1
  107. if health_bar.health == 0:
  108. await game_over()
  109. func game_over() -> void:
  110. spawn_timer.stop()
  111. var foes = get_tree().get_nodes_in_group("foe")
  112. for foe in foes:
  113. foe.queue_free()
  114. var gos: GameOver = game_over_scene.instantiate()
  115. gos.message = "YOU DIED AFTER\nCOMPLETING %d WAVES!" % waves_completed
  116. ui_root.add_child(gos)
  117. await gos.closed
  118. await go_to_main_menu()
  119. func _on_base_area_entered(area: Area2D) -> void:
  120. if area.is_in_group("foe") || area.is_in_group("foe_weapons"):
  121. base_hit()
  122. func start_combat() -> void:
  123. GlobalInput.dragging_disabled = true
  124. for n in (waves_completed + 1):
  125. var spawner = spawn_points.pick_random()
  126. spawn_bot(spawner)
  127. spawn_timer.wait_time = lerpf(3.5, 0.5, minf(float(waves_completed)/20.0, 1.0))
  128. spawn_timer.start()
  129. combat_start_sound.play()
  130. activate_foe()
  131. const LOOT_SURVIVOR: String = "+1 SURVIVOR"
  132. const LOOT_HEALTH: String = "+3 HEALTH"
  133. const LOOT_AMMO: String = "BIGGER MAGAZINES"
  134. const LOOT_RELOAD_TIME: String = "FASTER RELOADING"
  135. const LOOTS: Array[String] = [LOOT_SURVIVOR, LOOT_HEALTH, LOOT_AMMO, LOOT_RELOAD_TIME]
  136. func end_combat() -> void:
  137. phase = Phase.PHASE_LOOT
  138. spawn_timer.stop()
  139. await get_tree().create_timer(1.5).timeout
  140. var vs: Victory = victory_scene.instantiate()
  141. ui_root.add_child(vs)
  142. var loots: Array[String] = []
  143. loots.assign(LOOTS)
  144. loots.shuffle()
  145. vs.set_loot_options(loots[0], loots[1], loots[2])
  146. await vs.loot_selected
  147. var loot: String = loots[vs.selection]
  148. print("selected loot: " + str(loot))
  149. var next_wave = waves_completed + 2
  150. await transition.transition("WAVE %d" % next_wave, func ():
  151. self.waves_completed += 1
  152. self.phase = Phase.PHASE_SETUP
  153. self.next_phase_button.disabled = false
  154. self.reset_survivors()
  155. match loot:
  156. LOOT_SURVIVOR:
  157. self.player_spawn.add_survivor()
  158. LOOT_HEALTH:
  159. self.health_bar.health += 3
  160. LOOT_RELOAD_TIME:
  161. Game.reload_time *= 0.9
  162. LOOT_AMMO:
  163. Game.max_ammo += 1
  164. )
  165. GlobalInput.dragging_disabled = false
  166. func _on_next_phase_button_pressed() -> void:
  167. match phase:
  168. Phase.PHASE_SETUP:
  169. phase = Phase.PHASE_COMBAT
  170. next_phase_button.disabled = true
  171. start_combat()
  172. Phase.PHASE_COMBAT:
  173. pass # this should not happen
  174. Phase.PHASE_LOOT:
  175. pass # this should not happen