Skip to content

Commit

Permalink
+ deletion rules
Browse files Browse the repository at this point in the history
  • Loading branch information
andreakarasho committed Jul 11, 2024
1 parent c8a0783 commit a06228f
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 10 deletions.
17 changes: 10 additions & 7 deletions samples/MyBattleground/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@

using var ecs = new World();


var asd = ecs.Entity().Set(new Position());
var name = ecs.Entity<Position>().Name();

ecs.Query<Optional<Position>>();
ecs.Query<(Position, Velocity), (With<Networked>, Without<Likes>, Or<(With<Position>, Without<ManagedData>)>)>();

Expand All @@ -21,16 +25,15 @@
var root = ecs.Entity();
var child = ecs.Entity();

var child2 = ecs.Entity();
child2.Set(root, child);

if (child2.Has(root, child))
{

}
var eqiupId = ecs.Entity<EquippedItem>().Add<Defaults.OnDelete, Defaults.Unset>();

child.Add<EquippedItem>(root);
child.Set(new EquippedItem() { Layer = 3 }, root);
child.Set(new EquippedItem() { Layer = 3 }, root);

// root.AddChild(child);
root.Delete();

ref var equip2 = ref ecs.Get<EquippedItem>(child);
ref var equip = ref ecs.Get<EquippedItem>(child, root);
equip.Layer = 8;
Expand Down
66 changes: 66 additions & 0 deletions src/Default.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,70 @@ public struct Symmetric { }
/// </example>
/// </summary>
public struct DoNotDelete { }

/// <summary>
/// Built-in tag.<br/>Cleanup rule<para/>
/// <example>
/// Example:
/// <code>
/// var a = world.Entity();
/// var relation = world.Entity().Add&lt;OnDelete, Delete&gt;();
/// var b = world.Entity();
///
/// a.Add(relation, b);
/// b.Delete(); // --> a get deleted too
/// </code>
/// </example>
/// </summary>
public struct OnDelete { }


/// <summary>
/// Built-in tag.<br/>Cleanup rule for Delete<para/>
/// <example>
/// Example:
/// <code>
/// var a = world.Entity();
/// var relation = world.Entity().Add&lt;OnDelete, Delete&gt;();
/// var b = world.Entity();
///
/// a.Add(relation, b);
/// b.Delete(); // --> 'a' get deleted too
/// </code>
/// </example>
/// </summary>
public struct Delete { }

/// <summary>
/// Built-in tag.<br/>Cleanup rule for Delete<para/>
/// <example>
/// Example:
/// <code>
/// var a = world.Entity();
/// var relation = world.Entity().Add&lt;OnDelete, Panic&gt;();
/// var b = world.Entity();
///
/// a.Add(relation, b);
/// b.Delete(); // --> runtime error!
/// </code>
/// </example>
/// </summary>
public struct Panic { }


/// <summary>
/// Built-in tag.<br/>Cleanup rule for Delete<para/>
/// <example>
/// Example:
/// <code>
/// var a = world.Entity();
/// var relation = world.Entity().Add&lt;OnDelete, Unset&gt;();
/// var b = world.Entity();
///
/// a.Add(relation, b);
/// b.Delete(); // --> relation get removed from 'a'
/// </code>
/// </example>
/// </summary>
public struct Unset { }
}
26 changes: 23 additions & 3 deletions src/World.Public.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,25 @@ public World(ulong maxComponentId = 256)
_ = Component<Name>();
_ = Component<ChildOf>();

_ = Component<OnDelete>();
_ = Component<Delete>();
_ = Component<Panic>();
_ = Component<Unset>();

setCommon(Entity<DoNotDelete>(), nameof(DoNotDelete));
setCommon(Entity<Unique>(), nameof(Unique));
setCommon(Entity<Symmetric>(), nameof(Symmetric));
setCommon(Entity<Wildcard>(), nameof(Wildcard));
setCommon(Entity<Identifier>(), nameof(Identifier));
setCommon(Entity<Name>(), nameof(Name));
setCommon(Entity<ChildOf>(), nameof(ChildOf))
.Add<OnDelete, Delete>()
.Add<Unique>();
setCommon(Entity<OnDelete>(), nameof(OnDelete))
.Add<Unique>();
setCommon(Entity<Delete>(), nameof(Delete));
setCommon(Entity<Panic>(), nameof(Panic));
setCommon(Entity<Unset>(), nameof(Unset));

static EntityView setCommon(EntityView entity, string name)
=> entity.Add<DoNotDelete>().Set<Identifier, Name>(new (name));
Expand Down Expand Up @@ -208,11 +219,20 @@ public void Delete(EcsID entity)
// https://github.com/SanderMertens/flecs/blob/master/include/flecs/private/api_defines.h#L289
var term0 = new QueryTerm(IDOp.Pair(Wildcard.ID, entity), TermOp.With);
var term1 = new QueryTerm(IDOp.Pair(entity, Wildcard.ID), TermOp.With);
QueryRaw(term0).Each(static (EntityView child) => child.Delete());
QueryRaw(term1).Each(static (EntityView child) => child.Delete());

ref var record = ref GetRecord(entity);
QueryFilterDelegateWithEntity onQuery = (EntityView child) => {
var action = Action(child.ID, entity);
if (Has<OnDelete, Delete>(action))
child.Delete();
if (Has<OnDelete, Unset>(action))
child.Unset(action, entity);
if (Has<OnDelete, Panic>(action))
EcsAssert.Panic(false, "you cant remove this entity because of {OnDelete, Panic} relation");
};
QueryRaw(term0).Each(onQuery);
QueryRaw(term1).Each(onQuery);

ref var record = ref GetRecord(entity);
var removedId = record.Archetype.Remove(ref record);
EcsAssert.Assert(removedId == entity);

Expand Down
45 changes: 45 additions & 0 deletions tests/Relation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,5 +263,50 @@ public void Relation_SymmetricDeferred()
Assert.True(carl.Has(tradeWith, bob));
Assert.True(bob.Has(tradeWith, carl));
}

[Fact]
public void Relation_OnDelete_Delete()
{
using var ctx = new Context();

var a = ctx.World.Entity();
var relation = ctx.World.Entity().Add<OnDelete, Delete>();
var b = ctx.World.Entity();

a.Add(relation, b);
b.Delete();

Assert.False(a.Exists());
Assert.False(b.Exists());
}

[Fact]
public void Relation_OnDelete_Unset()
{
using var ctx = new Context();

var a = ctx.World.Entity();
var relation = ctx.World.Entity().Add<OnDelete, Unset>();
var b = ctx.World.Entity();

a.Add(relation, b);
b.Delete();

Assert.True(a.Exists());
Assert.False(a.Has(relation, b));
}

[Fact]
public void Relation_OnDelete_Panic()
{
using var ctx = new Context();

var a = ctx.World.Entity();
var relation = ctx.World.Entity().Add<OnDelete, Panic>();
var b = ctx.World.Entity();

a.Add(relation, b);
Assert.ThrowsAny<Exception>(() => b.Delete());
}
}
}

0 comments on commit a06228f

Please sign in to comment.