private static void ReadData() { ArchiveWorker aw = new ArchiveWorker(Memory.Archives.A_BATTLE); string[] test = aw.GetListOfFiles(); battlename = test.First(x => x.ToLower().Contains(battlename)); stageBuffer = ArchiveWorker.GetBinaryFile(Memory.Archives.A_BATTLE, battlename); pbs = new PseudoBufferedStream(stageBuffer); bs_cameraPointer = GetCameraPointer(); pbs.Seek(bs_cameraPointer, 0); ReadCamera(); uint sectionCounter = pbs.ReadUInt(); if (sectionCounter != 6) { Console.WriteLine($"BS_PARSER_PRE_OBJECTSECTION: Main geometry section has no 6 pointers at: {pbs.Tell()}"); battleModule++; return; } MainGeometrySection MainSection = ReadObjectGroupPointers(); ObjectsGroup[] objectsGroups = new ObjectsGroup[4] { ReadObjectsGroup(MainSection.Group1Pointer), ReadObjectsGroup(MainSection.Group2Pointer), ReadObjectsGroup(MainSection.Group3Pointer), ReadObjectsGroup(MainSection.Group4Pointer) }; modelGroups = new ModelGroup[4] { ReadModelGroup(objectsGroups[0].objectListPointer), ReadModelGroup(objectsGroups[1].objectListPointer), ReadModelGroup(objectsGroups[2].objectListPointer), ReadModelGroup(objectsGroups[3].objectListPointer) }; ReadTexture(MainSection.TexturePointer); ReadCharacters(); ReadMonster(); //for frames indexes monsters are first, then after n monsters characters appear with weapons frame = new int[monstersData.Length + charactersData.Length * 2]; battleModule++; }
private static ModelGroup ReadModelGroup(uint pointer) { pbs.Seek(pointer, System.IO.SeekOrigin.Begin); uint modelsCount = pbs.ReadUInt(); Model[] models = new Model[modelsCount]; uint[] modelPointers = new uint[modelsCount]; for (int i = 0; i < modelsCount; i++) { modelPointers[i] = pointer + pbs.ReadUInt(); } for (int i = 0; i < modelsCount; i++) { models[i] = ReadModel(modelPointers[i]); } return(new ModelGroup() { models = models }); }
private void ReadParameters(byte _bpp) { pbs.Seek(3, System.IO.SeekOrigin.Current); if (_bpp == 4) { texture.clutSize = pbs.ReadUInt() - 12; texture.PaletteX = pbs.ReadUShort(); texture.PaletteY = pbs.ReadUShort(); texture.NumOfColours = pbs.ReadUShort(); texture.NumOfCluts = pbs.ReadUShort(); int bppMultiplier = 16; if (texture.NumOfColours != 16 || texture.clutSize != (texture.NumOfCluts * bppMultiplier)) //wmsetus uses 4BPP, but sets 256 colours, but actually is 16, but num of clut is 2* 256/16 WTF? { texture.NumOfCluts = (ushort)(texture.NumOfColours / 16 * texture.NumOfCluts); bppMultiplier = 32; } byte[] buffer = new byte[texture.NumOfCluts * bppMultiplier]; for (int i = 0; i != buffer.Length; i++) { buffer[i] = pbs.ReadByte(); } texture.ClutData = buffer; pbs.Seek(4, System.IO.SeekOrigin.Current); texture.ImageOrgX = pbs.ReadUShort(); texture.ImageOrgY = pbs.ReadUShort(); texture.Width = (ushort)(pbs.ReadUShort() * 4); texture.Height = pbs.ReadUShort(); textureDataPointer = (uint)pbs.Tell(); return; } if (_bpp == 8) { pbs.Seek(4, System.IO.SeekOrigin.Current); texture.PaletteX = pbs.ReadUShort(); texture.PaletteY = pbs.ReadUShort(); pbs.Seek(2, System.IO.SeekOrigin.Current); texture.NumOfCluts = pbs.ReadUShort(); byte[] buffer = new byte[texture.NumOfCluts * 512]; for (int i = 0; i != buffer.Length; i++) { buffer[i] = pbs.ReadByte(); } texture.ClutData = buffer; pbs.Seek(4, System.IO.SeekOrigin.Current); texture.ImageOrgX = pbs.ReadUShort(); texture.ImageOrgY = pbs.ReadUShort(); texture.Width = (ushort)(pbs.ReadUShort() * 2); texture.Height = pbs.ReadUShort(); textureDataPointer = (uint)pbs.Tell(); return; } if (_bpp == 16) { pbs.Seek(4, System.IO.SeekOrigin.Current); texture.ImageOrgX = pbs.ReadUShort(); texture.ImageOrgY = pbs.ReadUShort(); texture.Width = pbs.ReadUShort(); texture.Height = pbs.ReadUShort(); textureDataPointer = (uint)pbs.Tell(); return; } if (_bpp != 24) { return; } pbs.Seek(4, System.IO.SeekOrigin.Current); texture.ImageOrgX = pbs.ReadUShort(); texture.ImageOrgY = pbs.ReadUShort(); texture.Width = (ushort)(pbs.ReadUShort() / 1.5); texture.Height = pbs.ReadUShort(); textureDataPointer = (uint)pbs.Tell(); }