internal WarpDestGroup(Project p, int id) : base(p, id) { fileParser = Project.GetFileWithLabel("warpDestTable"); Data tmp = fileParser.GetData("warpDestTable", id * 2); string label = tmp.GetValue(0); WarpDestData data = fileParser.GetData(label) as WarpDestData; warpDestDataList = new List <WarpDestData>(); while (data != null) { data.DestGroup = this; data.DestIndex = warpDestDataList.Count; warpDestDataList.Add(data); FileComponent component = data.Next; data = null; while (component != null) { if (component is Label) { data = null; break; } else if (component is Data) { data = component as WarpDestData; break; } component = component.Next; } } }
void SetMainGfx(int index) { graphicsState.RemoveGfxHeaderType(GfxHeaderType.Main); FileParser gfxHeaderFile = Project.GetFileWithLabel("gfxHeaderTable"); Data pointerData = gfxHeaderFile.GetData("gfxHeaderTable", index * 2); GfxHeaderData header = gfxHeaderFile.GetData(pointerData.GetValue(0)) as GfxHeaderData; if (header != null) { bool next = true; while (next) { graphicsState.AddGfxHeader(header, GfxHeaderType.Main); next = false; if (header.ShouldHaveNext) { GfxHeaderData nextHeader = header.NextData as GfxHeaderData; if (nextHeader != null) { header = nextHeader; next = true; } // Might wanna print a warning if no next value is found } } } InvalidateAllTiles(); }
internal WarpDestGroup(Project p, int id) : base(p,id) { fileParser = Project.GetFileWithLabel("warpDestTable"); Data tmp = fileParser.GetData("warpDestTable", id*2); string label = tmp.GetValue(0); WarpDestData data = fileParser.GetData(label) as WarpDestData; warpDestDataList = new List<WarpDestData>(); while (data != null) { data.DestGroup = this; data.DestIndex = warpDestDataList.Count; warpDestDataList.Add(data); FileComponent component = data.Next; data = null; while (component != null) { if (component is Label) { data = null; break; } else if (component is Data) { data = component as WarpDestData; break; } component = component.Next; } } }
internal Dungeon(Project p, int i) : base(p, i) { FileParser dungeonDataFile = Project.GetFileWithLabel("dungeonDataTable"); Data pointerData = dungeonDataFile.GetData("dungeonDataTable", Index * 2); string label = pointerData.GetValue(0); dataStart = dungeonDataFile.GetData(label); }
public PaletteHeaderData(Project p, string command, IEnumerable <string> values, FileParser parser, IList <int> spacing) : base(p, command, values, 3, parser, spacing) { int dest = -1; try { dest = Project.EvalToInt(GetValue(2)); } catch (FormatException) { dest = -1; } if (dest != -1) { sourceFromRam = true; } else { paletteDataFile = Project.GetFileWithLabel(GetValue(2)); if (!(paletteDataFile.GetData(GetValue(2)) is RgbData)) { throw new Exception("Label \"" + GetValue(2) + "\" was expected to reference data defined with m_RGB16"); } } }
internal WarpSourceGroup(Project p, int id) : base(p,id) { fileParser = Project.GetFileWithLabel("warpSourcesTable"); Data d = fileParser.GetData("warpSourcesTable", id*2); string label = d.GetValue(0); warpSourceDataList = new List<WarpSourceData>(); WarpSourceData warpData = fileParser.GetData(label) as WarpSourceData; while (warpData != null && warpData.WarpSourceType != WarpSourceType.WarpSourcesEnd) { warpSourceDataList.Add(warpData); warpData = warpData.NextData as WarpSourceData; } if (warpData != null) warpSourceDataList.Add(warpData); // WarpSourcesEnd }
void SetUniqueGfx(int index) { graphicsState.RemoveGfxHeaderType(GfxHeaderType.Unique); if (index != 0) { FileParser uniqueGfxHeaderFile = Project.GetFileWithLabel("uniqueGfxHeadersStart"); GfxHeaderData header = uniqueGfxHeaderFile.GetData("uniqueGfxHeader" + index.ToString("x2")) as GfxHeaderData; if (header != null) { bool next = true; while (next) { graphicsState.AddGfxHeader(header, GfxHeaderType.Unique); next = false; if (header.ShouldHaveNext) { GfxHeaderData nextHeader = header.NextData as GfxHeaderData; if (nextHeader != null) { header = nextHeader; next = true; } // Might wanna print a warning if no next value is found } } } } InvalidateAllTiles(); }
public GfxHeaderData GetGfxHeader(int i) { int index = gfxHeaderIndices[i]; FileParser parser = Project.GetFileWithLabel("animationGfxHeaders"); var header = parser.GetData("animationGfxHeaders") as GfxHeaderData; for (int j=0; j<index; j++) header = header.NextData as GfxHeaderData; return header; }
internal AnimationGroup(Project p, int i) : base(p, i) { FileParser parser = Project.GetFileWithLabel("animationGroupTable"); Data pointer = parser.GetData("animationGroupTable", 2 * Index); string label = pointer.GetValue(0); Data data = parser.GetData(label); int b1 = Project.EvalToInt(data.GetValue(0)); data = data.NextData; int bits = b1 & 0xf; if (bits >= 0xf) { _numAnimations = 4; } else if (bits >= 0x7) { _numAnimations = 3; } else if (bits >= 0x3) { _numAnimations = 2; } else if (bits >= 0x1) { _numAnimations = 1; } else { _numAnimations = 0; } for (int j = 0; j < NumAnimations; j++) { if (data.CommandLowerCase != ".dw") { throw new Exception("Malformatted animation group data (index 0x" + Index.ToString("x") + "\n"); } animations[j] = Project.GetDataType <Animation>(data.GetValue(0)); data = data.NextData; } }
internal WarpSourceGroup(Project p, int id) : base(p, id) { fileParser = Project.GetFileWithLabel("warpSourcesTable"); Data d = fileParser.GetData("warpSourcesTable", id * 2); string label = d.GetValue(0); warpSourceDataList = new List <WarpSourceData>(); WarpSourceData warpData = fileParser.GetData(label) as WarpSourceData; while (warpData != null && warpData.WarpSourceType != WarpSourceType.WarpSourcesEnd) { warpSourceDataList.Add(warpData); warpData = warpData.NextData as WarpSourceData; } if (warpData != null) { warpSourceDataList.Add(warpData); // WarpSourcesEnd } }
internal Animation(Project p, string label) : base(p, label) { FileParser parser = Project.GetFileWithLabel(label); Data data = parser.GetData(label); while (data != null && data.CommandLowerCase == ".db") { counters.Add(Project.EvalToInt(data.GetValue(0))); data = data.NextData; if (data.CommandLowerCase != ".db") throw new Exception("Malformatted animation data"); gfxHeaderIndices.Add(Project.EvalToInt(data.GetValue(0))); data = data.NextData; } }
internal ObjectGroup(Project p, String id) : base(p, id) { parser = Project.GetFileWithLabel(Identifier); ObjectData data = parser.GetData(Identifier) as ObjectData; while (data.GetObjectType() != ObjectType.End && data.GetObjectType() != ObjectType.EndPointer) { objectDataList.Add(data); data = data.NextData as ObjectData; } objectDataList.Add(data); }
PaletteHeaderGroup(Project project, int index) : base(project, index) { FileParser palettePointerFile = project.GetFileWithLabel("paletteHeaderTable"); Data headerPointerData = palettePointerFile.GetData("paletteHeaderTable", index * 2); FileParser paletteHeaderFile = project.GetFileWithLabel(headerPointerData.GetValue(0)); Data headerData = paletteHeaderFile.GetData(headerPointerData.GetValue(0)); if (!(headerData is PaletteHeaderData)) { throw new Exception("Expected palette header group " + index.ToString("X") + " to start with palette header data"); } firstPaletteHeader = (PaletteHeaderData)headerData; }
internal Area(Project p, int i) : base(p, i) { areaFile = Project.GetFileWithLabel("areaData"); areaData = areaFile.GetData("areaData", Index * 8); // If this is Seasons, it's possible that areaData does not point to 8 bytes as // expected, but instead to an "m_SeasonalData" macro. if (areaData.CommandLowerCase == "m_seasonalarea") { int season = 0; areaData = Project.GetData(areaData.GetValue(0), season * 8); } // Initialize graphics state graphicsState = new GraphicsState(); // Global palettes PaletteHeaderGroup globalPaletteHeaderGroup = Project.GetIndexedDataType <PaletteHeaderGroup>(0xf); graphicsState.AddPaletteHeaderGroup(globalPaletteHeaderGroup, PaletteGroupType.Common); Data data = areaData; flags1 = p.EvalToInt(data.GetValue(0)); data = data.NextData; flags2 = p.EvalToInt(data.GetValue(0)); data = data.NextData; SetUniqueGfx(Project.EvalToInt(data.GetValue(0))); data = data.NextData; SetMainGfx(Project.EvalToInt(data.GetValue(0))); data = data.NextData; SetPaletteHeader(Project.EvalToInt(data.GetValue(0))); data = data.NextData; SetTileset(Project.EvalToInt(data.GetValue(0))); data = data.NextData; layoutGroup = Project.EvalToInt(data.GetValue(0)); data = data.NextData; SetAnimation((byte)Project.EvalToInt(data.GetValue(0))); }
internal TilesetHeaderGroup(Project p, int i) : base(p, i) { FileParser tableFile = Project.GetFileWithLabel("tilesetHeaderGroupTable"); Data pointerData = tableFile.GetData("tilesetHeaderGroupTable", Index * 2); string labelName = pointerData.GetValue(0); FileParser headerFile = Project.GetFileWithLabel(labelName); TilesetHeaderData headerData = headerFile.GetData(labelName) as TilesetHeaderData; bool next = true; while (next) { if (headerData == null) { throw new Exception("Expected tileset header group " + Index.ToString("X") + " to reference tileset header data (m_TilesetHeader)"); } Stream dataFile = headerData.ReferencedData; dataFile.Position = 0; if (headerData.DestAddress == Project.EvalToInt("w3TileMappingIndices")) { // Mappings mappingsDataFile = dataFile; } else if (headerData.DestAddress == Project.EvalToInt("w3TileCollisions")) { // Collisions collisionsDataFile = dataFile; } if (headerData.ShouldHaveNext()) { headerData = headerData.NextData as TilesetHeaderData; if (headerData != null) { next = true; } } else { next = false; } } }
void UpdateRoomData() { // Get the tileDataFile int layoutGroup = area.LayoutGroup; string label = "room" + ((layoutGroup << 8) + (Index & 0xff)).ToString("X4").ToLower(); FileParser parserFile = Project.GetFileWithLabel(label); Data data = parserFile.GetData(label); if (data.CommandLowerCase != "m_roomlayoutdata") { throw new Exception("Expected label \"" + label + "\" to be followed by the m_RoomLayoutData macro."); } string roomString = data.GetValue(0) + ".bin"; try { tileDataFile = Project.GetBinaryFile( "rooms/" + Project.GameString + "/small/" + roomString); } catch (FileNotFoundException) { try { tileDataFile = Project.GetBinaryFile( "rooms/" + Project.GameString + "/large/" + roomString); } catch (FileNotFoundException) { throw new FileNotFoundException("Couldn't find \"" + roomString + "\" in \"rooms/small\" or \"rooms/large\"."); } } if (tileDataFile.Length == 80) // Small map { width = fileWidth = 10; height = 8; } else if (tileDataFile.Length == 176) // Large map { width = 0xf; fileWidth = 0x10; height = 0xb; } else { throw new Exception("Size of file \"" + tileDataFile.Name + "\" was invalid!"); } }
public PaletteHeaderData(Project p, string command, IEnumerable<string> values, FileParser parser, IList<int> spacing) : base(p, command, values, 3, parser, spacing) { int dest = -1; try { dest = Project.EvalToInt(GetValue(2)); } catch(FormatException) { dest = -1; } if (dest != -1) sourceFromRam = true; else { paletteDataFile = Project.GetFileWithLabel(GetValue(2)); if (!(paletteDataFile.GetData(GetValue(2)) is RgbData)) throw new Exception("Label \"" + GetValue(2) + "\" was expected to reference data defined with m_RGB16"); } }
internal Area(Project p, int i) : base(p, i) { areaFile = Project.GetFileWithLabel("areaData"); areaData = areaFile.GetData("areaData", Index * 8); // Initialize graphics state graphicsState = new GraphicsState(); // Global palettes PaletteHeaderGroup globalPaletteHeaderGroup = Project.GetIndexedDataType<PaletteHeaderGroup>(0xf); graphicsState.AddPaletteHeaderGroup(globalPaletteHeaderGroup, PaletteGroupType.Common); Data data = areaData; flags1 = p.EvalToInt(data.GetValue(0)); data = data.NextData; flags2 = p.EvalToInt(data.GetValue(0)); data = data.NextData; SetUniqueGfx(Project.EvalToInt(data.GetValue(0))); data = data.NextData; SetMainGfx(Project.EvalToInt(data.GetValue(0))); data = data.NextData; SetPaletteHeader(Project.EvalToInt(data.GetValue(0))); data = data.NextData; SetTileset(Project.EvalToInt(data.GetValue(0))); data = data.NextData; layoutGroup = Project.EvalToInt(data.GetValue(0)); data = data.NextData; SetAnimation((byte)Project.EvalToInt(data.GetValue(0))); }