Skip to content

Commit

Permalink
Fix not adding new entity type and not incrementing next entity IDs o…
Browse files Browse the repository at this point in the history
…n event insert
  • Loading branch information
NoahStolk committed Oct 14, 2023
1 parent 5f5184c commit e0b49a0
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/DevilDaggersInfo.Core.Replay/ReplayEventsData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,21 @@ public void InsertEvent(int index, IEvent e)
throw new ArgumentOutOfRangeException(nameof(index));

_events.Insert(index, e);
if (e is IEntitySpawnEvent spawnEvent)
{
// TODO: EntityId should be automatically calculated and not taken from the event.
_entityTypes.Insert(spawnEvent.EntityId, spawnEvent.EntityType);

// Increment all entity IDs that are higher than the added entity ID.
for (int i = 0; i < _events.Count; i++)
{
if (i == index)
continue;

if (_events[i] is IEntitySpawnEvent otherSpawnEvent && otherSpawnEvent.EntityId >= spawnEvent.EntityId)
otherSpawnEvent.EntityId++;
}
}

int? containingTick = null;
for (int i = 0; i < _eventOffsetsPerTick.Count; i++)
Expand Down
129 changes: 129 additions & 0 deletions src/test/DevilDaggersInfo.Core.Replay.Test/ReplayEventsEditingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -300,4 +300,133 @@ public void RemoveAllEventsReverse()

Assert.AreEqual(EntityType.Zero, _replay.EventsData.EntityTypes[0]);
}

[TestMethod]
public void InsertGemEventAtStart()
{
_replay.EventsData.InsertEvent(0, new GemEvent());

// There should be one new event.
Assert.AreEqual(_eventCount + 1, _replay.EventsData.Events.Count);

// There shouldn't be any new ticks or entities.
Assert.AreEqual(_tickCount, _replay.EventsData.EventOffsetsPerTick.Count);
Assert.AreEqual(_entityCount, _replay.EventsData.EntityTypes.Count);

// Original data should be unchanged.
ValidateOriginalEntityTypes();

// Entity IDs should be unchanged, but their indexes should be incremented.
AssertEntityId<SquidSpawnEvent>(_replay.EventsData.Events[3], 1);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[4], 2);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[25], 3);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[46], 4);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[67], 5);

int expectedOffset = 0;
for (int i = 0; i < _tickCount; i++)
{
int offset = _replay.EventsData.EventOffsetsPerTick[i];
Assert.AreEqual(expectedOffset, offset);

expectedOffset++; // Inputs event.

if (i == 0)
expectedOffset += 2; // Hit event 53333... and Gem event.
else if (i == 1)
expectedOffset += 2; // Squid and Skull spawn events.
else if (i is 21 or 41 or 61)
expectedOffset++; // Skull spawn event.
}
}

[TestMethod]
public void InsertGemEvent()
{
_replay.EventsData.InsertEvent(10, new GemEvent());

// There should be one new event.
Assert.AreEqual(_eventCount + 1, _replay.EventsData.Events.Count);

// There shouldn't be any new ticks or entities.
Assert.AreEqual(_tickCount, _replay.EventsData.EventOffsetsPerTick.Count);
Assert.AreEqual(_entityCount, _replay.EventsData.EntityTypes.Count);

// Original data should be unchanged.
ValidateOriginalEntityTypes();

// Entity IDs should be unchanged, but their indexes should be incremented.
AssertEntityId<SquidSpawnEvent>(_replay.EventsData.Events[2], 1);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[3], 2);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[25], 3);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[46], 4);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[67], 5);

int expectedOffset = 0;
for (int i = 0; i < _tickCount; i++)
{
int offset = _replay.EventsData.EventOffsetsPerTick[i];
Assert.AreEqual(expectedOffset, offset);

expectedOffset++; // Inputs event.

if (i == 0)
expectedOffset++; // Hit event 53333...
else if (i == 1)
expectedOffset += 2; // Squid and Skull spawn events.
else if (i == 7)
expectedOffset++; // Gem event.
else if (i is 21 or 41 or 61)
expectedOffset++; // Skull spawn event.
}
}

// TODO: Add tests: InsertSpawnEventAtStart, InsertInputsEventAtStart, InsertInputsEvent.

[TestMethod]
public void InsertSpawnEvent()
{
_replay.EventsData.InsertEvent(10, new ThornSpawnEvent(3, -1, default, 0));

// There should be one new event and one new entity.
Assert.AreEqual(_eventCount + 1, _replay.EventsData.Events.Count);
Assert.AreEqual(_entityCount + 1, _replay.EventsData.EntityTypes.Count);

// There shouldn't be any new ticks.
Assert.AreEqual(_tickCount, _replay.EventsData.EventOffsetsPerTick.Count);

// The new entity should be a Thorn.
Assert.AreEqual(EntityType.Zero, _replay.EventsData.EntityTypes[0]);
Assert.AreEqual(EntityType.Squid1, _replay.EventsData.EntityTypes[1]);
Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[2]);
Assert.AreEqual(EntityType.Thorn, _replay.EventsData.EntityTypes[3]);
Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[4]);
Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[5]);
Assert.AreEqual(EntityType.Skull1, _replay.EventsData.EntityTypes[6]);

AssertEntityId<SquidSpawnEvent>(_replay.EventsData.Events[2], 1);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[3], 2);
AssertEntityId<ThornSpawnEvent>(_replay.EventsData.Events[10], 3);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[25], 4);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[46], 5);
AssertEntityId<BoidSpawnEvent>(_replay.EventsData.Events[67], 6);

int expectedOffset = 0;
for (int i = 0; i < _tickCount; i++)
{
int offset = _replay.EventsData.EventOffsetsPerTick[i];
Assert.AreEqual(expectedOffset, offset);

expectedOffset++; // Inputs event.

if (i == 0)
expectedOffset++; // Hit event 53333...
else if (i == 1)
expectedOffset += 2; // Squid and Skull spawn events.
else if (i == 7)
expectedOffset++; // Thorn spawn event.
else if (i is 21 or 41 or 61)
expectedOffset++; // Skull spawn event.
}
}
}

0 comments on commit e0b49a0

Please sign in to comment.