From 14d397ab609516238833890d62290f3fb5e0adb7 Mon Sep 17 00:00:00 2001 From: ToasterPanic Date: Thu, 4 Dec 2025 17:09:20 -0500 Subject: [PATCH] Boost & health bars, enemy AI improvements, LimboConsole commands --- scenes/game.tscn | 160 +++++++++++++++++++++++++++++++++++++++++++++- scenes/ui.tres | 25 +++++++- scripts/enemy.gd | 24 +++++-- scripts/game.gd | 15 ++++- scripts/player.gd | 16 +++++ 5 files changed, 229 insertions(+), 11 deletions(-) diff --git a/scenes/game.tscn b/scenes/game.tscn index f695968..6e0f718 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -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) diff --git a/scenes/ui.tres b/scenes/ui.tres index 93fa420..3a832cf 100644 --- a/scenes/ui.tres +++ b/scenes/ui.tres @@ -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") diff --git a/scripts/enemy.gd b/scripts/enemy.gd index 40cff91..dc11731 100644 --- a/scripts/enemy.gd +++ b/scripts/enemy.gd @@ -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 @@ -159,7 +158,18 @@ 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() diff --git a/scripts/game.gd b/scripts/game.gd index 0008662..6f77d53 100644 --- a/scripts/game.gd +++ b/scripts/game.gd @@ -7,9 +7,18 @@ 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: @@ -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 diff --git a/scripts/player.gd b/scripts/player.gd index bbd0baa..e6885bd 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -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