Launcher.gd 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. class_name Launcher
  2. extends Node2D
  3. signal get_firing
  4. signal is_full
  5. signal gain_new_bullet
  6. signal interrupt_wave
  7. signal move_visor
  8. enum State {
  9. BOOTING,
  10. READY,
  11. FIRING,
  12. WAITING,
  13. INTERRUPTING,
  14. DEAD
  15. }
  16. const visor_min_heigth = 10
  17. const visor_start_shift = Vector2(0, -visor_min_heigth)
  18. const Ball = preload("res://component/entity/ball/Ball.tscn")
  19. export (float) var bullet_speed = 500.0
  20. export (float) var visor_ratio = 1.0
  21. var nbAmmo := 0
  22. var nbStorage := 0
  23. var current_state = State.WAITING
  24. onready var target = $TargetLine
  25. onready var visor = $TargetLine/TargetVisor
  26. onready var source = $Source
  27. onready var shootDelay = $ShootDelay
  28. func _input(event: InputEvent) -> void:
  29. if event is InputEventMouseButton and event.is_pressed():
  30. trigger(event.position)
  31. elif event is InputEventMouseMotion and current_state == State.READY:
  32. aim_at(event.position)
  33. func aim_at(cursor: Vector2) -> void:
  34. var visor_pos = (cursor - source.position) * visor_ratio
  35. if abs(visor_pos.y) > visor_min_heigth:
  36. visor.position = visor_pos
  37. emit_signal("move_visor")
  38. func trigger(aim: Vector2) -> void:
  39. if (current_state == State.READY):
  40. current_state = State.FIRING
  41. emit_signal("get_firing")
  42. elif (current_state == State.WAITING):
  43. current_state = State.INTERRUPTING
  44. emit_signal("interrupt_wave")
  45. func shoot() -> void:
  46. var bullet = Ball.instance()
  47. bullet.position = source.position
  48. bullet.linear_velocity = (target.get_visor_pos() - source.position).normalized()
  49. bullet.linear_velocity *= bullet_speed
  50. add_child(bullet)
  51. bullet.connect("tree_exited", self, "_on_Ball_tree_exited")
  52. self.connect("interrupt_wave", bullet, "_on_Launcher_interrupt_wave")
  53. func gain_new_bullet() -> void:
  54. load_bullet(1)
  55. emit_signal("gain_new_bullet")
  56. func load_bullet(n: int) -> void:
  57. nbStorage += n
  58. func end_of_round() -> void:
  59. if (current_state != State.DEAD):
  60. get_ready()
  61. func get_ready() -> void:
  62. if nbStorage == 0:
  63. gain_new_bullet()
  64. current_state = State.READY
  65. target.set_visor_pos(source.position + visor_start_shift)
  66. nbAmmo = nbStorage
  67. nbStorage = 0
  68. func die() -> void:
  69. current_state = State.DEAD
  70. func reset() -> void:
  71. nbStorage = 0
  72. nbAmmo = 0
  73. current_state = State.BOOTING
  74. destroy_every_ball()
  75. func destroy_every_ball() -> void:
  76. for ball in get_tree().get_nodes_in_group("ball"):
  77. ball.destroy()
  78. func _on_ShootDelay_timeout() -> void:
  79. shoot()
  80. nbAmmo -= 1
  81. if (nbAmmo <= 0):
  82. current_state = State.WAITING
  83. else:
  84. emit_signal("get_firing")
  85. func _on_Launcher_get_firing() -> void:
  86. shootDelay.start()
  87. func _on_Ball_tree_exited() -> void:
  88. if get_tree() == null:
  89. return # Game is exiting
  90. load_bullet(1)
  91. if (get_tree().get_nodes_in_group("ball").size() == 0):
  92. emit_signal("is_full")
  93. func _on_Grid_has_moved() -> void:
  94. end_of_round()
  95. func _on_Grid_kace_broken() -> void:
  96. if current_state in [State.FIRING, State.WAITING, State.INTERRUPTING]:
  97. gain_new_bullet()
  98. func _on_DeadLine_game_lost() -> void:
  99. die()
  100. func _on_Game_start_new_game():
  101. reset()