Add new resources and presenters for item pickups and effects

This commit is contained in:
2025-10-29 00:13:36 +01:00
parent 329a942de7
commit 87169b17ae
19 changed files with 151 additions and 8 deletions

View File

@@ -4,6 +4,7 @@ using System.Linq;
using CryptonymThunder.Code.Resources; using CryptonymThunder.Code.Resources;
using GameCore.Attributes; using GameCore.Attributes;
using GameCore.Combat; using GameCore.Combat;
using GameCore.Combat.Interfaces;
using GameCore.ECS.Interfaces; using GameCore.ECS.Interfaces;
using GameCore.Input; using GameCore.Input;
using GameCore.Inventory; using GameCore.Inventory;
@@ -62,12 +63,17 @@ public class ComponentFactory
if (resource.WeaponData == null) return null; if (resource.WeaponData == null) return null;
var weaponData = resource.WeaponData; var weaponData = resource.WeaponData;
var fireCosts = weaponData.FireCosts
.Select(_effectFactory.Create)
.OfType<ICostEffect>()
.ToList();
var onFireEffects = weaponData.OnFireEffects.Select(_effectFactory.Create).ToList(); var onFireEffects = weaponData.OnFireEffects.Select(_effectFactory.Create).ToList();
var onHitEffects = weaponData.OnHitEffects.Select(_effectFactory.Create).ToList(); var onHitEffects = weaponData.OnHitEffects.Select(_effectFactory.Create).ToList();
return new WeaponComponent return new WeaponComponent
{ {
FireRate = resource.WeaponData.FireRate, FireRate = resource.WeaponData.FireRate,
FireCosts = fireCosts,
OnFireEffects = onFireEffects, OnFireEffects = onFireEffects,
OnHitEffects = onHitEffects, OnHitEffects = onHitEffects,
}; };
@@ -83,11 +89,16 @@ public class ComponentFactory
private PickupComponent CreatePickupComponent(PickupComponentResource resource) private PickupComponent CreatePickupComponent(PickupComponentResource resource)
{ {
var onAcquireEffects = resource.OnAcquireEffects
.Select(_effectFactory.Create)
.ToList();
return new PickupComponent return new PickupComponent
{ {
ItemId = resource.ItemId, ItemId = resource.ItemId,
Quantity = resource.Quantity, Quantity = resource.Quantity,
IsInstantUse = resource.IsInstantUse IsInstantUse = resource.IsInstantUse,
OnAcquireEffects = onAcquireEffects,
}; };
} }
} }

View File

@@ -17,6 +17,7 @@ public class EffectFactory
new BulkProjectileEffect(fire.ProjectileArchetypeId, fire.Count, fire.SpreadAngle, fire.ProjectileSpeed), new BulkProjectileEffect(fire.ProjectileArchetypeId, fire.Count, fire.SpreadAngle, fire.ProjectileSpeed),
DamageEffectResource damage => new DamageEffect(damage.Amount), DamageEffectResource damage => new DamageEffect(damage.Amount),
HitscanEffectResource hitscan => new HitscanEffect(hitscan.Range), HitscanEffectResource hitscan => new HitscanEffect(hitscan.Range),
ConsumeAmmoCostResource consumeAmmo => new ConsumeAmmoCost(consumeAmmo.AmmoId, consumeAmmo.Amount),
_ => throw new ArgumentOutOfRangeException(nameof(resource), _ => throw new ArgumentOutOfRangeException(nameof(resource),
$"Effect type {resource.GetType().Name} not recognized") $"Effect type {resource.GetType().Name} not recognized")
}; };

View File

@@ -57,6 +57,7 @@ public partial class GamePresenter : Node
_world.RegisterSystem(new AttributeSystem()); _world.RegisterSystem(new AttributeSystem());
_world.RegisterSystem(new PickupSystem()); _world.RegisterSystem(new PickupSystem());
_world.RegisterSystem(new InventorySystem(_world)); _world.RegisterSystem(new InventorySystem(_world));
_world.RegisterSystem(new ItemAcquisitionSystem(_world));
_world.RegisterSystem(new WeaponSystem()); _world.RegisterSystem(new WeaponSystem());
_world.RegisterSystem(new ProjectileSystem()); _world.RegisterSystem(new ProjectileSystem());

View File

@@ -21,6 +21,7 @@ public partial class PickupPresenter : Area3D, IEntityPresenter, IPresenterCompo
{ {
if (_presenterRegistry.TryGetEntity(body.GetInstanceId(), out var hitEntity)) if (_presenterRegistry.TryGetEntity(body.GetInstanceId(), out var hitEntity))
{ {
GD.Print($"Collision detected between {CoreEntity.Id} and {hitEntity.Id}");
_world.AddComponent(hitEntity, new CollisionEventComponent(CoreEntity)); _world.AddComponent(hitEntity, new CollisionEventComponent(CoreEntity));
} }
} }
@@ -30,7 +31,6 @@ public partial class PickupPresenter : Area3D, IEntityPresenter, IPresenterCompo
CoreEntity = coreEntity; CoreEntity = coreEntity;
_world = world; _world = world;
_presenterRegistry = GetNode<PresenterRegistry>("/root/PresenterRegistry"); _presenterRegistry = GetNode<PresenterRegistry>("/root/PresenterRegistry");
BodyEntered += OnBodyEnter;
} }
public void SyncToPresentation(float delta) public void SyncToPresentation(float delta)

View File

@@ -0,0 +1 @@
uid://ck82xby5qe680

View File

@@ -0,0 +1,10 @@
using Godot;
namespace CryptonymThunder.Code.Resources.Effects;
[GlobalClass]
public partial class ConsumeAmmoCostResource : EffectResource
{
[Export] public string AmmoId { get; set; } = "ammo_bullets";
[Export(PropertyHint.Range, "1,100,1")] public int Amount { get; set; } = 1;
}

View File

@@ -0,0 +1 @@
uid://b6argm77cho2t

View File

@@ -0,0 +1 @@
uid://dhcbayl5iwvf3

View File

@@ -8,4 +8,5 @@ public partial class PickupComponentResource : Resource
[Export] public string ItemId { get; set; } [Export] public string ItemId { get; set; }
[Export] public int Quantity { get; set; } = 1; [Export] public int Quantity { get; set; } = 1;
[Export] public bool IsInstantUse { get; set; } = false; [Export] public bool IsInstantUse { get; set; } = false;
[Export] public Godot.Collections.Array<EffectResource> OnAcquireEffects { get; set; } = [];
} }

View File

@@ -0,0 +1 @@
uid://cg8upylcrj8le

View File

@@ -9,6 +9,7 @@ public partial class WeaponResource : Resource
[Export] public float FireRate { get; set; } = 1.0f; [Export] public float FireRate { get; set; } = 1.0f;
[ExportGroup("Effects")] [ExportGroup("Effects")]
[Export] public Godot.Collections.Array<EffectResource> FireCosts { get; set; } = [];
[Export] public Godot.Collections.Array<EffectResource> OnFireEffects { get; set; } = []; [Export] public Godot.Collections.Array<EffectResource> OnFireEffects { get; set; } = [];
[Export] public Godot.Collections.Array<EffectResource> OnHitEffects { get; set; } = []; [Export] public Godot.Collections.Array<EffectResource> OnHitEffects { get; set; } = [];
} }

24
Objects/health_pack.tscn Normal file
View File

@@ -0,0 +1,24 @@
[gd_scene load_steps=6 format=3 uid="uid://ceo2sg2077t4c"]
[ext_resource type="Script" uid="uid://ck82xby5qe680" path="res://Code/Presenters/PickupPresenter.cs" id="1_mnrc7"]
[ext_resource type="Script" uid="uid://b6x8llipvutqs" path="res://Code/Presenters/SceneEntity.cs" id="2_eofgr"]
[ext_resource type="Resource" uid="uid://cpw3nyfu40vyo" path="res://Resources/Pickups/health_pack_data.tres" id="3_riqti"]
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_03cv3"]
data = PackedVector3Array(0, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0, 0.5, 0.5, 0, 0.5, -0.5, 0.5, -0.5, 0.5, 0, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0, 0.5, -0.5, 0, 0.5, 0.5, -0.5, -0.5, -0.5, 0, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5)
[sub_resource type="PrismMesh" id="PrismMesh_8eow7"]
[node name="HealthPack" type="Area3D"]
script = ExtResource("1_mnrc7")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("ConcavePolygonShape3D_03cv3")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("PrismMesh_8eow7")
[node name="SceneEntity" type="Node" parent="." groups=["SceneEntities"]]
script = ExtResource("2_eofgr")
ComponentResources = Array[Resource]([ExtResource("3_riqti")])
metadata/_custom_type_script = "uid://b6x8llipvutqs"

30
Objects/pistol_ammo.tscn Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
[gd_resource type="Resource" script_class="EntityArchetype" load_steps=20 format=3 uid="uid://biev6ri5s8kyf"] [gd_resource type="Resource" script_class="EntityArchetype" load_steps=22 format=3 uid="uid://biev6ri5s8kyf"]
[ext_resource type="Script" uid="uid://dc7wq2ij5kwj5" path="res://Code/Resources/AttributeComponentResource.cs" id="1_0drlr"] [ext_resource type="Script" uid="uid://dc7wq2ij5kwj5" path="res://Code/Resources/AttributeComponentResource.cs" id="1_0drlr"]
[ext_resource type="Script" uid="uid://y4cbuh2wxigy" path="res://Code/Resources/InputStateComponentResource.cs" id="2_7o5r3"] [ext_resource type="Script" uid="uid://y4cbuh2wxigy" path="res://Code/Resources/InputStateComponentResource.cs" id="2_7o5r3"]
@@ -11,6 +11,7 @@
[ext_resource type="Resource" uid="uid://tj3ojc3bl7d8" path="res://Resources/Weapons/basic_pistol.tres" id="8_l66rq"] [ext_resource type="Resource" uid="uid://tj3ojc3bl7d8" path="res://Resources/Weapons/basic_pistol.tres" id="8_l66rq"]
[ext_resource type="Script" uid="uid://bp7mufswr41w6" path="res://Code/Resources/WeaponComponentResource.cs" id="9_efscl"] [ext_resource type="Script" uid="uid://bp7mufswr41w6" path="res://Code/Resources/WeaponComponentResource.cs" id="9_efscl"]
[ext_resource type="Script" uid="uid://coe688e2jkyjq" path="res://Code/Resources/EntityArchetype.cs" id="9_uue6s"] [ext_resource type="Script" uid="uid://coe688e2jkyjq" path="res://Code/Resources/EntityArchetype.cs" id="9_uue6s"]
[ext_resource type="Script" uid="uid://dhcbayl5iwvf3" path="res://Code/Resources/InventoryComponentResource.cs" id="10_efscl"]
[sub_resource type="Resource" id="Resource_d0bjv"] [sub_resource type="Resource" id="Resource_d0bjv"]
script = ExtResource("1_0drlr") script = ExtResource("1_0drlr")
@@ -53,8 +54,12 @@ script = ExtResource("9_efscl")
WeaponData = ExtResource("8_l66rq") WeaponData = ExtResource("8_l66rq")
metadata/_custom_type_script = "uid://bp7mufswr41w6" metadata/_custom_type_script = "uid://bp7mufswr41w6"
[sub_resource type="Resource" id="Resource_8u8a8"]
script = ExtResource("10_efscl")
metadata/_custom_type_script = "uid://dhcbayl5iwvf3"
[resource] [resource]
script = ExtResource("9_uue6s") script = ExtResource("9_uue6s")
Scene = ExtResource("8_0q1v5") Scene = ExtResource("8_0q1v5")
ComponentResources = Array[Resource]([SubResource("Resource_d0bjv"), SubResource("Resource_l855d"), SubResource("Resource_00aki"), SubResource("Resource_5qvjo"), SubResource("Resource_g7kif"), SubResource("Resource_xqdar"), SubResource("Resource_xnm3i"), SubResource("Resource_55dod")]) ComponentResources = Array[Resource]([SubResource("Resource_d0bjv"), SubResource("Resource_l855d"), SubResource("Resource_00aki"), SubResource("Resource_5qvjo"), SubResource("Resource_g7kif"), SubResource("Resource_xqdar"), SubResource("Resource_xnm3i"), SubResource("Resource_55dod"), SubResource("Resource_8u8a8")])
metadata/_custom_type_script = "uid://coe688e2jkyjq" metadata/_custom_type_script = "uid://coe688e2jkyjq"

View File

@@ -0,0 +1,17 @@
[gd_resource type="Resource" script_class="PickupComponentResource" load_steps=4 format=3 uid="uid://cpw3nyfu40vyo"]
[ext_resource type="Script" uid="uid://cg8upylcrj8le" path="res://Code/Resources/PickupComponentResource.cs" id="1_2ktm0"]
[ext_resource type="Script" uid="uid://btv24gsw1p850" path="res://Code/Resources/Effects/DamageEffectResource.cs" id="1_3n6l8"]
[sub_resource type="Resource" id="Resource_qa1ki"]
script = ExtResource("1_3n6l8")
Amount = -25.0
metadata/_custom_type_script = "uid://btv24gsw1p850"
[resource]
script = ExtResource("1_2ktm0")
ItemId = "health_pack"
Quantity = 25
IsInstantUse = true
OnAcquireEffects = Array[Object]([SubResource("Resource_qa1ki")])
metadata/_custom_type_script = "uid://cg8upylcrj8le"

View File

@@ -1,9 +1,15 @@
[gd_resource type="Resource" script_class="WeaponResource" load_steps=6 format=3 uid="uid://tj3ojc3bl7d8"] [gd_resource type="Resource" script_class="WeaponResource" load_steps=8 format=3 uid="uid://tj3ojc3bl7d8"]
[ext_resource type="Script" uid="uid://cht6trljihvle" path="res://Code/Resources/Effects/FireProjectileEffectResource.cs" id="1_p2b4p"] [ext_resource type="Script" uid="uid://cht6trljihvle" path="res://Code/Resources/Effects/FireProjectileEffectResource.cs" id="1_p2b4p"]
[ext_resource type="Script" uid="uid://hf0iut8o8do3" path="res://Code/Resources/WeaponResource.cs" id="1_qn35l"] [ext_resource type="Script" uid="uid://hf0iut8o8do3" path="res://Code/Resources/WeaponResource.cs" id="1_qn35l"]
[ext_resource type="Script" uid="uid://b6argm77cho2t" path="res://Code/Resources/Effects/ConsumeAmmoCostResource.cs" id="1_yt3rn"]
[ext_resource type="Script" uid="uid://btv24gsw1p850" path="res://Code/Resources/Effects/DamageEffectResource.cs" id="2_yt3rn"] [ext_resource type="Script" uid="uid://btv24gsw1p850" path="res://Code/Resources/Effects/DamageEffectResource.cs" id="2_yt3rn"]
[sub_resource type="Resource" id="Resource_1h0aq"]
script = ExtResource("1_yt3rn")
AmmoId = "basic_bullet"
metadata/_custom_type_script = "uid://b6argm77cho2t"
[sub_resource type="Resource" id="Resource_yt3rn"] [sub_resource type="Resource" id="Resource_yt3rn"]
script = ExtResource("1_p2b4p") script = ExtResource("1_p2b4p")
ProjectileArchetypeId = "basic_bullet" ProjectileArchetypeId = "basic_bullet"
@@ -19,6 +25,7 @@ metadata/_custom_type_script = "uid://btv24gsw1p850"
[resource] [resource]
script = ExtResource("1_qn35l") script = ExtResource("1_qn35l")
FireRate = 10.0 FireRate = 10.0
FireCosts = Array[Object]([SubResource("Resource_1h0aq")])
OnFireEffects = Array[Object]([SubResource("Resource_yt3rn")]) OnFireEffects = Array[Object]([SubResource("Resource_yt3rn")])
OnHitEffects = Array[Object]([SubResource("Resource_wqp4f")]) OnHitEffects = Array[Object]([SubResource("Resource_wqp4f")])
metadata/_custom_type_script = "uid://hf0iut8o8do3" metadata/_custom_type_script = "uid://hf0iut8o8do3"

View File

@@ -0,0 +1,23 @@
[gd_resource type="Resource" script_class="WeaponResource" load_steps=6 format=3 uid="uid://5c7x5piv7m7w"]
[ext_resource type="Script" uid="uid://chc0d0rjcbl65" path="res://Code/Resources/Effects/HitscanEffectResource.cs" id="1_mul78"]
[ext_resource type="Script" uid="uid://hf0iut8o8do3" path="res://Code/Resources/WeaponResource.cs" id="1_qbj27"]
[ext_resource type="Script" uid="uid://btv24gsw1p850" path="res://Code/Resources/Effects/DamageEffectResource.cs" id="2_3a8e5"]
[sub_resource type="Resource" id="Resource_iyx0n"]
script = ExtResource("1_mul78")
Range = 3.0
metadata/_custom_type_script = "uid://chc0d0rjcbl65"
[sub_resource type="Resource" id="Resource_oy2bd"]
script = ExtResource("2_3a8e5")
Amount = 25.0
metadata/_custom_type_script = "uid://btv24gsw1p850"
[resource]
script = ExtResource("1_qbj27")
FireRate = 1.5
FireCosts = Array[Object]([])
OnFireEffects = Array[Object]([SubResource("Resource_iyx0n")])
OnHitEffects = Array[Object]([SubResource("Resource_oy2bd")])
metadata/_custom_type_script = "uid://hf0iut8o8do3"

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=20 format=4 uid="uid://bkvgcsb8d3v7p"] [gd_scene load_steps=22 format=4 uid="uid://bkvgcsb8d3v7p"]
[ext_resource type="Script" uid="uid://cfpm5p102f65x" path="res://Code/Presenters/GamePresenter.cs" id="1_qvgq0"] [ext_resource type="Script" uid="uid://cfpm5p102f65x" path="res://Code/Presenters/GamePresenter.cs" id="1_qvgq0"]
[ext_resource type="Resource" uid="uid://biev6ri5s8kyf" path="res://Resources/Entities/player.tres" id="2_alii3"] [ext_resource type="Resource" uid="uid://biev6ri5s8kyf" path="res://Resources/Entities/player.tres" id="2_alii3"]
@@ -6,6 +6,8 @@
[ext_resource type="Script" uid="uid://cb7vaw6xqjs1i" path="res://Code/Presenters/EntityPresenter.cs" id="5_d0bjv"] [ext_resource type="Script" uid="uid://cb7vaw6xqjs1i" path="res://Code/Presenters/EntityPresenter.cs" id="5_d0bjv"]
[ext_resource type="Script" uid="uid://b6x8llipvutqs" path="res://Code/Presenters/SceneEntity.cs" id="5_f1ejf"] [ext_resource type="Script" uid="uid://b6x8llipvutqs" path="res://Code/Presenters/SceneEntity.cs" id="5_f1ejf"]
[ext_resource type="Script" uid="uid://dc7wq2ij5kwj5" path="res://Code/Resources/AttributeComponentResource.cs" id="6_d0bjv"] [ext_resource type="Script" uid="uid://dc7wq2ij5kwj5" path="res://Code/Resources/AttributeComponentResource.cs" id="6_d0bjv"]
[ext_resource type="PackedScene" uid="uid://wafx73yokhg4" path="res://Objects/pistol_ammo.tscn" id="8_rr1si"]
[ext_resource type="PackedScene" uid="uid://ceo2sg2077t4c" path="res://Objects/health_pack.tscn" id="9_xqdar"]
[ext_resource type="Script" uid="uid://uearpvfk21ym" path="res://Code/Resources/SimulationConfigResource.cs" id="11_xnm3i"] [ext_resource type="Script" uid="uid://uearpvfk21ym" path="res://Code/Resources/SimulationConfigResource.cs" id="11_xnm3i"]
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_ucfah"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_ucfah"]
@@ -213,3 +215,9 @@ surface_material_override/0 = SubResource("StandardMaterial3D_f1ejf")
script = ExtResource("5_f1ejf") script = ExtResource("5_f1ejf")
ComponentResources = Array[Resource]([SubResource("Resource_27os8")]) ComponentResources = Array[Resource]([SubResource("Resource_27os8")])
metadata/_custom_type_script = "uid://b6x8llipvutqs" metadata/_custom_type_script = "uid://b6x8llipvutqs"
[node name="PistolAmmo" parent="." instance=ExtResource("8_rr1si")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.5896075, -0.81455386, -3.995806)
[node name="HealthPack" parent="." instance=ExtResource("9_xqdar")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.4061804, -0.56455374, 4.434821)

View File

@@ -1,4 +1,4 @@
<Project Sdk="Godot.NET.Sdk/4.5.0"> <Project Sdk="Godot.NET.Sdk/4.5.1">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net9.0</TargetFramework> <TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net9.0</TargetFramework>