Skip to content

Commit

Permalink
Merge pull request #29 from jspahrsummers/hyperdrive
Browse files Browse the repository at this point in the history
Hyperdrive
  • Loading branch information
jspahrsummers authored Jul 14, 2024
2 parents f133aeb + 9de3f02 commit ca50c80
Show file tree
Hide file tree
Showing 42 changed files with 720 additions and 314 deletions.
55 changes: 35 additions & 20 deletions actors/player.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class_name Player
##
## [b]This script expects the parent node to be a [Ship].[/b]

@export var hyperspace_controller: HyperspaceController
@export var hyperspace_scene_switcher: HyperspaceSceneSwitcher
@export var message_log: MessageLog
@export var landing_scene: PackedScene
@export var takeoff_sound: AudioStreamPlayer
Expand All @@ -30,6 +30,9 @@ signal target_changed(player: Player, target: CombatObject)
## Fires when the player changes their landing target.
signal landing_target_changed(player: Player, target: PlanetInstance)

## Fires when the ship's hyperdrive changes.
signal hyperdrive_changed(player: Player, hyperdrive: Hyperdrive)

## The current target for landing, if any.
var landing_target: PlanetInstance = null:
set(value):
Expand All @@ -45,6 +48,9 @@ var landing_target: PlanetInstance = null:
if landing_target:
landing_target.targeted_by_player = true

## Created to turn the [Ship] when using the relative control scheme.
var _rigid_body_turner: RigidBodyTurner

## When using the "absolute" control scheme, this is the tolerance (in radians) for being slightly off-rotated while enabling thrusters.
const ABSOLUTE_DIRECTION_TOLERANCE_RAD = 0.1745

Expand All @@ -54,11 +60,10 @@ const MAX_LANDING_DISTANCE = 2.0
const MAX_LANDING_VELOCITY = 4.0

func _ready() -> void:
var turner: RigidBodyTurner = RigidBodyTurner.new()
turner.spin_thruster = self.ship.rigid_body_direction.spin_thruster
turner.battery = self.ship.rigid_body_direction.battery
self.ship.add_child.call_deferred(turner)
self.ship.rigid_body_turner = turner
self._rigid_body_turner = RigidBodyTurner.new()
self._rigid_body_turner.spin_thruster = self.ship.rigid_body_direction.spin_thruster
self._rigid_body_turner.battery = self.ship.rigid_body_direction.battery
self.ship.add_child.call_deferred(self._rigid_body_turner)
self.ship.radar_object.iff = RadarObject.IFF.SELF
self.ship.targeting_system.is_player = true

Expand All @@ -67,13 +72,15 @@ func _ready() -> void:
self.ship.combat_object.shield.changed.connect(_on_shield_changed)
self.ship.power_management_unit.battery.changed.connect(_on_power_changed)
self.ship.targeting_system.target_changed.connect(_on_target_changed)
self.ship.hyperdrive_system.hyperdrive.changed.connect(_on_hyperdrive_changed)

InputEventBroadcaster.input_event.connect(_on_broadcasted_input_event)

# Initial notifications so the UI can update.
self._on_hull_changed()
self._on_shield_changed()
self._on_power_changed()
self._on_hyperdrive_changed()

func _on_hull_changed() -> void:
self.hull_changed.emit(self, self.ship.combat_object.hull)
Expand All @@ -91,18 +98,23 @@ func _on_hull_destroyed(hull: Hull) -> void:
func _on_target_changed(targeting_system: TargetingSystem) -> void:
self.target_changed.emit(self, targeting_system.target)

func _on_jump_destination_loaded(_system: StarSystem) -> void:
func _on_jump_destination_loaded(_new_system_instance: StarSystemInstance) -> void:
self._reset_velocity()
self.ship.position = MathUtils.random_unit_vector() * HYPERSPACE_ARRIVAL_RADIUS
self.ship.targeting_system.target = null

func _on_hyperdrive_changed() -> void:
self.hyperdrive_changed.emit(self, self.ship.hyperdrive_system.hyperdrive)

func _next_system_connection() -> StarSystem:
var current_destination_name: Variant = null
if self.hyperspace_controller.jump_destination:
current_destination_name = self.hyperspace_controller.jump_destination.name
if self.ship.hyperdrive_system.jump_destination:
current_destination_name = self.ship.hyperdrive_system.jump_destination.name

var next_destination_name: Variant = ArrayUtils.cycle_through(self.hyperspace_controller.current_system.connections, current_destination_name)
return self.hyperspace_controller.galaxy.get_system(next_destination_name as StringName) if next_destination_name else null
var current_system := self.ship.hyperdrive_system.current_system()
var galaxy: Galaxy = current_system.galaxy.get_ref()
var next_destination_name: Variant = ArrayUtils.cycle_through(current_system.connections, current_destination_name)
return galaxy.get_system(next_destination_name as StringName) if next_destination_name else null

func _next_target() -> CombatObject:
var available_targets := self.ship.targeting_system.get_available_targets()
Expand Down Expand Up @@ -130,11 +142,11 @@ func _closest_landing_target() -> PlanetInstance:
return nearest_planet_instance

func _unhandled_key_input(event: InputEvent) -> void:
if self.hyperspace_controller.jumping:
if self.ship.hyperdrive_system.jumping:
return

if event.is_action_pressed("cycle_jump_destination", true):
self.hyperspace_controller.set_jump_destination(self._next_system_connection())
self.ship.hyperdrive_system.jump_destination = self._next_system_connection()
self.get_viewport().set_input_as_handled()

if event.is_action_pressed("cycle_target", true):
Expand Down Expand Up @@ -171,14 +183,16 @@ func _on_broadcasted_input_event(receiver: Node, event: InputEvent) -> void:
return

func _jump_to_hyperspace() -> void:
if not self.hyperspace_controller.jump_destination:
if not self.ship.hyperdrive_system.jump_destination:
return

if not self.hyperspace_scene_switcher.start_jump():
return

self.landing_target = null

# Lock controls
self._reset_controls()
self.hyperspace_controller.start_jump()

func _land() -> void:
if not self.landing_target:
Expand All @@ -201,6 +215,7 @@ func _land() -> void:
return

var landing: Landing = self.landing_scene.instantiate()
landing.player = self
landing.planet = planet
self.ship.add_sibling(landing)
self.ship.get_parent().remove_child(self.ship)
Expand All @@ -219,7 +234,7 @@ func _depart_from_planet() -> void:
func _reset_controls() -> void:
self.ship.rigid_body_thruster.throttle = 0.0
self.ship.rigid_body_direction.direction = Vector3.ZERO
self.ship.rigid_body_turner.turning = 0.0
self._rigid_body_turner.turning = 0.0

func _reset_velocity() -> void:
self.ship.linear_velocity = Vector3.ZERO
Expand All @@ -230,7 +245,7 @@ func _absolute_input_direction() -> Vector3:
return Vector3(input_direction.x, 0, input_direction.y)

func _physics_process(_delta: float) -> void:
if self.hyperspace_controller.jumping:
if self.ship.hyperdrive_system.jumping:
return

if Input.is_action_pressed("jump"):
Expand All @@ -254,11 +269,11 @@ func _physics_process(_delta: float) -> void:

self.ship.rigid_body_direction.direction = Vector3.ZERO
if Input.is_action_pressed("turn_left"):
self.ship.rigid_body_turner.turning = -1.0
self._rigid_body_turner.turning = -1.0
elif Input.is_action_pressed("turn_right"):
self.ship.rigid_body_turner.turning = 1.0
self._rigid_body_turner.turning = 1.0
else:
self.ship.rigid_body_turner.turning = 0.0
self._rigid_body_turner.turning = 0.0

UserPreferences.ControlScheme.ABSOLUTE:
var desired_direction := self._absolute_input_direction()
Expand Down
11 changes: 7 additions & 4 deletions fx/hyperspace/hyperspace_effect.gd
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ extends MeshInstance3D
##
## Besides being visually interesting, this effect also serves to hide the scene transition, where otherwise nodes would pop in and out.

@export var hyperspace_controller: HyperspaceController
@export var hyperspace_scene_switcher: HyperspaceSceneSwitcher
@export var hyperspace_viewport: SubViewport

## An audio clip to play when a hyperspace jump begins.
Expand Down Expand Up @@ -32,7 +32,10 @@ func _random_rotation() -> Vector3:
_random_radians(),
)

func _on_jump_started(_destination: StarSystem) -> void:
func _on_jumping_changed(hyperdrive_system: HyperdriveSystem) -> void:
if not hyperdrive_system.jumping:
return

self.hyperspace_viewport.render_target_update_mode = SubViewport.UPDATE_ONCE
self.rotation = self.initial_rotation
self.scale = self.initial_scale
Expand All @@ -47,7 +50,7 @@ func _on_jump_started(_destination: StarSystem) -> void:

await tween.finished

self.hyperspace_controller.load_jump_destination()
self.hyperspace_scene_switcher.load_jump_destination()

# Jump in effect
tween = self.create_tween()
Expand All @@ -57,4 +60,4 @@ func _on_jump_started(_destination: StarSystem) -> void:
await tween.finished

self.visible = false
self.hyperspace_controller.finish_jump()
self.hyperspace_scene_switcher.finish_jump()
7 changes: 7 additions & 0 deletions galaxy/galaxy.gd
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ class_name Galaxy
## A list of all systems in the galaxy.
@export var systems: Array[StarSystem]

func _init() -> void:
self._connect_backref.call_deferred()

func _connect_backref() -> void:
for system in self.systems:
system.galaxy = weakref(self)

## Looks up a system by name.
func get_system(name: StringName) -> StarSystem:
for system in systems:
Expand Down
28 changes: 6 additions & 22 deletions galaxy/main_galaxy.tres
Original file line number Diff line number Diff line change
@@ -1,27 +1,11 @@
[gd_resource type="Resource" script_class="Galaxy" load_steps=7 format=3 uid="uid://bcva4l4cpt70c"]
[gd_resource type="Resource" script_class="Galaxy" load_steps=6 format=3 uid="uid://bcva4l4cpt70c"]

[ext_resource type="Script" path="res://galaxy/galaxy.gd" id="1_bckai"]
[ext_resource type="Script" path="res://galaxy/star_systems/star_system.gd" id="2_mnbif"]
[ext_resource type="Resource" uid="uid://cew4x137v08q" path="res://galaxy/star_systems/sol.tres" id="2_va8e4"]

[sub_resource type="Resource" id="Resource_44mst"]
script = ExtResource("2_mnbif")
name = &"Alpha Centauri"
connections = Array[StringName]([&"Sol", &"Wolf 359"])
position = Vector3(2.5, 0.2, -3.7)

[sub_resource type="Resource" id="Resource_uo457"]
script = ExtResource("2_mnbif")
name = &"Barnard\'s Star"
connections = Array[StringName]([&"Sol"])
position = Vector3(3, 2.08165e-12, 3)

[sub_resource type="Resource" id="Resource_v2b8x"]
script = ExtResource("2_mnbif")
name = &"Wolf 359"
connections = Array[StringName]([&"Sol", &"Alpha Centauri"])
position = Vector3(-2, 2.08165e-12, -2)
[ext_resource type="Resource" uid="uid://cew4x137v08q" path="res://galaxy/star_system/star_systems/sol.tres" id="2_va8e4"]
[ext_resource type="Resource" uid="uid://cs1x8gyt6a7kw" path="res://galaxy/star_system/star_systems/alpha_centauri.tres" id="3_ulruw"]
[ext_resource type="Resource" uid="uid://shiglva7yxl0" path="res://galaxy/star_system/star_systems/barnard's_star.tres" id="4_jkjw5"]
[ext_resource type="Resource" uid="uid://di0bekcy5g0ya" path="res://galaxy/star_system/star_systems/wolf_359.tres" id="5_8a1bp"]

[resource]
script = ExtResource("1_bckai")
systems = Array[ExtResource("2_mnbif")]([ExtResource("2_va8e4"), SubResource("Resource_44mst"), SubResource("Resource_uo457"), SubResource("Resource_v2b8x")])
systems = Array[Resource("res://galaxy/star_system/star_system.gd")]([ExtResource("2_va8e4"), ExtResource("3_ulruw"), ExtResource("4_jkjw5"), ExtResource("5_8a1bp")])
38 changes: 21 additions & 17 deletions galaxy/map/galaxy_map.gd
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ extends Node3D

## Presents the in-game galaxy map, showing all star systems.

@export var hyperspace_controller: HyperspaceController
@export var hyperdrive_system: HyperdriveSystem

## The galaxy to display.
@export var galaxy: Galaxy
Expand All @@ -20,13 +20,14 @@ extends Node3D
var _system_nodes: Dictionary = {}

func _ready() -> void:
var current_system := self.hyperdrive_system.current_system()
for system in galaxy.systems:
var system_node: GalaxyMapSystem = self.galaxy_map_system.instantiate()
self._system_nodes[system.name] = system_node
system_node.clicked.connect(func(node: GalaxyMapSystem) -> void: self._on_system_clicked(system, node))

system_node.name = system.name
system_node.current = (system == self.hyperspace_controller.current_system)
system_node.current = (system == current_system)
self.add_child(system_node)

system_node.transform.origin = system.position
Expand All @@ -41,14 +42,16 @@ func _ready() -> void:
hyperlane.ending_position = connected_system.position
self.add_child(hyperlane)

func _on_jump_started(_destination: StarSystem) -> void:
var current_name := self.hyperspace_controller.current_system.name
self._system_nodes[current_name].current = false
func _on_jumping_changed(_hyperdrive_system: HyperdriveSystem) -> void:
assert(self.hyperdrive_system == _hyperdrive_system)

func _on_jump_finished(new_system: StarSystem) -> void:
var new_name := new_system.name
self.camera.center = new_system.position
self._system_nodes[new_name].current = true
if self.hyperdrive_system.jumping:
var current_name := self.hyperdrive_system.current_system().name
self._system_nodes[current_name].current = false
else:
var new_system := self.hyperdrive_system.current_system()
self.camera.center = new_system.position
self._system_nodes[new_system.name].current = true

func _input(event: InputEvent) -> void:
if event.is_action_pressed("toggle_galaxy_map"):
Expand All @@ -59,24 +62,25 @@ func _on_window_close_requested() -> void:
self.get_window().visible = false

func _on_system_clicked(star_system: StarSystem, _system_node: GalaxyMapSystem) -> void:
if self.hyperspace_controller.jumping:
if self.hyperdrive_system.jumping:
return

if star_system.name not in self.hyperspace_controller.current_system.connections:
if star_system.name not in self.hyperdrive_system.current_system().connections:
return

self.hyperspace_controller.set_jump_destination(star_system)
self.hyperdrive_system.jump_destination = star_system

func _on_hyperlane_clicked(from_system: StarSystem, to_system: StarSystem, _hyperlane_node: GalaxyMapHyperlane) -> void:
if self.hyperspace_controller.jumping:
if self.hyperdrive_system.jumping:
return


var current_system := self.hyperdrive_system.current_system()
var connection: StarSystem
if from_system == self.hyperspace_controller.current_system:
if from_system == current_system:
connection = to_system
elif to_system == self.hyperspace_controller.current_system:
elif to_system == current_system:
connection = from_system
else:
return

self.hyperspace_controller.set_jump_destination(connection)
self.hyperdrive_system.jump_destination = connection
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
[gd_scene load_steps=4 format=3 uid="uid://cyoasaafloxke"]
[gd_scene load_steps=6 format=3 uid="uid://cyoasaafloxke"]

[ext_resource type="Script" path="res://galaxy/star_system/star_system_instance.gd" id="1_hu4s2"]
[ext_resource type="PackedScene" uid="uid://cji43wyk7116p" path="res://stars/star.tscn" id="1_hyeo5"]
[ext_resource type="Texture2D" uid="uid://b0m27jnaenria" path="res://stars/sprites/star_orange03.png" id="2_ah0uv"]
[ext_resource type="Resource" uid="uid://cs1x8gyt6a7kw" path="res://galaxy/star_system/star_systems/alpha_centauri.tres" id="2_ex383"]
[ext_resource type="Texture2D" uid="uid://dfmoa1t4rv4kk" path="res://stars/sprites/star_red01.png" id="2_hng7k"]

[node name="Alpha Centauri" type="Node3D" groups=["star_system"]]
[node name="Alpha Centauri" type="Node3D"]
script = ExtResource("1_hu4s2")
star_system = ExtResource("2_ex383")

[node name="Rigil Kentaurus" parent="." instance=ExtResource("1_hyeo5")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5019, 2.08165e-12, -4.44388)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
[gd_scene load_steps=11 format=3 uid="uid://cghdtnx2qen2u"]
[gd_scene load_steps=13 format=3 uid="uid://cghdtnx2qen2u"]

[ext_resource type="PackedScene" uid="uid://cji43wyk7116p" path="res://stars/star.tscn" id="1_dt7yu"]
[ext_resource type="Script" path="res://galaxy/star_system/star_system_instance.gd" id="1_pqej6"]
[ext_resource type="Texture2D" uid="uid://bsgwmdcreel60" path="res://stars/sprites/star_red02.png" id="2_xr5lq"]
[ext_resource type="Resource" uid="uid://shiglva7yxl0" path="res://galaxy/star_system/star_systems/barnard's_star.tres" id="2_y4tl8"]
[ext_resource type="Script" path="res://mechanics/combat/shield.gd" id="4_avs2c"]
[ext_resource type="Script" path="res://mechanics/combat/hull.gd" id="5_4e6ev"]
[ext_resource type="Script" path="res://mechanics/power/battery.gd" id="6_s58bt"]
Expand All @@ -28,7 +30,9 @@ script = ExtResource("6_s58bt")
max_power = 300.0
power = 300.0

[node name="Barnard\'s Star" type="Node3D" groups=["star_system"]]
[node name="Barnard\'s Star" type="Node3D"]
script = ExtResource("1_pqej6")
star_system = ExtResource("2_y4tl8")

[node name="Star" parent="." instance=ExtResource("1_dt7yu")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 2.65429, 2.08165e-12, 11.1402)
Expand Down Expand Up @@ -69,3 +73,4 @@ battery = SubResource("Resource_62daw")

[editable path="Star"]
[editable path="Frigate"]
[editable path="Frigate/CombatObject/TargetOverlay"]
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
[gd_scene load_steps=16 format=3 uid="uid://2mdsbbko7baw"]
[gd_scene load_steps=18 format=3 uid="uid://2mdsbbko7baw"]

[ext_resource type="Script" path="res://galaxy/star_system/star_system_instance.gd" id="1_6tnek"]
[ext_resource type="PackedScene" uid="uid://cji43wyk7116p" path="res://stars/star.tscn" id="1_j8iws"]
[ext_resource type="Resource" uid="uid://cew4x137v08q" path="res://galaxy/star_system/star_systems/sol.tres" id="2_gs8wx"]
[ext_resource type="PackedScene" uid="uid://b04hfgkcuq7k6" path="res://planet/planet_instance.tscn" id="3_7gpxn"]
[ext_resource type="Resource" uid="uid://cmm0akidhocmo" path="res://planet/planets/earth.tres" id="3_qvwl4"]
[ext_resource type="Texture2D" uid="uid://bqxxjmbapro8l" path="res://planet/sprites/planet_02.png" id="4_afp06"]
Expand Down Expand Up @@ -33,7 +35,9 @@ script = ExtResource("9_w4i7k")
max_power = 300.0
power = 300.0

[node name="Sol" type="Node3D" groups=["star_system"]]
[node name="Sol" type="Node3D"]
script = ExtResource("1_6tnek")
star_system = ExtResource("2_gs8wx")

[node name="Star" parent="." instance=ExtResource("1_j8iws")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 2.08165e-12, -3)
Expand Down
Loading

0 comments on commit ca50c80

Please sign in to comment.