diff --git a/encompass-cs/Engine.cs b/encompass-cs/Engine.cs index dff9496..093e0cd 100644 --- a/encompass-cs/Engine.cs +++ b/encompass-cs/Engine.cs @@ -118,7 +118,7 @@ namespace Encompass componentMessage.entity = entity; componentMessage.componentID = componentID; componentMessage.component = component; - EmitMessage(componentMessage); + SendMessage(componentMessage); return componentID; } @@ -136,7 +136,7 @@ namespace Encompass componentMessage.entity = entity; componentMessage.componentID = componentID; componentMessage.component = component; - EmitMessage(componentMessage); + SendMessage(componentMessage); return componentID; } @@ -155,7 +155,7 @@ namespace Encompass componentMessage.entity = entity; componentMessage.componentID = componentID; componentMessage.component = component; - EmitMessage(componentMessage); + SendMessage(componentMessage); componentManager.Activate(componentID); } @@ -205,7 +205,7 @@ namespace Encompass UpdateComponentInWorld(componentID, newComponentValue); } - protected void EmitMessage(TMessage message) where TMessage : struct, IMessage + protected void SendMessage(TMessage message) where TMessage : struct, IMessage { if (!sendTypes.Contains(typeof(TMessage))) { diff --git a/encompass-cs/Engines/ComponentMessageEmitter.cs b/encompass-cs/Engines/ComponentMessageEmitter.cs index 3606652..8bd709e 100644 --- a/encompass-cs/Engines/ComponentMessageEmitter.cs +++ b/encompass-cs/Engines/ComponentMessageEmitter.cs @@ -23,7 +23,7 @@ namespace Encompass.Engines componentMessage.entity = entity; componentMessage.componentID = componentID; componentMessage.component = component; - EmitMessage(componentMessage); + SendMessage(componentMessage); } } } diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index 1063955..bbf561f 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -80,13 +80,18 @@ namespace Encompass engine.sendTypes.Add(activateType); } - var messageReadTypes = engine.readTypes.Where((type) => type.GetInterfaces().Contains(typeof(IMessage))); + var messageReadTypes = engine.readTypes; var messageSendTypes = engine.sendTypes; - if (messageReadTypes.Intersect(messageSendTypes).Any()) + foreach (var messageType in messageReadTypes.Intersect(messageSendTypes)) { - var type = messageReadTypes.Intersect(messageSendTypes).First(); - throw new EngineMessageSelfCycleException("Engine {0} both reads and writes Message {1}", engine.GetType().Name, type.Name); + // ComponentMessages can safely self-cycle + // this does introduce a gotcha though: if you AddComponent and then HasComponent or GetComponent you will receive a false negative + // there is no point to doing this but it is a gotcha i suppose + if (!(messageType.IsGenericType && messageType.GetGenericTypeDefinition() == typeof(ComponentMessage<>))) + { + throw new EngineMessageSelfCycleException("Engine {0} both reads and writes Message {1}", engine.GetType().Name, messageType.Name); + } } if (messageSendTypes.Any()) diff --git a/test/ComponentTest.cs b/test/ComponentTest.cs index c10ff29..76ba357 100644 --- a/test/ComponentTest.cs +++ b/test/ComponentTest.cs @@ -104,7 +104,7 @@ namespace Tests AddMockComponentMessage addMockComponentMessage; addMockComponentMessage.entity = entity; addMockComponentMessage.mockComponent = mockComponent; - EmitMessage(addMockComponentMessage); + SendMessage(addMockComponentMessage); } } @@ -376,14 +376,14 @@ namespace Tests CheckHasMockComponentMessage checkHasMockComponentMessage; checkHasMockComponentMessage.entity = entity; checkHasMockComponentMessage.shouldHaveComponent = true; - EmitMessage(checkHasMockComponentMessage); + SendMessage(checkHasMockComponentMessage); } else { CheckHasMockComponentMessage checkHasMockComponentMessage; checkHasMockComponentMessage.entity = entity; checkHasMockComponentMessage.shouldHaveComponent = false; - EmitMessage(checkHasMockComponentMessage); + SendMessage(checkHasMockComponentMessage); } } } @@ -457,7 +457,7 @@ namespace Tests CheckHasMockComponentMessage checkHasMockComponentMessage; checkHasMockComponentMessage.entity = entity; checkHasMockComponentMessage.shouldHaveComponent = true; - EmitMessage(checkHasMockComponentMessage); + SendMessage(checkHasMockComponentMessage); } } } @@ -538,14 +538,14 @@ namespace Tests CheckHasMockComponentMessage checkHasMockComponentMessage; checkHasMockComponentMessage.entity = entity; checkHasMockComponentMessage.shouldHaveComponent = true; - EmitMessage(checkHasMockComponentMessage); + SendMessage(checkHasMockComponentMessage); } else { CheckHasMockComponentMessage checkHasMockComponentMessage; checkHasMockComponentMessage.entity = entity; checkHasMockComponentMessage.shouldHaveComponent = false; - EmitMessage(checkHasMockComponentMessage); + SendMessage(checkHasMockComponentMessage); } } } diff --git a/test/EngineTest.cs b/test/EngineTest.cs index 59e9a04..ef882c1 100644 --- a/test/EngineTest.cs +++ b/test/EngineTest.cs @@ -208,7 +208,7 @@ namespace Tests MockMessage message; message.myString = "howdy"; - this.EmitMessage(message); + this.SendMessage(message); } } @@ -242,7 +242,7 @@ namespace Tests MockMessage message; message.myString = "howdy"; - this.EmitMessage(message); + this.SendMessage(message); } } @@ -292,7 +292,7 @@ namespace Tests MockMessage message; message.myString = "howdy"; - this.EmitMessage(message); + this.SendMessage(message); } } diff --git a/test/SpawnerTest.cs b/test/SpawnerTest.cs index 3d9b7d6..1ca1a00 100644 --- a/test/SpawnerTest.cs +++ b/test/SpawnerTest.cs @@ -19,7 +19,7 @@ namespace Tests { public override void Update(double dt) { - EmitMessage(new SpawnMessageA()); + SendMessage(new SpawnMessageA()); } } diff --git a/test/WorldBuilderTest.cs b/test/WorldBuilderTest.cs index adb9231..d7753e9 100644 --- a/test/WorldBuilderTest.cs +++ b/test/WorldBuilderTest.cs @@ -20,7 +20,7 @@ namespace Tests public override void Update(double dt) { BMessage message; - this.EmitMessage(message); + this.SendMessage(message); } } @@ -31,7 +31,7 @@ namespace Tests public override void Update(double dt) { AMessage message; - this.EmitMessage(message); + this.SendMessage(message); } } @@ -60,7 +60,7 @@ namespace Tests public override void Update(double dt) { BMessage message; - this.EmitMessage(message); + this.SendMessage(message); } } @@ -71,7 +71,7 @@ namespace Tests public override void Update(double dt) { CMessage message; - this.EmitMessage(message); + this.SendMessage(message); } } @@ -82,7 +82,7 @@ namespace Tests public override void Update(double dt) { DMessage message; - this.EmitMessage(message); + this.SendMessage(message); } } @@ -93,7 +93,7 @@ namespace Tests public override void Update(double dt) { AMessage message; - this.EmitMessage(message); + this.SendMessage(message); } }