123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- extends Node2D
- export (float) var visor_ratio = 1.0
- signal get_firing
- signal is_full
- signal gain_new_bullet
- signal interrupt_wave
- signal move_visor
- enum State {
- READY,
- FIRING,
- WAITING,
- INTERRUPTING,
- DEAD
- }
- export var BULLET_SPEED = 500.0
- const visor_min_heigth = 10
- const visor_start_shift = Vector2(0, -visor_min_heigth)
- var _ballScene = preload("res://scenes/Ball.tscn")
- var nbAmmo = 0
- var nbStorage = 1
- onready var target = $TargetLine
- onready var visor = $TargetLine/TargetVisor
- onready var source = $Source
- onready var shootDelay = $ShootDelay
- onready var grid = $Grid
- onready var current_state = State.WAITING
- func _ready():
- get_ready()
- func _input(event):
- if event is InputEventMouseButton and event.is_pressed() :
- trigger(event.position)
- elif event is InputEventMouseMotion and current_state == State.READY:
- aim_at(event.position)
- func aim_at(cursor:Vector2):
- var visor_pos = (cursor - source.position) * visor_ratio
- if abs(visor_pos.y) > visor_min_heigth:
- visor.position = visor_pos
- emit_signal("move_visor")
- func trigger(aim:Vector2):
- if (current_state == State.READY):
- current_state = State.FIRING
- emit_signal("get_firing")
- elif (current_state == State.WAITING):
- current_state = State.INTERRUPTING
- emit_signal("interrupt_wave")
- func shoot():
- var bullet = _ballScene.instance()
- bullet.position = source.position
- bullet.linear_velocity = (target.get_visor_pos() - source.position).normalized()
- bullet.linear_velocity *= BULLET_SPEED
- add_child(bullet)
- bullet.connect("tree_exited", self, "_on_Ball_tree_exited")
- bullet.connect("kace_contact", grid, "_on_Ball_kace_contact")
- self.connect("interrupt_wave", bullet, "_on_Launcher_interrupt_wave")
- func gain_new_bullet():
- load_bullet(1)
- emit_signal("gain_new_bullet")
- func load_bullet(n:int):
- nbStorage += n
- func end_of_round():
- if (current_state != State.DEAD):
- get_ready()
- func get_ready():
- current_state = State.READY
- target.set_visor_pos(source.position + visor_start_shift)
- nbAmmo = nbStorage
- nbStorage = 0
- func die():
- current_state = State.DEAD
- func _on_ShootDelay_timeout():
- shoot()
- nbAmmo -= 1
- if (nbAmmo == 0):
- current_state = State.WAITING
- else:
- emit_signal("get_firing")
- func _on_Launcher_get_firing():
- shootDelay.start()
- func _on_Ball_tree_exited():
- load_bullet(1)
- if (get_tree().get_nodes_in_group("ball").size() == 0):
- emit_signal("is_full")
- func _on_Grid_has_moved():
- end_of_round()
- func _on_Grid_kace_broken():
- gain_new_bullet()
- func _on_DeadLine_game_lost():
- die()
|