Boost & health bars, enemy AI improvements, LimboConsole commands

This commit is contained in:
ToasterPanic 2025-12-04 17:09:20 -05:00
parent 45c79db18c
commit 14d397ab60
5 changed files with 229 additions and 11 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=21 format=4 uid="uid://bauklhpieuivd"]
[gd_scene load_steps=28 format=4 uid="uid://bauklhpieuivd"]
[ext_resource type="Script" uid="uid://d0qswyhwbhdua" path="res://scripts/game.gd" id="1_u5sy4"]
[ext_resource type="Texture2D" uid="uid://dtwo7g0ipc4k" path="res://textures/ship_1.png" id="1_uwrxv"]
@ -14,6 +14,7 @@
[ext_resource type="Shader" uid="uid://bk7q00br1ms30" path="res://scripts/retro.gdshader" id="12_kvuet"]
[ext_resource type="Texture2D" uid="uid://hgfmjw6gbdnn" path="res://textures/blank.png" id="12_trtic"]
[ext_resource type="Script" uid="uid://d0txwo63hlrsy" path="res://scripts/enterable.gd" id="13_trtic"]
[ext_resource type="Theme" uid="uid://dtc7h6gpwpend" path="res://scenes/ui.tres" id="15_ir15t"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ir15t"]
texture = ExtResource("12_trtic")
@ -35,6 +36,29 @@ points = PackedVector2Array(-16, 16, 16, 16, 0, -16)
[sub_resource type="CircleShape2D" id="CircleShape2D_lnu2h"]
radius = 20.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ca42v"]
bg_color = Color(0, 0, 1, 1)
corner_detail = 1
[sub_resource type="LabelSettings" id="LabelSettings_rysoc"]
outline_size = 2
outline_color = Color(0, 0, 0, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ssvqc"]
bg_color = Color(1, 0, 0, 1)
corner_detail = 1
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ir15t"]
bg_color = Color(0.5421658, 0.0015220869, 0.72708863, 1)
corner_detail = 1
[sub_resource type="LabelSettings" id="LabelSettings_ca42v"]
outline_size = 2
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rysoc"]
bg_color = Color(1, 0, 0, 1)
corner_detail = 1
[sub_resource type="ShaderMaterial" id="ShaderMaterial_trtic"]
shader = ExtResource("12_kvuet")
shader_parameter/shake = 0.002000000095
@ -85,6 +109,8 @@ shape = SubResource("RectangleShape2D_kvuet")
position = Vector2(0, 245.5)
rotation = 3.1415927
[node name="Unloadables" type="Node2D" parent="."]
[node name="Player" type="RigidBody2D" parent="."]
position = Vector2(-78, 957)
linear_damp = 6.247
@ -105,6 +131,7 @@ bus = &"Sound Effects"
[node name="Fire" type="AudioStreamPlayer" parent="Player"]
stream = ExtResource("8_vtaks")
max_polyphony = 4
[node name="Sprite" type="Sprite2D" parent="Player"]
texture = ExtResource("1_uwrxv")
@ -125,7 +152,83 @@ rotation_smoothing_speed = 15.0
shape = SubResource("CircleShape2D_lnu2h")
debug_color = Color(0.9686392, 0, 0.4696517, 0.41960785)
[node name="Unloadables" type="Node2D" parent="."]
[node name="BoostMeter" type="ProgressBar" parent="Player"]
custom_minimum_size = Vector2(12, 0)
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -54.0
offset_top = -24.0
offset_right = -42.0
offset_bottom = 24.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_styles/fill = SubResource("StyleBoxFlat_ca42v")
value = 100.0
fill_mode = 2
show_percentage = false
[node name="Label" type="Label" parent="Player/BoostMeter"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -23.0
offset_top = -12.0
offset_right = 23.0
offset_bottom = 12.0
grow_horizontal = 2
grow_vertical = 2
pivot_offset = Vector2(23, 12)
text = "100"
label_settings = SubResource("LabelSettings_rysoc")
horizontal_alignment = 1
vertical_alignment = 1
[node name="HealthMeter" type="ProgressBar" parent="Player"]
custom_minimum_size = Vector2(12, 0)
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = 42.0
offset_top = -24.0
offset_right = 54.0
offset_bottom = 24.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_styles/fill = SubResource("StyleBoxFlat_ssvqc")
value = 100.0
fill_mode = 2
show_percentage = false
[node name="Label" type="Label" parent="Player/HealthMeter"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -23.0
offset_top = -12.0
offset_right = 23.0
offset_bottom = 12.0
grow_horizontal = 2
grow_vertical = 2
pivot_offset = Vector2(23, 12)
text = "100"
label_settings = SubResource("LabelSettings_rysoc")
horizontal_alignment = 1
vertical_alignment = 1
[node name="UI" type="CanvasLayer" parent="."]
@ -154,6 +257,59 @@ offset_bottom = 12.0
grow_vertical = 2
text = "DIST: 2048"
[node name="PanelContainer" type="PanelContainer" parent="UI/Control"]
layout_mode = 1
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -52.0
offset_right = 260.0
grow_vertical = 0
theme = ExtResource("15_ir15t")
[node name="HFlowContainer" type="HFlowContainer" parent="UI/Control/PanelContainer"]
layout_mode = 2
theme_override_constants/v_separation = 0
[node name="Fuel" type="ProgressBar" parent="UI/Control/PanelContainer/HFlowContainer"]
custom_minimum_size = Vector2(256, 24)
layout_mode = 2
theme_override_styles/fill = SubResource("StyleBoxFlat_ir15t")
value = 100.0
show_percentage = false
[node name="Label" type="Label" parent="UI/Control/PanelContainer/HFlowContainer/Fuel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
text = "100% FUEL"
label_settings = SubResource("LabelSettings_ca42v")
horizontal_alignment = 1
vertical_alignment = 1
[node name="Health" type="ProgressBar" parent="UI/Control/PanelContainer/HFlowContainer"]
custom_minimum_size = Vector2(256, 24)
layout_mode = 2
theme_override_styles/fill = SubResource("StyleBoxFlat_rysoc")
value = 50.0
fill_mode = 1
show_percentage = false
[node name="Label" type="Label" parent="UI/Control/PanelContainer/HFlowContainer/Health"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
text = "+1000 HEALTH"
label_settings = SubResource("LabelSettings_ca42v")
horizontal_alignment = 1
vertical_alignment = 1
[node name="FadeToBlack" type="ColorRect" parent="UI"]
process_mode = 3
modulate = Color(1, 1, 1, 0)

View file

@ -1,4 +1,4 @@
[gd_resource type="Theme" load_steps=4 format=3 uid="uid://dtc7h6gpwpend"]
[gd_resource type="Theme" load_steps=7 format=3 uid="uid://dtc7h6gpwpend"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mq06m"]
bg_color = Color(0, 0, 0, 1)
@ -29,6 +29,23 @@ expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_s6eqm"]
bg_color = Color(0, 0, 0, 1)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.53333336, 0.53333336, 0.53333336, 1)
corner_detail = 1
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cv53u"]
bg_color = Color(0, 0, 0, 1)
corner_detail = 1
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_twtfq"]
bg_color = Color(1, 1, 1, 1)
corner_detail = 1
[resource]
Button/colors/font_color = Color(0, 0, 0, 1)
Button/colors/font_focus_color = Color(1, 1, 1, 1)
@ -41,3 +58,9 @@ Button/styles/hover = SubResource("StyleBoxFlat_mq06m")
Button/styles/hover_pressed = SubResource("StyleBoxFlat_ue5e3")
Button/styles/normal = SubResource("StyleBoxFlat_oei2i")
Button/styles/pressed = SubResource("StyleBoxFlat_ue5e3")
Panel/styles/panel = SubResource("StyleBoxFlat_s6eqm")
PanelContainer/styles/panel = SubResource("StyleBoxFlat_s6eqm")
ProgressBar/colors/font_color = Color(0, 0, 0, 1)
ProgressBar/constants/outline_size = 2
ProgressBar/styles/background = SubResource("StyleBoxFlat_cv53u")
ProgressBar/styles/fill = SubResource("StyleBoxFlat_twtfq")

View file

@ -10,6 +10,9 @@ var firing = true
var axis = 0
var movement_axis = -1
var evade_direction = 1
var stress = 0
var AI_MODE_ATTACK = 1
@ -135,12 +138,8 @@ func _process(delta: float) -> void:
if ai_mode == AI_MODE_ATTACK:
firing = false
if !front_cast and (player_distance > 480):
if !front_cast and (player_distance > 720):
boost_pressed = true
elif $FireCast.get_collider() == player:
if player_distance > 480: boost_pressed = true
firing = true
else:
boost_pressed = false
@ -160,6 +159,17 @@ func _process(delta: float) -> void:
if (player.linear_velocity.length() > 256) or (player_distance > 320):
ai_state = AI_STATE_TRACK_ENEMY
var direction = (player.position - position).normalized()
# Optionally, you can get the angle if needed
var angle = direction.angle() + deg_to_rad(90)
var angular_target = wrapf(angle - rotation, -PI, PI)
if abs(rad_to_deg(rotation - angular_target)) < 15:
if player_distance > 480: boost_pressed = true
firing = true
if front_cast:
var front_cast_distance = ($SightCast.get_collision_point() - position).length()
@ -211,6 +221,8 @@ func _physics_process(delta: float) -> void:
func _on_hitbox_body_shape_entered(body_rid: RID, body: Node2D, body_shape_index: int, local_shape_index: int) -> void:
if not "linear_velocity" in body: return
if body.linear_velocity.length() + linear_velocity.length() > 256:
$Collision.play()

View file

@ -7,10 +7,19 @@ var time_since_last_atmospheric_track = 999
var current_atmospheric_track = null
var asteroid_scene = preload("res://scenes/asteroid.tscn")
var enemy_scene = preload("res://scenes/enemy.tscn")
func ship_heal(health: float = 1000) -> void:
func ship_health(health: float = 1000) -> void:
$Player.health = health
func summon_enemy() -> void:
var spawn_position = $Player.position + ($Player.transform.y * 1024)
var enemy = enemy_scene.instantiate()
enemy.position = spawn_position
add_child(enemy)
## Takes a world coordinate and converts it to a chunk coordinate.
func world_to_chunk(position: Vector2) -> Vector2:
return Vector2(floori(position.x / 1024), floori(position.y / 1024))
@ -42,7 +51,9 @@ func enter_physical(map):
func _ready() -> void:
LimboConsole
LimboConsole.register_command(ship_health, "ship_health", "Sets the ship's health.")
LimboConsole.register_command(summon_enemy, "summon_enemy", "Summons an enemy.")
if global.ground_location:
$Player.global_position = get_node(global.ground_location + "/ExitPoint").global_position
$Player.rotation = get_node(global.ground_location + "/ExitPoint").rotation

View file

@ -20,6 +20,8 @@ func _process(delta: float) -> void:
if (time_since_last_fire <= 0) and Input.is_action_pressed("fire"):
time_since_last_fire = 0.25
$Fire.play()
var laser = laser_scene.instantiate()
laser.creator = self
@ -52,6 +54,20 @@ func _process(delta: float) -> void:
boosting = true
$Boost.play()
if boost < 100:
$BoostMeter.modulate = Color(1, 1, 1, 1)
else:
$BoostMeter.modulate.a -= delta * 2
$BoostMeter.value = boost
$BoostMeter/Label.text = str(floori(boost))
if health < 100:
$HealthMeter.modulate = Color(1, 1, 1, 1)
else:
$HealthMeter.modulate.a -= delta * 2
$HealthMeter.value = health / 10
$HealthMeter/Label.text = str(floori(health / 10))
if camera_shake_power > 0:
camera_shake_power -= delta * 20