Compare commits

..

19 Commits

Author SHA1 Message Date
415897b7b0 debug
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Successful in 8m17s
2026-05-16 21:57:04 +02:00
d302d75238 c for crouching
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Successful in 5m33s
Create tag and build when new code gets to main / ReleaseName (push) Successful in 3s
Create tag and build when new code gets to main / Release (push) Successful in 14m28s
2026-05-16 20:58:11 +02:00
dc81796d52 fixed cue issue and setup proper waves
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 26s
Create tag and build when new code gets to main / Export (push) Has been cancelled
2026-05-16 20:56:20 +02:00
2103832e46 all spawners available can be used on first wave tick 2026-05-16 19:56:07 +02:00
1898d91a28 wave behavior and fixed explosion 2026-05-16 19:48:48 +02:00
b3ae3e37ea fixed weapon loss bug 2026-05-16 13:19:01 +02:00
4cd67023d9 token manager for projectile 2026-05-16 01:29:02 +02:00
afa335e7bf stunnable targets on hit 2026-05-15 15:29:24 +02:00
a0e99a959f parrying projectiles
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 28s
Create tag and build when new code gets to main / Export (push) Successful in 6m44s
2026-05-14 16:11:22 +02:00
0cd942d90e homing projectiles 2026-05-10 12:26:43 +02:00
150e007b22 basic projectiles
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 26s
Create tag and build when new code gets to main / Export (push) Successful in 5m9s
2026-05-07 14:53:30 +02:00
01a2e7582b enemy grant hit ability + prep projectiles 2026-05-06 19:55:05 +02:00
7ba4a3db3f fixed a few issues
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 30s
Create tag and build when new code gets to main / Export (push) Successful in 6m0s
2026-05-06 16:25:56 +02:00
bcc748ca6b More weapon events and abilities 2026-05-06 11:05:55 +02:00
1db30eafd9 removed obsolete references and maps, fixed menu hide pause issue 2026-05-05 17:04:09 +02:00
68e36742af removed obsolete interfaces for health and damage
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 27s
Create tag and build when new code gets to main / Export (push) Successful in 5m25s
2026-05-05 11:51:35 +02:00
33f55d04f3 made explosion forge compliant 2026-05-05 10:55:12 +02:00
a139990390 knockback forge implemented 2026-05-04 16:22:30 +02:00
b2b7baffe8 making dash through target a dedicated dash action 2026-05-04 13:22:25 +02:00
142 changed files with 2997 additions and 3307 deletions

View File

@@ -172,7 +172,13 @@ jobs:
mkdir -v -p build/windows
${{ steps.setup-godot.outputs.godot_bin }} --headless --verbose --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
ls -la build/windows
zip -r Windows.zip build/windows
- name: Upload build as artifact
uses: actions/upload-artifact@v3-node20
with:
name: Windows build
path: ${{ github.workspace }}/Windows.zip
# - name: Setup Butler
# shell: bash
# env:

View File

@@ -62,6 +62,9 @@ public partial class ForgeAttributeSet : Node
var name = prop.Name;
if (InitialAttributeValues.TryGetValue(name, out AttributeValues? value))
{
if (value is null) GD.PrintErr("Value is null");
if (instance is null) GD.PrintErr("Instance is null");
if (prop is null) GD.PrintErr("Prop is null");
SetAttributeValue("SetAttributeBaseValue", instance, prop, value.Default);
SetAttributeValue("SetAttributeMinValue", instance, prop, value.Min);
SetAttributeValue("SetAttributeMaxValue", instance, prop, value.Max);

View File

@@ -32,7 +32,7 @@ func _exit_tree() -> void:
func close() -> void:
menu_closing.emit()
hide()
hide_menu()
queue_free()
func hide_menu() -> void:
@@ -74,7 +74,6 @@ func show_menu() -> void:
visible = true
func _enter_tree() -> void:
print("enter_tree")
show_menu()
back_action.triggered.connect(_handle_cancel_input)

View File

@@ -3,19 +3,21 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bun38n3ff5wvv"
path="res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.ctex"
path.s3tc="res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.s3tc.ctex"
path.etc2="res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.etc2.ctex"
metadata={
"vram_texture": false
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_shift_icon_outline.svg"
dest_files=["res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.ctex"]
dest_files=["res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.s3tc.ctex", "res://.godot/imported/keyboard_shift_icon_outline.svg-21854f9aeab065c26ab9185b7d09e5f2.etc2.ctex"]
[params]
compress/mode=0
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
@@ -23,7 +25,7 @@ compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@@ -37,7 +39,7 @@ 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
detect_3d/compress_to=0
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -81,7 +81,7 @@ script_export_mode=2
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=2
binary_format/embed_pck=false
binary_format/embed_pck=true
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
shader_baker/enabled=true

View File

@@ -22,9 +22,9 @@ public partial class ForgeEntityNode : Node3D, IForgeEntity
public override void _Notification(int what) => this.Notify(what);
[Dependency]
public TagsManager TagsManager => this.DependOn<TagsManager>();
public TagsManager TagsManager => this.DependOn(() => ForgeManagers.Instance.TagsManager);
[Dependency]
public CuesManager CuesManager => this.DependOn<CuesManager>();
public CuesManager CuesManager => this.DependOn(() => ForgeManagers.Instance.CuesManager);
[Export]
public ForgeTagContainer? BaseTags { get; set; }
@@ -44,6 +44,10 @@ public partial class ForgeEntityNode : Node3D, IForgeEntity
public required Variables SharedVariables { get; set; }
public void OnReady()
{
}
public void OnResolved()
{
BaseTags ??= new ForgeTagContainer();
Tags = new EntityTags(BaseTags.GetTagContainer());
@@ -53,10 +57,7 @@ public partial class ForgeEntityNode : Node3D, IForgeEntity
SharedVariables = new Variables();
SharedVariableDefinitions?.PopulateVariables(SharedVariables);
}
public void OnResolved()
{
EffectsManager = new EffectsManager(this, CuesManager);
var effectApplier = new EffectApplier(this);
effectApplier.ApplyEffects(this, this, this);

View File

@@ -31,7 +31,7 @@ public class ExplodingSwordBehavior(PackedScene explosion, float radius) : IAbil
}
explo.Radius = radius;
owner.GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, explo);
owner.GetTree().GetCurrentScene().CallDeferred(Node.MethodName.AddChild, explo);
explo.CallDeferred(Node3D.MethodName.SetGlobalPosition, owner.GlobalPosition);
context.AbilityHandle.CommitAbility();

View File

@@ -0,0 +1,38 @@
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Godot;
namespace Movementtests.forge.abilities;
public class ManualCancelHitBehavior(ForgeEffectData[] effects) : IAbilityBehavior
{
public void OnStarted(AbilityBehaviorContext context)
{
if (context.Target == null) return;
var sourceLocation = (context.Source as Node3D)?.GlobalPosition ?? Vector3.Zero;
var targetLocation = (context.Target as Node3D)?.GlobalPosition ?? Vector3.Zero;
var magnitude = context.Magnitude == 0 ? 1 : context.Magnitude;
foreach (var effectData in effects)
{
var effect = new Effect(effectData.GetEffectData(), new EffectOwnership(context.Owner, context.Owner));
context.Target.EffectsManager.ApplyEffect(effect, new SimpleHitEffectData(sourceLocation, targetLocation, magnitude));
}
}
public void OnEnded(AbilityBehaviorContext context)
{
context.AbilityHandle.CommitAbility();
}
}
[Tool]
[GlobalClass]
public partial class ForgeManualCancelHitBehavior : ForgeAbilityBehavior
{
[Export] public ForgeEffectData[] OnHitEffects { get; set; } = [];
public override IAbilityBehavior GetBehavior() => new ManualCancelHitBehavior(OnHitEffects);
}

View File

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

View File

@@ -6,20 +6,28 @@ using Godot;
namespace Movementtests.forge.abilities;
public record SimpleHitEffectData(Vector3 SourceLocation, Vector3 TargetLocation, float Magnitude = 1);
public class SimpleHitBehavior(ForgeEffectData? damage) : IAbilityBehavior
{
public void OnStarted(AbilityBehaviorContext context)
{
if (context.Target == null || damage == null) return;
var sourceLocation = (context.Source as Node3D)?.GlobalPosition ?? Vector3.Zero;
var targetLocation = (context.Target as Node3D)?.GlobalPosition ?? Vector3.Zero;
var magnitude = context.Magnitude == 0 ? 1 : context.Magnitude;
var effect = new Effect(damage.GetEffectData(), new EffectOwnership(context.Owner, context.Owner));
context.Target.EffectsManager.ApplyEffect(effect);
context.Target.EffectsManager.ApplyEffect(effect, new SimpleHitEffectData(sourceLocation, targetLocation, magnitude));
context.AbilityHandle.CommitAbility();
context.InstanceHandle.End();
}
public void OnEnded(AbilityBehaviorContext context) {}
public void OnEnded(AbilityBehaviorContext context)
{
}
}
[Tool]

View File

@@ -0,0 +1,60 @@
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Godot;
using Movementtests.interfaces;
using Movementtests.managers;
using Movementtests.tools;
namespace Movementtests.forge.abilities;
public record OnProjectileSpawned(Vector3 Direction, float SpeedMultiplier, Vector3? SpawnOffset = null, uint? CollisionOverride = null, TokenManager.Token? Token = null);
public class SpawnProjectileBehavior(PackedScene projectileScene) : IAbilityBehavior<OnProjectileSpawned>
{
public void OnStarted(AbilityBehaviorContext context, OnProjectileSpawned data)
{
if (context.Source is not Node3D source || projectileScene.Instantiate() is not Projectile projectile)
{
context.InstanceHandle.End();
return;
}
source.GetTree().GetCurrentScene().AddChild(projectile);
// Computing projectile properties
var offset = data.SpawnOffset ?? Vector3.Zero;
var startPos = source is ITargetable targetable ? targetable.GetTargetGlobalPosition() : source.GlobalPosition;
var target = context.Target as Node3D;
var magnitude = context.Magnitude != 0 ? context.Magnitude : 1;
var impulse = data.Direction * data.SpeedMultiplier * magnitude;
var collisionOverride = data.CollisionOverride ?? projectile.CollisionMask;
// Setting up projectile
projectile.GlobalPosition = startPos + offset;
projectile.Target = target;
projectile.ImpulseDirection = impulse;
projectile.CollisionMask = collisionOverride;
projectile.Token = data.Token;
if (projectile is ISpawnable spawnable) spawnable.Init();
context.AbilityHandle.CommitAbility();
context.InstanceHandle.End();
}
public void OnEnded(AbilityBehaviorContext context)
{
}
}
[Tool]
[GlobalClass]
public partial class ForgeSpawnProjectileBehavior : ForgeAbilityBehavior
{
[Export] public required PackedScene Projectile { get; set; }
public override IAbilityBehavior GetBehavior() => new SpawnProjectileBehavior(Projectile);
}

View File

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

View File

@@ -4,9 +4,11 @@ namespace Movementtests.scenes.enemies;
public class MetaAttributeSet : AttributeSet
{
public EntityAttribute IncomingDamage { get; private set; }
public EntityAttribute Level { get; private set; }
public MetaAttributeSet()
{
IncomingDamage = InitializeAttribute(nameof(IncomingDamage), 0, 0, 1000, channels: 4);
Level = InitializeAttribute(nameof(Level), 1, 1, 1000);
}
}

View File

@@ -2,18 +2,8 @@ namespace Movementtests.tools.calculators;
public enum DamageType
{
/// <summary>
/// Physical damage.
/// </summary>
Physical = 0,
/// <summary>
/// Magical damage.
/// </summary>
Magical = 1,
/// <summary>
/// Elemental damage.
/// </summary>
Elemental = 2,
Explosive = 3,
}

View File

@@ -11,6 +11,7 @@ using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Calculators;
using Gamesmiths.Forge.Tags;
using Godot;
using Movementtests.forge.abilities;
namespace Movementtests.tools.calculators;
@@ -29,6 +30,7 @@ public class DamageExecution : CustomExecution
public DamageExecution(DamageType damageType, ForgeTagContainer? damageDealerEventTags, ForgeTagContainer? damageReceiverEventTags)
{
// Capture target mana and magic resistance
TargetHealth = new AttributeCaptureDefinition(
"CharacterAttributeSet.Health",
@@ -59,16 +61,19 @@ public class DamageExecution : CustomExecution
target,
effectEvaluatedData);
GD.Print(targetIncomingDamage);
if (targetIncomingDamage <= 0)
{
return [.. results];
}
if (effectEvaluatedData?.TryGetContextData(out float multiplier) == true)
if (effectEvaluatedData?.TryGetContextData(out SimpleHitEffectData? hitEffectData) == true)
{
targetIncomingDamage *= multiplier;
targetIncomingDamage *= hitEffectData.Magnitude;
}
// Apply health reduction to target if attribute exists
if (TargetHealth.TryGetAttribute(target, out EntityAttribute? targetHealthAttribute))
{

View File

@@ -0,0 +1,105 @@
using System.Collections.Generic;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Calculator;
using Gamesmiths.Forge.Effects.Magnitudes;
using Gamesmiths.Forge.Events;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Calculators;
using Godot;
using Movementtests.forge.abilities;
using Movementtests.scenes.components.knockback;
namespace Movementtests.tools.calculators;
public record KnockbackDone(float KnockbackValue, Vector3 knockbackDirection);
public class KnockbackExecution : CustomExecution
{
private readonly RKnockback _knockback;
private readonly ForgeTag _knockbackableTag;
private readonly ForgeTag _knockbackImmuneTag;
private readonly ForgeTagContainer? _knockbackReceiverEventTags;
private readonly ForgeTagContainer? _knockbackDealerEventTags;
public AttributeCaptureDefinition TargetIncomingDamage { get; }
public KnockbackExecution(ForgeTag knockbackableTag, ForgeTag knockbackImmuneTag, RKnockback knockback, ForgeTagContainer? knockbackDealerEventTags, ForgeTagContainer? knockbackReceiverEventTags)
{
_knockback = knockback;
_knockbackableTag = knockbackableTag;
_knockbackImmuneTag = knockbackImmuneTag;
_knockbackDealerEventTags = knockbackDealerEventTags;
_knockbackReceiverEventTags = knockbackReceiverEventTags;
TargetIncomingDamage = new AttributeCaptureDefinition(
"MetaAttributeSet.IncomingDamage",
AttributeCaptureSource.Target);
AttributesToCapture.Add(TargetIncomingDamage);
}
public override ModifierEvaluatedData[] EvaluateExecution(Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData)
{
var results = new List<ModifierEvaluatedData>();
if (!target.Tags.CombinedTags.HasTag(_knockbackableTag.GetTag()) || target.Tags.CombinedTags.HasTag(_knockbackImmuneTag.GetTag()))
return [.. results];
float targetIncomingDamage = CaptureAttributeMagnitude(
TargetIncomingDamage,
effect,
target,
effectEvaluatedData);
if (targetIncomingDamage <= 0)
return [.. results];
var knockbackValue = _knockback.Modifier * targetIncomingDamage / 100.0f;
if (_knockbackReceiverEventTags is null)
return [.. results];
var knockbackDirection = Vector3.Zero;
if (effectEvaluatedData?.TryGetContextData(out SimpleHitEffectData? hitEffectData) == true)
{
knockbackDirection = hitEffectData.SourceLocation.DirectionTo(hitEffectData.TargetLocation);
}
target.Events.Raise(new EventData<KnockbackDone>
{
EventTags = _knockbackReceiverEventTags.GetTagContainer(),
Source = effect.Ownership.Owner,
Target = target,
EventMagnitude = knockbackValue,
Payload = new KnockbackDone(knockbackValue, knockbackDirection)
});
if (effect.Ownership.Source is null || _knockbackDealerEventTags is null)
return [.. results];
effect.Ownership.Source.Events.Raise(new EventData<KnockbackDone>
{
EventTags = _knockbackDealerEventTags.GetTagContainer(),
Source = effect.Ownership.Owner,
Target = target,
EventMagnitude = knockbackValue,
Payload = new KnockbackDone(knockbackValue, knockbackDirection)
});
return [.. results];
}
}
[GlobalClass]
public partial class ForgeKnockbackExecution : ForgeCustomExecution
{
[Export] public ForgeTag? KnockbackableTag { get; set; }
[Export] public ForgeTag? KnockbackImmuneTag { get; set; }
[Export] public RKnockback? Knockback { get; set; }
[Export] public ForgeTagContainer? KnockbackDealerEventTags { get; set; }
[Export] public ForgeTagContainer? KnockbackReceiverEventTags { get; set; }
public override CustomExecution GetExecutionClass()
{
if (Knockback == null || KnockbackableTag == null || KnockbackImmuneTag == null) throw new System.ArgumentException("Knockback or KnockbackableTag is null");
return new KnockbackExecution(KnockbackableTag, KnockbackImmuneTag, Knockback, KnockbackDealerEventTags, KnockbackReceiverEventTags);
}
}

View File

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

View File

@@ -4,4 +4,4 @@
[resource]
script = ExtResource("1_l686n")
RegisteredTags = Array[String](["character.player", "character.enemy", "weapon", "status.stunned", "status.burning", "status.frozen", "abilities.weapon.land", "abilities.weapon.flying", "abilities.weapon.left", "events.combat.damage", "events.combat.hit", "events.weapon.flyingTick", "events.weapon.startedFlying", "events.weapon.stoppedFlying", "events.weapon.handToFlying", "events.weapon.flyingToHand", "events.weapon.plantedToHand", "events.weapon.plantedToFlying", "events.weapon.planted", "cooldown.empoweredAction", "cooldown.empoweredSwordThrow", "cues.resources.mana", "events.player.empowered_action_used", "cues.resources.mana.inhibited", "cues.resources.health", "cooldown.enemy.hit", "events.combat.death", "cooldown.hit", "events.player.hit", "cues.enemy.health", "immunity.damage", "status", "traits.damageable"])
RegisteredTags = Array[String](["character.player", "character.enemy", "status.stunned", "status.burning", "status.frozen", "abilities.weapon.land", "abilities.weapon.flying", "abilities.weapon.left", "events.combat.damage", "events.combat.hit", "events.weapon.flyingTick", "events.weapon.startedFlying", "events.weapon.stoppedFlying", "events.weapon.handToFlying", "events.weapon.flyingToHand", "events.weapon.plantedToHand", "events.weapon.plantedToFlying", "events.weapon.planted", "cooldown.empoweredAction", "cooldown.empoweredSwordThrow", "cues.resources.mana", "events.player.empowered_action_used", "cues.resources.mana.inhibited", "cues.resources.health", "cooldown.enemy.hit", "events.combat.death", "cooldown.hit", "events.player.hit", "cues.enemy.health", "immunity.damage", "status", "traits.damageable", "traits.knockbackable", "events.combat.knockback_dealt", "events.combat.knockback_received", "events.weapon.plantedtick", "events.weapon.unplanted", "abilities.weapon.planted", "events.enemy.try_hit", "events.enemy.launch_projectile", "objects.projectile", "objects.weapon", "events.enemy.request_projectile", "events.player.parry", "traits.stunnable", "immunity.knockback", "immunity.stun", "events.combat.stun_applied", "events.combat.stun_received"])

View File

@@ -0,0 +1,114 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://nns16d5uhtl8"]
[ext_resource type="Resource" uid="uid://bpovqvlqv5bs5" path="res://forge/resources/effect_components/damageable.tres" id="1_w36j6"]
[ext_resource type="Resource" uid="uid://sn6kndc6ukic" path="res://forge/resources/tag_containers/on_damage_dealt.tres" id="2_3ma4g"]
[ext_resource type="Resource" uid="uid://5tr54q0rdpho" path="res://forge/resources/tag_containers/on_damage_taken.tres" id="3_kyfqu"]
[ext_resource type="Script" uid="uid://cfx62w40nd84v" path="res://forge/calculators/ForgeDamageExecution.cs" id="4_xfamx"]
[ext_resource type="Script" uid="uid://b44cse62qru7j" path="res://scenes/components/knockback/RKnockback.cs" id="5_tw4gc"]
[ext_resource type="Resource" uid="uid://bhn27s8ne0uyg" path="res://forge/resources/tag_containers/on_knockback_dealt.tres" id="6_nq3a0"]
[ext_resource type="Resource" uid="uid://5obdxlcpw8qt" path="res://forge/resources/tag_containers/knockback_immune.tres" id="7_3ma4g"]
[ext_resource type="Resource" uid="uid://bkr6uu57wm3o3" path="res://forge/resources/tag_containers/on_knockback_received.tres" id="7_3utx7"]
[ext_resource type="Resource" uid="uid://45l7vnfs72b" path="res://forge/resources/tag_containers/knockbackable_tag.tres" id="8_7hfxb"]
[ext_resource type="Script" uid="uid://diondfg5xp78h" path="res://forge/calculators/ForgeKnockbackExecution.cs" id="9_lysxe"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="10_sd7ih"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="11_bs6rs"]
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="12_a6jts"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="13_c85am"]
[ext_resource type="Texture2D" uid="uid://c2akxlg7tdb67" path="res://assets/ui/IconGodotNode/node/icon_projectile.png" id="14_ow2i8"]
[ext_resource type="Script" uid="uid://n6efm5o4uxvr" path="res://forge/abilities/ForgeSimpleHitBehavior.cs" id="15_ki7ct"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="16_hhyju"]
[sub_resource type="Resource" id="Resource_vy8wr"]
script = ExtResource("4_xfamx")
DamageType = 3
DamageDealerEventTags = ExtResource("2_3ma4g")
DamageReceiverEventTags = ExtResource("3_kyfqu")
metadata/_custom_type_script = "uid://cfx62w40nd84v"
[sub_resource type="Resource" id="Resource_ndb8p"]
script = ExtResource("5_tw4gc")
Modifier = 500.0
metadata/_custom_type_script = "uid://b44cse62qru7j"
[sub_resource type="Resource" id="Resource_dy671"]
script = ExtResource("9_lysxe")
KnockbackableTag = ExtResource("8_7hfxb")
KnockbackImmuneTag = ExtResource("7_3ma4g")
Knockback = SubResource("Resource_ndb8p")
KnockbackDealerEventTags = ExtResource("6_nq3a0")
KnockbackReceiverEventTags = ExtResource("7_3utx7")
metadata/_custom_type_script = "uid://diondfg5xp78h"
[sub_resource type="Resource" id="Resource_i0sj3"]
script = ExtResource("10_sd7ih")
BaseValue = 1
[sub_resource type="Resource" id="Resource_1mvp7"]
script = ExtResource("11_bs6rs")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_jxdlf"]
script = ExtResource("11_bs6rs")
[sub_resource type="Resource" id="Resource_rslib"]
script = ExtResource("11_bs6rs")
[sub_resource type="Resource" id="Resource_3l3du"]
script = ExtResource("11_bs6rs")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_qqpg8"]
script = ExtResource("11_bs6rs")
[sub_resource type="Resource" id="Resource_igmn0"]
script = ExtResource("11_bs6rs")
[sub_resource type="Resource" id="Resource_acqnn"]
script = ExtResource("11_bs6rs")
BaseValue = 50.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_xwtie"]
script = ExtResource("12_a6jts")
Attribute = "MetaAttributeSet.IncomingDamage"
Operation = 2
CalculationType = 1
ScalableFloat = SubResource("Resource_acqnn")
CapturedAttribute = "MetaAttributeSet.Level"
Coefficient = SubResource("Resource_3l3du")
PreMultiplyAdditiveValue = SubResource("Resource_igmn0")
PostMultiplyAdditiveValue = SubResource("Resource_qqpg8")
CalculatorCoefficient = SubResource("Resource_1mvp7")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_rslib")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_jxdlf")
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
[sub_resource type="Resource" id="Resource_ikb7l"]
script = ExtResource("10_sd7ih")
BaseValue = 1
[sub_resource type="Resource" id="Resource_jdvg8"]
script = ExtResource("13_c85am")
Name = "Explosion hit"
Modifiers = Array[Object]([SubResource("Resource_xwtie")])
Components = [ExtResource("1_w36j6")]
Executions = Array[Object]([SubResource("Resource_vy8wr"), SubResource("Resource_dy671")])
StackLimit = SubResource("Resource_ikb7l")
InitialStack = SubResource("Resource_i0sj3")
Cues = []
metadata/_custom_type_script = "uid://b83hf13nj37k3"
[sub_resource type="Resource" id="Resource_ba5lh"]
script = ExtResource("15_ki7ct")
DamageEffect = SubResource("Resource_jdvg8")
Name = "Explostion hit"
Description = "Called by explosion scene"
Icon = ExtResource("14_ow2i8")
metadata/_custom_type_script = "uid://n6efm5o4uxvr"
[resource]
script = ExtResource("16_hhyju")
Name = "Explosion "
CooldownEffects = []
AbilityBehavior = SubResource("Resource_ba5lh")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -11,6 +11,7 @@
[ext_resource type="Script" uid="uid://n6efm5o4uxvr" path="res://forge/abilities/ForgeSimpleHitBehavior.cs" id="10_m4f1m"]
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="11_8c5sq"]
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="12_2x5q6"]
[ext_resource type="Resource" uid="uid://csh8jcxtrs11k" path="res://forge/resources/tag_containers/on_enemy_try_hit.tres" id="12_f6jpb"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="13_4nn3y"]
[sub_resource type="Resource" id="Resource_rjo6h"]
@@ -154,5 +155,7 @@ script = ExtResource("13_4nn3y")
Name = "Hit"
CooldownEffects = [SubResource("Resource_0gdnn")]
AbilityBehavior = SubResource("Resource_m0osh")
TriggerSource = 1
TriggerTag = ExtResource("12_f6jpb")
ActivationBlockedTags = SubResource("Resource_msmv1")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,23 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://ckfbi6lu255ep"]
[ext_resource type="Texture2D" uid="uid://g0u88alm6hcb" path="res://assets/ui/IconGodotNode/node/icon_bullet.png" id="1_hixal"]
[ext_resource type="PackedScene" uid="uid://bhp6qunnwhncf" path="res://scenes/projectile/Projectile.tscn" id="2_ljwqp"]
[ext_resource type="Script" uid="uid://dxtjifb8hv8k4" path="res://forge/abilities/ForgeSpawnProjectileBehavior.cs" id="3_urund"]
[ext_resource type="Resource" uid="uid://bkr1xfokymvp4" path="res://forge/resources/tag_containers/on_enemy_lauch_project.tres" id="4_5yymv"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="5_xbj7n"]
[sub_resource type="Resource" id="Resource_idpl5"]
script = ExtResource("3_urund")
Projectile = ExtResource("2_ljwqp")
Name = "Spawn projectile"
Icon = ExtResource("1_hixal")
metadata/_custom_type_script = "uid://dxtjifb8hv8k4"
[resource]
script = ExtResource("5_xbj7n")
Name = "Launch projectile"
CooldownEffects = []
AbilityBehavior = SubResource("Resource_idpl5")
TriggerSource = 1
TriggerTag = ExtResource("4_5yymv")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -1,80 +1,105 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://dgjsi1my7nlnk"]
[ext_resource type="Resource" uid="uid://bn1getr10b4dx" path="res://forge/resources/effect_datas/simple_player_hit.tres" id="1_c4wry"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="1_l0l1a"]
[ext_resource type="Script" uid="uid://n6efm5o4uxvr" path="res://forge/abilities/ForgeSimpleHitBehavior.cs" id="1_n2s8d"]
[ext_resource type="Resource" uid="uid://bpovqvlqv5bs5" path="res://forge/resources/effect_components/damageable.tres" id="1_r7waw"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_w1wo0"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="2_5vjbv"]
[ext_resource type="Script" uid="uid://d1bb1fvh1mnpd" path="res://forge/abilities/ForgeManualCancelHitBehavior.cs" id="2_c4wry"]
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="2_jwyed"]
[ext_resource type="Resource" uid="uid://4rkwr10pc6tp" path="res://forge/resources/custom_executions/physical_damage_calculator.tres" id="2_l5emy"]
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="3_c4wry"]
[ext_resource type="Resource" uid="uid://vs6kfo2ubhvr" path="res://forge/resources/effect_components/stunnable.tres" id="2_r7waw"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="3_w1wo0"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="4_c4wry"]
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="5_0cyim"]
[sub_resource type="Resource" id="Resource_0cyim"]
script = ExtResource("1_l0l1a")
BaseValue = 1
[ext_resource type="Script" uid="uid://br7ut4lbau66w" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="7_l5emy"]
[sub_resource type="Resource" id="Resource_h8gc3"]
script = ExtResource("4_c4wry")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_ewmvj"]
script = ExtResource("4_c4wry")
[sub_resource type="Resource" id="Resource_8wvcn"]
script = ExtResource("4_c4wry")
[sub_resource type="Resource" id="Resource_no8t2"]
script = ExtResource("4_c4wry")
BaseValue = 1.0
script = ExtResource("1_w1wo0")
ContainerTags = Array[String](["status.stunned"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_vioyh"]
script = ExtResource("4_c4wry")
script = ExtResource("2_jwyed")
TagsToAdd = SubResource("Resource_h8gc3")
metadata/_custom_type_script = "uid://dngf30hxy5go4"
[sub_resource type="Resource" id="Resource_m6xnn"]
script = ExtResource("4_c4wry")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_uinv8"]
script = ExtResource("4_c4wry")
BaseValue = 40.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_04hqa"]
script = ExtResource("3_c4wry")
Attribute = "MetaAttributeSet.IncomingDamage"
Operation = 2
ScalableFloat = SubResource("Resource_uinv8")
Coefficient = SubResource("Resource_no8t2")
PreMultiplyAdditiveValue = SubResource("Resource_m6xnn")
PostMultiplyAdditiveValue = SubResource("Resource_vioyh")
CalculatorCoefficient = SubResource("Resource_h8gc3")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_8wvcn")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_ewmvj")
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
script = ExtResource("4_c4wry")
[sub_resource type="Resource" id="Resource_8fbeq"]
script = ExtResource("4_c4wry")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_ees2v"]
script = ExtResource("4_c4wry")
[sub_resource type="Resource" id="Resource_6x2ov"]
script = ExtResource("4_c4wry")
[sub_resource type="Resource" id="Resource_ml8x2"]
script = ExtResource("4_c4wry")
BaseValue = 1.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_1uqo4"]
script = ExtResource("5_0cyim")
ScalableFloat = SubResource("Resource_ml8x2")
Coefficient = SubResource("Resource_8fbeq")
PreMultiplyAdditiveValue = SubResource("Resource_6x2ov")
PostMultiplyAdditiveValue = SubResource("Resource_ees2v")
CalculatorCoefficient = SubResource("Resource_m6xnn")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_04hqa")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_uinv8")
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
[sub_resource type="Resource" id="Resource_fyrcc"]
script = ExtResource("1_w1wo0")
ContainerTags = Array[String](["events.combat.stun_applied"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_sgtcb"]
script = ExtResource("1_w1wo0")
ContainerTags = Array[String](["events.combat.stun_received"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_3p0ly"]
script = ExtResource("7_l5emy")
EventTags = SubResource("Resource_fyrcc")
TargetEventTags = SubResource("Resource_sgtcb")
metadata/_custom_type_script = "uid://br7ut4lbau66w"
[sub_resource type="Resource" id="Resource_ewmvj"]
script = ExtResource("1_l0l1a")
BaseValue = 1
[sub_resource type="Resource" id="Resource_ees2v"]
[sub_resource type="Resource" id="Resource_8wvcn"]
script = ExtResource("1_l0l1a")
BaseValue = 1
[sub_resource type="Resource" id="Resource_no8t2"]
script = ExtResource("2_5vjbv")
Name = "Player Hit Effect"
Modifiers = Array[Object]([SubResource("Resource_04hqa")])
Components = Array[Object]([ExtResource("1_r7waw")])
Executions = Array[Object]([ExtResource("2_l5emy")])
StackLimit = SubResource("Resource_8fbeq")
InitialStack = SubResource("Resource_0cyim")
Name = "Basic stun"
Modifiers = Array[Object]([])
Components = Array[Object]([ExtResource("2_r7waw"), SubResource("Resource_vioyh")])
Executions = [SubResource("Resource_3p0ly")]
DurationType = 2
Duration = SubResource("Resource_1uqo4")
StackLimit = SubResource("Resource_8wvcn")
InitialStack = SubResource("Resource_ewmvj")
Cues = []
metadata/_custom_type_script = "uid://b83hf13nj37k3"
[sub_resource type="Resource" id="Resource_r7waw"]
script = ExtResource("1_n2s8d")
DamageEffect = SubResource("Resource_ees2v")
Name = "PlayerHitEffect"
Description = "Effect applied to target on player hit"
metadata/_custom_type_script = "uid://n6efm5o4uxvr"
[sub_resource type="Resource" id="Resource_0cyim"]
script = ExtResource("2_c4wry")
OnHitEffects = [ExtResource("1_c4wry"), SubResource("Resource_no8t2")]
Name = "Player hit"
metadata/_custom_type_script = "uid://d1bb1fvh1mnpd"
[sub_resource type="Resource" id="Resource_qk2av"]
script = ExtResource("1_w1wo0")
@@ -153,6 +178,6 @@ script = ExtResource("3_w1wo0")
Name = "PlayerHitAbility"
RetriggerInstancedAbility = true
CooldownEffects = [SubResource("Resource_cmmfb")]
AbilityBehavior = SubResource("Resource_r7waw")
AbilityBehavior = SubResource("Resource_0cyim")
ActivationBlockedTags = SubResource("Resource_qk2av")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,63 @@
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://0oo3na61ot1o"]
[ext_resource type="Resource" uid="uid://bk3rv5jrutfjw" path="res://forge/resources/tag_containers/on_weapon_plantedtick.tres" id="1_4dvtr"]
[ext_resource type="Script" uid="uid://br7ut4lbau66w" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="2_oo2u8"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="2_wolay"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="3_cykp3"]
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="3_mqsqr"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="4_4348y"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="4_oo2u8"]
[ext_resource type="Script" uid="uid://cl5hudinl1rex" path="res://forge/abilities/ForgeEffectApplicationBehavior.cs" id="5_drdls"]
[sub_resource type="Resource" id="Resource_l3tir"]
script = ExtResource("2_oo2u8")
EventTags = ExtResource("1_4dvtr")
metadata/_custom_type_script = "uid://br7ut4lbau66w"
[sub_resource type="Resource" id="Resource_yc0gp"]
script = ExtResource("3_cykp3")
BaseValue = 1
[sub_resource type="Resource" id="Resource_cykp3"]
script = ExtResource("4_oo2u8")
BaseValue = 0.5
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_rvogu"]
script = ExtResource("3_cykp3")
BaseValue = 1
[sub_resource type="Resource" id="Resource_hgeae"]
script = ExtResource("4_4348y")
Name = "Raise Planted Tick Periodically"
Modifiers = []
Components = []
Executions = Array[Object]([SubResource("Resource_l3tir")])
DurationType = 1
HasPeriodicApplication = true
Period = SubResource("Resource_cykp3")
ExecuteOnApplication = true
StackLimit = SubResource("Resource_rvogu")
InitialStack = SubResource("Resource_yc0gp")
Cues = []
metadata/_custom_type_script = "uid://b83hf13nj37k3"
[sub_resource type="Resource" id="Resource_jiqxq"]
script = ExtResource("5_drdls")
EffectData = SubResource("Resource_hgeae")
metadata/_custom_type_script = "uid://cl5hudinl1rex"
[sub_resource type="Resource" id="Resource_4aw8y"]
script = ExtResource("2_wolay")
Tag = "events.weapon.planted"
metadata/_custom_type_script = "uid://dpakv7agvir6y"
[resource]
script = ExtResource("3_mqsqr")
Name = "Weapon Planted Tick"
RetriggerInstancedAbility = true
CooldownEffects = []
AbilityBehavior = SubResource("Resource_jiqxq")
TriggerSource = 1
TriggerTag = SubResource("Resource_4aw8y")
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"

View File

@@ -0,0 +1,22 @@
[gd_resource type="Resource" script_class="ForgeKnockbackExecution" format=3 uid="uid://cc1qrmbp12fk8"]
[ext_resource type="Script" uid="uid://b44cse62qru7j" path="res://scenes/components/knockback/RKnockback.cs" id="1_kcl5u"]
[ext_resource type="Resource" uid="uid://bhn27s8ne0uyg" path="res://forge/resources/tag_containers/on_knockback_dealt.tres" id="2_oqtq1"]
[ext_resource type="Resource" uid="uid://bkr6uu57wm3o3" path="res://forge/resources/tag_containers/on_knockback_received.tres" id="3_1va1b"]
[ext_resource type="Resource" uid="uid://5obdxlcpw8qt" path="res://forge/resources/tag_containers/knockback_immune.tres" id="3_oqtq1"]
[ext_resource type="Resource" uid="uid://45l7vnfs72b" path="res://forge/resources/tag_containers/knockbackable_tag.tres" id="4_0i0oh"]
[ext_resource type="Script" uid="uid://diondfg5xp78h" path="res://forge/calculators/ForgeKnockbackExecution.cs" id="5_babc1"]
[sub_resource type="Resource" id="Resource_6x2ov"]
script = ExtResource("1_kcl5u")
Modifier = 50.0
metadata/_custom_type_script = "uid://b44cse62qru7j"
[resource]
script = ExtResource("5_babc1")
KnockbackableTag = ExtResource("4_0i0oh")
KnockbackImmuneTag = ExtResource("3_oqtq1")
Knockback = SubResource("Resource_6x2ov")
KnockbackDealerEventTags = ExtResource("2_oqtq1")
KnockbackReceiverEventTags = ExtResource("3_1va1b")
metadata/_custom_type_script = "uid://diondfg5xp78h"

View File

@@ -0,0 +1,20 @@
[gd_resource type="Resource" script_class="TargetTagRequirements" format=3 uid="uid://vs6kfo2ubhvr"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_52mex"]
[ext_resource type="Script" uid="uid://b0eq12mjqfage" path="res://addons/forge/resources/components/TargetTagRequirements.cs" id="2_d06a4"]
[sub_resource type="Resource" id="Resource_r7waw"]
script = ExtResource("1_52mex")
ContainerTags = Array[String](["immunity.stun"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[sub_resource type="Resource" id="Resource_vioyh"]
script = ExtResource("1_52mex")
ContainerTags = Array[String](["traits.stunnable"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
[resource]
script = ExtResource("2_d06a4")
ApplicationRequiredTags = SubResource("Resource_vioyh")
ApplicationIgnoredTags = SubResource("Resource_r7waw")
metadata/_custom_type_script = "uid://b0eq12mjqfage"

View File

@@ -0,0 +1,66 @@
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://bn1getr10b4dx"]
[ext_resource type="Resource" uid="uid://bpovqvlqv5bs5" path="res://forge/resources/effect_components/damageable.tres" id="1_uev3b"]
[ext_resource type="Resource" uid="uid://4rkwr10pc6tp" path="res://forge/resources/custom_executions/physical_damage_calculator.tres" id="2_o3goh"]
[ext_resource type="Resource" uid="uid://cc1qrmbp12fk8" path="res://forge/resources/custom_executions/player_hit_knoback_calculation.tres" id="3_bydif"]
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="4_sd5hm"]
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="5_l6rea"]
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="6_juqkp"]
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="7_njbpb"]
[sub_resource type="Resource" id="Resource_0cyim"]
script = ExtResource("4_sd5hm")
BaseValue = 1
[sub_resource type="Resource" id="Resource_h8gc3"]
script = ExtResource("5_l6rea")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_ewmvj"]
script = ExtResource("5_l6rea")
[sub_resource type="Resource" id="Resource_8wvcn"]
script = ExtResource("5_l6rea")
[sub_resource type="Resource" id="Resource_no8t2"]
script = ExtResource("5_l6rea")
BaseValue = 1.0
[sub_resource type="Resource" id="Resource_vioyh"]
script = ExtResource("5_l6rea")
[sub_resource type="Resource" id="Resource_m6xnn"]
script = ExtResource("5_l6rea")
[sub_resource type="Resource" id="Resource_uinv8"]
script = ExtResource("5_l6rea")
BaseValue = 40.0
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
[sub_resource type="Resource" id="Resource_04hqa"]
script = ExtResource("6_juqkp")
Attribute = "MetaAttributeSet.IncomingDamage"
Operation = 2
ScalableFloat = SubResource("Resource_uinv8")
Coefficient = SubResource("Resource_no8t2")
PreMultiplyAdditiveValue = SubResource("Resource_m6xnn")
PostMultiplyAdditiveValue = SubResource("Resource_vioyh")
CalculatorCoefficient = SubResource("Resource_h8gc3")
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_8wvcn")
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_ewmvj")
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
[sub_resource type="Resource" id="Resource_8fbeq"]
script = ExtResource("4_sd5hm")
BaseValue = 1
[resource]
script = ExtResource("7_njbpb")
Name = "Player Hit Effect"
Modifiers = Array[Object]([SubResource("Resource_04hqa")])
Components = Array[Object]([ExtResource("1_uev3b")])
Executions = Array[Object]([ExtResource("2_o3goh"), ExtResource("3_bydif")])
StackLimit = SubResource("Resource_8fbeq")
InitialStack = SubResource("Resource_0cyim")
Cues = []
metadata/_custom_type_script = "uid://b83hf13nj37k3"

View File

@@ -4,5 +4,5 @@
[resource]
script = ExtResource("1_kdy2b")
ContainerTags = Array[String](["character.enemy", "traits.damageable"])
ContainerTags = Array[String](["character.enemy", "traits.damageable", "traits.knockbackable", "traits.stunnable"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://5obdxlcpw8qt"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_pjklh"]
[resource]
script = ExtResource("1_pjklh")
Tag = "immunity.knockback"
metadata/_custom_type_script = "uid://dpakv7agvir6y"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://45l7vnfs72b"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_1cy5u"]
[resource]
script = ExtResource("1_1cy5u")
Tag = "traits.knockbackable"
metadata/_custom_type_script = "uid://dpakv7agvir6y"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://bkr1xfokymvp4"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_ux16b"]
[resource]
script = ExtResource("1_ux16b")
Tag = "events.enemy.launch_projectile"
metadata/_custom_type_script = "uid://dpakv7agvir6y"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeTag" format=3 uid="uid://csh8jcxtrs11k"]
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="1_3ab6s"]
[resource]
script = ExtResource("1_3ab6s")
Tag = "events.enemy.try_hit"
metadata/_custom_type_script = "uid://dpakv7agvir6y"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bhn27s8ne0uyg"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_kgxiq"]
[resource]
script = ExtResource("1_kgxiq")
ContainerTags = Array[String](["events.combat.knockback_dealt"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bkr6uu57wm3o3"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_ro1gp"]
[resource]
script = ExtResource("1_ro1gp")
ContainerTags = Array[String](["events.combat.knockback_received"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="ForgeTagContainer" format=3 uid="uid://bk3rv5jrutfjw"]
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_gt2iq"]
[resource]
script = ExtResource("1_gt2iq")
ContainerTags = Array[String](["events.weapon.plantedtick"])
metadata/_custom_type_script = "uid://cw525n4mjqgw0"

View File

@@ -249,19 +249,29 @@ metadata/_guide_triggers_collapsed = false
script = ExtResource("30_cvxqo")
key = 4194326
[sub_resource type="Resource" id="Resource_8ifoc"]
[sub_resource type="Resource" id="Resource_x328c"]
script = ExtResource("15_g6bbx")
[sub_resource type="Resource" id="Resource_imjft"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_wcvib")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_8ifoc")])
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_x328c")])
metadata/_guide_triggers_collapsed = false
[sub_resource type="Resource" id="Resource_pvh84"]
script = ExtResource("30_cvxqo")
key = 67
[sub_resource type="Resource" id="Resource_k0iwu"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_pvh84")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_x328c")])
metadata/_guide_triggers_collapsed = false
[sub_resource type="Resource" id="Resource_vibkn"]
script = ExtResource("1_qmhk6")
action = ExtResource("23_rvpjj")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_s8kjn"), SubResource("Resource_imjft")])
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_s8kjn"), SubResource("Resource_imjft"), SubResource("Resource_k0iwu")])
[sub_resource type="Resource" id="Resource_f3pn5"]
script = ExtResource("10_cvxqo")
@@ -279,18 +289,27 @@ triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_rvpjj")])
script = ExtResource("30_cvxqo")
key = 4194326
[sub_resource type="Resource" id="Resource_bhf7o"]
[sub_resource type="Resource" id="Resource_6j2cd"]
script = ExtResource("17_s8kjn")
[sub_resource type="Resource" id="Resource_woy8j"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_qksfw")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_bhf7o")])
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_6j2cd")])
[sub_resource type="Resource" id="Resource_uxk2a"]
script = ExtResource("30_cvxqo")
key = 67
[sub_resource type="Resource" id="Resource_urj6e"]
script = ExtResource("3_yp12v")
input = SubResource("Resource_uxk2a")
triggers = Array[ExtResource("8_2tfaw")]([SubResource("Resource_6j2cd")])
[sub_resource type="Resource" id="Resource_2hs2y"]
script = ExtResource("1_qmhk6")
action = ExtResource("25_rvpjj")
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_818lq"), SubResource("Resource_woy8j")])
input_mappings = Array[ExtResource("3_yp12v")]([SubResource("Resource_818lq"), SubResource("Resource_woy8j"), SubResource("Resource_urj6e")])
[sub_resource type="Resource" id="Resource_1fkas"]
script = ExtResource("19_qkgmj")

View File

@@ -1,12 +0,0 @@
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Tags;
using Godot;
namespace Movementtests.interfaces;
public interface IAbilityBase<TCreation, TPayload>
{
AbilityData Ability(TCreation creationData, TagContainer? tags);
IAbilityBehavior<TPayload> Behavior(TCreation creationData);
}

View File

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

View File

@@ -1,9 +0,0 @@
using Godot;
namespace Movementtests.interfaces;
public interface IDamageDealer
{
[Export]
RDamage RDamage { get; set; }
}

View File

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

View File

@@ -1,14 +0,0 @@
using System;
using Godot;
namespace Movementtests.interfaces;
public record DamageRecord(Vector3 SourceLocation, RDamage Damage);
public interface IDamageable
{
event Action<IDamageable, DamageRecord> DamageTaken;
DamageRecord TakeDamage(DamageRecord damageRecord);
DamageRecord ComputeDamage(DamageRecord damageRecord);
}

View File

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

View File

@@ -0,0 +1,12 @@
using Godot;
namespace Movementtests.interfaces;
public interface IDisableable
{
bool IsDisabled { get; set; }
[Export] float DisableDuration { get; set; }
void Disable();
void Enable();
}

View File

@@ -1,18 +0,0 @@
using System;
using Godot;
namespace Movementtests.interfaces;
public record HealthChangedRecord(float CurrentHealth, float PreviousHealth, float MaxHealth);
public interface IHealthable
{
event Action<IHealthable, HealthChangedRecord> HealthChanged;
event Action<IHealthable> HealthDepleted;
[Export] RHealth? RHealth { get; set; }
float CurrentHealth { get; set; }
HealthChangedRecord ReduceHealth(IDamageable source, DamageRecord damageRecord);
}

View File

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

View File

@@ -2,5 +2,5 @@ namespace Movementtests.interfaces;
public interface IKillable
{
void Kill(IHealthable source);
void Kill();
}

View File

@@ -1,8 +1,9 @@
using Godot;
using Movementtests.scenes.components.knockback;
namespace Movementtests.interfaces;
public record KnockbackRecord(DamageRecord DamageRecord, float ForceMultiplier = 1.0f);
public record KnockbackRecord(Vector3 Direction, float ForceMultiplier = 1.0f);
public interface IKnockbackable
{

View File

@@ -5,9 +5,10 @@ namespace Movementtests.interfaces;
public record MovementInputs(
Vector3 Velocity = default,
Vector3 TargetLocation = default,
bool isOnFloor = false,
Vector3 gravity = default,
double delta = 0);
bool IsOnFloor = false,
bool IsStunned = false,
Vector3 Gravity = default,
double Delta = 0);
public interface IMoveable
{

View File

@@ -1,12 +0,0 @@
using Godot;
namespace Movementtests.interfaces;
public interface IStunnable
{
bool IsStunned { get; set; }
[Export] float StunDuration { get; set; }
void Stun();
void Unstun();
}

View File

@@ -5,10 +5,6 @@ namespace Movementtests.interfaces;
public static class NodeExtensions
{
public static IDamageable[] ToIDamageables(this GodotObject[] nodes)
{
return nodes == null ? System.Array.Empty<IDamageable>() : nodes.OfType<IDamageable>().ToArray();
}
public static IKillable[] ToIKillables(this GodotObject[] nodes)
{
return nodes == null ? System.Array.Empty<IKillable>() : nodes.OfType<IKillable>().ToArray();

View File

@@ -9,34 +9,27 @@ using Movementtests.systems;
namespace Movementtests.managers;
public partial class WeaponEventAbilityData(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior ability)
: RefCounted
{
public WeaponSystem.WeaponEvent ForEvent { get; private set; } = forEvent;
public ForgeAbilityBehavior Ability { get; private set; } = ability;
}
[GlobalClass, Meta(typeof(IAutoNode))]
public partial class InventoryManager : Node, IDisposable
{
public override void _Notification(int what) => this.Notify(what);
#region Signals
[Signal]
public delegate void WeaponEventAbilityAddedEventHandler(WeaponEventAbilityData data);
[Signal]
public delegate void WeaponEventAbilityRemovedEventHandler(WeaponEventAbilityData data);
#endregion
private AutoSet<ForgeAbilityBehavior> _startedFlyingAbilities = new();
private AutoSet<ForgeAbilityBehavior> _flyingTickAbilities = new();
private AutoSet<ForgeAbilityBehavior> _stoppedFlyingAbilities = new();
private AutoSet<ForgeAbilityBehavior> _startedPlantedAbilities = new();
private AutoSet<ForgeAbilityBehavior> _plantedTickAbilities = new();
private AutoSet<ForgeAbilityBehavior> _stoppedPlantedAbilities = new();
public IAutoSet<ForgeAbilityBehavior> StartedFlyingAbilities => _startedFlyingAbilities;
public IAutoSet<ForgeAbilityBehavior> FlyingTickAbilities => _flyingTickAbilities;
public IAutoSet<ForgeAbilityBehavior> StoppedFlyingAbilities => _stoppedFlyingAbilities;
public IAutoSet<ForgeAbilityBehavior> StartedPlantedAbilities => _startedPlantedAbilities;
public IAutoSet<ForgeAbilityBehavior> PlantedTickAbilities => _plantedTickAbilities;
public IAutoSet<ForgeAbilityBehavior> StoppedPlantedAbilities => _stoppedPlantedAbilities;
private readonly AutoMap<WeaponSystem.WeaponEvent, AutoSet<ForgeAbilityBehavior>> _weaponEventsInventory = new();
public IAutoMap<WeaponSystem.WeaponEvent, AutoSet<ForgeAbilityBehavior>> WeaponEventsInventory => _weaponEventsInventory;
@@ -44,15 +37,23 @@ public partial class InventoryManager : Node, IDisposable
public void OnReady()
{
_weaponEventsInventory[WeaponSystem.WeaponEvent.StartedFlying] = _startedFlyingAbilities;
_weaponEventsInventory[WeaponSystem.WeaponEvent.FlyingTick] = _flyingTickAbilities;
_weaponEventsInventory[WeaponSystem.WeaponEvent.StoppedFlying] = _stoppedFlyingAbilities;
_weaponEventsInventory[WeaponSystem.WeaponEvent.FlyingTick] = _flyingTickAbilities;
_weaponEventsInventory[WeaponSystem.WeaponEvent.StartedPlanted] = _startedPlantedAbilities;
_weaponEventsInventory[WeaponSystem.WeaponEvent.StoppedPlanted] = _stoppedPlantedAbilities;
_weaponEventsInventory[WeaponSystem.WeaponEvent.PlantedTick] = _plantedTickAbilities;
}
public void InitializeFromResource(WeaponInventory inventory)
{
_startedFlyingAbilities = new AutoSet<ForgeAbilityBehavior>(inventory.OnWeaponStartedFlyingAbilities);
_flyingTickAbilities = new AutoSet<ForgeAbilityBehavior>(inventory.OnWeaponFlyingTickAbilities);
_stoppedFlyingAbilities = new AutoSet<ForgeAbilityBehavior>(inventory.OnWeaponStoppedFlyingAbilities);
var eventMap = inventory.GetEventAbilitiesMap();
_startedFlyingAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StartedFlying]);
_stoppedFlyingAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StoppedFlying]);
_flyingTickAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.FlyingTick]);
_startedPlantedAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StartedPlanted]);
_stoppedPlantedAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.StoppedPlanted]);
_plantedTickAbilities = new AutoSet<ForgeAbilityBehavior>(eventMap[WeaponSystem.WeaponEvent.PlantedTick]);
}
public new void Dispose()
@@ -60,8 +61,12 @@ public partial class InventoryManager : Node, IDisposable
GC.SuppressFinalize(this);
_startedFlyingAbilities.Dispose();
_flyingTickAbilities.Dispose();
_stoppedFlyingAbilities.Dispose();
_flyingTickAbilities.Dispose();
_startedPlantedAbilities.Dispose();
_stoppedPlantedAbilities.Dispose();
_plantedTickAbilities.Dispose();
_weaponEventsInventory.Dispose();
base.Dispose();

View File

@@ -0,0 +1,51 @@
using System.Collections.Generic;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Godot;
using Movementtests.systems;
namespace Movementtests.managers;
[GlobalClass]
public partial class WeaponInventory(
ForgeAbilityBehavior[] onWeaponStartedFlyingAbilities,
ForgeAbilityBehavior[] onWeaponFlyingTickAbilities,
ForgeAbilityBehavior[] onWeaponStoppedFlyingAbilities,
ForgeAbilityBehavior[] onWeaponStartedPlantedAbilities,
ForgeAbilityBehavior[] onWeaponPlantedTickAbilities,
ForgeAbilityBehavior[] onWeaponStoppedPlantedAbilities
) : Resource
{
[ExportGroup("Flying abilities")]
[Export]
public ForgeAbilityBehavior[] OnWeaponStartedFlyingAbilities { get; set; } = onWeaponStartedFlyingAbilities;
[Export]
public ForgeAbilityBehavior[] OnWeaponFlyingTickAbilities { get; set; } = onWeaponFlyingTickAbilities;
[Export]
public ForgeAbilityBehavior[] OnWeaponStoppedFlyingAbilities { get; set; } = onWeaponStoppedFlyingAbilities;
[ExportGroup("Planted abilities")]
[Export]
public ForgeAbilityBehavior[] OnWeaponStartedPlantedAbilities { get; set; } = onWeaponStartedPlantedAbilities;
[Export]
public ForgeAbilityBehavior[] OnWeaponPlantedTickAbilities { get; set; } = onWeaponPlantedTickAbilities;
[Export]
public ForgeAbilityBehavior[] OnWeaponStoppedPlantedAbilities { get; set; } = onWeaponStoppedPlantedAbilities;
public WeaponInventory() : this([], [], [], [], [], [])
{
}
public Dictionary<WeaponSystem.WeaponEvent, ForgeAbilityBehavior[]> GetEventAbilitiesMap()
{
return new Dictionary<WeaponSystem.WeaponEvent, ForgeAbilityBehavior[]>
{
{ WeaponSystem.WeaponEvent.StartedFlying, OnWeaponStartedFlyingAbilities },
{ WeaponSystem.WeaponEvent.StoppedFlying, OnWeaponStoppedFlyingAbilities },
{ WeaponSystem.WeaponEvent.FlyingTick, OnWeaponFlyingTickAbilities },
{ WeaponSystem.WeaponEvent.StartedPlanted, OnWeaponStartedPlantedAbilities },
{ WeaponSystem.WeaponEvent.StoppedPlanted, OnWeaponStoppedPlantedAbilities },
{ WeaponSystem.WeaponEvent.PlantedTick, OnWeaponPlantedTickAbilities },
};
}
}

61
managers/TokenManager.cs Normal file
View File

@@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
namespace Movementtests.managers;
[GlobalClass, Meta(typeof(IAutoNode))]
public partial class TokenManager : Node
{
public override void _Notification(int what) => this.Notify(what);
public record struct Token(ulong InstanceId, Action OnUse);
private Dictionary<ulong, Token> Tokens { get; set; } = [];
public int TokenCount => Tokens.Count;
private Queue<ulong> RequestQueue { get; set; } = [];
public int MaxTokens { get; set;}
public void Initialize(int maxTokens)
{
MaxTokens = maxTokens;
}
public Token? RequestToken(Node owner)
{
if (Tokens.ContainsKey(owner.GetInstanceId()))
{
GD.Print("Already has a token");
return null; // Already has a token
}
if (TokenCount >= MaxTokens)
{
GD.Print($"Max tokens reached: {TokenCount}");
return null; // Max tokens reached
}
if (!RequestQueue.Contains(owner.GetInstanceId()))
{
RequestQueue.Enqueue(owner.GetInstanceId());
}
if (RequestQueue.First() != owner.GetInstanceId())
{
GD.Print("Waiting its turn");
return null; // Next in line is not the requester
}
var ownerInstanceId = RequestQueue.Dequeue();
var token = new Token(ownerInstanceId, () => UseToken(ownerInstanceId));
Tokens.Add(token.InstanceId, token);
return token;
}
public void UseToken(ulong instanceId)
{
Tokens.Remove(instanceId);
}
}

View File

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

View File

@@ -0,0 +1,22 @@
using Godot;
namespace Movementtests.managers;
[GlobalClass]
public partial class EnemyDescription(PackedScene scene, EnemyDescription.EnemyType type, RMovement? movementOverride) : Resource
{
public enum EnemyType
{
Normal,
Flying,
Projectile,
}
[Export(PropertyHint.NodeType)] public required PackedScene Scene { get; set; } = scene;
[Export] public required EnemyType Type { get; set; } = type;
[Export] public RMovement? MovementOverride { get; set; } = movementOverride;
public EnemyDescription() : this(ResourceLoader.Load<PackedScene>("uid://dxt0e2ugmttqq"), EnemyType.Normal, null) {}
}

View File

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

View File

@@ -0,0 +1,13 @@
using System.Collections.Generic;
using Godot;
namespace Movementtests.managers;
[GlobalClass]
public partial class SingleWave(EnemyDescription[] enemies) : Resource
{
[Export] public Godot.Collections.Dictionary<EnemyDescription, int> EnemiesToSpawn { get; set; } = [];
public SingleWave() : this([]) {}
}

View File

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

View File

@@ -0,0 +1,11 @@
using Godot;
namespace Movementtests.managers;
[GlobalClass]
public partial class WaveContent(SingleWave[] waves) : Resource
{
[Export] public SingleWave[] Waves { get; set; } = waves;
public WaveContent() : this([]) {}
}

View File

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

View File

@@ -0,0 +1,121 @@
using System.Collections.Generic;
using System.Linq;
using Chickensoft.AutoInject;
using Chickensoft.Collections;
using Chickensoft.Introspection;
using Godot;
using Movementtests.tools;
namespace Movementtests.managers;
[GlobalClass, Meta(typeof(IAutoNode))]
public partial class WaveManager : Node
{
public override void _Notification(int what) => this.Notify(what);
public WaveContent WaveContent { get; set; }
public int CurrentWaveIndex { get; set; }
public int CurrentWaveCount => WaveContent.Waves.Length;
public Godot.Collections.Dictionary<EnemyDescription, int> CurrentWave =>
WaveContent.Waves[CurrentWaveIndex].EnemiesToSpawn;
public Dictionary<ulong, Enemy?> CurrentSpawnedEnemies { get; set; } = [];
public Set<Spawner> SpawnersInUse { get; set; } = [];
public List<Spawner> Spawners { get; set; } = [];
public void RegisterSpawner(Spawner spawner) => Spawners.Add(spawner);
public void InitializeFromResource(WaveContent waveContent) => WaveContent = waveContent;
public void StartWaves()
{
CurrentWaveIndex = 0;
StartNextWave();
}
public void StartNextWave()
{
if (CurrentWave.Count == 0)
{
GD.PrintErr("Wave has no enemies");
return;
}
if (Spawners.Count == 0)
{
GD.PrintErr("No spawners registered");
return;
}
SpawnEnemiesAsAvailable();
}
public void SpawnEnemiesAsAvailable()
{
var randomizedSpawners = Spawners.ToArray();
randomizedSpawners.Shuffle();
foreach (var spawner in randomizedSpawners)
{
if (SpawnersInUse.Contains(spawner)) continue;
foreach (var (enemyDescription, numberRemaining) in CurrentWave)
{
if (numberRemaining <= 0) continue;
if (!spawner.SupportedEnemyTypes.Contains(enemyDescription.Type)) continue;
var spawnedEnemy = spawner.SpawnEnemy(enemyDescription);
if (spawnedEnemy == null) continue;
CurrentSpawnedEnemies[spawnedEnemy.GetInstanceId()] = spawnedEnemy;
SpawnersInUse.Add(spawner);
spawnedEnemy.OnKilled += instanceId=> SpawnedEnemyDied(instanceId, spawner);
CurrentWave[enemyDescription]--;
break;
}
}
// foreach (var (enemyDescription, numberRemaining) in CurrentWave)
// {
// if (numberRemaining <= 0) continue;
// foreach (var spawner in randomizedSpawners)
// {
// if (!spawner.SupportedEnemyTypes.Contains(enemyDescription.Type)) continue;
// if (SpawnersInUse.Contains(spawner)) continue;
//
// var spawnedEnemy = spawner.SpawnEnemy(enemyDescription);
// if (spawnedEnemy == null) continue;
//
// CurrentSpawnedEnemies[spawnedEnemy.GetInstanceId()] = spawnedEnemy;
// SpawnersInUse.Add(spawner);
//
// spawnedEnemy.OnKilled += instanceId=> SpawnedEnemyDied(instanceId, spawner);
//
// CurrentWave[enemyDescription]--;
// break;
// }
// }
var remainingEnemiesToSpawn = CurrentWave.Values.Sum();
if (remainingEnemiesToSpawn <= 0) return; // Wave is fully spawned
GetTree().CreateTimer(1.0f).Timeout += SpawnEnemiesAsAvailable; // Call back the same function later to try and spawn the rest
}
public void SpawnedEnemyDied(ulong instanceId, Spawner spawner)
{
CurrentSpawnedEnemies.Remove(instanceId);
SpawnersInUse.Remove(spawner);
if (CurrentSpawnedEnemies.Count == 0) FinishWave();
}
public void FinishWave()
{
if (CurrentWaveIndex >= CurrentWaveCount) return; // All waves finished
CurrentWaveIndex++;
GetTree().CreateTimer(1.0f).Timeout += StartNextWave; // Start next wave in 1s
}
}

View File

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

View File

@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="EnemyDescription" format=3 uid="uid://cfyafss8ncbhh"]
[ext_resource type="Resource" uid="uid://bwqjaom4k7rc3" path="res://scenes/enemies/flying_enemy/flying_enemy_movement.tres" id="1_hsb6g"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="1_yvgr4"]
[ext_resource type="Script" uid="uid://rhdkfi7nuvu1" path="res://managers/Wave/EnemyDescription.cs" id="2_hsb6g"]
[resource]
script = ExtResource("2_hsb6g")
Scene = ExtResource("1_yvgr4")
Type = 1
MovementOverride = ExtResource("1_hsb6g")
metadata/_custom_type_script = "uid://rhdkfi7nuvu1"

View File

@@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="EnemyDescription" format=3 uid="uid://3clksludry8g"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="1_wxdbf"]
[ext_resource type="Script" uid="uid://rhdkfi7nuvu1" path="res://managers/Wave/EnemyDescription.cs" id="2_gk6ig"]
[resource]
script = ExtResource("2_gk6ig")
Scene = ExtResource("1_wxdbf")
metadata/_custom_type_script = "uid://rhdkfi7nuvu1"

View File

@@ -0,0 +1,17 @@
[gd_resource type="Resource" script_class="SingleWave" format=3 uid="uid://dm71u0ryn0w1o"]
[ext_resource type="Resource" uid="uid://cfyafss8ncbhh" path="res://managers/Wave/resources/flying_enemy_desc.tres" id="1_bcssi"]
[ext_resource type="Script" uid="uid://rhdkfi7nuvu1" path="res://managers/Wave/EnemyDescription.cs" id="2_3r6ce"]
[ext_resource type="Resource" uid="uid://3clksludry8g" path="res://managers/Wave/resources/grounded_enemy_desc.tres" id="2_mmsra"]
[ext_resource type="Resource" uid="uid://lnturc3ibr5c" path="res://managers/Wave/resources/projectile_enemy_desc.tres" id="3_3r6ce"]
[ext_resource type="Script" uid="uid://cr8wog705ane6" path="res://managers/Wave/SingleWave.cs" id="5_qckro"]
[resource]
script = ExtResource("5_qckro")
Enemies = Array[Object]([ExtResource("1_bcssi"), ExtResource("2_mmsra"), ExtResource("3_3r6ce")])
EnemiesToSpawn = Dictionary[ExtResource("2_3r6ce"), int]({
ExtResource("1_bcssi"): 1,
ExtResource("2_mmsra"): 1,
ExtResource("3_3r6ce"): 1
})
metadata/_custom_type_script = "uid://cr8wog705ane6"

View File

@@ -0,0 +1,10 @@
[gd_resource type="Resource" script_class="EnemyDescription" format=3 uid="uid://lnturc3ibr5c"]
[ext_resource type="PackedScene" uid="uid://dx3y8sjftqk8f" path="res://scenes/enemies/projectile_enemy/projectile_enemy.tscn" id="1_2nepo"]
[ext_resource type="Script" uid="uid://rhdkfi7nuvu1" path="res://managers/Wave/EnemyDescription.cs" id="2_bn1dh"]
[resource]
script = ExtResource("2_bn1dh")
Scene = ExtResource("1_2nepo")
Type = 1
metadata/_custom_type_script = "uid://rhdkfi7nuvu1"

View File

@@ -1,22 +0,0 @@
using System.Collections.Generic;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Godot;
namespace Movementtests.managers;
[GlobalClass]
public partial class WeaponInventory(
ForgeAbilityBehavior[] onWeaponStartedFlyingAbilities,
ForgeAbilityBehavior[] onWeaponFlyingTickAbilities,
ForgeAbilityBehavior[] onWeaponStoppedFlyingAbilities
) : Resource
{
[Export]
public ForgeAbilityBehavior[] OnWeaponStartedFlyingAbilities { get; set; } = onWeaponStartedFlyingAbilities;
[Export]
public ForgeAbilityBehavior[] OnWeaponFlyingTickAbilities { get; set; } = onWeaponFlyingTickAbilities;
[Export]
public ForgeAbilityBehavior[] OnWeaponStoppedFlyingAbilities { get; set; } = onWeaponStoppedFlyingAbilities;
public WeaponInventory() : this([], [], []) {}
}

View File

@@ -26,11 +26,7 @@
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="25_nrosh"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="25_x7fl1"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="26_lu3yt"]
[ext_resource type="Resource" uid="uid://dg1xbjhyhgnnk" path="res://scenes/enemies/flying_enemy/flying_enemy_health.tres" id="27_lgco8"]
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="28_51ivn"]
[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="30_3w3wd"]
[ext_resource type="Resource" uid="uid://bohbojc68j7y1" path="res://scenes/enemies/grounded_enemy/grounded_enemy_health.tres" id="31_5hbxb"]
[ext_resource type="Resource" uid="uid://otfc2snh8umc" path="res://scenes/enemies/grounded_enemy/grounded_enemy_damage.tres" id="32_hmdts"]
[sub_resource type="LabelSettings" id="LabelSettings_2k3fr"]
font_size = 30
@@ -382,11 +378,9 @@ shadow_enabled = true
shadow_opacity = 0.95
shadow_blur = 2.435
[node name="Player" parent="." unique_id=341554101 node_paths=PackedStringArray("TutorialWeaponTarget") instance=ExtResource("1_2vsi6")]
[node name="Player" parent="." unique_id=341554101 instance=ExtResource("1_2vsi6")]
transform = Transform3D(0.054514527, 0, -0.9985129, 0, 1, 0, 0.9985129, 0, 0.054514527, -6, 75.5, -13.5)
collision_layer = 17
TutorialWeaponTarget = NodePath("../PlacedTutorialWeapon/WeaponLocationTarget")
TutorialDone = true
AccelerationAir = 1.5
[node name="DebugLayer" type="CanvasLayer" parent="." unique_id=533965065]
@@ -448,8 +442,6 @@ spot_angle_attenuation = 10.556052
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19, 43, -111.5)
EnemyToSpawn = ExtResource("25_x7fl1")
MovementInputs = SubResource("Resource_pxspk")
HealthInputs = ExtResource("27_lgco8")
DamageInputs = ExtResource("28_51ivn")
Target = NodePath("../Player")
IsActiveOnStart = false
@@ -457,8 +449,6 @@ IsActiveOnStart = false
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 31, 7.5, -88)
EnemyToSpawn = ExtResource("25_nrosh")
MovementInputs = ExtResource("30_3w3wd")
HealthInputs = ExtResource("31_5hbxb")
DamageInputs = ExtResource("32_hmdts")
Target = NodePath("../Player")
IsActiveOnStart = false

View File

@@ -1,178 +0,0 @@
[gd_scene format=3 uid="uid://q7uc1h2jpbd2"]
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://scenes/player_controller/PlayerController.tscn" id="1_62kkh"]
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="2_3uydm"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="2_5fa36"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="3_3uydm"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="5_8fd2t"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="5_ybosk"]
[ext_resource type="PackedScene" uid="uid://c305mfrtumcyq" path="res://scenes/spawners/spawner.tscn" id="6_7m3bq"]
[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="7_caohq"]
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://scenes/components/health/RHealth.cs" id="9_2e4ci"]
[ext_resource type="Resource" uid="uid://otfc2snh8umc" path="res://scenes/enemies/grounded_enemy/grounded_enemy_damage.tres" id="9_dmw1t"]
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="9_gp7s3"]
[ext_resource type="Resource" uid="uid://bwqjaom4k7rc3" path="res://scenes/enemies/flying_enemy/flying_enemy_movement.tres" id="10_spw1u"]
[ext_resource type="Resource" uid="uid://dg1xbjhyhgnnk" path="res://scenes/enemies/flying_enemy/flying_enemy_health.tres" id="11_2e4ci"]
[ext_resource type="PackedScene" uid="uid://qup00a7x2sji" path="res://scenes/fixed_dash_target/fixed_dashthrough_target.tscn" id="15_5fa36"]
[sub_resource type="Resource" id="Resource_1hrkh"]
script = ExtResource("2_5fa36")
DamageDealt = 1.0
metadata/_custom_type_script = "uid://jitubgv6judn"
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_0xm2m"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
[sub_resource type="Sky" id="Sky_h2yge"]
sky_material = SubResource("ProceduralSkyMaterial_0xm2m")
[sub_resource type="Environment" id="Environment_1bvp3"]
background_mode = 2
sky = SubResource("Sky_h2yge")
ambient_light_source = 2
ambient_light_color = Color(0.576076, 0.459788, 0.652401, 1)
reflected_light_source = 2
tonemap_mode = 4
tonemap_exposure = 1.32
ssao_enabled = true
ssao_radius = 3.61
ssil_enabled = true
ssil_radius = 8.4
sdfgi_use_occlusion = true
glow_enabled = true
[sub_resource type="Resource" id="Resource_5fa36"]
script = ExtResource("5_ybosk")
GravityModifier = 5.0
metadata/_custom_type_script = "uid://dtpxijlnb2c5"
[sub_resource type="Resource" id="Resource_ybosk"]
script = ExtResource("9_2e4ci")
StartingHealth = 1.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[node name="Main" type="Node3D" unique_id=2140535950]
[node name="Player" parent="." unique_id=809599523 instance=ExtResource("1_62kkh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 7.5)
TutorialDone = true
RDamage = SubResource("Resource_1hrkh")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=2082209843]
environment = SubResource("Environment_1bvp3")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=63930954]
transform = Transform3D(-0.772218, 0.611111, 0.173844, 0.0446935, -0.220691, 0.974319, 0.633783, 0.760157, 0.143109, 0, 0, 0)
shadow_enabled = true
[node name="Greybox" type="CSGCombiner3D" parent="." unique_id=1207469789]
use_collision = true
collision_layer = 256
collision_mask = 65553
[node name="CSGBox3D" type="CSGBox3D" parent="Greybox" unique_id=319978745]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.096, -0.5, -46.329)
use_collision = true
size = Vector3(100, 1, 190.741)
material = ExtResource("2_3uydm")
[node name="CSGBox3D2" type="CSGBox3D" parent="Greybox" unique_id=1919989912]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.346, 4.5, 2.7915)
use_collision = true
size = Vector3(6.5, 11, 5.5)
material = ExtResource("2_3uydm")
[node name="CSGBox3D6" type="CSGBox3D" parent="Greybox" unique_id=1213152660]
transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, -15.846001, 2.75, 2.0415)
use_collision = true
size = Vector3(6.5, 7.5, 11)
material = ExtResource("2_3uydm")
[node name="CSGBox3D7" type="CSGBox3D" parent="Greybox" unique_id=1851111034]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.346001, 1, 1.0415001)
use_collision = true
size = Vector3(6.5, 4, 17)
material = ExtResource("2_3uydm")
[node name="CSGBox3D10" type="CSGBox3D" parent="Greybox" unique_id=50441196]
transform = Transform3D(1, 0, 0, 0, 0.9659258, 0.25881904, 0, -0.25881904, 0.9659258, 13.653999, 0.9705714, -5.336278)
use_collision = true
size = Vector3(6.5, 4, 24.5)
material = ExtResource("2_3uydm")
[node name="CSGBox3D8" type="CSGBox3D" parent="Greybox" unique_id=660741680]
transform = Transform3D(0.81915206, 0, 0.57357645, 0, 1, 0, -0.57357645, 0, 0.81915206, -7.3460007, 0, -3.9585)
use_collision = true
size = Vector3(6.5, 4, 17)
material = ExtResource("2_3uydm")
[node name="CSGBox3D3" type="CSGBox3D" parent="Greybox" unique_id=994335188]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.154, 4.5, 2.7915)
use_collision = true
size = Vector3(6.5, 11, 5.5)
material = ExtResource("2_3uydm")
[node name="CSGBox3D9" type="CSGBox3D" parent="Greybox" unique_id=377955376]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 50.154, 0, -20.4585)
use_collision = true
size = Vector3(6.5, 2, 116)
material = ExtResource("2_3uydm")
[node name="CSGBox3D4" type="CSGBox3D" parent="Greybox" unique_id=1145091341]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.154, 4.5, -14.2085)
use_collision = true
size = Vector3(6.5, 11, 5.5)
material = ExtResource("2_3uydm")
[node name="CSGBox3D5" type="CSGBox3D" parent="Greybox" unique_id=53153206]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8460007, 4.5, 17.7915)
use_collision = true
size = Vector3(6.5, 11, 5.5)
material = ExtResource("2_3uydm")
[node name="FixedDashthroughTarget" parent="." unique_id=1206948786 instance=ExtResource("15_5fa36")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, 3.5, 2.5)
[node name="Enemy" parent="." unique_id=935342749 node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 13.5, 2.5, -8.336809)
Target = NodePath("../Player")
RMovement = SubResource("Resource_5fa36")
[node name="Enemy2" parent="." unique_id=1014680385 node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 13, 0, -17.33681)
Target = NodePath("../Player")
RMovement = SubResource("Resource_5fa36")
[node name="Enemy3" parent="." unique_id=236903306 node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 4, -3.3368092)
Target = NodePath("../Player")
RMovement = SubResource("Resource_5fa36")
[node name="FlyingEnemy" parent="." unique_id=1135200290 node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 7, -16)
Target = NodePath("../Player")
RMovement = SubResource("Resource_5fa36")
[node name="FlyingEnemy2" parent="." unique_id=1853592183 node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 7, -16)
Target = NodePath("../Player")
RMovement = SubResource("Resource_5fa36")
[node name="GroundedSpawner" parent="." unique_id=140494238 node_paths=PackedStringArray("Target") instance=ExtResource("6_7m3bq")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 2.5, -15)
EnemyToSpawn = ExtResource("3_3uydm")
MovementInputs = ExtResource("7_caohq")
HealthInputs = SubResource("Resource_ybosk")
DamageInputs = ExtResource("9_dmw1t")
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="FlyingSpawner" parent="." unique_id=252188747 node_paths=PackedStringArray("Target") instance=ExtResource("6_7m3bq")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 11, -14)
EnemyToSpawn = ExtResource("5_8fd2t")
MovementInputs = ExtResource("10_spw1u")
HealthInputs = ExtResource("11_2e4ci")
DamageInputs = ExtResource("9_gp7s3")
Target = NodePath("../Player")
IsActiveOnStart = false

View File

@@ -1,407 +0,0 @@
[gd_scene format=3 uid="uid://cxbskue0lj2gv"]
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://scenes/player_controller/PlayerController.tscn" id="1_ig7tw"]
[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="2_0xm2m"]
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="3_h2yge"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_0xm2m"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
[sub_resource type="Sky" id="Sky_h2yge"]
sky_material = SubResource("ProceduralSkyMaterial_0xm2m")
[sub_resource type="Environment" id="Environment_1bvp3"]
background_mode = 2
sky = SubResource("Sky_h2yge")
ambient_light_source = 2
ambient_light_color = Color(0.576076, 0.459788, 0.652401, 1)
reflected_light_source = 2
tonemap_mode = 4
tonemap_exposure = 1.32
ssao_enabled = true
ssao_radius = 3.61
ssil_enabled = true
ssil_radius = 8.4
sdfgi_use_occlusion = true
glow_enabled = true
[node name="Main" type="Node3D" unique_id=985886321]
[node name="Player" parent="." unique_id=376011014 instance=ExtResource("1_ig7tw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.7981, 1.6118, 39.3006)
TutorialDone = true
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1240471357]
environment = SubResource("Environment_1bvp3")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=346312364]
transform = Transform3D(-0.772218, 0.611111, 0.173844, 0.0446935, -0.220691, 0.974319, 0.633783, 0.760157, 0.143109, 0, 0, 0)
shadow_enabled = true
[node name="DebugLayer" type="CanvasLayer" parent="." unique_id=17611482]
[node name="GuideDebugger" parent="DebugLayer" unique_id=1527386667 instance=ExtResource("2_0xm2m")]
visible = false
[node name="Greybox" type="CSGCombiner3D" parent="." unique_id=202319879]
use_collision = true
collision_layer = 3
collision_mask = 5
[node name="CSGBox3D" type="CSGBox3D" parent="Greybox" unique_id=973340000]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.09619, -0.472656, -46.3293)
use_collision = true
size = Vector3(100, 1, 190.741)
material = ExtResource("3_h2yge")
[node name="CSGBox3D2" type="CSGBox3D" parent="Greybox" unique_id=233983464]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22, 5, 11.0613)
use_collision = true
size = Vector3(10, 10, 57.8774)
material = ExtResource("3_h2yge")
[node name="CSGBox3D19" type="CSGBox3D" parent="Greybox" unique_id=964201148]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.5, 8.25323, -39.2813)
use_collision = true
size = Vector3(13, 16.5065, 47)
material = ExtResource("3_h2yge")
[node name="CSGBox3D30" type="CSGBox3D" parent="Greybox" unique_id=44194028]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22, 34.3, -33.2813)
use_collision = true
size = Vector3(10, 2, 35)
material = ExtResource("3_h2yge")
[node name="CSGBox3D31" type="CSGBox3D" parent="Greybox" unique_id=129657386]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 26.3, -47.4313)
use_collision = true
size = Vector3(79, 2, 7.3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D33" type="CSGBox3D" parent="Greybox" unique_id=1195124026]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.5, 15.3, -47.4313)
use_collision = true
size = Vector3(29, 2, 7.3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D35" type="CSGBox3D" parent="Greybox" unique_id=1660033609]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 20.8, -44.2813)
use_collision = true
size = Vector3(19, 13, 1)
material = ExtResource("3_h2yge")
[node name="CSGBox3D36" type="CSGBox3D" parent="Greybox" unique_id=1494958881]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 20.8, -51.2813)
use_collision = true
size = Vector3(19, 13, 1)
material = ExtResource("3_h2yge")
[node name="CSGBox3D34" type="CSGBox3D" parent="Greybox" unique_id=608991527]
transform = Transform3D(0.866025, 0.5, 0, -0.5, 0.866025, 0, 0, 0, 1, 17.0311, 6.45, -47.4313)
use_collision = true
size = Vector3(36, 2, 7.3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D32" type="CSGBox3D" parent="Greybox" unique_id=1803245548]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21, 30.3, -47.4313)
use_collision = true
size = Vector3(12, 10, 7.3)
material = ExtResource("3_h2yge")
[node name="Stairs" type="CSGCombiner3D" parent="Greybox" unique_id=1805647048]
use_collision = true
[node name="CSGBox3D5" type="CSGBox3D" parent="Greybox/Stairs" unique_id=961319320]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.0294, 0.5, 32.891)
size = Vector3(3, 1, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D6" type="CSGBox3D" parent="Greybox/Stairs" unique_id=1360044459]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 1, 29.905)
size = Vector3(3, 2, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D7" type="CSGBox3D" parent="Greybox/Stairs" unique_id=1499624262]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 1.5, 26.9138)
size = Vector3(3, 3, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D8" type="CSGBox3D" parent="Greybox/Stairs" unique_id=1412980197]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 2, 23.9462)
size = Vector3(3, 4, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D9" type="CSGBox3D" parent="Greybox/Stairs" unique_id=1310937492]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 2.5, 20.975)
size = Vector3(3, 5, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D10" type="CSGBox3D" parent="Greybox/Stairs" unique_id=2023609911]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 3, 17.9825)
size = Vector3(3, 6, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D11" type="CSGBox3D" parent="Greybox/Stairs" unique_id=393957727]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 3.5, 15)
size = Vector3(3, 7, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D12" type="CSGBox3D" parent="Greybox/Stairs" unique_id=1704667554]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 4, 12.018)
size = Vector3(3, 8, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D13" type="CSGBox3D" parent="Greybox/Stairs" unique_id=1710300338]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 4.5, 9.04904)
size = Vector3(3, 9, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D3" type="CSGBox3D" parent="Greybox" unique_id=1317342293]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.0524, 10.795, 6.27246)
use_collision = true
size = Vector3(39.9961, 21.6211, 2.62695)
material = ExtResource("3_h2yge")
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Greybox/CSGBox3D3" unique_id=81700125]
transform = Transform3D(4.2, 0, 0, 0, -6.11959e-08, -7, 0, 1.4, -3.0598e-07, 8.96759, -10.8105, -0.293446)
operation = 2
radius = 1.0
height = 5.0
sides = 40
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Greybox/CSGBox3D3" unique_id=1626645027]
transform = Transform3D(4.2, 0, 0, 0, -6.11959e-08, -7, 0, 1.4, -3.0598e-07, -11.9615, -10.8105, -0.293446)
operation = 2
radius = 1.0
height = 5.0
sides = 40
[node name="CSGBox3D4" type="CSGBox3D" parent="Greybox" unique_id=860496794]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 35.9586, 5, 15.3133)
use_collision = true
size = Vector3(25.9171, 10, 66.0572)
material = ExtResource("3_h2yge")
[node name="CSGBox3D24" type="CSGBox3D" parent="Greybox/CSGBox3D4" unique_id=953680138]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -4.4306, -1.45655, 25.6867)
operation = 2
size = Vector3(12, 7, 35)
material = ExtResource("3_h2yge")
[node name="CSGBox3D25" type="CSGBox3D" parent="Greybox/CSGBox3D4" unique_id=647976782]
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 9.0694, -1.45655, 7.6867)
operation = 2
size = Vector3(12, 7, 30)
material = ExtResource("3_h2yge")
[node name="CSGBox3D26" type="CSGBox3D" parent="Greybox/CSGBox3D4" unique_id=981384844]
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 9.0694, 1.04345, -3.3133)
operation = 2
size = Vector3(12, 12, 8)
material = ExtResource("3_h2yge")
[node name="CSGBox3D9" type="CSGBox3D" parent="Greybox" unique_id=2097153680]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.5038, 2.5, 7.30957)
size = Vector3(3, 5, 25.3809)
material = ExtResource("3_h2yge")
[node name="CSGBox3D10" type="CSGBox3D" parent="Greybox" unique_id=760209768]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 11.517, 1.29345, 21.5)
size = Vector3(3, 2.5, 22.978)
material = ExtResource("3_h2yge")
[node name="CSGBox3D5" type="CSGBox3D" parent="Greybox" unique_id=2030989025]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.45774, 10.7885, -6.32539)
use_collision = true
size = Vector3(2.15405, 21.577, 22.6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D21" type="CSGBox3D" parent="Greybox/CSGBox3D5" unique_id=929527256]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.10074, 8.35729, -0.350719)
operation = 2
use_collision = true
size = Vector3(9.25954, 5.10669, 7.561)
material = ExtResource("3_h2yge")
[node name="CSGBox3D20" type="CSGBox3D" parent="Greybox" unique_id=1990392027]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.7766, 17.433, -31.0838)
use_collision = true
size = Vector3(2.15405, 35.9, 27)
material = ExtResource("3_h2yge")
[node name="CSGBox3D37" type="CSGBox3D" parent="Greybox/CSGBox3D20" unique_id=200448590]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.174269, 10.3449, -0.91618)
operation = 2
use_collision = true
size = Vector3(4, 4, 3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D25" type="CSGBox3D" parent="Greybox" unique_id=1913858984]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -3.02663, 27.983, -16.9838)
use_collision = true
size = Vector3(2.15405, 13, 52.3)
material = ExtResource("3_h2yge")
[node name="CSGBox3D34" type="CSGBox3D" parent="Greybox/CSGBox3D25" unique_id=426380119]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.41618, -2.15506, -19.5757)
operation = 2
use_collision = true
size = Vector3(3, 7, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D35" type="CSGBox3D" parent="Greybox/CSGBox3D25" unique_id=656184598]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.41618, -2.15506, -8.57573)
operation = 2
use_collision = true
size = Vector3(3, 7, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D36" type="CSGBox3D" parent="Greybox/CSGBox3D25" unique_id=710213414]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.41618, -2.15506, 4.42427)
operation = 2
use_collision = true
size = Vector3(3, 7, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D29" type="CSGBox3D" parent="Greybox" unique_id=1552229602]
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 21.9734, 27.983, -4.93377)
use_collision = true
size = Vector3(2.15405, 13, 25)
material = ExtResource("3_h2yge")
[node name="CSGBox3D26" type="CSGBox3D" parent="Greybox" unique_id=742482926]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -3.07663, 27.983, 6.51623)
use_collision = true
size = Vector3(2.15405, 13, 52.2)
material = ExtResource("3_h2yge")
[node name="CSGBox3D30" type="CSGBox3D" parent="Greybox/CSGBox3D26" unique_id=2034823641]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1.08382, -0.65506, -19.6257)
operation = 2
use_collision = true
size = Vector3(3, 4, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D31" type="CSGBox3D" parent="Greybox/CSGBox3D26" unique_id=219731987]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1.08382, -0.65506, -8.62572)
operation = 2
use_collision = true
size = Vector3(3, 4, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D32" type="CSGBox3D" parent="Greybox/CSGBox3D26" unique_id=122544263]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1.08382, -0.65506, 3.37428)
operation = 2
use_collision = true
size = Vector3(3, 4, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D33" type="CSGBox3D" parent="Greybox/CSGBox3D26" unique_id=983294595]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1.08382, -2.15506, 18.8743)
operation = 2
use_collision = true
size = Vector3(10, 7, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D6" type="CSGBox3D" parent="Greybox" unique_id=2039585908]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -7.80455, 10.8026, -16.7054)
use_collision = true
size = Vector3(1.9, 21.6052, 18.459)
material = ExtResource("3_h2yge")
[node name="CSGBox3D7" type="CSGBox3D" parent="Greybox" unique_id=1704800656]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 45.6363, 5, -30.4887)
use_collision = true
size = Vector3(6.8864, 10, 40.8848)
material = ExtResource("3_h2yge")
[node name="CSGBox3D8" type="CSGBox3D" parent="Greybox" unique_id=102084295]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 50.0149, 26.122, -0.963737)
use_collision = true
size = Vector3(2.14108, 52.2441, 99.9347)
material = ExtResource("3_h2yge")
[node name="CSGBox3D11" type="CSGBox3D" parent="Greybox" unique_id=1645938429]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -28.1405, 26.122, -0.963737)
use_collision = true
size = Vector3(2.14108, 52.2441, 99.9347)
material = ExtResource("3_h2yge")
[node name="CSGBox3D12" type="CSGBox3D" parent="Greybox" unique_id=2010255775]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -93.2643, 26.122, -49.9656)
use_collision = true
size = Vector3(2.14108, 52.2441, 99.9347)
material = ExtResource("3_h2yge")
[node name="CSGBox3D13" type="CSGBox3D" parent="Greybox" unique_id=779512432]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 10.7529, 26.122, 49.3889)
use_collision = true
size = Vector3(2.14108, 52.2441, 99.9347)
material = ExtResource("3_h2yge")
[node name="CSGBox3D14" type="CSGBox3D" parent="Greybox" unique_id=593545609]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.534, 10.8458, 27.1386)
use_collision = true
size = Vector3(1.10791, 1.71436, 25.7228)
material = ExtResource("3_h2yge")
[node name="CSGBox3D21" type="CSGBox3D" parent="Greybox" unique_id=913202979]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 23.4606, 10.8458, -4.97476)
use_collision = true
size = Vector3(1.10791, 1.71436, 25.2857)
material = ExtResource("3_h2yge")
[node name="CSGBox3D24" type="CSGBox3D" parent="Greybox" unique_id=1595738887]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 23.4606, 16.1886, -17.1176)
use_collision = true
size = Vector3(1.10791, 12.4, 1)
material = ExtResource("3_h2yge")
[node name="CSGBox3D22" type="CSGBox3D" parent="Greybox" unique_id=100240267]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 36.3499, 10.8458, 7.02524)
use_collision = true
size = Vector3(1.10791, 1.71436, 28)
material = ExtResource("3_h2yge")
[node name="CSGBox3D23" type="CSGBox3D" parent="Greybox" unique_id=1131367437]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 36.8499, 10.8458, -17.0748)
use_collision = true
size = Vector3(1.10791, 1.71436, 27)
material = ExtResource("3_h2yge")
[node name="CSGBox3D27" type="CSGBox3D" parent="Greybox" unique_id=1865223494]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 4.19987, 23.1458, -23.0748)
use_collision = true
size = Vector3(1.10791, 1.71436, 37.7)
material = ExtResource("3_h2yge")
[node name="CSGBox3D28" type="CSGBox3D" parent="Greybox" unique_id=1060380653]
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 22.5999, 23.1458, -20.2248)
use_collision = true
size = Vector3(1.10791, 1.71436, 6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D15" type="CSGBox3D" parent="Greybox" unique_id=1299247533]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.9058, 10.795, 47.0594)
use_collision = true
size = Vector3(76.2239, 21.6211, 2.62695)
material = ExtResource("3_h2yge")
[node name="CSGBox3D16" type="CSGBox3D" parent="Greybox" unique_id=1365802849]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.02149, 21.8279, -7.89995)
use_collision = true
size = Vector3(52.1412, 1, 31)
material = ExtResource("3_h2yge")
[node name="CSGBox3D17" type="CSGBox3D" parent="Greybox" unique_id=2135806884]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.02149, 34.8279, -5.19995)
use_collision = true
size = Vector3(52.1412, 1, 25.6)
material = ExtResource("3_h2yge")
[node name="CSGBox3D18" type="CSGBox3D" parent="Greybox" unique_id=247653250]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.534, 10.7583, -4.19618)
use_collision = true
size = Vector3(1.10791, 1.71436, 23.4043)
material = ExtResource("3_h2yge")

View File

@@ -1,915 +0,0 @@
[gd_scene format=3 uid="uid://pk8ypa04qy6x"]
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://scenes/player_controller/PlayerController.tscn" id="1_1s2y7"]
[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="2_epx65"]
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="3_vvhq3"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_0xm2m"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
[sub_resource type="Sky" id="Sky_h2yge"]
sky_material = SubResource("ProceduralSkyMaterial_0xm2m")
[sub_resource type="Environment" id="Environment_1bvp3"]
background_mode = 2
sky = SubResource("Sky_h2yge")
ambient_light_source = 2
ambient_light_color = Color(0.576076, 0.459788, 0.652401, 1)
reflected_light_source = 2
tonemap_mode = 4
tonemap_exposure = 1.32
ssao_enabled = true
ssao_radius = 3.61
ssil_enabled = true
ssil_radius = 8.4
sdfgi_use_occlusion = true
glow_enabled = true
[node name="Main" type="Node3D" unique_id=1886692589]
[node name="Player" parent="." unique_id=1926439269 instance=ExtResource("1_1s2y7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1.5)
TutorialDone = true
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1918922070]
environment = SubResource("Environment_1bvp3")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1220382102]
transform = Transform3D(-0.772218, 0.611111, 0.173844, 0.0446935, -0.220691, 0.974319, 0.633783, 0.760157, 0.143109, 0, 0, 0)
shadow_enabled = true
[node name="DebugLayer" type="CanvasLayer" parent="." unique_id=2035564069]
[node name="GuideDebugger" parent="DebugLayer" unique_id=1346724862 instance=ExtResource("2_epx65")]
visible = false
[node name="Greybox" type="CSGCombiner3D" parent="." unique_id=947987680]
use_collision = true
collision_layer = 256
collision_mask = 65553
[node name="CSGBox3D" type="CSGBox3D" parent="Greybox" unique_id=1658565485]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.096, -0.5, -46.329)
use_collision = true
size = Vector3(100, 1, 190.741)
material = ExtResource("3_vvhq3")
[node name="RunningTrack" type="CSGCombiner3D" parent="Greybox" unique_id=878428333]
[node name="CSGBox3D2" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=1524612867]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D3" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=1343324188]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -10)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D4" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=2003839018]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -20)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D5" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=12532369]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -30)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D6" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=1528078611]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -40)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D7" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=1374413337]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -50)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D8" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=1756322621]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 0)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D9" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=991157972]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, -10)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D10" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=1421677964]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, -20)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D11" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=147727252]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, -30)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D12" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=190006939]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, -40)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D13" type="CSGBox3D" parent="Greybox/RunningTrack" unique_id=397218140]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, -50)
use_collision = true
size = Vector3(0.2, 2, 0.2)
material = ExtResource("3_vvhq3")
[node name="Label3D" type="Label3D" parent="Greybox/RunningTrack" unique_id=2077484418]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 1, 0.1, -9.5)
text = "10m"
[node name="Label3D6" type="Label3D" parent="Greybox/RunningTrack" unique_id=157546019]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 27.5, 0.1, 1)
text = "10deg
"
[node name="Label3D7" type="Label3D" parent="Greybox/RunningTrack" unique_id=1322657783]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 30.5, 0.1, 1)
text = "20deg
"
[node name="Label3D8" type="Label3D" parent="Greybox/RunningTrack" unique_id=2087446523]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 33.5, 0.1, 1)
text = "30deg
"
[node name="Label3D2" type="Label3D" parent="Greybox/RunningTrack" unique_id=631102816]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 1, 0.1, -19.5)
text = "20m"
[node name="Label3D3" type="Label3D" parent="Greybox/RunningTrack" unique_id=1135391266]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 1, 0.1, -29.5)
text = "30m"
[node name="Label3D4" type="Label3D" parent="Greybox/RunningTrack" unique_id=646298813]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 1, 0.1, -39.5)
text = "40m"
[node name="Label3D5" type="Label3D" parent="Greybox/RunningTrack" unique_id=2110989391]
transform = Transform3D(5, 0, 0, 0, -2.18557e-07, 5, 0, -5, -2.18557e-07, 1, 0.1, -49)
text = "50m"
[node name="JumpHeights" type="CSGCombiner3D" parent="Greybox" unique_id=346821943]
[node name="Label3D6" type="Label3D" parent="Greybox/JumpHeights" unique_id=210969284]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -1.5)
text = "0.5m"
[node name="Label3D7" type="Label3D" parent="Greybox/JumpHeights" unique_id=1563882963]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -6.5)
text = "1m"
[node name="Label3D22" type="Label3D" parent="Greybox/JumpHeights" unique_id=1538473923]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, 1)
text = "1.5m"
[node name="Label3D23" type="Label3D" parent="Greybox/JumpHeights" unique_id=2066337875]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -11)
text = "2m"
[node name="Label3D24" type="Label3D" parent="Greybox/JumpHeights" unique_id=2019920411]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -21.5)
text = "3m"
[node name="Label3D25" type="Label3D" parent="Greybox/JumpHeights" unique_id=1152598342]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -31)
text = "4m"
[node name="Label3D26" type="Label3D" parent="Greybox/JumpHeights" unique_id=2044865263]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -41.5)
text = "5m"
[node name="Label3D27" type="Label3D" parent="Greybox/JumpHeights" unique_id=1508331602]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -51.5)
text = "6m"
[node name="Label3D28" type="Label3D" parent="Greybox/JumpHeights" unique_id=816037691]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -61)
text = "7m"
[node name="Label3D29" type="Label3D" parent="Greybox/JumpHeights" unique_id=1451982413]
transform = Transform3D(-2.1855689e-07, 5, 2.18557e-07, 0, -2.18557e-07, 5, 5, 2.1855689e-07, 9.55343e-15, -28.5, 0.1, -74.5)
text = "8m"
[node name="Label3D8" type="Label3D" parent="Greybox/JumpHeights" unique_id=1308191043]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -11.5)
text = "1.5m"
[node name="Label3D9" type="Label3D" parent="Greybox/JumpHeights" unique_id=1470563462]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -16.5)
text = "2m"
[node name="Label3D10" type="Label3D" parent="Greybox/JumpHeights" unique_id=517230341]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -21.5)
text = "3m"
[node name="Label3D11" type="Label3D" parent="Greybox/JumpHeights" unique_id=1293816232]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -26.5)
text = "4m"
[node name="Label3D12" type="Label3D" parent="Greybox/JumpHeights" unique_id=1806324602]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -31.5)
text = "5m"
[node name="Label3D13" type="Label3D" parent="Greybox/JumpHeights" unique_id=1770523108]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -36.5)
text = "6m"
[node name="Label3D14" type="Label3D" parent="Greybox/JumpHeights" unique_id=623833835]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -41.5)
text = "7m"
[node name="Label3D15" type="Label3D" parent="Greybox/JumpHeights" unique_id=350021472]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -46.5)
text = "8m"
[node name="Label3D16" type="Label3D" parent="Greybox/JumpHeights" unique_id=1106153648]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -51.5)
text = "9m"
[node name="Label3D17" type="Label3D" parent="Greybox/JumpHeights" unique_id=1382154683]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -56.5)
text = "10m"
[node name="Label3D18" type="Label3D" parent="Greybox/JumpHeights" unique_id=698619474]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -61.5)
text = "12.5m"
[node name="Label3D19" type="Label3D" parent="Greybox/JumpHeights" unique_id=1918747333]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -66.5)
text = "15m"
[node name="Label3D20" type="Label3D" parent="Greybox/JumpHeights" unique_id=749209142]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -71.5)
text = "17.5m"
[node name="Label3D21" type="Label3D" parent="Greybox/JumpHeights" unique_id=1268617484]
transform = Transform3D(-2.18557e-07, -5, -2.18557e-07, 0, -2.18557e-07, 5, -5, 2.18557e-07, 9.55343e-15, -7, 0.1, -76.5)
text = "20m"
[node name="CSGBox3D14" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=942560904]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 0.25, -1.5)
use_collision = true
size = Vector3(5, 0.5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D15" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=580104271]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 0.5, -6.5)
use_collision = true
size = Vector3(5, 1, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D16" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=585408401]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 0.75, -11.5)
use_collision = true
size = Vector3(5, 1.5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D17" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=808992543]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 1, -16.5)
use_collision = true
size = Vector3(5, 2, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D18" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=500341031]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 1.5, -21.5)
use_collision = true
size = Vector3(5, 3, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D19" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=127771296]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 2, -26.5)
use_collision = true
size = Vector3(5, 4, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D20" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=752300025]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 2.5, -31.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D21" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=964844948]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 3, -36.5)
use_collision = true
size = Vector3(5, 6, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D22" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1284495409]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 3.5, -41.5)
use_collision = true
size = Vector3(5, 7, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D23" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1789414429]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 4, -46.5)
use_collision = true
size = Vector3(5, 8, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D24" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1372664433]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 4.5, -51.5)
use_collision = true
size = Vector3(5, 9, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D25" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1339820114]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 5, -56.5)
use_collision = true
size = Vector3(5, 10, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D30" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1631874678]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 9.5, -50)
use_collision = true
size = Vector3(5, 1, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D31" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=92296730]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 9.75, -50)
use_collision = true
size = Vector3(5, 0.5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D32" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=919734519]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11, 9.875, -50)
use_collision = true
size = Vector3(5, 0.25, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D26" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=632258873]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 6.25, -61.5)
use_collision = true
size = Vector3(5, 12.5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D27" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1421623781]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 7.5, -66.5)
use_collision = true
size = Vector3(5, 15, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D28" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1274987907]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 8.75, -71.5)
use_collision = true
size = Vector3(5, 17.5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D29" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1284199936]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30.25, 10, -40)
use_collision = true
size = Vector3(0.5, 20, 80)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D33" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=282038058]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24.75, 10, -5)
use_collision = true
size = Vector3(7.5, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D41" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1258759526]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.75, 5, -1.5)
use_collision = true
size = Vector3(12.5, 10, 3)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D47" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1619601364]
transform = Transform3D(1, 0, 0, 0, 0.9848078, 0.17364816, 0, -0.17364816, 0.9848078, 22.75, 0.03095889, -30.695885)
use_collision = true
size = Vector3(12.5, 10, 58)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D48" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1868104378]
transform = Transform3D(1, 0, 0, 0, 0.9396926, 0.34202012, 0, -0.34202012, 0.9396926, 30.5, 1.5878377, -16.713436)
use_collision = true
size = Vector3(3, 6.5, 31.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D49" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1533360289]
transform = Transform3D(1, 0, 0, 0, 0.86602545, 0.5, 0, -0.5, 0.86602545, 33.5, 2.5053406, -10.524445)
use_collision = true
size = Vector3(3, 5.5, 20.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D42" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=76190477]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.5, 5, -1.5)
use_collision = true
size = Vector3(3, 10, 3)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D43" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1165241235]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 33.5, 5, -1.5)
use_collision = true
size = Vector3(3, 10, 3)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D44" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1360018990]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 36.5, 5, -1.5)
use_collision = true
size = Vector3(3, 10, 3)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D45" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1830898064]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 39.5, 5, -1.5)
use_collision = true
size = Vector3(3, 10, 3)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D46" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=694688329]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 42.5, 5, -1.5)
use_collision = true
size = Vector3(3, 10, 3)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D34" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=498798132]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24.5, 10, -15)
use_collision = true
size = Vector3(7, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D35" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1246548038]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -24, 10, -25)
use_collision = true
size = Vector3(6, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D36" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1584237505]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.5, 10, -35)
use_collision = true
size = Vector3(5, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D37" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=331538659]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23, 10, -45)
use_collision = true
size = Vector3(4, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D38" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=778040676]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.5, 10, -55)
use_collision = true
size = Vector3(3, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D39" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=749396522]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22, 10, -65)
use_collision = true
size = Vector3(2, 20, 10)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D40" type="CSGBox3D" parent="Greybox/JumpHeights" unique_id=1945303355]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.5, 10, -75)
use_collision = true
size = Vector3(1, 20, 10)
material = ExtResource("3_vvhq3")
[node name="Passageways" type="CSGCombiner3D" parent="Greybox" unique_id=677969083]
[node name="CSGBox3D30" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1481494931]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 2.25, -6.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D34" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1048797470]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 1.5, -6.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 3)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D31" type="CSGBox3D" parent="Greybox/Passageways" unique_id=930969091]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 2.25, -16.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D35" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1117727389]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 0.5, -16.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D38" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1320724023]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 21.5, 2.25, 22.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D39" type="CSGBox3D" parent="Greybox/Passageways" unique_id=2070041982]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 21.25, 0.5, 22.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D40" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1332332880]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 28.5, 2.25, 22.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D41" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1557133957]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 28.25, 0.25, 22.5)
operation = 2
use_collision = true
size = Vector3(5, 2.5, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D42" type="CSGBox3D" parent="Greybox/Passageways" unique_id=425387876]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 35.5, 2.25, 22.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D43" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1661141377]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 35.25, -0.5, 22.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D44" type="CSGBox3D" parent="Greybox/Passageways" unique_id=179620552]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 42.5, 2.25, 22.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D45" type="CSGBox3D" parent="Greybox/Passageways" unique_id=351904606]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 42.25, -1, 22.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D46" type="CSGBox3D" parent="Greybox/Passageways" unique_id=357200570]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 21.5, 2.25, 31.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D47" type="CSGBox3D" parent="Greybox/Passageways" unique_id=2085426420]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 21.25, 0.5, 31.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D48" type="CSGBox3D" parent="Greybox/Passageways" unique_id=555217301]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 28.5, 2.25, 31.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D49" type="CSGBox3D" parent="Greybox/Passageways" unique_id=85616752]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 28.25, 0.25, 31.5)
operation = 2
use_collision = true
size = Vector3(5, 2.5, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D50" type="CSGBox3D" parent="Greybox/Passageways" unique_id=28571400]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 35.5, 2.25, 31.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D51" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1721812352]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 35.25, -0.5, 31.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D52" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1658935175]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 42.5, 2.25, 31.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D53" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1619696510]
transform = Transform3D(-2.6226834e-08, 0, -1, 0, 1, 0, 0.6, 0, -4.371139e-08, 42.25, -1, 31.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D54" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1250559296]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 21.5, 2.25, 39.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D55" type="CSGBox3D" parent="Greybox/Passageways" unique_id=248318083]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 21.25, 0.5, 39.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D56" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1031611906]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 28.5, 2.25, 39.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D57" type="CSGBox3D" parent="Greybox/Passageways" unique_id=2134340759]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 28.25, 0.25, 39.5)
operation = 2
use_collision = true
size = Vector3(5, 2.5, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D58" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1499177937]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 35.5, 2.25, 39.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D59" type="CSGBox3D" parent="Greybox/Passageways" unique_id=165562631]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 35.25, -0.5, 39.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D60" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1318706705]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 42.5, 2.25, 39.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D61" type="CSGBox3D" parent="Greybox/Passageways" unique_id=887461416]
transform = Transform3D(-7.86805e-09, 0, -1, 0, 1, 0, 0.18, 0, -4.371139e-08, 42.25, -1, 39.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D32" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1804430744]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 2.25, -26.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D36" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1364916863]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 0.5, -26.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D33" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1526520386]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 2.25, -36.5)
use_collision = true
size = Vector3(5, 5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D37" type="CSGBox3D" parent="Greybox/Passageways" unique_id=1368661310]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, -0.5, -36.5)
operation = 2
use_collision = true
size = Vector3(5, 3, 1)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D14" type="CSGBox3D" parent="Greybox/Passageways" unique_id=283118902]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 4.5, -21.5)
use_collision = true
size = Vector3(0.5, 0.5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D16" type="CSGBox3D" parent="Greybox/Passageways" unique_id=694923358]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 4.5, -31.5)
use_collision = true
size = Vector3(0.25, 0.5, 5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D15" type="CSGBox3D" parent="Greybox/Passageways" unique_id=135402735]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, 4.5, -11.5)
use_collision = true
size = Vector3(1, 0.5, 5)
material = ExtResource("3_vvhq3")
[node name="Mantles" type="CSGCombiner3D" parent="Greybox" unique_id=981837550]
[node name="Label3D22" type="Label3D" parent="Greybox/Mantles" unique_id=1749350071]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, -5.5, 0.1, 11)
text = "0.5m"
[node name="Label3D35" type="Label3D" parent="Greybox/Mantles" unique_id=2055966274]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, -8.5, 0.1, 11)
text = "0.25m"
[node name="Label3D23" type="Label3D" parent="Greybox/Mantles" unique_id=328340961]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, -2, 0.1, 11)
text = "1m"
[node name="Label3D27" type="Label3D" parent="Greybox/Mantles" unique_id=743712317]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, -11, 0.1, 12.5)
text = "1m"
[node name="Label3D28" type="Label3D" parent="Greybox/Mantles" unique_id=504602524]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, 13, 0.1, 12.5)
text = "1m"
[node name="Label3D29" type="Label3D" parent="Greybox/Mantles" unique_id=2030993341]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, 13, 0.1, 21)
text = "2m"
[node name="Label3D30" type="Label3D" parent="Greybox/Mantles" unique_id=1124860686]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, 13, 0.1, 28.5)
text = "3m"
[node name="Label3D31" type="Label3D" parent="Greybox/Mantles" unique_id=1317588075]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, -11, 0.1, 21)
text = "2m"
[node name="Label3D32" type="Label3D" parent="Greybox/Mantles" unique_id=1366926955]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, -11, 0.1, 28.5)
text = "3m"
[node name="Label3D24" type="Label3D" parent="Greybox/Mantles" unique_id=248801834]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, 2, 0.1, 11)
text = "1.5m"
[node name="Label3D25" type="Label3D" parent="Greybox/Mantles" unique_id=1124306017]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, 6, 0.1, 11)
text = "2m"
[node name="Label3D26" type="Label3D" parent="Greybox/Mantles" unique_id=1225991052]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, 10, 0.1, 11)
text = "4m"
[node name="CSGBox3D33" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1996945224]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.5, 12.5)
use_collision = true
size = Vector3(4, 1, 1)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D34" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1009493198]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 0.5, 12.25)
use_collision = true
size = Vector3(3, 1, 0.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D35" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1749498204]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0.5, 12.75)
use_collision = true
size = Vector3(4, 1, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D36" type="CSGBox3D" parent="Greybox/Mantles" unique_id=312432354]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0.5, 13)
use_collision = true
size = Vector3(4, 1, 2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D37" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1640084191]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0.5, 14)
use_collision = true
size = Vector3(4, 1, 4)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D38" type="CSGBox3D" parent="Greybox/Mantles" unique_id=301256990]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 1, 20.5)
use_collision = true
size = Vector3(4, 2, 1)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D39" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1252915649]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 1, 20.25)
use_collision = true
size = Vector3(3, 2, 0.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D40" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1017054955]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 20.75)
use_collision = true
size = Vector3(4, 2, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D41" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1276092930]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 1, 21)
use_collision = true
size = Vector3(4, 2, 2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D42" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1107832581]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 1, 22)
use_collision = true
size = Vector3(4, 2, 4)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D43" type="CSGBox3D" parent="Greybox/Mantles" unique_id=195563549]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 1.5, 28.5)
use_collision = true
size = Vector3(4, 3, 1)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D44" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1422563548]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 1.5, 28.25)
use_collision = true
size = Vector3(3, 3, 0.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D45" type="CSGBox3D" parent="Greybox/Mantles" unique_id=597518478]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1.5, 28.75)
use_collision = true
size = Vector3(4, 3, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D46" type="CSGBox3D" parent="Greybox/Mantles" unique_id=2035828800]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 1.5, 29)
use_collision = true
size = Vector3(4, 3, 2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D47" type="CSGBox3D" parent="Greybox/Mantles" unique_id=2050446324]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 1.5, 30)
use_collision = true
size = Vector3(4, 3, 4)
material = ExtResource("3_vvhq3")
[node name="Label3D33" type="Label3D" parent="Greybox/Mantles" unique_id=437224967]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, 13, 0.1, 36.5)
text = "4m"
[node name="Label3D34" type="Label3D" parent="Greybox/Mantles" unique_id=1883460159]
transform = Transform3D(-5, 4.3711395e-07, 1.9106861e-14, 0, -2.18557e-07, 5, 4.3711395e-07, 5, 2.18557e-07, -11, 0.1, 36.5)
text = "4m"
[node name="CSGBox3D48" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1685845188]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 2, 36.5)
use_collision = true
size = Vector3(4, 4, 1)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D49" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1338959967]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 2, 36.25)
use_collision = true
size = Vector3(3, 4, 0.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D53" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1194447690]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 0.5, 12.125)
use_collision = true
size = Vector3(3, 1, 0.25)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D57" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1186673858]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -13, 3.5, -21.629175)
use_collision = true
size = Vector3(5, 1, 0.25)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D54" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1895250071]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 1, 20.125)
use_collision = true
size = Vector3(3, 2, 0.25)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D55" type="CSGBox3D" parent="Greybox/Mantles" unique_id=141610439]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 1.5, 28.125)
use_collision = true
size = Vector3(3, 3, 0.25)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D56" type="CSGBox3D" parent="Greybox/Mantles" unique_id=343197184]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 2, 36.125)
use_collision = true
size = Vector3(3, 4, 0.25)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D50" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1273139469]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 36.75)
use_collision = true
size = Vector3(4, 4, 1.5)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D51" type="CSGBox3D" parent="Greybox/Mantles" unique_id=1688782002]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 2, 37)
use_collision = true
size = Vector3(4, 4, 2)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D52" type="CSGBox3D" parent="Greybox/Mantles" unique_id=443302723]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 2, 38)
use_collision = true
size = Vector3(4, 4, 4)
material = ExtResource("3_vvhq3")

View File

@@ -13,7 +13,12 @@ using Movementtests.systems;
typeof(IAutoConnect),
typeof(IProvider)
)]
public partial class MainSceneTemplate : Node3D, IProvide<InventoryManager>, IProvide<TagsManager>, IProvide<CuesManager>
public partial class MainSceneTemplate : Node3D,
IProvide<InventoryManager>,
IProvide<TagsManager>,
IProvide<CuesManager>,
IProvide<TokenManager>,
IProvide<WaveManager>
{
public override void _Notification(int what) => this.Notify(what);
@@ -31,6 +36,8 @@ public partial class MainSceneTemplate : Node3D, IProvide<InventoryManager>, IPr
#region Exports
[Export] public WeaponInventory? InitialWeaponInventory { get; set; }
[Export] public int MaxNumberOfProjectiles { get; set; } = 3;
[Export] public WaveContent? WaveContent { get; set; }
#endregion
@@ -40,6 +47,12 @@ public partial class MainSceneTemplate : Node3D, IProvide<InventoryManager>, IPr
TagsManager IProvide<TagsManager>.Value() => ForgeManagers.Instance.TagsManager;
CuesManager IProvide<CuesManager>.Value() => ForgeManagers.Instance.CuesManager;
public required TokenManager TokenManager { get; set; }
TokenManager IProvide<TokenManager>.Value() => TokenManager;
public required WaveManager WaveManager { get; set; }
WaveManager IProvide<WaveManager>.Value() => WaveManager;
public void OnReady()
{
PlayerFellPlane.BodyEntered += StartResetPlayerAnimation;
@@ -50,14 +63,22 @@ public partial class MainSceneTemplate : Node3D, IProvide<InventoryManager>, IPr
InventoryManager.InitializeFromResource(InitialWeaponInventory);
AddChild(InventoryManager);
TokenManager = new TokenManager();
TokenManager.Initialize(MaxNumberOfProjectiles);
AddChild(TokenManager);
WaveManager = new WaveManager();
if (WaveContent != null)
WaveManager.InitializeFromResource(WaveContent);
AddChild(WaveManager);
this.Provide();
}
public void OnProvided()
{
// You can optionally implement this method. It gets called once you call
// this.Provide() to inform AutoInject that the provided values are now
// available.
if (WaveContent != null)
GetTree().CreateTimer(3).Timeout += WaveManager.StartWaves;
}
public void ResetPlayerPosition()
@@ -82,12 +103,11 @@ public partial class MainSceneTemplate : Node3D, IProvide<InventoryManager>, IPr
public void KillEnemy(Node3D body)
{
if (body is not (IKillable killable and IHealthable healthable))
if (body is not IKillable killable)
{
body.QueueFree();
// body.QueueFree();
return;
}
killable.Kill(healthable);
killable.Kill();
}
}

View File

@@ -7,8 +7,6 @@
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="5_dl1un"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="6_465vr"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="7_egib5"]
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://scenes/components/health/RHealth.cs" id="8_a01g8"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="9_doqxp"]
[ext_resource type="PackedScene" uid="uid://b8aet6m4m2i83" path="res://scenes/tuto_trigger/TutoTrigger.tscn" id="10_vqwwk"]
[ext_resource type="Texture2D" uid="uid://nrhxjdpuje3f" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_lt_outline.svg" id="11_bdsxx"]
[ext_resource type="Texture2D" uid="uid://dx2mk8qd6g8uh" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/mouse_right_outline.svg" id="12_2usyc"]
@@ -18,39 +16,12 @@
[ext_resource type="Texture2D" uid="uid://bhlrmh5v3fa2n" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/mouse_left_outline.svg" id="16_ca01l"]
[ext_resource type="Texture2D" uid="uid://b580m114ivbse" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_button_menu_outline.svg" id="17_5461m"]
[ext_resource type="Texture2D" uid="uid://goerc3svgoqd" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_escape_outline.svg" id="18_22eiu"]
[ext_resource type="Texture2D" uid="uid://db6uqhcmcfs5t" path="res://assets/ui/input-prompts/Xbox Series/Vector/xbox_lb_outline.svg" id="19_ci5dp"]
[ext_resource type="Texture2D" uid="uid://ybwqghk70io" path="res://assets/ui/input-prompts/Keyboard & Mouse/Vector/keyboard_f_outline.svg" id="20_4ouww"]
[sub_resource type="Resource" id="Resource_nwk5u"]
script = ExtResource("6_465vr")
GravityModifier = 5.0
metadata/_custom_type_script = "uid://dtpxijlnb2c5"
[sub_resource type="Resource" id="Resource_xy0m1"]
script = ExtResource("8_a01g8")
StartingHealth = 100.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_invhv"]
script = ExtResource("8_a01g8")
StartingHealth = 1.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_cgfmf"]
script = ExtResource("9_doqxp")
DamageType = 2
metadata/_custom_type_script = "uid://jitubgv6judn"
[sub_resource type="Resource" id="Resource_05lnh"]
script = ExtResource("8_a01g8")
StartingHealth = 100.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_t5o40"]
script = ExtResource("8_a01g8")
StartingHealth = 100.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="BoxShape3D" id="BoxShape3D_xy0m1"]
size = Vector3(3, 3.75, 3)
@@ -85,6 +56,18 @@ use_collision = true
size = Vector3(1, 17.5, 9.5)
material = ExtResource("3_4m8g1")
[node name="CSGBox3D109" type="CSGBox3D" parent="Playground/PlaytestArena" index="89" unique_id=167333800]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 50, 24.75, -41.74998)
use_collision = true
size = Vector3(1, 1.5, 9.5)
material = ExtResource("3_4m8g1")
[node name="CSGBox3D112" type="CSGBox3D" parent="Playground/PlaytestArena" index="90" unique_id=2075934946]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 45.5, 24.75, -46.999954)
use_collision = true
size = Vector3(10, 1.5, 1)
material = ExtResource("3_4m8g1")
[node name="Targets" type="Node3D" parent="Playground" index="1" unique_id=1727473773]
[node name="FixedDashthroughTarget" parent="Playground/Targets" index="0" unique_id=1291663508 instance=ExtResource("4_4u5eu")]
@@ -184,151 +167,126 @@ RMovement = SubResource("Resource_nwk5u")
[node name="Enemy3" parent="Playground/GroundedEnemies" index="0" unique_id=1159989424 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 25, 0, -8.336809)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy11" parent="Playground/GroundedEnemies" index="1" unique_id=1747444936 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 17, 8, 3.6631908)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy12" parent="Playground/GroundedEnemies" index="2" unique_id=283117081 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 11, -4.836809)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy13" parent="Playground/GroundedEnemies" index="3" unique_id=970022638 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 12, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy18" parent="Playground/GroundedEnemies" index="4" unique_id=2077088475 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 12, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy19" parent="Playground/GroundedEnemies" index="5" unique_id=2023773341 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 7.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy25" parent="Playground/GroundedEnemies" index="6" unique_id=1101329723 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 46, 7.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy26" parent="Playground/GroundedEnemies" index="7" unique_id=855220553 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 46, 12, -35.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy20" parent="Playground/GroundedEnemies" index="8" unique_id=1255215986 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 7.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy21" parent="Playground/GroundedEnemies" index="9" unique_id=2098915426 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 36.5, 0.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy22" parent="Playground/GroundedEnemies" index="10" unique_id=246912749 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 0.5, -19.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy14" parent="Playground/GroundedEnemies" index="11" unique_id=211015190 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 41, 17.5, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy15" parent="Playground/GroundedEnemies" index="12" unique_id=1164179421 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 31, 17.5, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy16" parent="Playground/GroundedEnemies" index="13" unique_id=1169725422 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 24.5, 17.5, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy17" parent="Playground/GroundedEnemies" index="14" unique_id=1951666189 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 17.5, 17.5, -22.836807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy23" parent="Playground/GroundedEnemies" index="15" unique_id=1348057502 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 17.5, 24.5, -43.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy24" parent="Playground/GroundedEnemies" index="16" unique_id=2068813971 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 45, 24.5, -43.336807)
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 45, 24.5, -43.336803)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy4" parent="Playground/GroundedEnemies" index="17" unique_id=366059658 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 10.5, 0, -18.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy7" parent="Playground/GroundedEnemies" index="18" unique_id=1389063523 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 25.5, 4, -27.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy27" parent="Playground/GroundedEnemies" index="19" unique_id=854456486 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 20, 0, -44.836807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy10" parent="Playground/GroundedEnemies" index="20" unique_id=836898496 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 30.5, 11, -33.336807)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy8" parent="Playground/GroundedEnemies" index="21" unique_id=1015624071 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 34.5, 1.5, -27.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy9" parent="Playground/GroundedEnemies" index="22" unique_id=827865590 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 46.5, 0, -27.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy5" parent="Playground/GroundedEnemies" index="23" unique_id=1267116862 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4, 0, -18.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy6" parent="Playground/GroundedEnemies" index="24" unique_id=1147823180 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 16.5, 7, -17.33681)
Target = NodePath("../../../Player")
RHealth = SubResource("Resource_xy0m1")
RMovement = SubResource("Resource_nwk5u")
[node name="Tutorial" type="CSGCombiner3D" parent="." index="8" unique_id=1168290062]
@@ -345,22 +303,16 @@ transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1.3647223, 23.75, -13.7
[node name="Enemy28" parent="Tutorial" index="2" unique_id=1765389924 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -5, 22, 15.5)
Target = NodePath("../../Player")
RHealth = SubResource("Resource_invhv")
RDamage = SubResource("Resource_cgfmf")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy29" parent="Tutorial" index="3" unique_id=1071267369 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -10, 22, 28.75)
Target = NodePath("../../Player")
RHealth = SubResource("Resource_05lnh")
RDamage = SubResource("Resource_cgfmf")
RMovement = SubResource("Resource_nwk5u")
[node name="Enemy30" parent="Tutorial" index="4" unique_id=1982933011 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0.25, 22, 28.75)
Target = NodePath("../../Player")
RHealth = SubResource("Resource_t5o40")
RDamage = SubResource("Resource_cgfmf")
RMovement = SubResource("Resource_nwk5u")
[node name="Triggers" type="Node3D" parent="Tutorial" index="5" unique_id=1531131828]
@@ -403,8 +355,8 @@ shape = SubResource("BoxShape3D_dkfm7")
[node name="TutoTrigger4" parent="Tutorial/Triggers" index="3" unique_id=321542244 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.5, 17.75, -27.5)
first_input_icon = ExtResource("15_1s3jl")
first_input_icon_keyboard = ExtResource("16_ca01l")
first_input_icon = ExtResource("13_ocbap")
first_input_icon_keyboard = ExtResource("14_4hfom")
input_related_text = "at target"
tuto_text = "dash through"
@@ -414,8 +366,8 @@ shape = SubResource("BoxShape3D_nwk5u")
[node name="TutoTrigger6" parent="Tutorial/Triggers" index="4" unique_id=26112457 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.75, 22.75, 11.25)
first_input_icon = ExtResource("15_1s3jl")
first_input_icon_keyboard = ExtResource("16_ca01l")
first_input_icon = ExtResource("13_ocbap")
first_input_icon_keyboard = ExtResource("14_4hfom")
input_related_text = "at enemy"
tuto_text = "dash through"
@@ -447,10 +399,9 @@ shape = SubResource("BoxShape3D_trte5")
[node name="TutoTrigger8" parent="Tutorial/Triggers" index="7" unique_id=36196488 instance=ExtResource("10_vqwwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 21.75, 28.25)
first_input_icon = ExtResource("19_ci5dp")
first_input_icon_keyboard = ExtResource("20_4ouww")
input_related_text = "at enemy"
tuto_text = "knockback"
first_input_icon = ExtResource("15_1s3jl")
first_input_icon_keyboard = ExtResource("16_ca01l")
tuto_text = "hit"
[node name="CollisionShape3D" type="CollisionShape3D" parent="Tutorial/Triggers/TutoTrigger8" index="1" unique_id=929676345]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.125, 1.875, 0.375)

View File

@@ -8,12 +8,8 @@
[ext_resource type="PackedScene" uid="uid://c305mfrtumcyq" path="res://scenes/spawners/spawner.tscn" id="4_jaqjx"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="5_iq67o"]
[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="6_l44fp"]
[ext_resource type="Resource" uid="uid://bohbojc68j7y1" path="res://scenes/enemies/grounded_enemy/grounded_enemy_health.tres" id="7_ucbss"]
[ext_resource type="Resource" uid="uid://otfc2snh8umc" path="res://scenes/enemies/grounded_enemy/grounded_enemy_damage.tres" id="8_2brdd"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="9_4vdsh"]
[ext_resource type="Resource" uid="uid://bwqjaom4k7rc3" path="res://scenes/enemies/flying_enemy/flying_enemy_movement.tres" id="10_levmk"]
[ext_resource type="Resource" uid="uid://dg1xbjhyhgnnk" path="res://scenes/enemies/flying_enemy/flying_enemy_health.tres" id="11_5jlg7"]
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="12_pjgox"]
[ext_resource type="PackedScene" uid="uid://qup00a7x2sji" path="res://scenes/fixed_dash_target/fixed_dashthrough_target.tscn" id="13_iq67o"]
[ext_resource type="PackedScene" uid="uid://b8aet6m4m2i83" path="res://scenes/tuto_trigger/TutoTrigger.tscn" id="14_lthgu"]
@@ -22,6 +18,9 @@ script = ExtResource("3_nix1q")
OnWeaponStartedFlyingAbilities = Array[Object]([ExtResource("2_ctafv")])
OnWeaponFlyingTickAbilities = Array[Object]([ExtResource("2_ctafv")])
OnWeaponStoppedFlyingAbilities = Array[Object]([ExtResource("2_ctafv")])
OnWeaponStartedPlantedAbilities = null
OnWeaponPlantedTickAbilities = null
OnWeaponStoppedPlantedAbilities = null
metadata/_custom_type_script = "uid://cgaahnfgxcrr6"
[sub_resource type="BoxShape3D" id="BoxShape3D_lthgu"]
@@ -42,8 +41,6 @@ material = ExtResource("3_1qo78")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.5, 1, -42.5)
EnemyToSpawn = ExtResource("5_iq67o")
MovementInputs = ExtResource("6_l44fp")
HealthInputs = ExtResource("7_ucbss")
DamageInputs = ExtResource("8_2brdd")
Target = NodePath("../Player")
SpawnInterval = 1.808
@@ -51,18 +48,13 @@ SpawnInterval = 1.808
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 46.5, 11.5, -34.5)
EnemyToSpawn = ExtResource("5_iq67o")
MovementInputs = ExtResource("6_l44fp")
HealthInputs = ExtResource("7_ucbss")
DamageInputs = ExtResource("8_2brdd")
Target = NodePath("../Player")
SpawnInterval = 5.0
IsActiveOnStart = false
[node name="GroundedSpawner3" parent="." index="10" unique_id=241829575 node_paths=PackedStringArray("Target") instance=ExtResource("4_jaqjx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 44.5, 0, -3)
EnemyToSpawn = ExtResource("5_iq67o")
MovementInputs = ExtResource("6_l44fp")
HealthInputs = ExtResource("7_ucbss")
DamageInputs = ExtResource("8_2brdd")
Target = NodePath("../Player")
SpawnInterval = 5.0
@@ -70,21 +62,15 @@ SpawnInterval = 5.0
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16.5, 19, -19.5)
EnemyToSpawn = ExtResource("9_4vdsh")
MovementInputs = ExtResource("10_levmk")
HealthInputs = ExtResource("11_5jlg7")
DamageInputs = ExtResource("12_pjgox")
Target = NodePath("../Player")
SpawnInterval = 5.0
IsActiveOnStart = false
[node name="FlyingSpawner2" parent="." index="12" unique_id=365997644 node_paths=PackedStringArray("Target") instance=ExtResource("4_jaqjx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 45.5, 25.5, -42.5)
EnemyToSpawn = ExtResource("9_4vdsh")
MovementInputs = ExtResource("10_levmk")
HealthInputs = ExtResource("11_5jlg7")
DamageInputs = ExtResource("12_pjgox")
Target = NodePath("../Player")
SpawnInterval = 5.0
IsActiveOnStart = false
[node name="Targets" type="Node3D" parent="." index="13" unique_id=1620747784]

View File

@@ -0,0 +1,348 @@
[gd_scene format=3 uid="uid://b2g2gys4dopmn"]
[ext_resource type="PackedScene" uid="uid://55wehh6xombr" path="res://maps/_templates/main_scene_template.tscn" id="1_pxwoj"]
[ext_resource type="PackedScene" uid="uid://y77cdg7gg3y7" path="res://maps/levels/_arenas/playtest_1.tscn" id="2_apgv3"]
[ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/materials/greybox/m_greybox.tres" id="3_452yy"]
[ext_resource type="Script" uid="uid://rhdkfi7nuvu1" path="res://managers/Wave/EnemyDescription.cs" id="3_a6jwd"]
[ext_resource type="Resource" uid="uid://cfyafss8ncbhh" path="res://managers/Wave/resources/flying_enemy_desc.tres" id="3_re07p"]
[ext_resource type="PackedScene" uid="uid://c305mfrtumcyq" path="res://scenes/spawners/spawner.tscn" id="4_6q0yp"]
[ext_resource type="Resource" uid="uid://3clksludry8g" path="res://managers/Wave/resources/grounded_enemy_desc.tres" id="4_7ijxg"]
[ext_resource type="Script" uid="uid://cr8wog705ane6" path="res://managers/Wave/SingleWave.cs" id="5_7ijxg"]
[ext_resource type="Resource" uid="uid://lnturc3ibr5c" path="res://managers/Wave/resources/projectile_enemy_desc.tres" id="5_hm1dp"]
[ext_resource type="Script" uid="uid://dijmv0wqc1xuv" path="res://managers/Wave/WaveContent.cs" id="6_hm1dp"]
[sub_resource type="Resource" id="Resource_7ijxg"]
script = ExtResource("5_7ijxg")
EnemiesToSpawn = Dictionary[ExtResource("3_a6jwd"), int]({
ExtResource("4_7ijxg"): 4
})
metadata/_custom_type_script = "uid://cr8wog705ane6"
[sub_resource type="Resource" id="Resource_hm1dp"]
script = ExtResource("5_7ijxg")
EnemiesToSpawn = Dictionary[ExtResource("3_a6jwd"), int]({
ExtResource("4_7ijxg"): 8,
ExtResource("3_re07p"): 3
})
metadata/_custom_type_script = "uid://cr8wog705ane6"
[sub_resource type="Resource" id="Resource_a6jwd"]
script = ExtResource("5_7ijxg")
EnemiesToSpawn = Dictionary[ExtResource("3_a6jwd"), int]({
ExtResource("5_hm1dp"): 3
})
metadata/_custom_type_script = "uid://cr8wog705ane6"
[sub_resource type="Resource" id="Resource_wllel"]
script = ExtResource("5_7ijxg")
EnemiesToSpawn = Dictionary[ExtResource("3_a6jwd"), int]({
ExtResource("4_7ijxg"): 4,
ExtResource("5_hm1dp"): 4,
ExtResource("3_re07p"): 4
})
metadata/_custom_type_script = "uid://cr8wog705ane6"
[sub_resource type="Resource" id="Resource_re07p"]
script = ExtResource("5_7ijxg")
EnemiesToSpawn = Dictionary[ExtResource("3_a6jwd"), int]({
ExtResource("3_re07p"): 15
})
metadata/_custom_type_script = "uid://cr8wog705ane6"
[sub_resource type="Resource" id="Resource_t6pb5"]
script = ExtResource("5_7ijxg")
EnemiesToSpawn = Dictionary[ExtResource("3_a6jwd"), int]({
ExtResource("4_7ijxg"): 15,
ExtResource("5_hm1dp"): 10,
ExtResource("3_re07p"): 10
})
metadata/_custom_type_script = "uid://cr8wog705ane6"
[sub_resource type="Resource" id="Resource_e88eg"]
script = ExtResource("6_hm1dp")
Waves = Array[Object]([SubResource("Resource_7ijxg"), SubResource("Resource_hm1dp"), SubResource("Resource_a6jwd"), SubResource("Resource_wllel"), SubResource("Resource_re07p"), SubResource("Resource_t6pb5")])
metadata/_custom_type_script = "uid://dijmv0wqc1xuv"
[node name="Main" unique_id=955321579 instance=ExtResource("1_pxwoj")]
WaveContent = SubResource("Resource_e88eg")
[node name="PlaytestArena" parent="." index="12" unique_id=664535670 instance=ExtResource("2_apgv3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16, 0, 9.5)
[node name="CSGBox3D108" type="CSGBox3D" parent="PlaytestArena" index="89" unique_id=94297910]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 8.75, 2.25)
use_collision = true
size = Vector3(1, 17.5, 9.5)
material = ExtResource("3_452yy")
[node name="Spawner2" parent="." index="13" unique_id=1982641431 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 1, -4)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="Spawner3" parent="." index="14" unique_id=1743153579 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.5, 1, -4)
SupportedEnemyTypes = Array[int]([1])
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="Spawner4" parent="." index="15" unique_id=536869732 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 1, -4)
SupportedEnemyTypes = Array[int]([1, 0])
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="Spawner5" parent="." index="16" unique_id=275129467 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 13, 1, -4)
SupportedEnemyTypes = Array[int]([1, 0])
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="Spawners" type="Node3D" parent="." index="17" unique_id=1784503796]
[node name="Grounded" type="Node3D" parent="Spawners" index="0" unique_id=2135113359]
[node name="Spawner" parent="Spawners/Grounded" index="0" unique_id=580981173 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12, 1, -4)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner13" parent="Spawners/Grounded" index="1" unique_id=771710160 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, -4)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner14" parent="Spawners/Grounded" index="2" unique_id=947491829 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 1, -4)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner15" parent="Spawners/Grounded" index="3" unique_id=519369782 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 1, 5.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner16" parent="Spawners/Grounded" index="4" unique_id=1219755801 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 1, -9.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner17" parent="Spawners/Grounded" index="5" unique_id=1403055240 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.5, 1, -9.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner18" parent="Spawners/Grounded" index="6" unique_id=1479410245 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.5, 1, 7.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner19" parent="Spawners/Grounded" index="7" unique_id=1743292696 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.5, 7, -9.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner21" parent="Spawners/Grounded" index="8" unique_id=1801083740 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.5, 11.5, -24.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner22" parent="Spawners/Grounded" index="9" unique_id=1296256003 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.5, 11.5, -24.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner20" parent="Spawners/Grounded" index="10" unique_id=1527237523 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.5, 7, -9.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner2" parent="Spawners/Grounded" index="11" unique_id=834604221 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12, 1, -23.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner3" parent="Spawners/Grounded" index="12" unique_id=270195635 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 1, -30.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner4" parent="Spawners/Grounded" index="13" unique_id=1202580658 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 1, -33)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner5" parent="Spawners/Grounded" index="14" unique_id=1987649511 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.5, 1, -33)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner6" parent="Spawners/Grounded" index="15" unique_id=1276050304 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26.5, 1, -25)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner7" parent="Spawners/Grounded" index="16" unique_id=825475214 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26.5, 1, -17.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner8" parent="Spawners/Grounded" index="17" unique_id=1896505808 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 6, -17.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner11" parent="Spawners/Grounded" index="18" unique_id=1922800453 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 7, -8)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner12" parent="Spawners/Grounded" index="19" unique_id=172297553 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14, 7, -8)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner9" parent="Spawners/Grounded" index="20" unique_id=242104600 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 5, -17.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner10" parent="Spawners/Grounded" index="21" unique_id=1537236940 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5, 3.5, -17.5)
SupportedEnemyTypes = Array[int]([0])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Flying" type="Node3D" parent="Spawners" index="1" unique_id=1568736683]
[node name="Spawner2" parent="Spawners/Flying" index="0" unique_id=540145996 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 26.051147, -34)
SupportedEnemyTypes = Array[int]([1])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner3" parent="Spawners/Flying" index="1" unique_id=286744715 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 27, 26.051147, -34)
SupportedEnemyTypes = Array[int]([1])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner4" parent="Spawners/Flying" index="2" unique_id=97624405 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.5, 26.051147, -31)
SupportedEnemyTypes = Array[int]([1])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner5" parent="Spawners/Flying" index="3" unique_id=452318421 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.5, 13.051147, 3.5)
SupportedEnemyTypes = Array[int]([1])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner6" parent="Spawners/Flying" index="4" unique_id=1238823469 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.5, 13.051147, 8)
SupportedEnemyTypes = Array[int]([1])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Projectile" type="Node3D" parent="Spawners" index="2" unique_id=1258161549]
[node name="Spawner3" parent="Spawners/Projectile" index="0" unique_id=1747138734 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 7.5, 8.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner4" parent="Spawners/Projectile" index="1" unique_id=1503627609 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7, 11, 9.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner5" parent="Spawners/Projectile" index="2" unique_id=2041198655 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.5, 11, 9.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner6" parent="Spawners/Projectile" index="3" unique_id=552715567 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.5, 11, 1.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner7" parent="Spawners/Projectile" index="4" unique_id=70054371 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.5, 12, -9.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner8" parent="Spawners/Projectile" index="5" unique_id=1180979948 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17, 12, -9.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner9" parent="Spawners/Projectile" index="6" unique_id=1257162636 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.5, 12, -9.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner10" parent="Spawners/Projectile" index="7" unique_id=508868686 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 17.5, -8.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner11" parent="Spawners/Projectile" index="8" unique_id=1732590308 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 17.5, -17.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner12" parent="Spawners/Projectile" index="9" unique_id=1601257376 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7, 17.5, -24.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner13" parent="Spawners/Projectile" index="10" unique_id=391332199 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17, 17.5, -24.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner14" parent="Spawners/Projectile" index="11" unique_id=1920158287 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.5, 17.5, -24.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false
[node name="Spawner15" parent="Spawners/Projectile" index="12" unique_id=1099390523 node_paths=PackedStringArray("Target") instance=ExtResource("4_6q0yp")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12, 11, -26.5)
SupportedEnemyTypes = Array[int]([2])
Target = NodePath("../../../Player")
IsActiveOnStart = false

View File

@@ -5,44 +5,16 @@
[ext_resource type="PackedScene" uid="uid://qup00a7x2sji" path="res://scenes/fixed_dash_target/fixed_dashthrough_target.tscn" id="3_j13fh"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="4_1cb4f"]
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="5_vuwkd"]
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://scenes/components/health/RHealth.cs" id="6_251oa"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="7_vkl5g"]
[ext_resource type="PackedScene" uid="uid://c305mfrtumcyq" path="res://scenes/spawners/spawner.tscn" id="8_1upfw"]
[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="9_ynw2y"]
[ext_resource type="Resource" uid="uid://otfc2snh8umc" path="res://scenes/enemies/grounded_enemy/grounded_enemy_damage.tres" id="10_jadgc"]
[ext_resource type="Resource" uid="uid://bwqjaom4k7rc3" path="res://scenes/enemies/flying_enemy/flying_enemy_movement.tres" id="11_luuoi"]
[ext_resource type="Resource" uid="uid://dg1xbjhyhgnnk" path="res://scenes/enemies/flying_enemy/flying_enemy_health.tres" id="12_4nug6"]
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="13_e04qc"]
[ext_resource type="PackedScene" uid="uid://dx3y8sjftqk8f" path="res://scenes/enemies/projectile_enemy/projectile_enemy.tscn" id="10_mm5sa"]
[sub_resource type="Resource" id="Resource_xixm3"]
script = ExtResource("5_vuwkd")
GravityModifier = 5.0
metadata/_custom_type_script = "uid://dtpxijlnb2c5"
[sub_resource type="Resource" id="Resource_p48l4"]
script = ExtResource("6_251oa")
StartingHealth = 1000.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[sub_resource type="Resource" id="Resource_epn1o"]
script = ExtResource("6_251oa")
StartingHealth = 1.0
metadata/_custom_type_script = "uid://baiapod3csndf"
[node name="Main" unique_id=1551129541 instance=ExtResource("1_qu1jn")]
[node name="BackgroundMusicPlayer" parent="." index="0" unique_id=879496303]
autoplay = false
[node name="Player" parent="." index="5" unique_id=1309399929]
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 2, 1.5, 9.5)
[node name="DebugLayer" parent="." index="6" unique_id=294370189]
visible = true
[node name="GuideDebugger" parent="DebugLayer" index="0" unique_id=636020765]
visible = false
[node name="Greybox" type="CSGCombiner3D" parent="." index="7" unique_id=646927976]
use_collision = true
collision_layer = 256
@@ -124,7 +96,6 @@ RMovement = SubResource("Resource_xixm3")
[node name="Enemy3" parent="." index="11" unique_id=271578597 node_paths=PackedStringArray("Target") instance=ExtResource("4_1cb4f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 4, -3.3368092)
Target = NodePath("../Player")
RHealth = SubResource("Resource_p48l4")
RMovement = SubResource("Resource_xixm3")
[node name="FlyingEnemy" parent="." index="12" unique_id=1167959205 node_paths=PackedStringArray("Target") instance=ExtResource("7_vkl5g")]
@@ -137,20 +108,17 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 7, -16)
Target = NodePath("../Player")
RMovement = SubResource("Resource_xixm3")
[node name="GroundedSpawner" parent="." index="14" unique_id=557145011 node_paths=PackedStringArray("Target") instance=ExtResource("8_1upfw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 2.5, -15)
EnemyToSpawn = ExtResource("4_1cb4f")
MovementInputs = ExtResource("9_ynw2y")
HealthInputs = SubResource("Resource_epn1o")
DamageInputs = ExtResource("10_jadgc")
[node name="ProjectileEnemy" parent="." index="14" unique_id=1747444936 node_paths=PackedStringArray("Target") instance=ExtResource("10_mm5sa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0893264, -1.9073486e-06, -17.405575)
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="FlyingSpawner" parent="." index="15" unique_id=974076606 node_paths=PackedStringArray("Target") instance=ExtResource("8_1upfw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 11, -14)
EnemyToSpawn = ExtResource("7_vkl5g")
MovementInputs = ExtResource("11_luuoi")
HealthInputs = ExtResource("12_4nug6")
DamageInputs = ExtResource("13_e04qc")
[node name="ProjectileEnemy2" parent="." index="15" unique_id=1908678308 node_paths=PackedStringArray("Target") instance=ExtResource("10_mm5sa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.42922592, -3.8146973e-06, -20.257122)
Target = NodePath("../Player")
IsActiveOnStart = false
[node name="ProjectileEnemy3" parent="." index="16" unique_id=1327447050 node_paths=PackedStringArray("Target") instance=ExtResource("10_mm5sa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.4421315, -1.9073486e-06, -13.8114)
Target = NodePath("../Player")
[node name="Player" parent="." index="18" unique_id=1309399929]
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 2, 1.5, 9.5)

View File

@@ -43,7 +43,7 @@ item_0/text = "1 - ExampleLevel"
[node name="SceneLister" type="Node" parent="." unique_id=149935027]
script = ExtResource("3_stdqw")
files = Array[String](["res://maps/levels/1 - tuto_movement.tscn", "res://maps/levels/2 - tuto_sword.tscn", "res://maps/levels/3 - tuto_enemies.tscn", "res://maps/zoos/grounded_flying_ennemies.tscn", "res://maps/gyms/metrics.tscn"])
files = Array[String](["res://maps/levels/1 - tuto_movement.tscn", "res://maps/levels/2 - tuto_sword.tscn", "res://maps/levels/3 - tuto_enemies.tscn", "res://maps/levels/4 - tuto_waves.tscn"])
directory = "res://maps"
[connection signal="item_activated" from="Control/LevelButtonsContainer" to="." method="_on_level_buttons_container_item_activated"]

View File

@@ -14,6 +14,11 @@ using Movementtests.systems;
public partial class InventoryUi : Control, IDisposable
{
public override void _Notification(int what) => this.Notify(what);
public record struct EventElements(
AbilitySelection AbilitySelection,
AutoSet<ForgeAbilityBehavior>.Binding Binding,
IAutoSet<ForgeAbilityBehavior> Inventory);
#region Dependencies
[Dependency]
@@ -27,53 +32,67 @@ public partial class InventoryUi : Control, IDisposable
public required AbilitySelection WhileFlying { get; set; }
[Node]
public required AbilitySelection StoppedFlying { get; set; }
[Node]
public required AbilitySelection StartedPlanted { get; set; }
[Node]
public required AbilitySelection WhilePlanted { get; set; }
[Node]
public required AbilitySelection StoppedPlanted { get; set; }
#endregion Nodes
public AutoSet<ForgeAbilityBehavior>.Binding StartedFlyingBinding { get; set; }
public AutoSet<ForgeAbilityBehavior>.Binding FlyingTickBinding { get; set; }
public AutoSet<ForgeAbilityBehavior>.Binding StoppedFlyingBinding { get; set; }
public required AutoSet<ForgeAbilityBehavior>.Binding StartedFlyingBinding { get; set; }
public required AutoSet<ForgeAbilityBehavior>.Binding FlyingTickBinding { get; set; }
public required AutoSet<ForgeAbilityBehavior>.Binding StoppedFlyingBinding { get; set; }
public required AutoSet<ForgeAbilityBehavior>.Binding StartedPlantedBinding { get; set; }
public required AutoSet<ForgeAbilityBehavior>.Binding PlantedTickBinding { get; set; }
public required AutoSet<ForgeAbilityBehavior>.Binding StoppedPlantedBinding { get; set; }
public Dictionary<WeaponSystem.WeaponEvent, EventElements> EventElementsMap { get; private set; } = [];
public void OnReady()
{
StartedFlying.AbilityAdded += AddAbilityForEvent;
WhileFlying.AbilityAdded += AddAbilityForEvent;
StoppedFlying.AbilityAdded += AddAbilityForEvent;
StartedFlying.AbilityRemoved += RemoveAbilityForEvent;
WhileFlying.AbilityRemoved += RemoveAbilityForEvent;
StoppedFlying.AbilityRemoved += RemoveAbilityForEvent;
}
public void OnResolved()
{
StartedFlying.Initialize(InventoryManager.WeaponEventsInventory[WeaponSystem.WeaponEvent.StartedFlying]);
WhileFlying.Initialize(InventoryManager.WeaponEventsInventory[WeaponSystem.WeaponEvent.FlyingTick]);
StoppedFlying.Initialize(InventoryManager.WeaponEventsInventory[WeaponSystem.WeaponEvent.StoppedFlying]);
EventElementsMap = new Dictionary<WeaponSystem.WeaponEvent, EventElements>
{
{ WeaponSystem.WeaponEvent.StartedFlying, new EventElements(StartedFlying, StartedFlyingBinding, InventoryManager.StartedFlyingAbilities) },
{ WeaponSystem.WeaponEvent.StoppedFlying, new EventElements(StoppedFlying, StoppedFlyingBinding, InventoryManager.StoppedFlyingAbilities)},
{ WeaponSystem.WeaponEvent.FlyingTick, new EventElements(WhileFlying, FlyingTickBinding, InventoryManager.FlyingTickAbilities) },
{ WeaponSystem.WeaponEvent.StartedPlanted, new EventElements(StartedPlanted, StartedPlantedBinding, InventoryManager.StartedPlantedAbilities) },
{ WeaponSystem.WeaponEvent.StoppedPlanted, new EventElements(StoppedPlanted, StoppedPlantedBinding, InventoryManager.StoppedPlantedAbilities) },
{ WeaponSystem.WeaponEvent.PlantedTick, new EventElements(WhilePlanted, PlantedTickBinding, InventoryManager.PlantedTickAbilities) },
};
StartedFlyingBinding = InventoryManager.StartedFlyingAbilities.Bind();
StartedFlyingBinding
.OnAdd(behavior => OnWeaponEventInventoryAdded(WeaponSystem.WeaponEvent.StartedFlying, behavior))
.OnRemove(behavior => OnWeaponEventInventoryRemoved(WeaponSystem.WeaponEvent.StartedFlying, behavior))
.OnClear(() => OnWeaponEventInventoryCleared(WeaponSystem.WeaponEvent.StartedFlying));
FlyingTickBinding = InventoryManager.FlyingTickAbilities.Bind();
FlyingTickBinding
.OnAdd(behavior => OnWeaponEventInventoryAdded(WeaponSystem.WeaponEvent.FlyingTick, behavior))
.OnRemove(behavior => OnWeaponEventInventoryRemoved(WeaponSystem.WeaponEvent.FlyingTick, behavior))
.OnClear(() => OnWeaponEventInventoryCleared(WeaponSystem.WeaponEvent.FlyingTick));
StoppedFlyingBinding = InventoryManager.StoppedFlyingAbilities.Bind();
StoppedFlyingBinding
.OnAdd(behavior => OnWeaponEventInventoryAdded(WeaponSystem.WeaponEvent.StoppedFlying, behavior))
.OnRemove(behavior => OnWeaponEventInventoryRemoved(WeaponSystem.WeaponEvent.StoppedFlying, behavior))
.OnClear(() => OnWeaponEventInventoryCleared(WeaponSystem.WeaponEvent.StoppedFlying));
foreach (var (forEvent, element) in EventElementsMap)
{
element.AbilitySelection.AbilityAdded += AddAbilityForEvent;
element.AbilitySelection.AbilityRemoved += RemoveAbilityForEvent;
var elem = EventElementsMap[forEvent];
elem.AbilitySelection.Initialize(InventoryManager.WeaponEventsInventory[forEvent]);
elem.Binding = element.Inventory.Bind();
elem.Binding
.OnAdd(behavior => OnWeaponEventInventoryAdded(forEvent, behavior))
.OnRemove(behavior => OnWeaponEventInventoryRemoved(forEvent, behavior))
.OnClear(() => OnWeaponEventInventoryCleared(forEvent));
}
foreach (var forEvent in EventElementsMap.Keys)
{
}
}
public new void Dispose()
{
GC.SuppressFinalize(this);
StartedFlying.Dispose();
WhileFlying.Dispose();
StoppedFlying.Dispose();
foreach (var element in EventElementsMap.Values)
element.Binding.Dispose();
base.Dispose();
}
@@ -108,13 +127,6 @@ public partial class InventoryUi : Control, IDisposable
public AbilitySelection GetAbilitySelection(WeaponSystem.WeaponEvent forEvent)
{
var abilitiesSelectionsMap = new Dictionary<WeaponSystem.WeaponEvent, AbilitySelection>
{
{ WeaponSystem.WeaponEvent.StartedFlying, StartedFlying },
{ WeaponSystem.WeaponEvent.StoppedFlying, StoppedFlying },
{ WeaponSystem.WeaponEvent.FlyingTick, WhileFlying },
};
return abilitiesSelectionsMap[forEvent];
return EventElementsMap[forEvent].AbilitySelection;
}
}

View File

@@ -72,24 +72,47 @@ layout_mode = 2
text = "Weapon abilities"
horizontal_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection" unique_id=75337901]
[node name="FlyingHBoxContainer" type="HBoxContainer" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection" unique_id=75337901]
layout_mode = 2
script = ExtResource("2_ijoei")
search_depth = 10
[node name="StartedFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/HBoxContainer" unique_id=1373426933 instance=ExtResource("3_ijoei")]
[node name="StartedFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/FlyingHBoxContainer" unique_id=1373426933 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
Title = "Started flying"
[node name="WhileFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/HBoxContainer" unique_id=1771285257 instance=ExtResource("3_ijoei")]
[node name="WhileFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/FlyingHBoxContainer" unique_id=1771285257 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
ForEvent = 2
Title = "While flying"
[node name="StoppedFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/HBoxContainer" unique_id=324047638 instance=ExtResource("3_ijoei")]
[node name="StoppedFlying" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/FlyingHBoxContainer" unique_id=324047638 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
ForEvent = 1
Title = "Stopped flying"
[node name="PlantedHBoxContainer" type="HBoxContainer" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection" unique_id=1198840955]
layout_mode = 2
script = ExtResource("2_ijoei")
search_depth = 10
[node name="StartedPlanted" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/PlantedHBoxContainer" unique_id=1231817717 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
ForEvent = 3
Title = "On weapon planted"
[node name="WhilePlanted" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/PlantedHBoxContainer" unique_id=1222663623 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
ForEvent = 5
Title = "While planted"
[node name="StoppedPlanted" parent="Inventory/MenuPanelContainer/MarginContainer/BoxContainer/PlayerSectionMargin/PlayerSection/PlantedHBoxContainer" unique_id=2136675723 instance=ExtResource("3_ijoei")]
unique_name_in_owner = true
layout_mode = 2
ForEvent = 4
Title = "On weapon unplanted"

View File

@@ -1,31 +0,0 @@
using Godot;
using System;
using Movementtests.interfaces;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/white/icon_skull.png")]
public partial class CDamageable : Node, IDamageable
{
public event Action<IDamageable, DamageRecord> DamageTaken;
[Export]
public RDamageModifier[] DamageModifiers { get; set; }
public DamageRecord TakeDamage(DamageRecord damageRecord)
{
var finalDamage = 0f;
foreach (var damageable in DamageModifiers.ToIDamageables())
finalDamage += damageable.TakeDamage(damageRecord).Damage.DamageDealt;
var finalDamageRecord = damageRecord with { Damage = new RDamage(finalDamage, damageRecord.Damage.DamageType) };
DamageTaken?.Invoke(this, finalDamageRecord);
return finalDamageRecord;
}
public DamageRecord ComputeDamage(DamageRecord damageRecord)
{
var finalDamage = 0f;
foreach (var damageable in DamageModifiers.ToIDamageables())
finalDamage += damageable.ComputeDamage(damageRecord).Damage.DamageDealt;
return damageRecord with { Damage = new RDamage(finalDamage, damageRecord.Damage.DamageType) };
}
}

View File

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

View File

@@ -1,6 +0,0 @@
[gd_scene format=3 uid="uid://hpsg4fqwrx1u"]
[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/components/damage/CDamageable.cs" id="1_qp8bd"]
[node name="CDamageable" type="Node" unique_id=482221079]
script = ExtResource("1_qp8bd")

View File

@@ -1,9 +0,0 @@
namespace Movementtests.systems.damage;
public enum EDamageTypes
{
Normal,
Fire,
Ice,
Explosion,
}

View File

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

View File

@@ -1,20 +0,0 @@
using Godot;
using System;
using Movementtests.systems.damage;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/white/icon_skull.png")]
public partial class RDamage : Resource
{
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float DamageDealt { get; set;}
[Export]
public EDamageTypes DamageType { get; set;}
public RDamage() : this(1.0f, EDamageTypes.Normal) {}
public RDamage(float damageDealt, EDamageTypes damageType)
{
DamageDealt = damageDealt;
DamageType = damageType;
}
}

View File

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

View File

@@ -1,43 +0,0 @@
using Godot;
using System;
using Movementtests.interfaces;
using Movementtests.systems.damage;
[Icon("res://assets/ui/IconGodotNode/white/icon_freeze.png")]
[GlobalClass]
public partial class RDamageModifier : Resource, IDamageable
{
public event Action<IDamageable, DamageRecord> DamageTaken = null!;
[Export]
public EDamageTypes DamageType { get; set;}
[Export]
public float Modifier { get; set;}
public RDamageModifier() : this(EDamageTypes.Normal, 1.0f) {}
public RDamageModifier(EDamageTypes damageType, float modifier)
{
Modifier = modifier;
DamageType = damageType;
}
public DamageRecord TakeDamage(DamageRecord damageRecord)
{
if (damageRecord.Damage.DamageType != DamageType)
return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) };
var finalDamage = damageRecord.Damage.DamageDealt * Modifier;
var finalDamageRecord = damageRecord with { Damage = new RDamage(finalDamage, damageRecord.Damage.DamageType) };
DamageTaken?.Invoke(this, finalDamageRecord);
return finalDamageRecord;
}
public DamageRecord ComputeDamage(DamageRecord damageRecord)
{
if (damageRecord.Damage.DamageType != DamageType)
return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) };
var finalDamage = damageRecord.Damage.DamageDealt * Modifier;
return damageRecord with { Damage = new RDamage(finalDamage, damageRecord.Damage.DamageType) };
}
}

View File

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

View File

@@ -1,35 +0,0 @@
using Godot;
using System;
using Movementtests.interfaces;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/white/icon_heart.png")]
public partial class CHealth : Node, IHealthable
{
public event Action<IHealthable, HealthChangedRecord> HealthChanged = null!;
public event Action<IHealthable> HealthDepleted = null!;
[Export]
public RHealth RHealth { get; set; } = null!;
public float CurrentHealth { get; set; }
public override void _Ready()
{
CurrentHealth = RHealth.StartingHealth;
}
public HealthChangedRecord ReduceHealth(IDamageable source, DamageRecord damageRecord)
{
var previousHealth = CurrentHealth;
CurrentHealth -= damageRecord.Damage.DamageDealt;
var record = new HealthChangedRecord(CurrentHealth, previousHealth, RHealth.StartingHealth);
HealthChanged?.Invoke(this, record);
if (CurrentHealth <= 0)
{
CurrentHealth = 0;
HealthDepleted?.Invoke(this);
}
return record;
}
}

View File

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

View File

@@ -1,6 +0,0 @@
[gd_scene format=3 uid="uid://c4ikbhojckpnc"]
[ext_resource type="Script" uid="uid://bjwrpv3jpsc1e" path="res://scenes/components/health/CHealth.cs" id="1_75uyt"]
[node name="CHealth" type="Node" unique_id=1940090217]
script = ExtResource("1_75uyt")

View File

@@ -5,8 +5,8 @@ using Movementtests.interfaces;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_thunder.png")]
public partial class RDeathEffect : Resource, IKillable
{
public void Kill(IHealthable source)
public void Kill()
{
GD.Print($"Death Effect triggered on {source}");
GD.Print($"Death Effect triggered");
}
}

View File

@@ -1,12 +0,0 @@
using Godot;
using System;
using Movementtests.interfaces;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/white/icon_heart.png")]
public partial class RHealth(float startingHealth) : Resource
{
[Export]
public float StartingHealth { get; set;} = startingHealth;
public RHealth() : this(100.0f) {}
}

View File

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

View File

@@ -1,13 +1,14 @@
using Godot;
using System;
using Movementtests.interfaces;
namespace Movementtests.scenes.components.knockback;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_wind.png")]
public partial class CKnockback : Node3D, IKnockbackable
{
[Export] public RKnockback RKnockback { get; set;} = null!;
private KnockbackRecord _knockbackRecord = null!;
private KnockbackRecord? _knockbackRecord;
public void RegisterKnockback(KnockbackRecord knockbackRecord)
{
@@ -18,9 +19,8 @@ public partial class CKnockback : Node3D, IKnockbackable
{
if (_knockbackRecord == null) return Vector3.Zero;
var knockbackDirection = GlobalPosition - _knockbackRecord.DamageRecord.SourceLocation;
var finalKnockback = knockbackDirection.Normalized() * RKnockback.Modifier * _knockbackRecord.ForceMultiplier;
_knockbackRecord = null!;
var finalKnockback = _knockbackRecord.Direction.Normalized() * RKnockback.Modifier * _knockbackRecord.ForceMultiplier;
_knockbackRecord = null;
return finalKnockback;
}
}
}

View File

@@ -1,16 +1,12 @@
using Godot;
using System;
using Movementtests.interfaces;
namespace Movementtests.scenes.components.knockback;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/white/icon_wind.png")]
public partial class RKnockback : Resource
public partial class RKnockback(float modifier) : Resource
{
[Export]
public float Modifier { get; set;}
public float Modifier { get; set;} = modifier;
public RKnockback() : this(1.0f) {}
public RKnockback(float modifier)
{
Modifier = modifier;
}
}
}

View File

@@ -21,14 +21,18 @@ public partial class CFlyingMovement : Node3D, IMoveable
public Vector3 ComputeVelocity(MovementInputs inputs)
{
if (inputs.IsStunned) return inputs.Velocity.Lerp(Vector3.Zero, (float) inputs.Delta * RMovement.Acceleration);
var velocity = inputs.Velocity;
var spaceState = GetWorld3D().DirectSpaceState;
var target = inputs.TargetLocation;
var direction = (target - GlobalPosition).Normalized();
var direction = GlobalPosition.DirectionTo(target);
velocity = velocity.Lerp(direction * RMovement.Speed, (float) inputs.Delta * RMovement.Acceleration);
return velocity;
// Check if we have a direct line of sight to the player
if (!_movingToDesiredHeight)
{
velocity = velocity.Lerp(direction * RMovement.Speed, (float) inputs.delta * RMovement.Acceleration);
velocity = velocity.Lerp(direction * RMovement.Speed, (float) inputs.Delta * RMovement.Acceleration);
var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, TerrainCollision);
var result = spaceState.IntersectRay(query);
@@ -40,7 +44,7 @@ public partial class CFlyingMovement : Node3D, IMoveable
}
else
{
velocity = velocity.Lerp(_randomDirection * RMovement.Speed, (float) inputs.delta * RMovement.Acceleration);
velocity = velocity.Lerp(_randomDirection * RMovement.Speed, (float) inputs.Delta * RMovement.Acceleration);
var groundQuery = PhysicsRayQueryParameters3D.Create(GlobalPosition, GlobalPosition+Vector3.Down*RMovement.TargetHeight, TerrainCollision);
var groundResult = spaceState.IntersectRay(groundQuery);

View File

@@ -19,15 +19,18 @@ public partial class CGroundedMovement : Node3D, IMoveable
var targetPlane = new Vector3(target.X, GlobalPosition.Y, target.Z);
LookAt(targetPlane);
float xAcc = (float) Mathf.Lerp(velocity.X, direction.X * RMovement.Speed, inputs.delta * RMovement.Acceleration);
float zAcc = (float) Mathf.Lerp(velocity.Z, direction.Z * RMovement.Speed, inputs.delta * RMovement.Acceleration);
var targetXSpeed = inputs.IsStunned ? 0 : direction.X * RMovement.Speed;
var targetZSpeed = inputs.IsStunned ? 0 : direction.Z * RMovement.Speed;
float xAcc = (float) Mathf.Lerp(velocity.X, targetXSpeed, inputs.Delta * RMovement.Acceleration);
float zAcc = (float) Mathf.Lerp(velocity.Z, targetZSpeed, inputs.Delta * RMovement.Acceleration);
velocity.X = xAcc;
velocity.Z = zAcc;
if (WallInFrontRayCast.IsColliding())
if (WallInFrontRayCast.IsColliding() && !inputs.IsStunned)
velocity.Y = RMovement.Speed;
else if (!inputs.isOnFloor)
velocity += inputs.gravity * (float)inputs.delta * RMovement.GravityModifier;
else if (!inputs.IsOnFloor)
velocity += inputs.Gravity * (float)inputs.Delta * RMovement.GravityModifier;
return velocity;
}

Some files were not shown because too many files have changed in this diff Show More