public void read(Reader reader, bool dcVer = false) { if (dcVer) { reader.ReadByte(); } width = (ushort)(reader.ReadByte() << 8); width |= reader.ReadByte(); height = (ushort)(reader.ReadByte() << 8); height |= reader.ReadByte(); // Read & Process palette for (int i = 0; i < 255; i++) { palette[i].R = reader.ReadByte(); palette[i].G = reader.ReadByte(); palette[i].B = reader.ReadByte(); } // Read Pixels pixels = new byte[width * height]; byte[] buf = new byte[3]; int pos = 0; while (true) { buf[0] = reader.ReadByte(); if (buf[0] == 0xFF) { buf[1] = reader.ReadByte(); if (buf[1] != 0xFF) { buf[2] = reader.ReadByte(); byte val = buf[1]; int cnt = buf[2]; if (dcVer) { cnt--; } for (int c = 0; c < cnt; ++c) { pixels[pos++] = val; } } else { break; } } else { pixels[pos++] = buf[0]; } } reader.Close(); }
public ScrollInfo(Reader reader) { RelativeSpeed = reader.ReadByte(); ConstantSpeed = reader.ReadByte(); Deform = reader.ReadByte(); }
public void read(Reader reader) { foreach (ScriptSub sub in subs) { sub.scriptCode.Clear(); sub.blankLines.Clear(); sub.labels.Clear(); sub.jumpTable.Clear(); bool finishedScriptCode = false; int scriptCodeLength = reader.ReadByte() << 8; scriptCodeLength |= reader.ReadByte(); sub.scriptCode.Clear(); while (!finishedScriptCode) { byte scriptOpcode = reader.ReadByte(); if (scriptOpcode == 0xFF) { scriptOpcode = reader.ReadByte(); if (scriptOpcode == 0xFF) { scriptOpcode = reader.ReadByte(); if (scriptOpcode == 0xFF) { scriptOpcode = reader.ReadByte(); if (scriptOpcode == 0xFF) { finishedScriptCode = true; } } } } if (!finishedScriptCode) { OpcodeInfo opInfo = new OpcodeInfo(); opInfo.opcode = scriptOpcode; uint paramCount = (uint)opcodeList[scriptOpcode].paramCount; opInfo.parameters.Clear(); for (int p = 0; p < paramCount; p++) { ParamInfo param = new ParamInfo(); int paramType = reader.ReadByte(); // if 0 then int constant, else variable if (paramType != 0) { param.isVariable = true; param.value = reader.ReadByte(); int arrayIndex = reader.ReadByte(); if (arrayIndex > 0x80) { arrayIndex = 0x80 - arrayIndex; } param.arrayIndex = (sbyte)arrayIndex; } else { param.isVariable = false; param.arrayIndex = -1; int byte1 = reader.ReadByte(); int constVal = 0; if (byte1 < 0x80) // unsigned uint16 { constVal = byte1 << 8; constVal |= reader.ReadByte(); } else // signed uint16 { constVal = (byte1 - 0x80) << 8; constVal |= reader.ReadByte(); constVal = -constVal; } param.value = constVal; } opInfo.parameters.Add(param); } sub.scriptCode.Add(opInfo); } } int blankLineUnused = reader.ReadByte(); int blankLineCount = reader.ReadByte(); for (int u = 0; u < blankLineCount; u++) { int blankLineID = reader.ReadByte() << 8; blankLineID |= reader.ReadByte(); sub.blankLines.Add(blankLineID); } int labelUnused = reader.ReadByte(); int labelCount = reader.ReadByte(); for (int l = 0; l < labelCount; l++) { LabelInfo label = new LabelInfo(); label.scriptCodePos = reader.ReadByte() << 8; label.scriptCodePos |= reader.ReadByte(); label.id = reader.ReadByte() << 8; label.id |= reader.ReadByte(); label.lineID = reader.ReadByte() << 8; label.lineID |= reader.ReadByte(); sub.labels.Add(label); } int jumpTableUnused = reader.ReadByte(); int jumpTableCount = reader.ReadByte(); for (int s = 0; s < jumpTableCount; ++s) { SwitchInfo info = new SwitchInfo(); info.scriptCodePos = reader.ReadByte() << 8; info.scriptCodePos |= reader.ReadByte(); int caseCount = reader.ReadByte() << 8; caseCount |= reader.ReadByte(); info.defaultScriptCodePos = reader.ReadByte() << 8; info.defaultScriptCodePos |= reader.ReadByte(); info.defaultCaseLineID = reader.ReadByte() << 8; info.defaultCaseLineID |= reader.ReadByte(); info.endScriptCodePos = reader.ReadByte() << 8; info.endScriptCodePos |= reader.ReadByte(); // if (info.defaultScriptCodePos == 0) // info.defaultScriptCodePos = info.endScriptCodePos; int lowestCase = 0x8000; int highestCase = 0; info.cases.Clear(); for (int c = 0; c < caseCount; c++) { SwitchCaseInfo caseInfo = new SwitchCaseInfo(); caseInfo.scriptCodePos = reader.ReadByte() << 8; caseInfo.scriptCodePos |= reader.ReadByte(); caseInfo.caseNum = reader.ReadByte() << 8; caseInfo.caseNum |= reader.ReadByte(); if (caseInfo.caseNum < lowestCase) { lowestCase = caseInfo.caseNum; } if (caseInfo.caseNum > highestCase) { highestCase = caseInfo.caseNum; } caseInfo.lineID = reader.ReadByte() << 8; caseInfo.lineID |= reader.ReadByte(); info.cases.Add(caseInfo); } info.lowestCase = lowestCase; info.highestCase = highestCase; // Take any duds and make em default cases // for (int m = lowestCase; m <= highestCase; ++m) // { // int jump = sub.scriptCode[caseTablePos + m]; // if (jump == 0) // sub.scriptCode[caseTablePos + m] = sub.jumpTable[startSwitchTablePos + 2]; // } // wow this is weird // it manually goes and sets up the offsets instead of doing it at compile-time like later RSDK versions int pos = 0; foreach (OpcodeInfo opcodeInfo in sub.scriptCode) { if (pos == info.scriptCodePos) { opcodeInfo.parameters[1].value = pos; break; } pos += opcodeInfo.size; } sub.jumpTable.Add(info); } } reader.Close(); }
public void read(Reader reader) { reader.ReadInt16(); // "BM" reader.ReadInt32(); // totalFileSize reader.ReadInt32(); // Unused int pixelPos = reader.ReadInt32(); reader.seek(14 + 4, System.IO.SeekOrigin.Begin); width = reader.ReadByte(); width |= reader.ReadByte() << 8; width |= reader.ReadByte() << 16; width |= reader.ReadByte() << 24; height = reader.ReadByte(); height |= reader.ReadByte() << 8; height |= reader.ReadByte() << 16; height |= reader.ReadByte() << 24; reader.BaseStream.Position += sizeof(ushort); bool indexed = reader.ReadUInt16() <= 8; //bpp if (!indexed) { throw new Exception("RSDK-Formatted Bitmap files must be indexed!"); } reader.BaseStream.Position += 4 * sizeof(int); int clrCount = reader.ReadInt32(); // how many colours used reader.seek(14 + 40, System.IO.SeekOrigin.Begin); for (int c = 0; c < clrCount; c++) { palette[c].B = reader.ReadByte(); palette[c].G = reader.ReadByte(); palette[c].R = reader.ReadByte(); reader.ReadByte(); // unused } long expectedPixelPos = (reader.BaseStream.Length - height * width); if (pixelPos != expectedPixelPos) { throw new Exception("RSDK-Formatted Bitmap files must end with the pixel data!"); } // This is how RSDK does it but there's a small chance it could maybe be wrong reader.seek(expectedPixelPos, System.IO.SeekOrigin.Begin); pixels = new byte[width * height]; int gfxPos = width * (height - 1); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { pixels[gfxPos++] = reader.ReadByte(); } gfxPos -= 2 * width; } reader.Close(); }
public GraphicsImage(Reader reader, bool dcGFX = false) { if (dcGFX) { reader.ReadByte(); } width = (ushort)(reader.ReadByte() << 8); width |= reader.ReadByte(); height = (ushort)(reader.ReadByte() << 8); height |= reader.ReadByte(); // Create image gfxImage = new Bitmap(width, height, PixelFormat.Format8bppIndexed); ColorPalette cp = gfxImage.Palette; // Read & Process palette for (int i = 0; i < 255; i++) { GFXpal[i].R = reader.ReadByte(); GFXpal[i].G = reader.ReadByte(); GFXpal[i].B = reader.ReadByte(); cp.Entries[i] = Color.FromArgb(255, GFXpal[i].R, GFXpal[i].G, GFXpal[i].B); } gfxImage.Palette = cp; //Read Image Data byte[] buf = new byte[3]; bool finished = false; int cnt = 0; int loop = 0; data = new byte[(width * height) + 1]; while (!finished) { buf[0] = reader.ReadByte(); if (buf[0] == 255) { buf[1] = reader.ReadByte(); if (buf[1] == 255) { finished = true; break; } else { buf[2] = reader.ReadByte(); loop = 0; // Repeat value needs to decreased by one to decode // the graphics from the Dreamcast demo if (dcGFX) { buf[2]--; } while (loop < buf[2] && !reader.IsEof) { data[cnt++] = buf[1]; loop++; } } } else { data[cnt++] = buf[0]; } } //Console.Write("file Length = " + reader.BaseStream.Length + " file pos = " + reader.Pos + " data remaining = " + (reader.BaseStream.Length - reader.Pos)); // Write data to image int pixel = 0; for (int h = 0; h < height; h++) { for (int w = 0; w < width; w++) { BitmapData ImgData = gfxImage.LockBits(new Rectangle(new Point(w, h), new Size(1, 1)), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); byte b = System.Runtime.InteropServices.Marshal.ReadByte(ImgData.Scan0); System.Runtime.InteropServices.Marshal.WriteByte(ImgData.Scan0, (data[pixel])); gfxImage.UnlockBits(ImgData); pixel++; } } reader.Close(); }
public gfx(Reader reader, bool dcGFX) { if (dcGFX) { reader.ReadByte(); } width = reader.ReadByte() << 8; width |= reader.ReadByte(); height = reader.ReadByte() << 8; height |= reader.ReadByte(); // Create image GFXpal = new gfxPalette(); gfxImage = new Bitmap(width, height, PixelFormat.Format8bppIndexed); ColorPalette cp = gfxImage.Palette; // Read & Process palette, ISSUE HERE for (int i = 0; i < 255; i++) { GFXpal.r[i] = reader.ReadByte(); GFXpal.g[i] = reader.ReadByte(); GFXpal.b[i] = reader.ReadByte(); cp.Entries[i] = Color.FromArgb(255, GFXpal.r[i], GFXpal.g[i], GFXpal.b[i]); } gfxImage.Palette = cp; //Read Image Data int[] buf = new int[3]; bool finished = false; int cnt = 0; int loop = 0; data = new int[width * height]; while (!reader.IsEof) { buf[0] = reader.ReadByte(); if (buf[0] != 0xFF && !reader.IsEof) { data[cnt++] = buf[0]; } else { buf[1] = reader.ReadByte(); if (buf[1] != 0xFF && !reader.IsEof) { buf[2] = reader.ReadByte(); loop = 0; // Repeat value needs to decreased by one to decode // the graphics from the Dreamcast demo if (dcGFX) { buf[2]--; } while (loop < buf[2] && !reader.IsEof) { data[cnt++] = buf[1]; loop++; } } else { finished = true; } } } // Write data to image int pixel = 0; for (int h = 0; h < height; h++) { for (int w = 0; w < width; w++) { BitmapData ImgData = gfxImage.LockBits(new Rectangle(new Point(w, h), new Size(1, 1)), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); byte b = System.Runtime.InteropServices.Marshal.ReadByte(ImgData.Scan0); System.Runtime.InteropServices.Marshal.WriteByte(ImgData.Scan0, (byte)(data[pixel])); gfxImage.UnlockBits(ImgData); pixel++; } } reader.Close(); }
internal SaveData(Reader reader) { CurrentLevel = reader.ReadByte(); EmeraldCount = reader.ReadByte(); Lives = reader.ReadByte(); }