예제 #1
0
        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());
        }
예제 #2
0
        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));
            });
        }
예제 #4
0
        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);
        }
예제 #5
0
            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();
                    }
                }));
            }
예제 #6
0
        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);
            });
        }
예제 #7
0
            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));
            }
예제 #8
0
        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);
        }
예제 #9
0
        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());
        }
예제 #10
0
        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();
            });
        }
예제 #11
0
        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());
        }
예제 #12
0
            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));
            }