Added kamikaze states and star system border (both don't working properly)

This commit is contained in:
2ndbeam 2024-05-03 22:52:21 +03:00
commit ac263a1e65
6 changed files with 112 additions and 10 deletions

View file

@ -1,9 +1,13 @@
extends State
## Shortcut to get_parent().get_parent()
@onready var ship = get_parent().get_parent()
## Shortcut to current scene
@onready var star_system = get_tree().current_scene
## Timer which randomizes destination
@onready var update_timer = $UpdateDestination
## Radius in which ship will transit to attack state
@export var search_distance: float = 1024.0
## Ship will strive to achieve this angle
var destination_degrees: float = 0:
set(value):
@ -13,10 +17,19 @@ var destination_degrees: float = 0:
destination_degrees = 360 + value
else:
destination_degrees = value
## Difference between current rotation and destination angle, in degrees. Sign determines torque direction.
var current_destination_difference: float = 0:
set(value):
if value < 0:
current_destination_difference = 180 + value
if current_destination_difference > 180:
current_destination_difference = value - 180
## Delta to destination_degrees
var destination_difference: float = 15.0
## available map bounds (use with absolute position)
var available_bounds: Vector2
# for testing purposes only
var player_ship: PlayerShip = null
func _ready():
available_bounds = Vector2(star_system.width / 2, star_system.height / 2)
@ -24,16 +37,13 @@ func _ready():
func enter(_message):
update_timer.start()
get_tree().create_timer(0.02).timeout.connect(get_player_ship)
update_destination()
func process(_delta):
# checking if need to apply torque
var current_destination_difference = destination_degrees - ship.hull.global_rotation_degrees
current_destination_difference = destination_degrees - ship.hull.global_rotation_degrees
var rotation_sign = sign(current_destination_difference)
if current_destination_difference < 0:
current_destination_difference = 180 - current_destination_difference
if current_destination_difference > 180:
current_destination_difference -= 180
if abs(current_destination_difference) > destination_difference:
ship.engine.rotation_axis = rotation_sign * (current_destination_difference / 180)
else:
@ -43,6 +53,13 @@ func process(_delta):
# if ship is out of star system bounds, set destination angle to center
if abs(ship.global_position.x) > available_bounds.x or abs(ship.global_position.y) > available_bounds.y:
destination_degrees = rad_to_deg(ship.global_position.angle_to_point(Vector2.ZERO))
# if distance to player is less than scan radius
# TODO: rewrite this to more complex behavior
if player_ship != null:
var distance_to_player = ship.global_position.distance_to(player_ship.position)
if distance_to_player <= search_distance:
get_parent().transit("AttackState", {"target": player_ship})
func exit():
update_timer.stop()
@ -50,3 +67,6 @@ func exit():
## Set new random direction
func update_destination():
destination_degrees += randi_range(-180, 180)
func get_player_ship():
player_ship = star_system.player_ship