HorseisleMapEditor/SilicaTilesEditor/Tileset.cs

176 lines
7.2 KiB
C#

using SilicaTilesEditor.Properties;
using System;
using System.Drawing;
using System.Threading.Tasks;
namespace SilicaTilesEditor
{
class Tileset
{
private static Bitmap cacheTerrainTileset = Resources.TerrainTileset;
private static Bitmap cacheOverlayTileset = Resources.OverlayTileset;
private static Bitmap cacheOverlayTileset0 = Resources.Tileset0;
private static Bitmap cacheOverlayTileset1 = Resources.Tileset1;
private static Bitmap cacheOverlayTileset2 = Resources.Tileset2;
private static Bitmap cacheOverlayTileset3 = Resources.Tileset3;
private static Bitmap cacheOverlayTileset4 = Resources.Tileset4;
private static Bitmap cacheOverlayTileset5 = Resources.Tileset5;
private static Bitmap cacheOverlayTileset6 = Resources.Tileset6;
private static Bitmap cacheOverlayTileset7 = Resources.Tileset7;
public static Bitmap[] TerrainList = new Bitmap[((cacheTerrainTileset.Height / 32) * (cacheTerrainTileset.Width / 32)) + 1];
public static Bitmap[] OverlayList = new Bitmap[192 + 1];
public static Bitmap[] ExtOverlays = new Bitmap[8] { cacheOverlayTileset0, cacheOverlayTileset1, cacheOverlayTileset2, cacheOverlayTileset3, cacheOverlayTileset4, cacheOverlayTileset5, cacheOverlayTileset6, cacheOverlayTileset7 };
public static Bitmap[] ExtNorm = new Bitmap[((cacheOverlayTileset0.Height / 48) * (cacheOverlayTileset0.Width / 32))];
public static Bitmap[] ExtSnow = new Bitmap[((cacheOverlayTileset1.Height / 48) * (cacheOverlayTileset1.Width / 32))];
public static Bitmap[] ExtSand = new Bitmap[((cacheOverlayTileset2.Height / 48) * (cacheOverlayTileset2.Width / 32))];
public static Bitmap[] ExtPirt = new Bitmap[((cacheOverlayTileset3.Height / 48) * (cacheOverlayTileset3.Width / 32))];
public static Bitmap[] ExtFlwr = new Bitmap[((cacheOverlayTileset4.Height / 48) * (cacheOverlayTileset4.Width / 32))];
public static Bitmap[] ExtJngl = new Bitmap[((cacheOverlayTileset5.Height / 48) * (cacheOverlayTileset5.Width / 32))];
public static Bitmap[] ExtClwd = new Bitmap[((cacheOverlayTileset6.Height / 48) * (cacheOverlayTileset6.Width / 32))];
public static Bitmap[] ExtVolc = new Bitmap[((cacheOverlayTileset7.Height / 48) * (cacheOverlayTileset7.Width / 32))];
public static Bitmap[] JoinedTileset
{
get
{
Bitmap[] ExtOverlaySet = GetTileset(Program.form.tileList.ExtOverlay);
int sz = OverlayList.Length + ExtOverlaySet.Length;
if (sz > 0xFF)
sz = 0xFF;
Bitmap[] arr = new Bitmap[sz];
int i = 0;
for(i = 0; i < OverlayList.Length; i++)
{
arr[i] = OverlayList[i];
}
for (int ii = 0; ii < ExtOverlaySet.Length; ii++)
{
arr[i] = ExtOverlaySet[ii];
i++;
if (i >= 0xFF)
break;
}
return arr;
}
}
public static Boolean ReadAllTerrain = false;
public static Boolean ReadAllOverlay = false;
public static void CopyRegionIntoImage(Bitmap srcBitmap, Rectangle srcRegion, Bitmap destBitmap, Rectangle destRegion)
{
using (Graphics grD = Graphics.FromImage(destBitmap))
{
grD.DrawImage(srcBitmap, destRegion, srcRegion, GraphicsUnit.Pixel);
}
}
public static Bitmap[] GetTileset(int numb)
{
switch(numb)
{
case 0:
return ExtNorm;
case 1:
return ExtSnow;
case 2:
return ExtSand;
case 3:
return ExtPirt;
case 4:
return ExtFlwr;
case 5:
return ExtJngl;
case 6:
return ExtClwd;
case 7:
return ExtVolc;
default:
return ExtNorm;
}
}
public static void ReadAllTiles()
{
Task[] tileTasks = new Task[3];
tileTasks[0] = Task.Run(() => readTerrain());
tileTasks[1] = Task.Run(() => readOverlay());
tileTasks[2] = Task.Run(() => readExtOverlay());
Task.WaitAll(tileTasks);
ReadAllTerrain = true;
ReadAllOverlay = true;
}
private static void readTerrain()
{
Console.WriteLine("Reading Terrain.png...");
int i = 0;
Rectangle dstRect = new Rectangle(0, 0, 32, 32);
Rectangle srcRect = new Rectangle(0, 0, 32, 32);
for (int y = 0; y < (cacheTerrainTileset.Height/32); y++)
{
for (int x = 0; x < (cacheTerrainTileset.Width / 32); x++)
{
i++;
TerrainList[i] = new Bitmap(32, 32);
srcRect.X = x * 32;
srcRect.Y = y * 32;
CopyRegionIntoImage(cacheTerrainTileset, srcRect, TerrainList[i], dstRect);
}
}
}
private static void readExtOverlay()
{
Rectangle dstRect = new Rectangle(0, 0, 32, 48);
Rectangle srcRect = new Rectangle(0, 0, 32, 48);
for (int picid = 0; picid <= 7; picid++)
{
Bitmap[] TilesetList = GetTileset(picid);
Bitmap Tileset = ExtOverlays[picid];
Console.WriteLine("Reading Overlay"+ picid.ToString()+".png...");
int i = 0;
for (int y = 0; y < (Tileset.Height / 48); y++)
{
for (int x = 0; x < (Tileset.Width / 32); x++)
{
TilesetList[i] = new Bitmap(32, 48);
srcRect.X = x * 32;
srcRect.Y = y * 48;
CopyRegionIntoImage(Tileset, srcRect, TilesetList[i], dstRect);
i++;
}
}
Console.WriteLine("Total Tiles Read: " + i.ToString());
}
}
private static void readOverlay()
{
Console.WriteLine("Reading Overlay.png...");
int i = 0;
int OVERLAY_SIZE = 24;
Rectangle dstRect = new Rectangle(0, 0, 32, 48);
Rectangle srcRect = new Rectangle(0, 0, 32, 48);
for (int y = 0; y < OVERLAY_SIZE; y++)
{
for (int x = 0; x < (cacheOverlayTileset.Width / 32); x++)
{
i++;
OverlayList[i] = new Bitmap(32, 48);
srcRect.X = x * 32;
srcRect.Y = y * 48;
CopyRegionIntoImage(cacheOverlayTileset, srcRect, OverlayList[i], dstRect);
}
}
}
}
}