diff --git a/Sources/FirebladeECS/Nexus+FamilyUpdate.swift b/Sources/FirebladeECS/Nexus+FamilyUpdate.swift index cd7d78d..7424b27 100644 --- a/Sources/FirebladeECS/Nexus+FamilyUpdate.swift +++ b/Sources/FirebladeECS/Nexus+FamilyUpdate.swift @@ -13,6 +13,7 @@ extension Nexus { } familyMembersByTraits[traits] = UnorderedSparseSet() + defer { delegate?.nexusEvent(FamilyCreated(family: traits)) } update(familyMembership: traits) } @@ -50,25 +51,26 @@ extension Nexus { case (true, false): add(entityWithId: entityId, toFamilyWithTraits: traits) delegate?.nexusEvent(FamilyMemberAdded(member: entityId, toFamily: traits)) - return case (false, true): remove(entityWithId: entityId, fromFamilyWithTraits: traits) delegate?.nexusEvent(FamilyMemberRemoved(member: entityId, from: traits)) - return default: - return + break } } final func add(entityWithId entityId: EntityIdentifier, toFamilyWithTraits traits: FamilyTraitSet) { - precondition(familyMembersByTraits[traits] != nil) familyMembersByTraits[traits]!.insert(entityId, at: entityId.id) } final func remove(entityWithId entityId: EntityIdentifier, fromFamilyWithTraits traits: FamilyTraitSet) { - precondition(familyMembersByTraits[traits] != nil) familyMembersByTraits[traits]!.remove(at: entityId.id) + if familyMembersByTraits[traits]!.isEmpty { + // delete family if no more entities are present + familyMembersByTraits[traits] = nil + delegate?.nexusEvent(FamilyDestroyed(family: traits)) + } } } diff --git a/Sources/FirebladeECS/NexusEvents.swift b/Sources/FirebladeECS/NexusEvents.swift index e686e6d..d82d1e1 100644 --- a/Sources/FirebladeECS/NexusEvents.swift +++ b/Sources/FirebladeECS/NexusEvents.swift @@ -20,10 +20,6 @@ public struct ComponentAdded: NexusEvent { public let toEntity: EntityIdentifier } -public struct ComponentUpdated: NexusEvent { - public let atEnity: EntityIdentifier -} - public struct ComponentRemoved: NexusEvent { public let component: ComponentIdentifier public let from: EntityIdentifier