Add managed entity and script component.

Added ManagedEntity and related methods in EntityManager;
Added ScriptComponent to write game play logic in oop;
This commit is contained in:
2025-12-10 16:12:56 +09:00
parent 99c1a1980e
commit 21e85e0c02
17 changed files with 549 additions and 152 deletions

View File

@@ -49,7 +49,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 1; index++)
{
@@ -65,7 +65,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -216,7 +216,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 2; index++)
{
@@ -232,7 +232,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -393,7 +393,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 3; index++)
{
@@ -409,7 +409,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -580,7 +580,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 4; index++)
{
@@ -596,7 +596,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -777,7 +777,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 5; index++)
{
@@ -793,7 +793,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -984,7 +984,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 6; index++)
{
@@ -1000,7 +1000,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -1201,7 +1201,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 7; index++)
{
@@ -1217,7 +1217,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -1428,7 +1428,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 8; index++)
{
@@ -1444,7 +1444,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))

View File

@@ -94,7 +94,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < <#= i #>; index++)
{
@@ -110,7 +110,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))

View File

@@ -72,7 +72,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 1; index++)
{
@@ -88,7 +88,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -246,7 +246,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 2; index++)
{
@@ -262,7 +262,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -430,7 +430,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 3; index++)
{
@@ -446,7 +446,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -624,7 +624,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 4; index++)
{
@@ -640,7 +640,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -828,7 +828,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 5; index++)
{
@@ -844,7 +844,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -1042,7 +1042,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 6; index++)
{
@@ -1058,7 +1058,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -1266,7 +1266,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 7; index++)
{
@@ -1282,7 +1282,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))
@@ -1500,7 +1500,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < 8; index++)
{
@@ -1516,7 +1516,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))

View File

@@ -95,7 +95,7 @@ public unsafe partial struct EntityQuery
{
_currentChunk = ref _currentArchetype.GetChunkReference(chunkIndex);
_chunkBasePtr = _currentChunk.GetUnsafePtr();
_currentChunkEntityCount = _currentChunk.Count;
_currentChunkEntityCount = _currentChunk._count;
for (var index = 0; index < <#= i #>; index++)
{
@@ -111,7 +111,7 @@ public unsafe partial struct EntityQuery
while (true)
{
_currentEntityIndex++;
if (_currentEntityIndex < _currentChunk.Count)
if (_currentEntityIndex < _currentChunk._count)
{
var pChunkData = _currentChunk.GetUnsafePtr();
if (IsEntityValid(pChunkData, _currentEntityIndex, in _currentArchetype, in _mask))

View File

@@ -44,7 +44,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -100,7 +100,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -158,7 +158,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -218,7 +218,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -280,7 +280,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -344,7 +344,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -410,7 +410,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -478,7 +478,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -540,7 +540,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -597,7 +597,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -656,7 +656,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -717,7 +717,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -780,7 +780,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -845,7 +845,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -912,7 +912,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{
@@ -981,7 +981,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{

View File

@@ -61,7 +61,7 @@ public unsafe partial struct EntityQuery
basePtrs[index] = pChunkData + offsets[index];
}
for (var entityIndex = 0; entityIndex < chunk.Count; entityIndex++)
for (var entityIndex = 0; entityIndex < chunk._count; entityIndex++)
{
if (!IsEntityValid(pChunkData, entityIndex, in archetype, in _mask))
{

View File

@@ -798,7 +798,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);
@@ -906,7 +906,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);
@@ -1035,7 +1035,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);
@@ -1185,7 +1185,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);
@@ -1356,7 +1356,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);
@@ -1548,7 +1548,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);
@@ -1761,7 +1761,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);
@@ -1995,7 +1995,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
offsets0.Add(layout0.offset);

View File

@@ -138,7 +138,7 @@ public unsafe partial struct EntityQuery
ref var chunkRef = ref arch.GetChunkReference(i);
chunkList.Add((IntPtr)chunkRef.GetUnsafePtr());
chunkEntityCounts.Add(chunkRef.Count);
chunkEntityCounts.Add(chunkRef._count);
entityOffsets.Add(arch.EntityIDsOffset);
<# for (var j = 0; j < i; j++){ #>