diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..ea450fe --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,15 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://cbmx3klr6k4mt"] + +[resource] +bus/1/name = &"Music" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = 0.0 +bus/1/send = &"Master" +bus/2/name = &"Sound Effects" +bus/2/solo = false +bus/2/mute = false +bus/2/bypass_fx = false +bus/2/volume_db = 0.0 +bus/2/send = &"Master" diff --git a/scenes/enemy.tscn b/scenes/enemy.tscn new file mode 100644 index 0000000..429c786 --- /dev/null +++ b/scenes/enemy.tscn @@ -0,0 +1,53 @@ +[gd_scene load_steps=9 format=3 uid="uid://dy6dv2tio433m"] + +[ext_resource type="Script" uid="uid://8d4jhy3fo32b" path="res://scripts/enemy.gd" id="1_xwavj"] +[ext_resource type="AudioStream" uid="uid://brqjxveo53kco" path="res://sounds/boost.mp3" id="2_nenq2"] +[ext_resource type="AudioStream" uid="uid://b1ung55xg31l3" path="res://sounds/boost_finish.mp3" id="3_md484"] +[ext_resource type="AudioStream" uid="uid://5tr30e1tmdp6" path="res://sounds/collision.mp3" id="4_ipns3"] +[ext_resource type="AudioStream" uid="uid://y7lhonymtk3t" path="res://sounds/fire.mp3" id="5_8qclf"] +[ext_resource type="Texture2D" uid="uid://dtwo7g0ipc4k" path="res://textures/ship_1.png" id="6_w8i8w"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_uwrxv"] +radius = 16.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_lnu2h"] +radius = 20.0 + +[node name="Enemy" type="RigidBody2D"] +linear_damp = 6.247 +script = ExtResource("1_xwavj") + +[node name="Boost" type="AudioStreamPlayer" parent="."] +stream = ExtResource("2_nenq2") +pitch_scale = 0.75 +bus = &"Sound Effects" + +[node name="BoostFinish" type="AudioStreamPlayer" parent="."] +stream = ExtResource("3_md484") +volume_db = -80.0 +bus = &"Sound Effects" + +[node name="Collision" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_ipns3") +pitch_scale = 0.75 +bus = &"Sound Effects" + +[node name="Fire" type="AudioStreamPlayer" parent="."] +stream = ExtResource("5_8qclf") + +[node name="Sprite" type="Sprite2D" parent="."] +texture = ExtResource("6_w8i8w") + +[node name="CollisionShape" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_uwrxv") + +[node name="Hitbox" type="Area2D" parent="."] + +[node name="CollisionShape" type="CollisionShape2D" parent="Hitbox"] +shape = SubResource("CircleShape2D_lnu2h") +debug_color = Color(0.9686392, 0, 0.4696517, 0.41960785) + +[node name="SightCast" type="RayCast2D" parent="."] +target_position = Vector2(0, -256) + +[connection signal="body_shape_entered" from="Hitbox" to="." method="_on_hitbox_body_shape_entered"] diff --git a/scenes/game.tscn b/scenes/game.tscn index 7540615..cfe767e 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=3 uid="uid://bauklhpieuivd"] +[gd_scene load_steps=19 format=3 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"] @@ -8,7 +8,10 @@ [ext_resource type="AudioStream" uid="uid://5tr30e1tmdp6" path="res://sounds/collision.mp3" id="2_lbhrr"] [ext_resource type="AudioStream" uid="uid://b6tyof2j3ytbv" path="res://sounds/concrete_halls.mp3" id="3_0tnpc"] [ext_resource type="AudioStream" uid="uid://b1ung55xg31l3" path="res://sounds/boost_finish.mp3" id="3_p57ef"] -[ext_resource type="Script" uid="uid://8d4jhy3fo32b" path="res://scripts/enemy.gd" id="9_0tnpc"] +[ext_resource type="AudioStream" uid="uid://y7lhonymtk3t" path="res://sounds/fire.mp3" id="8_vtaks"] +[ext_resource type="Script" uid="uid://b7te10evkqwhy" path="res://scripts/laser.gd" id="10_kvpfn"] +[ext_resource type="PackedScene" uid="uid://dy6dv2tio433m" path="res://scenes/enemy.tscn" id="11_dinhu"] +[ext_resource type="Texture2D" uid="uid://bb0v0jtreyba3" path="res://textures/laser.png" id="11_kvuet"] [sub_resource type="CircleShape2D" id="CircleShape2D_uwrxv"] radius = 16.0 @@ -16,16 +19,32 @@ radius = 16.0 [sub_resource type="CircleShape2D" id="CircleShape2D_lnu2h"] radius = 20.0 +[sub_resource type="CircleShape2D" id="CircleShape2D_trtic"] +radius = 12.0 + +[sub_resource type="Curve" id="Curve_ir15t"] +_data = [Vector2(0, 0.5393259), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_ca42v"] +curve = SubResource("Curve_ir15t") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_rysoc"] +gravity = Vector3(0, 98, 0) +alpha_curve = SubResource("CurveTexture_ca42v") + [node name="Game" type="Node2D"] script = ExtResource("1_u5sy4") [node name="BalladOfTheCats" type="AudioStreamPlayer" parent="."] stream = ExtResource("2_gee14") volume_db = -10.0 +bus = &"Music" [node name="ConcreteHalls" type="AudioStreamPlayer" parent="."] stream = ExtResource("3_0tnpc") volume_db = -10.0 +bus = &"Music" [node name="Player" type="RigidBody2D" parent="."] linear_damp = 6.247 @@ -33,13 +52,19 @@ script = ExtResource("1_yqjtg") [node name="Boost" type="AudioStreamPlayer" parent="Player"] stream = ExtResource("2_iywne") +bus = &"Sound Effects" [node name="BoostFinish" type="AudioStreamPlayer" parent="Player"] stream = ExtResource("3_p57ef") volume_db = -8.0 +bus = &"Sound Effects" [node name="Collision" type="AudioStreamPlayer" parent="Player"] stream = ExtResource("2_lbhrr") +bus = &"Sound Effects" + +[node name="Fire" type="AudioStreamPlayer" parent="Player"] +stream = ExtResource("8_vtaks") [node name="Sprite" type="Sprite2D" parent="Player"] texture = ExtResource("1_uwrxv") @@ -60,35 +85,28 @@ rotation_smoothing_speed = 15.0 shape = SubResource("CircleShape2D_lnu2h") debug_color = Color(0.9686392, 0, 0.4696517, 0.41960785) -[node name="Enemy" type="RigidBody2D" parent="."] -position = Vector2(0, -418) +[node name="Laser" type="RigidBody2D" parent="."] +position = Vector2(77, -428) linear_damp = 6.247 -script = ExtResource("9_0tnpc") +script = ExtResource("10_kvpfn") -[node name="Boost" type="AudioStreamPlayer" parent="Enemy"] -stream = ExtResource("2_iywne") +[node name="Sprite" type="Sprite2D" parent="Laser"] +texture = ExtResource("11_kvuet") -[node name="BoostFinish" type="AudioStreamPlayer" parent="Enemy"] -stream = ExtResource("3_p57ef") -volume_db = -8.0 +[node name="Hitbox" type="Area2D" parent="Laser"] -[node name="Collision" type="AudioStreamPlayer" parent="Enemy"] -stream = ExtResource("2_lbhrr") +[node name="CollisionShape" type="CollisionShape2D" parent="Laser/Hitbox"] +shape = SubResource("CircleShape2D_trtic") +debug_color = Color(1, 0, 0, 0.41960785) -[node name="Sprite" type="Sprite2D" parent="Enemy"] -texture = ExtResource("1_uwrxv") +[node name="Trail" type="GPUParticles2D" parent="Laser"] +amount = 24 +texture = ExtResource("11_kvuet") +lifetime = 0.05 +process_material = SubResource("ParticleProcessMaterial_rysoc") -[node name="CollisionShape" type="CollisionShape2D" parent="Enemy"] -shape = SubResource("CircleShape2D_uwrxv") - -[node name="Hitbox" type="Area2D" parent="Enemy"] - -[node name="CollisionShape" type="CollisionShape2D" parent="Enemy/Hitbox"] -shape = SubResource("CircleShape2D_lnu2h") -debug_color = Color(0.9686392, 0, 0.4696517, 0.41960785) - -[node name="SightCast" type="RayCast2D" parent="Enemy"] -target_position = Vector2(0, -256) +[node name="Enemy" parent="." instance=ExtResource("11_dinhu")] +position = Vector2(0, -418) [node name="Unloadables" type="Node2D" parent="."] @@ -120,4 +138,4 @@ grow_vertical = 2 text = "DIST: 2048" [connection signal="body_shape_entered" from="Player/Hitbox" to="Player" method="_on_hitbox_body_shape_entered"] -[connection signal="body_shape_entered" from="Enemy/Hitbox" to="Enemy" method="_on_hitbox_body_shape_entered"] +[connection signal="body_shape_entered" from="Laser/Hitbox" to="Laser" method="_on_hitbox_body_shape_entered"] diff --git a/scripts/enemy.gd b/scripts/enemy.gd index 8629e73..435f950 100644 --- a/scripts/enemy.gd +++ b/scripts/enemy.gd @@ -24,6 +24,8 @@ var ai_state = AI_STATE_TRACK_ENEMY var target_rotation = 0 var target_rotation_speed = 1 +var boost_pressed = false + var ai_tick = 0.1 @onready var player = get_parent().get_node("Player") @@ -65,7 +67,7 @@ func _process(delta: float) -> void: ai_tick -= delta if boosting: - if Input.is_action_pressed("boost"): + if boost_pressed: boost -= delta * 40 if boost <= 0: @@ -77,10 +79,10 @@ func _process(delta: float) -> void: $BoostFinish.play() else: boost += delta * 25 - if boost > 100: boost = 100 + if boost > 75: boost = 75 $Boost.stop() - if Input.is_action_just_pressed("boost") and (boost > 33): + if boost_pressed and (boost > 33): boosting = true $Boost.play() @@ -92,13 +94,8 @@ func _process(delta: float) -> void: movement_axis = -1 - if ai_state == AI_STATE_TRACK_ENEMY: - target_rotation = global_position.direction_to(player.position).angle() + deg_to_rad(270) - - if ai_state == AI_STATE_STATIONARY_ENEMY: - target_rotation = global_position.direction_to(player.position).angle() + deg_to_rad(270) - movement_axis = 0 - + var player_distance = (player.position - position).length() + var front_cast = cast(0) if !front_cast: $SightCast.position.x = -20 @@ -109,11 +106,26 @@ func _process(delta: float) -> void: front_cast = cast(0) $SightCast.position.x = 0 + + if ai_mode == AI_MODE_ATTACK: + if !front_cast and (player_distance > 480): + boost_pressed = true + elif front_cast == player: + if player_distance > 480: boost_pressed = true + else: + boost_pressed = false + + if ai_state == AI_STATE_TRACK_ENEMY: + target_rotation = global_position.direction_to(player.position).angle() + deg_to_rad(270) + + if ai_state == AI_STATE_STATIONARY_ENEMY: + target_rotation = global_position.direction_to(player.position).angle() + deg_to_rad(270) + movement_axis = 0 if front_cast: var front_cast_distance = ($SightCast.get_collision_point() - position).length() - if (front_cast_distance < 160 * (speed / 300)) and (front_cast_distance < (player.position - position).length()): + if (front_cast_distance < 160 * (speed / 300.0)) and (front_cast_distance < player_distance): if ai_state != AI_STATE_EVADE_OBJECT: last_ai_state_before_evasion = ai_state ai_state = AI_STATE_EVADE_OBJECT diff --git a/scripts/laser.gd b/scripts/laser.gd new file mode 100644 index 0000000..110d81c --- /dev/null +++ b/scripts/laser.gd @@ -0,0 +1,27 @@ +extends RigidBody2D + +var shooter = null +var lifetime = 0 +var has_collided = false + +func _process(delta: float) -> void: + if has_collided: return + + linear_velocity = transform.y * -1 * 256 + + +func _on_hitbox_body_shape_entered(body_rid: RID, body: Node2D, body_shape_index: int, local_shape_index: int) -> void: + if body != shooter: + has_collided = true + + linear_velocity = Vector2() + + $Sprite.visible = false + $Trail.visible = false + + if "health" in body: + body.health -= 100 + + await get_tree().create_timer(1.0).timeout + + queue_free() diff --git a/scripts/laser.gd.uid b/scripts/laser.gd.uid new file mode 100644 index 0000000..c1294f9 --- /dev/null +++ b/scripts/laser.gd.uid @@ -0,0 +1 @@ +uid://b7te10evkqwhy diff --git a/scripts/player.gd b/scripts/player.gd index 2333a08..4bd70c3 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -7,6 +7,8 @@ var camera_shake_power = 0 var boosting = false func _process(delta: float) -> void: + modulate.g = health / 1000.0 + modulate.b = health / 1000.0 $Camera.offset.x = randi_range(-camera_shake_power, camera_shake_power) $Camera.offset.y = randi_range(-camera_shake_power, camera_shake_power) diff --git a/sounds/fire.mp3 b/sounds/fire.mp3 index e43185b..2ad7739 100644 Binary files a/sounds/fire.mp3 and b/sounds/fire.mp3 differ diff --git a/sounds/fire_assets.mp3 b/sounds/fire_assets.mp3 new file mode 100644 index 0000000..e43185b Binary files /dev/null and b/sounds/fire_assets.mp3 differ diff --git a/sounds/fire_assets.mp3.import b/sounds/fire_assets.mp3.import new file mode 100644 index 0000000..7dcdb78 --- /dev/null +++ b/sounds/fire_assets.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://7lx0ep8c801h" +path="res://.godot/imported/fire_assets.mp3-0e6bf1f951ac9f8605933ee56dd4c2f5.mp3str" + +[deps] + +source_file="res://sounds/fire_assets.mp3" +dest_files=["res://.godot/imported/fire_assets.mp3-0e6bf1f951ac9f8605933ee56dd4c2f5.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/textures/laser.png b/textures/laser.png new file mode 100644 index 0000000..f79194e Binary files /dev/null and b/textures/laser.png differ diff --git a/textures/laser.png.import b/textures/laser.png.import new file mode 100644 index 0000000..6234cc1 --- /dev/null +++ b/textures/laser.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb0v0jtreyba3" +path="res://.godot/imported/laser.png-78c1e43d923d0dc894a1a1e095c0e0c3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://textures/laser.png" +dest_files=["res://.godot/imported/laser.png-78c1e43d923d0dc894a1a1e095c0e0c3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1