From be879a03a4858fc1024e785cdb881364878e59b1 Mon Sep 17 00:00:00 2001 From: ToasterPanic Date: Sat, 6 Dec 2025 19:33:42 -0500 Subject: [PATCH] Guns, ground enemy AI beginnings --- project.godot | 20 ++++++ scenes/enemy.tscn | 49 +------------ scenes/game.tscn | 2 +- scenes/ground.tscn | 67 ++++++++++++++++- scenes/locations/space_station_1.tscn | 3 +- scenes/particles/bullet_impact.tscn | 38 ++++++++++ scenes/particles/bullet_trail.tscn | 100 ++++++++++++++++++++++++++ scenes/particles/explosion.tscn | 48 +++++++++++++ scripts/bullet_trail.gd | 8 +++ scripts/bullet_trail.gd.uid | 1 + scripts/character_ground.gd | 49 +++++++++++++ scripts/enemy_ground.gd | 32 +++++++++ scripts/enemy_ground.gd.uid | 1 + scripts/global.gd | 11 +++ scripts/particle_group.gd | 6 ++ scripts/player_ground.gd | 23 ++++++ sounds/gunshot_1.mp3 | Bin 0 -> 49920 bytes sounds/gunshot_1.mp3.import | 19 +++++ textures/particles/bullet.png | Bin 0 -> 99 bytes textures/particles/bullet.png.import | 40 +++++++++++ 20 files changed, 468 insertions(+), 49 deletions(-) create mode 100644 scenes/particles/bullet_impact.tscn create mode 100644 scenes/particles/bullet_trail.tscn create mode 100644 scenes/particles/explosion.tscn create mode 100644 scripts/bullet_trail.gd create mode 100644 scripts/bullet_trail.gd.uid create mode 100644 scripts/enemy_ground.gd create mode 100644 scripts/enemy_ground.gd.uid create mode 100644 sounds/gunshot_1.mp3 create mode 100644 sounds/gunshot_1.mp3.import create mode 100644 textures/particles/bullet.png create mode 100644 textures/particles/bullet.png.import diff --git a/project.godot b/project.godot index 31b518a..368c84b 100644 --- a/project.godot +++ b/project.godot @@ -205,6 +205,26 @@ ui_back={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null) ] } +aim_left={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null) +] +} +aim_right={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null) +] +} +aim_up={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null) +] +} +aim_down={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null) +] +} [physics] diff --git a/scenes/enemy.tscn b/scenes/enemy.tscn index 3a68791..df633d0 100644 --- a/scenes/enemy.tscn +++ b/scenes/enemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://dy6dv2tio433m"] +[gd_scene load_steps=10 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"] @@ -6,35 +6,11 @@ [ext_resource type="AudioStream" uid="uid://5tr30e1tmdp6" path="res://sounds/collision.mp3" id="4_ipns3"] [ext_resource type="AudioStream" uid="uid://bney1c4julhfk" path="res://sounds/explode.mp3" id="5_ipns3"] [ext_resource type="Texture2D" uid="uid://dtwo7g0ipc4k" path="res://textures/ship_1.png" id="6_w8i8w"] -[ext_resource type="Script" uid="uid://ck38qwl4qytnt" path="res://scripts/particle_group.gd" id="7_md484"] -[ext_resource type="Texture2D" uid="uid://5iimabvyld40" path="res://textures/particles/basic.png" id="7_nenq2"] -[ext_resource type="Texture2D" uid="uid://bpe67g6185n5v" path="res://textures/particles/fire.png" id="9_ipns3"] +[ext_resource type="PackedScene" path="res://scenes/particles/explosion.tscn" id="7_nenq2"] [sub_resource type="CircleShape2D" id="CircleShape2D_lnu2h"] radius = 20.0 -[sub_resource type="Curve" id="Curve_ipns3"] -_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.7512195, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] -point_count = 3 - -[sub_resource type="CurveTexture" id="CurveTexture_8qclf"] -curve = SubResource("Curve_ipns3") - -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_w8i8w"] -particle_flag_disable_z = true -angle_min = -720.0 -angle_max = 720.0 -spread = 180.0 -initial_velocity_min = 30.3 -initial_velocity_max = 260.81 -gravity = Vector3(0, 0, 0) -damping_min = 2.0 -damping_max = 14.000001 -scale_min = 0.099999994 -scale_max = 0.25 -alpha_curve = SubResource("CurveTexture_8qclf") -collision_use_scale = true - [sub_resource type="ConvexPolygonShape2D" id="ConvexPolygonShape2D_ipns3"] points = PackedVector2Array(-16, 16, 16, 16, 0, -16) @@ -79,26 +55,7 @@ target_position = Vector2(0, -256) [node name="FireCast" type="RayCast2D" parent="."] target_position = Vector2(0, -1024) -[node name="Explosion" type="Node2D" parent="."] -script = ExtResource("7_md484") - -[node name="GPUParticles2D" type="GPUParticles2D" parent="Explosion"] -emitting = false -amount = 24 -texture = ExtResource("7_nenq2") -lifetime = 10.0 -one_shot = true -explosiveness = 1.0 -process_material = SubResource("ParticleProcessMaterial_w8i8w") - -[node name="GPUParticles2D2" type="GPUParticles2D" parent="Explosion"] -emitting = false -amount = 24 -texture = ExtResource("9_ipns3") -lifetime = 10.0 -one_shot = true -explosiveness = 1.0 -process_material = SubResource("ParticleProcessMaterial_w8i8w") +[node name="Explosion" parent="." instance=ExtResource("7_nenq2")] [node name="CollisionShape" type="CollisionShape2D" parent="."] shape = SubResource("ConvexPolygonShape2D_ipns3") diff --git a/scenes/game.tscn b/scenes/game.tscn index dd75165..9782439 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -694,7 +694,7 @@ layout_mode = 2 [node name="Label" type="Label" parent="UI/Control/ControlsBox/Flow5"] layout_mode = 2 size_flags_horizontal = 3 -text = "NAVPANEL" +text = "NAVPANEL " [node name="InputIconTextureRect" type="TextureRect" parent="UI/Control/ControlsBox/Flow5"] custom_minimum_size = Vector2(32, 32) diff --git a/scenes/ground.tscn b/scenes/ground.tscn index 517c7f8..2155d0b 100644 --- a/scenes/ground.tscn +++ b/scenes/ground.tscn @@ -1,9 +1,12 @@ -[gd_scene load_steps=23 format=3 uid="uid://by43ihcec8e8q"] +[gd_scene load_steps=27 format=3 uid="uid://by43ihcec8e8q"] [ext_resource type="Script" uid="uid://b2sw6ymaf4t0s" path="res://scripts/game_ground.gd" id="1_6ra5r"] [ext_resource type="Script" uid="uid://dowu512otgyyf" path="res://scripts/player_ground.gd" id="3_8gbjj"] [ext_resource type="AudioStream" uid="uid://cdl70q0x28717" path="res://sounds/dialogue.mp3" id="3_rncil"] [ext_resource type="Texture2D" uid="uid://c0cyhybh30ogt" path="res://textures/player-ground-sheet.png" id="4_2c1ag"] +[ext_resource type="Texture2D" uid="uid://csrlh1sbdroud" path="res://textures/pistol.png" id="5_8gbjj"] +[ext_resource type="AudioStream" uid="uid://5x8fl2mk082h" path="res://sounds/gunshot_1.mp3" id="6_2c1ag"] +[ext_resource type="Script" uid="uid://bv7ymrwe6ciax" path="res://scripts/enemy_ground.gd" id="7_modao"] [ext_resource type="Shader" uid="uid://d3hoh7ec2w8q7" path="res://scripts/outline.gdshader" id="7_vuhkc"] [ext_resource type="Shader" uid="uid://d2e0541hawkml" path="res://scripts/vignette.gdshader" id="9_5vwr8"] [ext_resource type="Shader" uid="uid://bk7q00br1ms30" path="res://scripts/retro.gdshader" id="9_257nh"] @@ -76,6 +79,9 @@ animations = [{ radius = 21.0 height = 48.0 +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_8gbjj"] +height = 94.0 + [sub_resource type="ShaderMaterial" id="ShaderMaterial_8gbjj"] shader = ExtResource("9_5vwr8") shader_parameter/radius = 1.0 @@ -140,6 +146,65 @@ position_smoothing_enabled = true position = Vector2(0, 40) shape = SubResource("CapsuleShape2D_176r3") +[node name="HeldItem" type="Node2D" parent="PlayerGround"] + +[node name="Cast" type="RayCast2D" parent="PlayerGround/HeldItem"] +target_position = Vector2(2048, 0) +collision_mask = 2 +collide_with_areas = true + +[node name="Sprite" type="Sprite2D" parent="PlayerGround/HeldItem"] +position = Vector2(56, 0) +texture = ExtResource("5_8gbjj") + +[node name="Gunshot" type="AudioStreamPlayer2D" parent="PlayerGround/HeldItem"] +stream = ExtResource("6_2c1ag") + +[node name="Hitbox" type="Area2D" parent="PlayerGround"] +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape" type="CollisionShape2D" parent="PlayerGround/Hitbox"] +shape = SubResource("CapsuleShape2D_8gbjj") +debug_color = Color(1, 0, 0, 0.41960785) + +[node name="EnemyTest" type="CharacterBody2D" parent="."] +position = Vector2(349, -58) +script = ExtResource("7_modao") + +[node name="Sprite" type="AnimatedSprite2D" parent="EnemyTest"] +scale = Vector2(2, 2) +sprite_frames = SubResource("SpriteFrames_aergo") + +[node name="Camera" type="Camera2D" parent="EnemyTest"] +position_smoothing_enabled = true + +[node name="CollisionShape" type="CollisionShape2D" parent="EnemyTest"] +position = Vector2(0, 40) +shape = SubResource("CapsuleShape2D_176r3") + +[node name="HeldItem" type="Node2D" parent="EnemyTest"] + +[node name="Cast" type="RayCast2D" parent="EnemyTest/HeldItem"] +target_position = Vector2(2048, 0) +collision_mask = 2 +collide_with_areas = true + +[node name="Sprite" type="Sprite2D" parent="EnemyTest/HeldItem"] +position = Vector2(56, 0) +texture = ExtResource("5_8gbjj") + +[node name="Gunshot" type="AudioStreamPlayer2D" parent="EnemyTest/HeldItem"] +stream = ExtResource("6_2c1ag") + +[node name="Hitbox" type="Area2D" parent="EnemyTest"] +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape" type="CollisionShape2D" parent="EnemyTest/Hitbox"] +shape = SubResource("CapsuleShape2D_8gbjj") +debug_color = Color(1, 0, 0, 0.41960785) + [node name="UI" type="CanvasLayer" parent="."] [node name="Vignette" type="ColorRect" parent="UI"] diff --git a/scenes/locations/space_station_1.tscn b/scenes/locations/space_station_1.tscn index 156c76f..7d65cd2 100644 --- a/scenes/locations/space_station_1.tscn +++ b/scenes/locations/space_station_1.tscn @@ -67,7 +67,8 @@ texture_region_size = Vector2i(32, 32) [sub_resource type="TileSet" id="TileSet_uxsmb"] tile_size = Vector2i(32, 32) occlusion_layer_0/light_mask = 1 -physics_layer_0/collision_layer = 1 +physics_layer_0/collision_layer = 3 +physics_layer_0/collision_mask = 3 sources/0 = SubResource("TileSetAtlasSource_k741b") sources/1 = SubResource("TileSetAtlasSource_mdep3") sources/2 = SubResource("TileSetAtlasSource_bhfm6") diff --git a/scenes/particles/bullet_impact.tscn b/scenes/particles/bullet_impact.tscn new file mode 100644 index 0000000..11ae170 --- /dev/null +++ b/scenes/particles/bullet_impact.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=6 format=3 uid="uid://ckbjyhwv6su8y"] + +[ext_resource type="Script" uid="uid://ck38qwl4qytnt" path="res://scripts/particle_group.gd" id="1_416m4"] +[ext_resource type="Texture2D" uid="uid://cduq2cbhvwqj4" path="res://textures/particles/bullet.png" id="2_c1ocy"] + +[sub_resource type="Curve" id="Curve_ipns3"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.49242425, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_416m4"] +curve = SubResource("Curve_ipns3") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_ty3mr"] +particle_flag_disable_z = true +angle_min = -720.0 +angle_max = 720.0 +spread = 180.0 +initial_velocity_min = 30.3 +initial_velocity_max = 260.81 +gravity = Vector3(0, 0, 0) +damping_min = 2.0 +damping_max = 14.000001 +scale_min = 0.29999998 +scale_max = 0.5 +alpha_curve = SubResource("CurveTexture_416m4") +collision_use_scale = true + +[node name="BulletImpact" type="Node2D"] +script = ExtResource("1_416m4") + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +emitting = false +amount = 24 +texture = ExtResource("2_c1ocy") +lifetime = 0.2 +one_shot = true +explosiveness = 1.0 +process_material = SubResource("ParticleProcessMaterial_ty3mr") diff --git a/scenes/particles/bullet_trail.tscn b/scenes/particles/bullet_trail.tscn new file mode 100644 index 0000000..1f4092f --- /dev/null +++ b/scenes/particles/bullet_trail.tscn @@ -0,0 +1,100 @@ +[gd_scene load_steps=5 format=3 uid="uid://d8llv1fieoga"] + +[ext_resource type="Script" uid="uid://i21n4rlirxln" path="res://scripts/bullet_trail.gd" id="1_086qf"] + +[sub_resource type="Animation" id="Animation_rlhfg"] +resource_name = "default" +length = 0.4 +step = 0.0167 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:width") +tracks/0/interp = 1 +tracks/0/loop_wrap = false +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 3.3635848), +"update": 0, +"values": [6.0, 0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:default_color:b") +tracks/1/interp = 1 +tracks/1/loop_wrap = false +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:default_color:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.0, 0.0] +} + +[sub_resource type="Animation" id="Animation_gt5uw"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:width") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [6.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:default_color:b") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:default_color:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [1.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_p1in0"] +_data = { +&"RESET": SubResource("Animation_gt5uw"), +&"default": SubResource("Animation_rlhfg") +} + +[node name="BulletTrail" type="Line2D"] +points = PackedVector2Array(0, 0, 128, 0) +width = 6.0 +default_color = Color(1, 1, 0, 1) +script = ExtResource("1_086qf") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_p1in0") +} diff --git a/scenes/particles/explosion.tscn b/scenes/particles/explosion.tscn new file mode 100644 index 0000000..35c8c2e --- /dev/null +++ b/scenes/particles/explosion.tscn @@ -0,0 +1,48 @@ +[gd_scene load_steps=7 format=3 uid="uid://bsvwpuwvh3hga"] + +[ext_resource type="Script" uid="uid://ck38qwl4qytnt" path="res://scripts/particle_group.gd" id="1_uommb"] +[ext_resource type="Texture2D" uid="uid://5iimabvyld40" path="res://textures/particles/basic.png" id="2_02mh3"] +[ext_resource type="Texture2D" uid="uid://bpe67g6185n5v" path="res://textures/particles/fire.png" id="3_nnsi5"] + +[sub_resource type="Curve" id="Curve_ipns3"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.7512195, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_8qclf"] +curve = SubResource("Curve_ipns3") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_w8i8w"] +particle_flag_disable_z = true +angle_min = -720.0 +angle_max = 720.0 +spread = 180.0 +initial_velocity_min = 30.3 +initial_velocity_max = 260.81 +gravity = Vector3(0, 0, 0) +damping_min = 2.0 +damping_max = 14.000001 +scale_min = 0.099999994 +scale_max = 0.25 +alpha_curve = SubResource("CurveTexture_8qclf") +collision_use_scale = true + +[node name="Explosion" type="Node2D"] +script = ExtResource("1_uommb") + +[node name="GPUParticles2D" type="GPUParticles2D" parent="."] +emitting = false +amount = 24 +texture = ExtResource("2_02mh3") +lifetime = 10.0 +one_shot = true +explosiveness = 1.0 +process_material = SubResource("ParticleProcessMaterial_w8i8w") + +[node name="GPUParticles2D2" type="GPUParticles2D" parent="."] +emitting = false +amount = 24 +texture = ExtResource("3_nnsi5") +lifetime = 10.0 +one_shot = true +explosiveness = 1.0 +process_material = SubResource("ParticleProcessMaterial_w8i8w") diff --git a/scripts/bullet_trail.gd b/scripts/bullet_trail.gd new file mode 100644 index 0000000..6b702ab --- /dev/null +++ b/scripts/bullet_trail.gd @@ -0,0 +1,8 @@ +extends Line2D + +func play() -> void: + $AnimationPlayer.play("default") + + await $AnimationPlayer.animation_finished + + queue_free() diff --git a/scripts/bullet_trail.gd.uid b/scripts/bullet_trail.gd.uid new file mode 100644 index 0000000..1bd4856 --- /dev/null +++ b/scripts/bullet_trail.gd.uid @@ -0,0 +1 @@ +uid://i21n4rlirxln diff --git a/scripts/character_ground.gd b/scripts/character_ground.gd index c63e6c1..0e9ffeb 100644 --- a/scripts/character_ground.gd +++ b/scripts/character_ground.gd @@ -3,14 +3,34 @@ extends CharacterBody2D var horizontial_movement = 0 var vertical_movement = 0 var speed = 256 +var health = 100 + +var fire_delay = 0 ## Is the player busy in an interaction? var busy = false +var firing = false + +var equipped_ground_gun = "pistol" +var ammo_in_mag = 12 + +func set_ground_gun(value: String): + equipped_ground_gun = value + $HeldItem/Sprite.texture = load("res://textures/" + equipped_ground_gun + ".png") + ammo_in_mag = global.ground_guns + func _ready() -> void: $Sprite.play() + + if has_node("HeldItem") and (equipped_ground_gun != null): + set_ground_gun(equipped_ground_gun) + $HeldItem/Cast.add_exception(self) func _process(delta: float) -> void: + if !$Sprite.is_playing(): + $Sprite.play() + if busy: velocity = Vector2() else: @@ -27,5 +47,34 @@ func _process(delta: float) -> void: else: $Sprite.animation = "idle" + fire_delay -= delta + if firing and (fire_delay < 0): + if has_node("HeldItem") and (equipped_ground_gun != null): + $HeldItem/Cast.force_raycast_update() + + var hit_target = $HeldItem/Cast.get_collider() + + if "health" in hit_target: + hit_target.health -= 10 + + var bullet_impact = preload("res://scenes/particles/bullet_impact.tscn").instantiate() + bullet_impact.global_position = $HeldItem/Cast.get_collision_point() + + get_parent().add_child(bullet_impact) + + bullet_impact.play() + + var bullet_trail = preload("res://scenes/particles/bullet_trail.tscn").instantiate() + bullet_trail.global_position = $HeldItem/Sprite.global_position + + bullet_trail.points[1] = ($HeldItem/Cast.get_collision_point() - bullet_trail.global_position) + + get_parent().add_child(bullet_trail) + + bullet_trail.play() + + $HeldItem/Gunshot.play() + + fire_delay = 0.5 move_and_slide() diff --git a/scripts/enemy_ground.gd b/scripts/enemy_ground.gd new file mode 100644 index 0000000..b864c2b --- /dev/null +++ b/scripts/enemy_ground.gd @@ -0,0 +1,32 @@ +extends "res://scripts/character_ground.gd" + +var last_aim_direction = Vector2(0, 0) + +@export var starting_gun: String = &"pistol" + +func _ready() -> void: + super() + + set_ground_gun(starting_gun) + +func _process(delta: float) -> void: + super(delta) + + if input_icon.using_gamepad: + if !((Input.get_axis("aim_left", "aim_right") == 0) and (Input.get_axis("aim_up", "aim_down") == 0)): + $HeldItem.rotation = Vector2( + Input.get_axis("aim_left", "aim_right"), + Input.get_axis("aim_up", "aim_down") + ).angle() + + if ($HeldItem.rotation_degrees < -90) or ($HeldItem.rotation_degrees > 90): + $HeldItem/Sprite.scale.y = -1 + else: + $HeldItem/Sprite.scale.y = 1 + else: + $HeldItem.look_at(get_global_mouse_position()) + + horizontial_movement = Input.get_axis("ground_left", "ground_right") + vertical_movement = Input.get_axis("ground_up", "ground_down") + + firing = Input.is_action_pressed("fire") diff --git a/scripts/enemy_ground.gd.uid b/scripts/enemy_ground.gd.uid new file mode 100644 index 0000000..f19e0ee --- /dev/null +++ b/scripts/enemy_ground.gd.uid @@ -0,0 +1 @@ +uid://bv7ymrwe6ciax diff --git a/scripts/global.gd b/scripts/global.gd index bbf4c94..c0e3d2b 100644 --- a/scripts/global.gd +++ b/scripts/global.gd @@ -28,6 +28,16 @@ var orbit_zones = [ ] +var ground_guns = { + "pistol": { + "name": "Oni", + "type": "energy", + "damage": 10, + "magazine_size": 12, + "fire_rate": 0.3 + } +} + func generate_save(): var save_dict = { "stats": stats @@ -101,6 +111,7 @@ var default_stats = { "ship_rotation": 0, "story_progress": 1, "navigation_goal": null, + "equipped_ground_gun": "pistol" } var stats = default_stats.duplicate_deep() diff --git a/scripts/particle_group.gd b/scripts/particle_group.gd index cd1e2de..dfb0dbe 100644 --- a/scripts/particle_group.gd +++ b/scripts/particle_group.gd @@ -1,5 +1,11 @@ extends Node2D func play(): + var last = null for n in get_children(): + last = n n.restart() + + await last.finished + + queue_free() diff --git a/scripts/player_ground.gd b/scripts/player_ground.gd index 12360a9..c526c08 100644 --- a/scripts/player_ground.gd +++ b/scripts/player_ground.gd @@ -1,7 +1,30 @@ extends "res://scripts/character_ground.gd" +var last_aim_direction = Vector2(0, 0) + +func _ready() -> void: + super() + + set_ground_gun(global.stats.equipped_ground_gun) + func _process(delta: float) -> void: super(delta) + if input_icon.using_gamepad: + if !((Input.get_axis("aim_left", "aim_right") == 0) and (Input.get_axis("aim_up", "aim_down") == 0)): + $HeldItem.rotation = Vector2( + Input.get_axis("aim_left", "aim_right"), + Input.get_axis("aim_up", "aim_down") + ).angle() + + if ($HeldItem.rotation_degrees < -90) or ($HeldItem.rotation_degrees > 90): + $HeldItem/Sprite.scale.y = -1 + else: + $HeldItem/Sprite.scale.y = 1 + else: + $HeldItem.look_at(get_global_mouse_position()) + horizontial_movement = Input.get_axis("ground_left", "ground_right") vertical_movement = Input.get_axis("ground_up", "ground_down") + + firing = Input.is_action_pressed("fire") diff --git a/sounds/gunshot_1.mp3 b/sounds/gunshot_1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9554455a146546774852a7a9d4ea88d86d4f4212 GIT binary patch literal 49920 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