git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1102 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
@@ -63,7 +63,7 @@ namespace OpenRa.FileFormats
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class IniSection
|
public class IniSection : IEnumerable<KeyValuePair<string, string>>
|
||||||
{
|
{
|
||||||
string name;
|
string name;
|
||||||
Dictionary<string, string> values = new Dictionary<string, string>();
|
Dictionary<string, string> values = new Dictionary<string, string>();
|
||||||
@@ -83,5 +83,15 @@ namespace OpenRa.FileFormats
|
|||||||
string s;
|
string s;
|
||||||
return values.TryGetValue( key, out s ) ? s : defaultValue;
|
return values.TryGetValue( key, out s ) ? s : defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
|
||||||
|
{
|
||||||
|
return values.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return GetEnumerator();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ namespace OpenRa.FileFormats
|
|||||||
public readonly int Height;
|
public readonly int Height;
|
||||||
|
|
||||||
public readonly TileReference[ , ] MapTiles = new TileReference[ 128, 128 ];
|
public readonly TileReference[ , ] MapTiles = new TileReference[ 128, 128 ];
|
||||||
|
public readonly List<TreeReference> Trees = new List<TreeReference>();
|
||||||
|
|
||||||
public Map( IniFile file )
|
public Map( IniFile file )
|
||||||
{
|
{
|
||||||
@@ -35,6 +36,8 @@ namespace OpenRa.FileFormats
|
|||||||
MemoryStream ms = ReadMapPack( file );
|
MemoryStream ms = ReadMapPack( file );
|
||||||
|
|
||||||
UnpackTileData( ms );
|
UnpackTileData( ms );
|
||||||
|
|
||||||
|
ReadTrees( file );
|
||||||
}
|
}
|
||||||
|
|
||||||
static MemoryStream ReadMapPack( IniFile file )
|
static MemoryStream ReadMapPack( IniFile file )
|
||||||
@@ -104,6 +107,16 @@ namespace OpenRa.FileFormats
|
|||||||
for( int j = 0 ; j < 128 ; j++ )
|
for( int j = 0 ; j < 128 ; j++ )
|
||||||
MapTiles[ j, i ].image = ReadByte( ms );
|
MapTiles[ j, i ].image = ReadByte( ms );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ReadTrees( IniFile file )
|
||||||
|
{
|
||||||
|
IniSection terrain = file.GetSection( "TERRAIN" );
|
||||||
|
foreach( KeyValuePair<string, string> kv in terrain )
|
||||||
|
{
|
||||||
|
int xy = int.Parse( kv.Key );
|
||||||
|
Trees.Add( new TreeReference( xy % 128, xy / 128, kv.Value ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct TileReference
|
public struct TileReference
|
||||||
@@ -111,4 +124,18 @@ namespace OpenRa.FileFormats
|
|||||||
public ushort tile;
|
public ushort tile;
|
||||||
public byte image;
|
public byte image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct TreeReference
|
||||||
|
{
|
||||||
|
public readonly int X;
|
||||||
|
public readonly int Y;
|
||||||
|
public readonly string Image;
|
||||||
|
|
||||||
|
public TreeReference( int x, int y, string image )
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Image = image;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,11 @@ namespace OpenRa.FileFormats
|
|||||||
public class TileSet
|
public class TileSet
|
||||||
{
|
{
|
||||||
public readonly Dictionary<ushort, Terrain> tiles = new Dictionary<ushort, Terrain>();
|
public readonly Dictionary<ushort, Terrain> tiles = new Dictionary<ushort, Terrain>();
|
||||||
|
public readonly Package MixFile;
|
||||||
|
|
||||||
public TileSet( Package mixFile, string suffix, Palette pal )
|
public TileSet( Package mixFile, string suffix, Palette pal )
|
||||||
{
|
{
|
||||||
|
MixFile = mixFile;
|
||||||
StreamReader tileIdFile = File.OpenText( "../../../tileSet.til" );
|
StreamReader tileIdFile = File.OpenText( "../../../tileSet.til" );
|
||||||
|
|
||||||
while( true )
|
while( true )
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Text;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using OpenRa.FileFormats;
|
using OpenRa.FileFormats;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
namespace ShpViewer
|
namespace ShpViewer
|
||||||
{
|
{
|
||||||
@@ -11,8 +12,22 @@ namespace ShpViewer
|
|||||||
{
|
{
|
||||||
public int XScroll, YScroll;
|
public int XScroll, YScroll;
|
||||||
|
|
||||||
public Map Map;
|
Map map;
|
||||||
public TileSet TileSet;
|
public Map Map
|
||||||
|
{
|
||||||
|
get { return map; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
map = value;
|
||||||
|
TileSet = LoadTileSet( Map );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Palette pal;
|
||||||
|
TileSet TileSet;
|
||||||
|
Package TileMix;
|
||||||
|
string TileSuffix;
|
||||||
|
Dictionary<string, Bitmap> TreeCache = new Dictionary<string, Bitmap>();
|
||||||
|
|
||||||
public MapViewControl()
|
public MapViewControl()
|
||||||
{
|
{
|
||||||
@@ -62,6 +77,50 @@ namespace ShpViewer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach( TreeReference tr in Map.Trees )
|
||||||
|
{
|
||||||
|
int tX = tr.X - Map.XOffset - XScroll;
|
||||||
|
int tY = tr.Y - Map.YOffset - YScroll;
|
||||||
|
g.DrawImage( GetTree( tr.Image, TileMix ), tX * 24, tY * 24 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bitmap GetTree( string name, Package mix )
|
||||||
|
{
|
||||||
|
Bitmap ret;
|
||||||
|
if( !TreeCache.TryGetValue( name, out ret ) )
|
||||||
|
{
|
||||||
|
ShpReader shp = new ShpReader( TileSet.MixFile.GetContent( name + TileSuffix ) );
|
||||||
|
ret = BitmapBuilder.FromBytes( shp[ 0 ].Image, shp.Width, shp.Height, pal ); ;
|
||||||
|
TreeCache.Add( name, ret );
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
TileSet LoadTileSet( Map currentMap )
|
||||||
|
{
|
||||||
|
switch( currentMap.Theater.ToLowerInvariant() )
|
||||||
|
{
|
||||||
|
case "temperate":
|
||||||
|
pal = new Palette( File.OpenRead( "../../../temperat.pal" ) );
|
||||||
|
TileMix = new Package( "../../../temperat.mix" );
|
||||||
|
TileSuffix = ".tem";
|
||||||
|
break;
|
||||||
|
case "snow":
|
||||||
|
pal = new Palette( File.OpenRead( "../../../snow.pal" ) );
|
||||||
|
TileMix = new Package( "../../../snow.mix" );
|
||||||
|
TileSuffix = ".sno";
|
||||||
|
break;
|
||||||
|
case "interior":
|
||||||
|
pal = new Palette( File.OpenRead( "../../../interior.pal" ) );
|
||||||
|
TileMix = new Package( "../../../interior.mix" );
|
||||||
|
TileSuffix = ".int";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
return new TileSet( TileMix, TileSuffix, pal );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,13 +57,11 @@ namespace ShpViewer
|
|||||||
{
|
{
|
||||||
IniFile iniFile = new IniFile( File.OpenRead( filename ) );
|
IniFile iniFile = new IniFile( File.OpenRead( filename ) );
|
||||||
Map map = new Map( iniFile );
|
Map map = new Map( iniFile );
|
||||||
TileSet tileSet = LoadTileSet( map );
|
|
||||||
|
|
||||||
flowLayoutPanel1.Visible = false;
|
flowLayoutPanel1.Visible = false;
|
||||||
flowLayoutPanel1.BackColor = Color.Blue;
|
flowLayoutPanel1.BackColor = Color.Blue;
|
||||||
mapViewControl1.Visible = true;
|
mapViewControl1.Visible = true;
|
||||||
mapViewControl1.Map = map;
|
mapViewControl1.Map = map;
|
||||||
mapViewControl1.TileSet = tileSet;
|
|
||||||
mapViewControl1.Invalidate();
|
mapViewControl1.Invalidate();
|
||||||
|
|
||||||
int ux = 0, uy = 0;
|
int ux = 0, uy = 0;
|
||||||
@@ -104,9 +102,8 @@ namespace ShpViewer
|
|||||||
if( e.Button == MouseButtons.Left )
|
if( e.Button == MouseButtons.Left )
|
||||||
{
|
{
|
||||||
mapViewControl1.Map = new Map( iniFile );
|
mapViewControl1.Map = new Map( iniFile );
|
||||||
mapViewControl1.TileSet = LoadTileSet( map );
|
mapViewControl1.Invalidate();
|
||||||
}
|
}
|
||||||
mapViewControl1.Invalidate();
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,24 +118,5 @@ namespace ShpViewer
|
|||||||
Focus();
|
Focus();
|
||||||
BringToFront();
|
BringToFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
TileSet LoadTileSet( Map currentMap )
|
|
||||||
{
|
|
||||||
Palette pal;
|
|
||||||
switch( currentMap.Theater.ToLowerInvariant() )
|
|
||||||
{
|
|
||||||
case "temperate":
|
|
||||||
pal = new Palette( File.OpenRead( "../../../temperat.pal" ) );
|
|
||||||
return new TileSet( new Package( "../../../temperat.mix" ), ".tem", pal );
|
|
||||||
case "snow":
|
|
||||||
pal = new Palette( File.OpenRead( "../../../snow.pal" ) );
|
|
||||||
return new TileSet( new Package( "../../../snow.mix" ), ".sno", pal );
|
|
||||||
case "interior":
|
|
||||||
pal = new Palette( File.OpenRead( "../../../interior.pal" ) );
|
|
||||||
return new TileSet( new Package( "../../../interior.mix" ), ".int", pal );
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user