Launcher.gd 2.3 KB

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