/*
* Created by SharpDevelop.
* User: DarthNemesis
* Date: 4/20/2009
* Time: 10:14 PM
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace Test2
{
///
/// Description of MainForm.
///
public partial class MainForm : Form
{
private Color[] palette;
private Bitmap[] tiles;
private Bitmap image;
public MainForm()
{
InitializeComponent();
}
void MainFormLoad(object sender, EventArgs e)
{
string baseName = "wallp_ending";
FileStream file;
BinaryReader reader;
if (!File.Exists(baseName + ".cl") || !File.Exists(baseName + ".cg") || !File.Exists(baseName + ".sc"))
{
MessageBox.Show("Cannot find all wallp_ending files.");
return;
}
file = new FileStream(baseName + ".cl", FileMode.Open, FileAccess.Read);
reader = new BinaryReader(file);
ReadPalette(reader);
reader.Close();
file = new FileStream(baseName + ".cg", FileMode.Open, FileAccess.Read);
reader = new BinaryReader(file);
ReadTiles(reader);
reader.Close();
file = new FileStream(baseName + ".sc", FileMode.Open, FileAccess.Read);
reader = new BinaryReader(file);
ReadImage(reader);
reader.Close();
panelImage.Width = image.Width;
panelImage.Height = image.Height;
panelImage.Invalidate();
}
private Color ReadColor(BinaryReader reader)
{
ushort code = reader.ReadUInt16();
int r = (code & 0x001F) > 2;
int b = (code & 0x7C00) >> 7;
return System.Drawing.Color.FromArgb(r, g, b);
}
private void ReadPalette(BinaryReader reader)
{
uint numColors = 16;
palette = new Color[numColors];
for (int i = 0; i < numColors; i++)
{
palette = ReadColor(reader);
}
}
private Bitmap ReadTile(BinaryReader reader)
{
Bitmap tile = new Bitmap(8, 8);
byte remainder = 0;
bool lowByte = true;
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 8; x++)
{
byte curColorIndex = 0;
if (lowByte)
{
remainder = reader.ReadByte();
curColorIndex = (byte)(remainder & 0x0F);
remainder >>= 4;
lowByte = false;
}
else
{
curColorIndex = remainder;
lowByte = true;
}
tile.SetPixel(x, y, palette[curColorIndex]);
}
}
return tile;
}
private void ReadTiles(BinaryReader reader)
{
uint numTiles = (uint)reader.BaseStream.Length / 32;
tiles = new Bitmap[numTiles];
for (int i = 0; i < numTiles; i++)
{
tiles = ReadTile(reader);
}
}
private void ReadImage(BinaryReader reader)
{
int MAX_X = 32;
int MAX_Y = 64;
image = new Bitmap(8*MAX_X, 8*MAX_Y);
Graphics g = Graphics.FromImage(image);
for (int y = 0; y < MAX_Y; y++)
{
for (int x = 0; x < MAX_X; x++)
{
ushort tileIndex = reader.ReadUInt16();
g.DrawImageUnscaled(tiles[tileIndex], 8*x, 8*y);
}
}
g.Dispose();
}
void PanelImagePaint(object sender, PaintEventArgs e)
{
Graphics g = panelImage.CreateGraphics();
g.DrawImageUnscaled(image, 0, 0);
g.Dispose();
}
}
}