added .mix file support for game asset browser

This commit is contained in:
Matthias Mailänder
2013-04-27 18:32:09 +02:00
parent 4a1ebb69c3
commit 6a6776754b
12 changed files with 484 additions and 60 deletions

View File

@@ -62,9 +62,9 @@ namespace OpenRA.FileFormats
int recurseDepth = 0; int recurseDepth = 0;
public ShpReader( Stream stream ) public ShpReader(Stream stream)
{ {
using( var reader = new BinaryReader( stream ) ) using (var reader = new BinaryReader(stream))
{ {
ImageCount = reader.ReadUInt16(); ImageCount = reader.ReadUInt16();
reader.ReadUInt16(); reader.ReadUInt16();
@@ -73,60 +73,60 @@ namespace OpenRA.FileFormats
Height = reader.ReadUInt16(); Height = reader.ReadUInt16();
reader.ReadUInt32(); reader.ReadUInt32();
for( int i = 0 ; i < ImageCount ; i++ ) for (int i = 0 ; i < ImageCount ; i++)
headers.Add( new ImageHeader( reader ) ); headers.Add(new ImageHeader(reader));
new ImageHeader( reader ); // end-of-file header new ImageHeader(reader); // end-of-file header
new ImageHeader( reader ); // all-zeroes header new ImageHeader(reader); // all-zeroes header
var offsets = headers.ToDictionary(h => h.Offset, h =>h); var offsets = headers.ToDictionary(h => h.Offset, h =>h);
for( int i = 0 ; i < ImageCount ; i++ ) for (int i = 0 ; i < ImageCount ; i++)
{ {
var h = headers[ i ]; var h = headers[ i ];
if( h.Format == Format.Format20 ) if (h.Format == Format.Format20)
h.RefImage = headers[ i - 1 ]; h.RefImage = headers[i - 1];
else if( h.Format == Format.Format40 ) else if (h.Format == Format.Format40)
if( !offsets.TryGetValue( h.RefOffset, out h.RefImage ) ) if (!offsets.TryGetValue(h.RefOffset, out h.RefImage))
throw new InvalidDataException( "Reference doesnt point to image data {0}->{1}".F(h.Offset, h.RefOffset) ); throw new InvalidDataException("Reference doesnt point to image data {0}->{1}".F(h.Offset, h.RefOffset));
} }
foreach( ImageHeader h in headers ) foreach (ImageHeader h in headers)
Decompress( stream, h ); Decompress(stream, h);
} }
} }
public ImageHeader this[ int index ] public ImageHeader this[int index]
{ {
get { return headers[ index ]; } get { return headers[index]; }
} }
void Decompress( Stream stream, ImageHeader h ) void Decompress(Stream stream, ImageHeader h)
{ {
if( recurseDepth > ImageCount ) if (recurseDepth > ImageCount)
throw new InvalidDataException( "Format20/40 headers contain infinite loop" ); throw new InvalidDataException("Format20/40 headers contain infinite loop");
switch( h.Format ) switch(h.Format)
{ {
case Format.Format20: case Format.Format20:
case Format.Format40: case Format.Format40:
{ {
if( h.RefImage.Image == null ) if (h.RefImage.Image == null)
{ {
++recurseDepth; ++recurseDepth;
Decompress( stream, h.RefImage ); Decompress(stream, h.RefImage);
--recurseDepth; --recurseDepth;
} }
h.Image = CopyImageData( h.RefImage.Image ); h.Image = CopyImageData(h.RefImage.Image);
Format40.DecodeInto(ReadCompressedData(stream, h), h.Image); Format40.DecodeInto(ReadCompressedData(stream, h), h.Image);
break; break;
} }
case Format.Format80: case Format.Format80:
{ {
var imageBytes = new byte[ Width * Height ]; var imageBytes = new byte[Width * Height];
Format80.DecodeInto( ReadCompressedData( stream, h ), imageBytes ); Format80.DecodeInto(ReadCompressedData(stream, h), imageBytes);
h.Image = imageBytes; h.Image = imageBytes;
break; break;
} }
@@ -135,11 +135,11 @@ namespace OpenRA.FileFormats
} }
} }
static byte[] ReadCompressedData( Stream stream, ImageHeader h ) static byte[] ReadCompressedData(Stream stream, ImageHeader h)
{ {
stream.Position = h.Offset; stream.Position = h.Offset;
// Actually, far too big. There's no length field with the correct length though :( // TODO: Actually, far too big. There's no length field with the correct length though :(
var compressedLength = (int)( stream.Length - stream.Position ); var compressedLength = (int)(stream.Length - stream.Position);
var compressedBytes = new byte[ compressedLength ]; var compressedBytes = new byte[ compressedLength ];
stream.Read( compressedBytes, 0, compressedLength ); stream.Read( compressedBytes, 0, compressedLength );
@@ -147,11 +147,11 @@ namespace OpenRA.FileFormats
return compressedBytes; return compressedBytes;
} }
byte[] CopyImageData( byte[] baseImage ) byte[] CopyImageData(byte[] baseImage)
{ {
var imageData = new byte[ Width * Height ]; var imageData = new byte[Width * Height];
for( int i = 0 ; i < Width * Height ; i++ ) for (int i = 0 ; i < Width * Height ; i++)
imageData[ i ] = baseImage[ i ]; imageData[i] = baseImage[i];
return imageData; return imageData;
} }

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
namespace OpenRA.FileFormats namespace OpenRA.FileFormats
@@ -20,7 +21,8 @@ namespace OpenRA.FileFormats
public readonly string[] public readonly string[]
Mods, Folders, Packages, Rules, ServerTraits, Mods, Folders, Packages, Rules, ServerTraits,
Sequences, Cursors, Chrome, Assemblies, ChromeLayout, Sequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Notifications, Music, Movies, TileSets, ChromeMetrics; Weapons, Voices, Notifications, Music, Movies, TileSets,
ChromeMetrics, PackageContents;
public readonly MiniYaml LoadScreen; public readonly MiniYaml LoadScreen;
public readonly Dictionary<string, Pair<string,int>> Fonts; public readonly Dictionary<string, Pair<string,int>> Fonts;
public readonly int TileSize = 24; public readonly int TileSize = 24;
@@ -29,7 +31,7 @@ namespace OpenRA.FileFormats
{ {
Mods = mods; Mods = mods;
var yaml = new MiniYaml(null, mods var yaml = new MiniYaml(null, mods
.Select(m => MiniYaml.FromFile("mods/" + m + "/mod.yaml")) .Select(m => MiniYaml.FromFile("mods{0}{1}{0}mod.yaml".F(Path.DirectorySeparatorChar, m)))
.Aggregate(MiniYaml.MergeLiberal)).NodesDict; .Aggregate(MiniYaml.MergeLiberal)).NodesDict;
// TODO: Use fieldloader // TODO: Use fieldloader
@@ -49,6 +51,7 @@ namespace OpenRA.FileFormats
Movies = YamlList(yaml, "Movies"); Movies = YamlList(yaml, "Movies");
TileSets = YamlList(yaml, "TileSets"); TileSets = YamlList(yaml, "TileSets");
ChromeMetrics = YamlList(yaml, "ChromeMetrics"); ChromeMetrics = YamlList(yaml, "ChromeMetrics");
PackageContents = YamlList(yaml, "PackageContents");
LoadScreen = yaml["LoadScreen"]; LoadScreen = yaml["LoadScreen"];
Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key, Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key,

View File

@@ -238,7 +238,7 @@ namespace OpenRA
public static Dictionary<String, Mod> CurrentMods public static Dictionary<String, Mod> CurrentMods
{ {
get { return Mod.AllMods.Where( k => modData.Manifest.Mods.Contains( k.Key )).ToDictionary( k => k.Key, k => k.Value ); } get { return Mod.AllMods.Where(k => modData.Manifest.Mods.Contains(k.Key)).ToDictionary(k => k.Key, k => k.Value); }
} }
static Modifiers modifiers; static Modifiers modifiers;

View File

@@ -25,6 +25,7 @@ namespace OpenRA
public static Dictionary<string, MusicInfo> Music; public static Dictionary<string, MusicInfo> Music;
public static Dictionary<string, string> Movies; public static Dictionary<string, string> Movies;
public static Dictionary<string, TileSet> TileSets; public static Dictionary<string, TileSet> TileSets;
public static Dictionary<string, string> PackageContents;
public static void LoadRules(Manifest m, Map map) public static void LoadRules(Manifest m, Map map)
{ {
@@ -35,6 +36,7 @@ namespace OpenRA
Notifications = LoadYamlRules(m.Notifications, map.Notifications, (k, _) => new SoundInfo(k.Value)); Notifications = LoadYamlRules(m.Notifications, map.Notifications, (k, _) => new SoundInfo(k.Value));
Music = LoadYamlRules(m.Music, new List<MiniYamlNode>(), (k, _) => new MusicInfo(k.Key, k.Value)); Music = LoadYamlRules(m.Music, new List<MiniYamlNode>(), (k, _) => new MusicInfo(k.Key, k.Value));
Movies = LoadYamlRules(m.Movies, new List<MiniYamlNode>(), (k, v) => k.Value.Value); Movies = LoadYamlRules(m.Movies, new List<MiniYamlNode>(), (k, v) => k.Value.Value);
PackageContents = LoadYamlRules(m.PackageContents, new List<MiniYamlNode>(), (k, v) => k.Value.Value);
TileSets = new Dictionary<string, TileSet>(); TileSets = new Dictionary<string, TileSet>();
foreach (var file in m.TileSets) foreach (var file in m.TileSets)
@@ -46,7 +48,7 @@ namespace OpenRA
static Dictionary<string, T> LoadYamlRules<T>(string[] files, List<MiniYamlNode> dict, Func<MiniYamlNode, Dictionary<string, MiniYaml>, T> f) static Dictionary<string, T> LoadYamlRules<T>(string[] files, List<MiniYamlNode> dict, Func<MiniYamlNode, Dictionary<string, MiniYaml>, T> f)
{ {
var y = files.Select(a => MiniYaml.FromFile(a)).Aggregate(dict,MiniYaml.MergeLiberal); var y = files.Select(a => MiniYaml.FromFile(a)).Aggregate(dict, MiniYaml.MergeLiberal);
var yy = y.ToDictionary( x => x.Key, x => x.Value ); var yy = y.ToDictionary( x => x.Key, x => x.Value );
return y.ToDictionary(kv => kv.Key.ToLowerInvariant(), kv => f(kv, yy)); return y.ToDictionary(kv => kv.Key.ToLowerInvariant(), kv => f(kv, yy));
} }

View File

@@ -29,14 +29,14 @@ namespace OpenRA
public SheetBuilder SheetBuilder; public SheetBuilder SheetBuilder;
public SpriteLoader SpriteLoader; public SpriteLoader SpriteLoader;
public ModData( params string[] mods ) public ModData(params string[] mods)
{ {
Manifest = new Manifest( mods ); Manifest = new Manifest(mods);
ObjectCreator = new ObjectCreator( Manifest ); ObjectCreator = new ObjectCreator(Manifest);
LoadScreen = ObjectCreator.CreateObject<ILoadScreen>(Manifest.LoadScreen.Value); LoadScreen = ObjectCreator.CreateObject<ILoadScreen>(Manifest.LoadScreen.Value);
LoadScreen.Init(Manifest.LoadScreen.NodesDict.ToDictionary(x => x.Key, x => x.Value.Value)); LoadScreen.Init(Manifest.LoadScreen.NodesDict.ToDictionary(x => x.Key, x => x.Value.Value));
LoadScreen.Display(); LoadScreen.Display();
WidgetLoader = new WidgetLoader( this ); WidgetLoader = new WidgetLoader(this);
} }
public void LoadInitialAssets(bool enumMaps) public void LoadInitialAssets(bool enumMaps)

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
@@ -22,30 +23,27 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
Widget panel; Widget panel;
ShpImageWidget spriteImage; static ShpImageWidget spriteImage;
TextFieldWidget filenameInput; static TextFieldWidget filenameInput;
SliderWidget frameSlider; static SliderWidget frameSlider;
ButtonWidget playButton; static ButtonWidget playButton;
ButtonWidget pauseButton; static ButtonWidget pauseButton;
static ScrollPanelWidget assetList;
static ScrollItemWidget template;
public enum SourceType { Folders, Packages }
public static SourceType AssetSource = SourceType.Folders;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public AssetBrowserLogic(Widget widget, Action onExit, World world) public AssetBrowserLogic(Widget widget, Action onExit, World world)
{ {
panel = widget; panel = widget;
var assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST"); var sourceDropdown = panel.Get<DropDownButtonWidget>("SOURCE_SELECTOR");
var template = panel.Get<ScrollItemWidget>("ASSET_TEMPLATE"); sourceDropdown.OnMouseDown = _ => ShowSourceDropdown(sourceDropdown);
sourceDropdown.GetText = () => AssetSource == SourceType.Folders ? "Folders"
assetList.RemoveChildren(); : AssetSource == SourceType.Packages ? "Packages" : "None";
foreach (var folder in FileSystem.FolderPaths) sourceDropdown.Disabled = !Rules.PackageContents.Keys.Any();
{
if (Directory.Exists(folder))
{
var shps = Directory.GetFiles(folder, "*.shp");
foreach (var shp in shps)
AddAsset(assetList, shp, template);
}
}
spriteImage = panel.Get<ShpImageWidget>("SPRITE"); spriteImage = panel.Get<ShpImageWidget>("SPRITE");
@@ -93,10 +91,14 @@ namespace OpenRA.Mods.RA.Widgets.Logic
LoadAsset(filenameInput.Text); LoadAsset(filenameInput.Text);
}; };
assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST");
template = panel.Get<ScrollItemWidget>("ASSET_TEMPLATE");
PopulateAssetList();
panel.Get<ButtonWidget>("CLOSE_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; panel.Get<ButtonWidget>("CLOSE_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); };
} }
void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template) static void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template)
{ {
var sprite = Path.GetFileNameWithoutExtension(filepath); var sprite = Path.GetFileNameWithoutExtension(filepath);
@@ -108,7 +110,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
list.AddChild(item); list.AddChild(item);
} }
bool LoadAsset(string filename) static bool LoadAsset(string filename)
{ {
if (filename == null) if (filename == null)
return false; return false;
@@ -120,5 +122,48 @@ namespace OpenRA.Mods.RA.Widgets.Logic
frameSlider.Ticks = spriteImage.FrameCount+1; frameSlider.Ticks = spriteImage.FrameCount+1;
return true; return true;
} }
public static bool ShowSourceDropdown(DropDownButtonWidget dropdown)
{
var options = new Dictionary<string, SourceType>()
{
{ "Folders", SourceType.Folders },
{ "Packages", SourceType.Packages },
};
Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) =>
{
var item = ScrollItemWidget.Setup(itemTemplate,
() => AssetSource == options[o],
() => { AssetSource = options[o]; PopulateAssetList(); });
item.Get<LabelWidget>("LABEL").GetText = () => o;
return item;
};
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, setupItem);
return true;
}
public static void PopulateAssetList()
{
assetList.RemoveChildren();
if (AssetSource == SourceType.Folders)
{
foreach (var folder in FileSystem.FolderPaths)
{
if (Directory.Exists(folder))
{
var shps = Directory.GetFiles(folder, "*.shp");
foreach (var shp in shps)
AddAsset(assetList, shp, template);
}
}
}
if (AssetSource == SourceType.Packages)
foreach (var hiddenFile in Rules.PackageContents.Keys)
AddAsset(assetList, hiddenFile, template);
}
} }
} }

View File

@@ -29,6 +29,8 @@ Packages:
~scores2.mix ~scores2.mix
~transit.mix ~transit.mix
PackageContents:
Rules: Rules:
mods/cnc/rules/defaults.yaml mods/cnc/rules/defaults.yaml
mods/cnc/rules/system.yaml mods/cnc/rules/system.yaml

View File

@@ -21,6 +21,8 @@ Packages:
~main.mix ~main.mix
conquer.mix conquer.mix
PackageContents:
Rules: Rules:
mods/d2k/rules/system.yaml mods/d2k/rules/system.yaml
mods/d2k/rules/defaults.yaml mods/d2k/rules/defaults.yaml

View File

@@ -83,6 +83,7 @@ Background@ASSETBROWSER_BG:
Height:25 Height:25
Text:Change Palette Text:Change Palette
Font:Bold Font:Bold
Disabled: yes
Button@IMPORT_BUTTON: Button@IMPORT_BUTTON:
X:PARENT_RIGHT - 200 X:PARENT_RIGHT - 200
Y:PARENT_BOTTOM - 270 Y:PARENT_BOTTOM - 270
@@ -90,6 +91,7 @@ Background@ASSETBROWSER_BG:
Height:25 Height:25
Text:Import from PNG Text:Import from PNG
Font:Bold Font:Bold
Disabled: yes
Button@EXTRACT_BUTTON: Button@EXTRACT_BUTTON:
X:PARENT_RIGHT - 200 X:PARENT_RIGHT - 200
Y:PARENT_BOTTOM - 235 Y:PARENT_BOTTOM - 235
@@ -97,6 +99,7 @@ Background@ASSETBROWSER_BG:
Height:25 Height:25
Text:Extract to Folder Text:Extract to Folder
Font:Bold Font:Bold
Disabled: yes
Button@EXPORT_BUTTON: Button@EXPORT_BUTTON:
X:PARENT_RIGHT - 200 X:PARENT_RIGHT - 200
Y:PARENT_BOTTOM - 200 Y:PARENT_BOTTOM - 200
@@ -104,6 +107,7 @@ Background@ASSETBROWSER_BG:
Height:25 Height:25
Text:Export as PNG Text:Export as PNG
Font:Bold Font:Bold
Disabled: yes
Button@CLOSE_BUTTON: Button@CLOSE_BUTTON:
X:PARENT_RIGHT - 200 X:PARENT_RIGHT - 200
Y:PARENT_BOTTOM - 115 Y:PARENT_BOTTOM - 115

227
mods/ra/mix/conquer.yaml Normal file
View File

@@ -0,0 +1,227 @@
# conquer.mix filename list for the game asset browser
#appear1.aud:
#beepy6.aud:
#briefing.aud:
#clock1.aud:
#country1.aud:
#country4.aud:
#keystrok.aud:
#mapwipe2.aud:
#mapwipe5.aud:
#scold1.aud:
#sfx4.aud:
#toney10.aud:
#toney4.aud:
#toney7.aud:
#type.fnt:
#alibackh.pcx:
#sovback.pcx:
120mm.shp:
1tnk.shp:light tank
2tnk.shp:medium tank
3tnk.shp:heavy tank
4tnk.shp:mammoth tank
50cal.shp:
afld.shp:
afldmake.shp:
agun.shp:
agunmake.shp:
apc.shp:
apwr.shp:
apwramke.shp:
armor.shp:
art-exp1.shp:
arty.shp:
atek.shp:
atekmake.shp:
atomicdn.shp:
atomicup.shp:
atomsfx.shp:
badr.shp:
bar3bhr.shp:
bar3blue.shp:
bar3red.shp:
bar3rhr.shp:
barb.shp:
barl.shp:
barr.shp:
barrmake.shp:
bio.shp:
biomake.shp:
bomb.shp:
bomblet.shp:
brik.shp:
brl3.shp:
burn-l.shp:
burn-m.shp:
burn-s.shp:
ca.shp:
chronbox.shp:
countrya.shp:
countrye.shp:
credsa.shp:
credsahr.shp:
credsu.shp:
credsuhr.shp:
cycl.shp:
dd.shp:
deviator.shp:
dog.shp:
dogbullt.shp:
dollar.shp:
dome.shp:
domemake.shp:
dragon.shp:
earth.shp:
ebtn-dn.shp:
electdog.shp:
empulse.shp:
fact.shp:
factmake.shp:
fb1.shp:
fb2.shp:
fball1.shp:
fcom.shp:
fenc.shp:
fire1.shp:
fire2.shp:
fire3.shp:
fire4.shp:
fix.shp:
fixmake.shp:
flagfly.shp:
flak.shp:
flmspt.shp:
fpls.shp:
fpower.shp:
frag1.shp:
ftnk.shp:
ftur.shp:
fturmake.shp:
gap.shp:
gapmake.shp:
gpsbox.shp:
gun.shp:
gunfire.shp:
gunmake.shp:
h2o_exp1.shp:
h2o_exp2.shp:
h2o_exp3.shp:
harv.shp:
heli.shp:
hind.shp:
hisc1-hr.shp:
hisc2-hr.shp:
hiscore1.shp:
hiscore2.shp:
hosp.shp:
hospmake.shp:
hpad.shp:
hpadmake.shp:
invulbox.shp:
invun.shp:
iron.shp:
ironmake.shp:
jeep.shp:
kenn.shp:
kennmake.shp:
litning.shp:
lrotor.shp:
lst.shp:
mcv.shp:
mgg.shp:
mgun.shp:
mhq.shp:
mig.shp:
mine.shp:
minigun.shp:
minp.shp:
minpmake.shp:
minv.shp:
minvmake.shp:
miss.shp:
missile.shp:
missile2.shp:
mlrs.shp:
mnly.shp:
mrj.shp:
napalm1.shp:
napalm2.shp:
napalm3.shp:
orca.shp:
parabomb.shp:
parabox.shp:
parach.shp:
patriot.shp:
pbox.shp:
pboxmake.shp:
pdox.shp:
pdoxmake.shp:
piff.shp:
piffpiff.shp:
powr.shp:
powrmake.shp:
pt.shp:
pumpmake.shp:
radarfrm.shp:
rapid.shp:
rrotor.shp:
sam.shp:
samfire.shp:
sammake.shp:
sbag.shp:
scrate.shp:
select.shp:
repair.shp:
shadow.shp:
silo.shp:
silomake.shp:
smig.shp:
smoke_m.shp:
smokey.shp:
smokland.shp:
sonarbox.shp:
speed.shp:
spen.shp:
spenmake.shp:
sputdoor.shp:
sputnik.shp:
ss.shp:
ssam.shp:
stealth2.shp:
stek.shp:
stekmake.shp:
stnk.shp:
syrd.shp:
syrdmake.shp:
tent.shp:
tentmake.shp:
time.shp:
timehr.shp:
tquake.shp:
tran.shp:
truk.shp:
tsla.shp:
tslamake.shp:
turr.shp:
twinkle1.shp:
twinkle2.shp:
twinkle3.shp:
u2.shp:
v19.shp:
v2.shp:
v2rl.shp:
veh-hit1.shp:
veh-hit2.shp:
wake.shp:
wcrate.shp:
weap.shp:
weap2.shp:
weapmake.shp:
wood.shp:
wwcrate.shp:
yak.shp:
#trans.icn:
#ali-tran.wsa:
#mltiplyr.wsa:
#sov-tran.wsa:

135
mods/ra/mix/hires.yaml Normal file
View File

@@ -0,0 +1,135 @@
# hires.mix filename list for the game asset browser
1tnkicon.shp:
2tnkicon.shp:
3tnkicon.shp:
4tnkicon.shp:
afldicon.shp:
agunicon.shp:
apcicon.shp:
apwricon.shp:
artyicon.shp:
atekicon.shp:
atomicon.shp:
badricon.shp:
barricon.shp:
brikicon.shp:
btn-dn.shp:
btn-pl.shp:
btn-st.shp:
btn-up.shp:
c1.shp:
c2.shp:
caicon.shp:
camicon.shp:
chan.shp:
clock.shp:
dd-bkgnd.shp:
dd-botm.shp:
dd-crnr.shp:
dd-edge.shp:
dd-left.shp:
dd-right.shp:
dd-top.shp:
ddicon.shp:
delphi.shp:
dogicon.shp:
domeicon.shp:
domficon.shp:
e1.shp:
e1icon.shp:
e2.shp:
e2icon.shp:
e3.shp:
e3icon.shp:
e4.shp:
e4icon.shp:
e5.shp:
e6.shp:
e6icon.shp:
e7.shp:
e7icon.shp:
einstein.shp:
facficon.shp:
facticon.shp:
fencicon.shp:
fixicon.shp:
fturicon.shp:
gapicon.shp:
gnrl.shp:
gpssicon.shp:
gunicon.shp:
harvicon.shp:
hboxicon.shp:
heliicon.shp:
hindicon.shp:
hpadicon.shp:
infxicon.shp:
ironicon.shp:
jeepicon.shp:
kennicon.shp:
lsticon.shp:
map.shp:
mcvicon.shp:
medi.shp:
mediicon.shp:
mggicon.shp:
migicon.shp:
mnlyicon.shp:
mrjicon.shp:
msloicon.shp:
natoradr.shp:
nradrfrm.shp:
pbmbicon.shp:
pboxicon.shp:
pdoxicon.shp:
pinficon.shp:
pips.shp:
power.shp:
powerbar.shp:
powricon.shp:
procicon.shp:
pticon.shp:
pulse.shp:
repair.shp:
samicon.shp:
sbagicon.shp:
sell.shp:
side1na.shp:
side1us.shp:
side2na.shp:
side2us.shp:
side3na.shp:
side3us.shp:
#sidebar.shp:will crash
siloicon.shp:
smigicon.shp:
sonricon.shp:
speficon.shp:
spenicon.shp:
spy.shp:
spyicon.shp:
ssicon.shp:
stekicon.shp:
strip.shp:
stripdn.shp:
stripna.shp:
stripup.shp:
stripus.shp:
syrdicon.shp:
syrficon.shp:
tabs.shp:
tenticon.shp:
thf.shp:
thficon.shp:
tranicon.shp:
trukicon.shp:
tslaicon.shp:
u2icon.shp:
uradrfrm.shp:
ussrradr.shp:
v2rlicon.shp:
warpicon.shp:
weaficon.shp:
weapicon.shp:
yakicon.shp:
#mouse.shp:Dune II format

View File

@@ -29,6 +29,10 @@ Packages:
~movies1.mix ~movies1.mix
~movies2.mix ~movies2.mix
PackageContents:
mods/ra/mix/conquer.yaml
mods/ra/mix/hires.yaml
Rules: Rules:
mods/ra/rules/defaults.yaml mods/ra/rules/defaults.yaml
mods/ra/rules/system.yaml mods/ra/rules/system.yaml