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

@@ -138,7 +138,7 @@ namespace OpenRA.FileFormats
static byte[] ReadCompressedData(Stream stream, ImageHeader h)
{
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 compressedBytes = new byte[ compressedLength ];

View File

@@ -9,6 +9,7 @@
#endregion
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenRA.FileFormats
@@ -20,7 +21,8 @@ namespace OpenRA.FileFormats
public readonly string[]
Mods, Folders, Packages, Rules, ServerTraits,
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 Dictionary<string, Pair<string,int>> Fonts;
public readonly int TileSize = 24;
@@ -29,7 +31,7 @@ namespace OpenRA.FileFormats
{
Mods = 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;
// TODO: Use fieldloader
@@ -49,6 +51,7 @@ namespace OpenRA.FileFormats
Movies = YamlList(yaml, "Movies");
TileSets = YamlList(yaml, "TileSets");
ChromeMetrics = YamlList(yaml, "ChromeMetrics");
PackageContents = YamlList(yaml, "PackageContents");
LoadScreen = yaml["LoadScreen"];
Fonts = yaml["Fonts"].NodesDict.ToDictionary(x => x.Key,

View File

@@ -25,6 +25,7 @@ namespace OpenRA
public static Dictionary<string, MusicInfo> Music;
public static Dictionary<string, string> Movies;
public static Dictionary<string, TileSet> TileSets;
public static Dictionary<string, string> PackageContents;
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));
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);
PackageContents = LoadYamlRules(m.PackageContents, new List<MiniYamlNode>(), (k, v) => k.Value.Value);
TileSets = new Dictionary<string, TileSet>();
foreach (var file in m.TileSets)

View File

@@ -9,6 +9,7 @@
#endregion
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.FileFormats;
@@ -22,30 +23,27 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{
Widget panel;
ShpImageWidget spriteImage;
TextFieldWidget filenameInput;
SliderWidget frameSlider;
ButtonWidget playButton;
ButtonWidget pauseButton;
static ShpImageWidget spriteImage;
static TextFieldWidget filenameInput;
static SliderWidget frameSlider;
static ButtonWidget playButton;
static ButtonWidget pauseButton;
static ScrollPanelWidget assetList;
static ScrollItemWidget template;
public enum SourceType { Folders, Packages }
public static SourceType AssetSource = SourceType.Folders;
[ObjectCreator.UseCtor]
public AssetBrowserLogic(Widget widget, Action onExit, World world)
{
panel = widget;
var assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST");
var template = panel.Get<ScrollItemWidget>("ASSET_TEMPLATE");
assetList.RemoveChildren();
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);
}
}
var sourceDropdown = panel.Get<DropDownButtonWidget>("SOURCE_SELECTOR");
sourceDropdown.OnMouseDown = _ => ShowSourceDropdown(sourceDropdown);
sourceDropdown.GetText = () => AssetSource == SourceType.Folders ? "Folders"
: AssetSource == SourceType.Packages ? "Packages" : "None";
sourceDropdown.Disabled = !Rules.PackageContents.Keys.Any();
spriteImage = panel.Get<ShpImageWidget>("SPRITE");
@@ -93,10 +91,14 @@ namespace OpenRA.Mods.RA.Widgets.Logic
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(); };
}
void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template)
static void AddAsset(ScrollPanelWidget list, string filepath, ScrollItemWidget template)
{
var sprite = Path.GetFileNameWithoutExtension(filepath);
@@ -108,7 +110,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
list.AddChild(item);
}
bool LoadAsset(string filename)
static bool LoadAsset(string filename)
{
if (filename == null)
return false;
@@ -120,5 +122,48 @@ namespace OpenRA.Mods.RA.Widgets.Logic
frameSlider.Ticks = spriteImage.FrameCount+1;
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
~transit.mix
PackageContents:
Rules:
mods/cnc/rules/defaults.yaml
mods/cnc/rules/system.yaml

View File

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

View File

@@ -83,6 +83,7 @@ Background@ASSETBROWSER_BG:
Height:25
Text:Change Palette
Font:Bold
Disabled: yes
Button@IMPORT_BUTTON:
X:PARENT_RIGHT - 200
Y:PARENT_BOTTOM - 270
@@ -90,6 +91,7 @@ Background@ASSETBROWSER_BG:
Height:25
Text:Import from PNG
Font:Bold
Disabled: yes
Button@EXTRACT_BUTTON:
X:PARENT_RIGHT - 200
Y:PARENT_BOTTOM - 235
@@ -97,6 +99,7 @@ Background@ASSETBROWSER_BG:
Height:25
Text:Extract to Folder
Font:Bold
Disabled: yes
Button@EXPORT_BUTTON:
X:PARENT_RIGHT - 200
Y:PARENT_BOTTOM - 200
@@ -104,6 +107,7 @@ Background@ASSETBROWSER_BG:
Height:25
Text:Export as PNG
Font:Bold
Disabled: yes
Button@CLOSE_BUTTON:
X:PARENT_RIGHT - 200
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
~movies2.mix
PackageContents:
mods/ra/mix/conquer.yaml
mods/ra/mix/hires.yaml
Rules:
mods/ra/rules/defaults.yaml
mods/ra/rules/system.yaml