Launcher.gd 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. extends Node2D
  2. export (float) var visor_ratio = 1.0
  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. READY,
  10. FIRING,
  11. WAITING,
  12. INTERRUPTING,
  13. DEAD
  14. }
  15. export var BULLET_SPEED = 500.0
  16. const visor_min_heigth = 10
  17. const visor_start_shift = Vector2(0, -visor_min_heigth)
  18. var _ballScene = preload("res://scenes/Ball.tscn")
  19. var nbAmmo = 0
  20. var nbStorage = 1
  21. onready var target = $TargetLine
  22. onready var visor = $TargetLine/TargetVisor
  23. onready var source = $Source
  24. onready var shootDelay = $ShootDelay
  25. onready var grid = $Grid
  26. onready var current_state = State.WAITING
  27. func _ready():
  28. get_ready()
  29. func _input(event):
  30. if event is InputEventMouseButton and event.is_pressed() :
  31. trigger(event.position)
  32. elif event is InputEventMouseMotion and current_state == State.READY:
  33. aim_at(event.position)
  34. func aim_at(cursor:Vector2):
  35. var visor_pos = (cursor - source.position) * visor_ratio
  36. if abs(visor_pos.y) > visor_min_heigth:
  37. visor.position = visor_pos
  38. emit_signal("move_visor")
  39. func trigger(aim:Vector2):
  40. if (current_state == State.READY):
  41. current_state = State.FIRING
  42. emit_signal("get_firing")
  43. elif (current_state == State.WAITING):
  44. current_state = State.INTERRUPTING
  45. emit_signal("interrupt_wave")
  46. func shoot():
  47. var bullet = _ballScene.instance()
  48. bullet.position = source.position
  49. bullet.linear_velocity = (target.get_visor_pos() - source.position).normalized()
  50. bullet.linear_velocity *= BULLET_SPEED
  51. add_child(bullet)
  52. bullet.connect("tree_exited", self, "_on_Ball_tree_exited")
  53. bullet.connect("kace_contact", grid, "_on_Ball_kace_contact")
  54. self.connect("interrupt_wave", bullet, "_on_Launcher_interrupt_wave")
  55. func gain_new_bullet():
  56. load_bullet(1)
  57. emit_signal("gain_new_bullet")
  58. func load_bullet(n:int):
  59. nbStorage += n
  60. func end_of_round():
  61. if (current_state != State.DEAD):
  62. get_ready()
  63. func get_ready():
  64. current_state = State.READY
  65. target.set_visor_pos(source.position + visor_start_shift)
  66. nbAmmo = nbStorage
  67. nbStorage = 0
  68. func die():
  69. current_state = State.DEAD
  70. func _on_ShootDelay_timeout():
  71. shoot()
  72. nbAmmo -= 1
  73. if (nbAmmo <= 0):
  74. current_state = State.WAITING
  75. else:
  76. emit_signal("get_firing")
  77. func _on_Launcher_get_firing():
  78. shootDelay.start()
  79. func _on_Ball_tree_exited():
  80. load_bullet(1)
  81. if (get_tree().get_nodes_in_group("ball").size() == 0):
  82. emit_signal("is_full")
  83. func _on_Grid_has_moved():
  84. end_of_round()
  85. func _on_Grid_kace_broken():
  86. print("new bullet")
  87. gain_new_bullet()
  88. func _on_DeadLine_game_lost():
  89. die()