123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- extends Node2D
- export (float) var visor_ratio = 1.0
- signal get_firing
- signal is_full
- signal gain_new_bullet
- signal interrupt_wave
- enum State {
- READY,
- FIRING,
- WAITING,
- INTERRUPTING,
- DEAD
- }
- export var BULLET_SPEED = 500.0
- var _ballScene = preload("res://scenes/Ball.tscn")
- var nbAmmo = 0
- var nbStorage = 1
- onready var target = $Target
- 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):
- target.position = source.position
- target.position += (cursor - source.position) * visor_ratio
- func trigger(aim:Vector2):
- if (current_state == State.READY):
- current_state = State.FIRING
- target.position = aim
- 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.position - 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.position = source.position
- 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()
|