public void PlacedObjectInCell() { var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimSE); var block = new CellBlock() { BlockNumber = 2, GroupType = GroupTypeEnum.InteriorCellBlock, }; var subBlock = new CellSubBlock() { BlockNumber = 4, GroupType = GroupTypeEnum.InteriorCellSubBlock, }; block.SubBlocks.Add(subBlock); mod.Cells.Records.Add(block); var cell1 = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); var cell2 = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); subBlock.Cells.Add(cell1); subBlock.Cells.Add(cell2); var block2 = new CellBlock() { BlockNumber = 5, GroupType = GroupTypeEnum.InteriorCellBlock, }; var subBlock2 = new CellSubBlock() { BlockNumber = 8, GroupType = GroupTypeEnum.InteriorCellSubBlock, }; block2.SubBlocks.Add(subBlock2); mod.Cells.Records.Add(block2); var cell3 = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); subBlock2.Cells.Add(cell3); var placedNpc = new PlacedNpc(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell2.Persistent.Add(placedNpc); var placedObj = new PlacedObject(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell2.Persistent.Add(placedObj); var cache = mod.ToImmutableLinkCache(); var contexts = mod.EnumerateMajorRecordContexts <IPlacedObject, IPlacedObjectGetter>(linkCache: cache).ToArray(); contexts.Should().HaveCount(1); var mod2 = new SkyrimMod(TestConstants.PluginModKey2, SkyrimRelease.SkyrimSE); var placedObjOverride = contexts[0].GetOrAddAsOverride(mod2); Assert.Equal(placedObj.FormKey, placedObjOverride.FormKey); mod2.Cells.Records.Should().HaveCount(1); mod2.Cells.Records.First().SubBlocks.Should().HaveCount(1); mod2.Cells.Records.First().SubBlocks.First().Cells.Should().HaveCount(1); mod2.Cells.Records.First().SubBlocks.First().Cells.First().Persistent.Should().HaveCount(1); Assert.Same(placedObjOverride, mod2.Cells.Records.First().SubBlocks.First().Cells.First().Persistent.First()); }
public void EnumerateDeepMajorRecordType() { var mod = new OblivionMod(Utility.PluginModKey); var placed = new PlacedNpc(mod); mod.Cells.Records.Add(new CellBlock() { BlockNumber = 0, GroupType = GroupTypeEnum.InteriorCellBlock, LastModified = 4, SubBlocks = { new CellSubBlock() { BlockNumber = 0, GroupType = GroupTypeEnum.InteriorCellSubBlock, LastModified = 4, Cells = { new Cell(mod.GetNextFormKey()) { Persistent = { placed } } } } } }); var conv = ConvertMod(mod); conv.EnumerateMajorRecords <IOblivionMajorRecordGetter>().Any(p => p.FormKey == placed.FormKey).Should().BeTrue(); }
public void FormLink_Direct_Resolve_MarkerInterface_DeepRecord_Linked(LinkCacheTestTypes cacheType) { var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimLE); var worldspace = mod.Worldspaces.AddNew(); var subBlock = new WorldspaceSubBlock(); var cell = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimLE); subBlock.Items.Add(cell); var placedNpc = new PlacedNpc(mod.GetNextFormKey(), SkyrimRelease.SkyrimLE); cell.Temporary.Add(placedNpc); var block = new WorldspaceBlock(); block.Items.Add(subBlock); worldspace.SubCells.Add(block); var(style, package) = GetLinkCache(mod, cacheType); var placedFormLink = new FormLink <IPlacedGetter>(placedNpc.FormKey); WrapPotentialThrow(cacheType, style, () => { Assert.Same(placedNpc, placedFormLink.TryResolve(package)); }); var cellFormLink = new FormLink <ICellGetter>(cell.FormKey); WrapPotentialThrow(cacheType, style, () => { Assert.Same(cell, cellFormLink.TryResolve(package)); }); var worldspaceFormLink = new FormLink <IWorldspaceGetter>(worldspace.FormKey); WrapPotentialThrow(cacheType, style, () => { Assert.Same(worldspace, worldspaceFormLink.TryResolve(package)); }); }
public void ParentRefs() { WarmupSkyrim.Init(); var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimSE); var worldspace = mod.Worldspaces.AddNew(); var block = new WorldspaceBlock() { BlockNumberX = 2, BlockNumberY = 3, GroupType = GroupTypeEnum.ExteriorCellBlock, }; var subBlock = new WorldspaceSubBlock() { BlockNumberX = 4, BlockNumberY = 5, GroupType = GroupTypeEnum.ExteriorCellSubBlock, }; block.Items.Add(subBlock); worldspace.SubCells.Add(block); var cell = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); subBlock.Items.Add(cell); var placedNpc = new PlacedNpc(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell.Persistent.Add(placedNpc); var placedObj = new PlacedObject(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell.Persistent.Add(placedObj); var cache = mod.ToImmutableLinkCache(); var contexts = mod.EnumerateMajorRecordContexts <IPlacedObject, IPlacedObjectGetter>(linkCache: cache).ToArray(); contexts.Should().HaveCount(1); var baseContext = contexts[0]; var cellContext = baseContext.Parent; cellContext.Should().BeOfType(typeof(ModContext <ISkyrimMod, ISkyrimModGetter, ICell, ICellGetter>)); cellContext !.Record.Should().Be(cell); var subBlockContext = cellContext.Parent; subBlockContext !.Record.Should().Be(subBlock); var blockContext = subBlockContext.Parent; blockContext !.Record.Should().Be(block); var worldspaceContext = blockContext.Parent; worldspaceContext !.Record.Should().Be(worldspace); baseContext.IsUnderneath <IWorldspaceGetter>().Should().BeTrue(); baseContext.TryGetParent <IWorldspaceGetter>(out var worldParent).Should().BeTrue(); worldParent.Should().Be(worldspace); baseContext.TryGetParentContext <IWorldspace, IWorldspaceGetter>(out var worldParentContext).Should().BeTrue(); worldParentContext !.Record.Should().Be(worldspace); }
static void ParseTypical( MutagenFrame frame, ICellInternal obj, IList <IPlaced> coll, bool persistentParse) { var groupMeta = frame.ReadGroup(); var formKey = FormKey.Factory(frame.MetaData.MasterReferences !, BinaryPrimitives.ReadUInt32LittleEndian(groupMeta.ContainedRecordTypeData)); if (formKey != obj.FormKey) { throw new ArgumentException("Cell children group did not match the FormID of the parent cell."); } if (persistentParse) { obj.PersistentTimestamp = groupMeta.LastModifiedData.Int32(); } else { obj.VisibleWhenDistantTimestamp = groupMeta.LastModifiedData.Int32(); } coll.AddRange( ListBinaryTranslation <IPlaced> .Instance.Parse( reader: frame, transl: (MutagenFrame r, RecordType header, out IPlaced placed) => { switch (header.TypeInt) { case 0x45524341: // "ACRE": placed = PlacedCreature.CreateFromBinary(r); return(true); case 0x52484341: //"ACHR": placed = PlacedNpc.CreateFromBinary(r); return(true); case 0x52464552: // "REFR": placed = PlacedObject.CreateFromBinary(r); return(true); default: throw new NotImplementedException(); } })); }
public void FormLink_LoadOrder_TryResolve_DeepRecord_Linked(LinkCacheTestTypes cacheType) { var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimLE); var worldspace = mod.Worldspaces.AddNew(); var subBlock = new WorldspaceSubBlock(); var cell = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimLE); subBlock.Items.Add(cell); var placedNpc = new PlacedNpc(mod.GetNextFormKey(), SkyrimRelease.SkyrimLE); cell.Temporary.Add(placedNpc); var block = new WorldspaceBlock(); block.Items.Add(subBlock); worldspace.SubCells.Add(block); var loadOrder = new LoadOrder <ISkyrimModGetter>() { mod, new SkyrimMod(TestConstants.PluginModKey2, SkyrimRelease.SkyrimLE), }; var(style, package) = GetLinkCache(loadOrder, cacheType); FormLink <IPlacedNpc> placedFormLink = new FormLink <IPlacedNpc>(placedNpc.FormKey); WrapPotentialThrow(cacheType, style, () => { Assert.True(placedFormLink.TryResolve(package, out var linkedPlacedNpc)); Assert.Same(placedNpc, linkedPlacedNpc); }); FormLink <ICell> cellFormLink = new FormLink <ICell>(cell.FormKey); WrapPotentialThrow(cacheType, style, () => { Assert.True(cellFormLink.TryResolve(package, out var linkedCell)); Assert.Same(cell, linkedCell); }); FormLink <IWorldspace> worldspaceFormLink = new FormLink <IWorldspace>(worldspace.FormKey); WrapPotentialThrow(cacheType, style, () => { Assert.True(worldspaceFormLink.TryResolve(package, out var linkedWorldspace)); Assert.Same(worldspace, linkedWorldspace); }); }
static void ParseTemporary(MutagenFrame frame, ICellInternal obj) { var groupMeta = frame.ReadGroup(); var formKey = FormKey.Factory(frame.MetaData.MasterReferences !, BinaryPrimitives.ReadUInt32LittleEndian(groupMeta.ContainedRecordTypeData)); if (formKey != obj.FormKey) { throw new ArgumentException("Cell children group did not match the FormID of the parent cell."); } obj.TemporaryTimestamp = BinaryPrimitives.ReadInt32LittleEndian(groupMeta.LastModifiedData); var items = ListBinaryTranslation <IPlaced> .Instance.Parse( reader : frame, transl : (MutagenFrame r, RecordType header, out IPlaced placed) => { switch (header.TypeInt) { case 0x45524341: // "ACRE": placed = PlacedCreature.CreateFromBinary(r); return(true); case 0x52484341: //"ACHR": placed = PlacedNpc.CreateFromBinary(r); return(true); case 0x52464552: // "REFR": placed = PlacedObject.CreateFromBinary(r); return(true); default: if (ParseTemporaryOutliers(frame, obj)) { placed = null !; return(false); } throw new NotImplementedException(); } placed = null !; return(false); }); obj.Temporary.SetTo(new ExtendedList <IPlaced>(items)); }
public void SetModKeys() { WarmupSkyrim.Init(); var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimSE); var worldspace = mod.Worldspaces.AddNew(); var block = new WorldspaceBlock() { BlockNumberX = 2, BlockNumberY = 3, GroupType = GroupTypeEnum.ExteriorCellBlock, }; var subBlock = new WorldspaceSubBlock() { BlockNumberX = 4, BlockNumberY = 5, GroupType = GroupTypeEnum.ExteriorCellSubBlock, }; block.Items.Add(subBlock); worldspace.SubCells.Add(block); var cell = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); subBlock.Items.Add(cell); var placedNpc = new PlacedNpc(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell.Persistent.Add(placedNpc); var placedObj = new PlacedObject(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell.Persistent.Add(placedObj); var cache = mod.ToImmutableLinkCache(); var contexts = mod.EnumerateMajorRecordContexts <IPlacedObject, IPlacedObjectGetter>(linkCache: cache).ToArray(); contexts.Should().HaveCount(1); contexts[0].ModKey.Should().Be(TestConstants.PluginModKey); }
public void EnumerateDeepLinkInterface() { var mod = new OblivionMod(Utility.PluginModKey); var placed = new PlacedNpc(mod); mod.Cells.Records.Add(new CellBlock() { BlockNumber = 0, GroupType = GroupTypeEnum.InteriorCellBlock, LastModified = 4, SubBlocks = { new CellSubBlock() { BlockNumber = 0, GroupType = GroupTypeEnum.InteriorCellSubBlock, LastModified = 4, Cells = { new Cell(mod.GetNextFormKey()) { Persistent = { placed } } } } } }); var conv = ConvertMod(mod); Assert.NotEmpty(conv.EnumerateMajorRecords <ICellGetter>()); Assert.NotEmpty(conv.EnumerateMajorRecords <IPlacedGetter>()); Assert.Equal(Getter ? 0 : 1, conv.EnumerateMajorRecords <IPlaced>().Count()); }
public void FormLink_Direct_TryResolveContext_DeepRecord_Linked(LinkCacheTestTypes cacheType, AContextRetriever contextRetriever) { var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimLE); var worldspace = mod.Worldspaces.AddNew(); var subBlock = new WorldspaceSubBlock(); var cell = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimLE); subBlock.Items.Add(cell); var placedNpc = new PlacedNpc(mod.GetNextFormKey(), SkyrimRelease.SkyrimLE); cell.Temporary.Add(placedNpc); var block = new WorldspaceBlock(); block.Items.Add(subBlock); worldspace.SubCells.Add(block); var(style, package) = GetLinkCache(mod, cacheType); var placedFormLink = new FormLink <IPlacedNpcGetter>(placedNpc.FormKey); WrapPotentialThrow(cacheType, style, () => { Assert.True(contextRetriever.TryResolveContext <IPlacedNpc, IPlacedNpcGetter>(placedFormLink, package, out var linkedPlacedNpc)); linkedPlacedNpc.Record.Should().BeSameAs(placedNpc); linkedPlacedNpc.ModKey.Should().Be(TestConstants.PluginModKey); linkedPlacedNpc.Parent.Record.Should().Be(cell); var cellFormLink = new FormLink <ICellGetter>(cell.FormKey); Assert.True(contextRetriever.TryResolveContext <ICell, ICellGetter>(cellFormLink, package, out var linkedCell)); linkedCell.Record.Should().BeSameAs(cell); linkedCell.ModKey.Should().Be(TestConstants.PluginModKey); linkedCell.Parent.Record.Should().Be(subBlock); var worldspaceFormLink = new FormLink <IWorldspaceGetter>(worldspace.FormKey); Assert.True(contextRetriever.TryResolveContext <IWorldspace, IWorldspaceGetter>(worldspaceFormLink, package, out var linkedWorldspace)); linkedWorldspace.Record.Should().BeSameAs(worldspace); linkedWorldspace.ModKey.Should().Be(TestConstants.PluginModKey); linkedWorldspace.Parent.Should().BeNull(); }); }
public void IPlacedInWorldspace() { WarmupSkyrim.Init(); var mod = new SkyrimMod(TestConstants.PluginModKey, SkyrimRelease.SkyrimSE); var worldspace = mod.Worldspaces.AddNew(); var block = new WorldspaceBlock() { BlockNumberX = 2, BlockNumberY = 3, GroupType = GroupTypeEnum.ExteriorCellBlock, }; var subBlock = new WorldspaceSubBlock() { BlockNumberX = 4, BlockNumberY = 5, GroupType = GroupTypeEnum.ExteriorCellSubBlock, }; block.Items.Add(subBlock); worldspace.SubCells.Add(block); var cell1 = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); var cell2 = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); subBlock.Items.Add(cell1); subBlock.Items.Add(cell2); var block2 = new WorldspaceBlock() { BlockNumberX = 5, BlockNumberY = 6, GroupType = GroupTypeEnum.ExteriorCellBlock, }; var subBlock2 = new WorldspaceSubBlock() { BlockNumberX = 8, BlockNumberY = 9, GroupType = GroupTypeEnum.ExteriorCellSubBlock, }; block2.Items.Add(subBlock2); worldspace.SubCells.Add(block2); var cell3 = new Cell(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); subBlock2.Items.Add(cell3); var placedNpc = new PlacedNpc(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell2.Persistent.Add(placedNpc); var placedObj = new PlacedObject(mod.GetNextFormKey(), SkyrimRelease.SkyrimSE); cell2.Persistent.Add(placedObj); var cache = mod.ToImmutableLinkCache(); var contexts = mod.EnumerateMajorRecordContexts <IPlaced, IPlacedGetter>(linkCache: cache).ToArray(); Assert.Equal(2, contexts.Length); var mod2 = new SkyrimMod(TestConstants.PluginModKey2, SkyrimRelease.SkyrimSE); var placedNpcOverride = contexts[0].GetOrAddAsOverride(mod2); var placedObjOverride = contexts[1].GetOrAddAsOverride(mod2); Assert.Equal(placedNpc.FormKey, placedNpcOverride.FormKey); Assert.Equal(placedObj.FormKey, placedObjOverride.FormKey); mod2.Worldspaces.Should().HaveCount(1); mod2.Worldspaces.First().SubCells.Should().HaveCount(1); mod2.Worldspaces.First().SubCells.First().Items.Should().HaveCount(1); mod2.Worldspaces.First().SubCells.First().Items.First().Items.Should().HaveCount(1); mod2.Worldspaces.First().SubCells.First().Items.First().Items.First().Persistent.Should().HaveCount(2); Assert.Same(placedNpcOverride, mod2.Worldspaces.First().SubCells.First().Items.First().Items.First().Persistent.First()); }
static void ParseTemporary(MutagenFrame frame, ICellInternal obj) { var groupMeta = frame.ReadGroup(); var formKey = FormKey.Factory(frame.MetaData.MasterReferences !, BinaryPrimitives.ReadUInt32LittleEndian(groupMeta.ContainedRecordTypeData)); if (formKey != obj.FormKey) { throw new ArgumentException("Cell children group did not match the FormID of the parent cell."); } obj.TemporaryTimestamp = BinaryPrimitives.ReadInt32LittleEndian(groupMeta.LastModifiedData); obj.TemporaryUnknownGroupData = BinaryPrimitives.ReadInt32LittleEndian(groupMeta.HeaderData.Slice(groupMeta.HeaderData.Length - 4)); var items = ListBinaryTranslation <IPlaced> .Instance.Parse( reader : frame, transl : (MutagenFrame r, RecordType header, out IPlaced placed) => { switch (header.TypeInt) { case RecordTypeInts.ACHR: placed = PlacedNpc.CreateFromBinary(r); return(true); case RecordTypeInts.REFR: placed = PlacedObject.CreateFromBinary(r); return(true); case RecordTypeInts.PARW: placed = PlacedArrow.CreateFromBinary(r); return(true); case RecordTypeInts.PBAR: placed = PlacedBarrier.CreateFromBinary(r); return(true); case RecordTypeInts.PBEA: placed = PlacedBeam.CreateFromBinary(r); return(true); case RecordTypeInts.PCON: placed = PlacedCone.CreateFromBinary(r); return(true); case RecordTypeInts.PFLA: placed = PlacedFlame.CreateFromBinary(r); return(true); case RecordTypeInts.PHZD: placed = PlacedHazard.CreateFromBinary(r); return(true); case RecordTypeInts.PMIS: placed = PlacedMissile.CreateFromBinary(r); return(true); case RecordTypeInts.PGRE: placed = PlacedTrap.CreateFromBinary(r); return(true); default: if (ParseTemporaryOutliers(frame, obj)) { placed = null !; return(false); } throw new NotImplementedException(); } }); obj.Temporary.SetTo(new ExtendedList <IPlaced>(items)); }