Add projectiles

This commit is contained in:
2026-02-10 18:03:53 -08:00
parent 2f377d2d7a
commit 92b4e8662f
41 changed files with 2170 additions and 42 deletions

View File

@@ -92,6 +92,10 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
[Node] private ShakeCamera _camera3D { get; set; } = default!;
[Node] private Projectile FireReactor { get; set; } = default!;
[Node] private Projectile AirReactor { get; set; } = default!;
[Node] private Projectile WaterReactor { get; set; } = default!;
#endregion
public bool CanEquipState { get; set; } = true;
@@ -319,6 +323,13 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
private void Attack()
{
var weapon = EquipmentComponent.EquippedWeapon.Value as Weapon;
if (weapon.WeaponTag == WeaponTag.ElementalProjectile)
{
HandleProjectile(weapon);
return;
}
if (PlayerIsHittingGeometry())
WeaponAnimations.Play("hit_wall");
else if (!WeaponAnimations.IsPlaying())
@@ -326,13 +337,40 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
else
return;
var weapon = EquipmentComponent.EquippedWeapon.Value as Weapon;
if (weapon.WeaponTag == WeaponTag.DegradeOnSwing)
_playerEffectService.Degrade();
else if (weapon.WeaponTag == WeaponTag.SelfDamage)
_playerEffectService.TakeSelfDamage(5);
}
private void HandleProjectile(Weapon weapon)
{
var ammo = EquipmentComponent.EquippedAmmo.Value as Ammo;
if (ammo == null || ammo.Count <= 0)
return;
if (weapon.WeaponTag != WeaponTag.ElementalProjectile)
return;
var fired = false;
if (ammo.AmmoElement == ElementType.Igneous)
fired = FireReactor.Fire();
if (ammo.AmmoElement == ElementType.Aeolic)
fired = AirReactor.Fire();
if (ammo.AmmoElement == ElementType.Hydric)
fired = WaterReactor.Fire();
if (!fired)
return;
ammo.SetCount(ammo.Count - 1);
if (ammo.Count <= 0)
{
EquipmentComponent.Unequip(ammo);
Inventory.Remove(ammo);
}
}
private void ThrowItem()
{
var itemScene = GD.Load<PackedScene>("res://src/items/throwable/ThrowableItem.tscn");

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=1580 format=3 uid="uid://cfecvvav8kkp6"]
[gd_scene load_steps=1583 format=3 uid="uid://cfecvvav8kkp6"]
[ext_resource type="Script" uid="uid://yxmiqy7i0t7r" path="res://src/player/Player.cs" id="1_xcol5"]
[ext_resource type="PackedScene" uid="uid://didc6vnf5ftlg" path="res://src/camera/ShakeCamera.tscn" id="2_jtmj1"]
@@ -508,6 +508,9 @@
[ext_resource type="Texture2D" uid="uid://bvqsilbdfyqd1" path="res://src/vfx/Items Etc/persiko/persiko125.png" id="399_b1hpb"]
[ext_resource type="Texture2D" uid="uid://bwoccwmlevwm1" path="res://src/vfx/Items Etc/persiko/persiko126.png" id="400_nmop6"]
[ext_resource type="Texture2D" uid="uid://dwfqyfjsj8nro" path="res://src/vfx/Items Etc/persiko/persiko127.png" id="401_28ame"]
[ext_resource type="PackedScene" uid="uid://igpvnbi8qi6e" path="res://src/items/weapons/FireReactorProjectile.tscn" id="509_14f5p"]
[ext_resource type="PackedScene" uid="uid://nnns2ade62al" path="res://src/items/weapons/AirReactorProjectile.tscn" id="510_k6pkx"]
[ext_resource type="PackedScene" uid="uid://7p2sh52lj42o" path="res://src/items/weapons/WaterReactorProjectile.tscn" id="511_sq73w"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_dw45s"]
radius = 1.0
@@ -10364,7 +10367,7 @@ shape = SubResource("SphereShape3D_g641l")
[node name="Hitbox" type="Area3D" parent="Collision"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.12691, -1)
collision_layer = 2048
collision_layer = 0
collision_mask = 2048
[node name="HitboxCollision" type="CollisionShape3D" parent="Collision/Hitbox"]
@@ -10495,3 +10498,14 @@ bus = &"SFX"
[node name="WalkSFX" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true
stream = ExtResource("6_v7rlw")
[node name="Projectiles" type="Node3D" parent="."]
[node name="FireReactor" parent="Projectiles" instance=ExtResource("509_14f5p")]
unique_name_in_owner = true
[node name="AirReactor" parent="Projectiles" instance=ExtResource("510_k6pkx")]
unique_name_in_owner = true
[node name="WaterReactor" parent="Projectiles" instance=ExtResource("511_sq73w")]
unique_name_in_owner = true