Skip to content

Instantly share code, notes, and snippets.

@Ryex
Created January 2, 2016 22:20
Show Gist options
  • Save Ryex/e4f9e5172c22155be606 to your computer and use it in GitHub Desktop.
Save Ryex/e4f9e5172c22155be606 to your computer and use it in GitHub Desktop.
XML Resource parsing
function Clone() { }
function clone(obj) {
Clone.prototype = obj;
return new Clone();
}
//load sprintf
//importScripts('sprintf.js')
//importScripts('/js/lib/underscore-min.js')
//importScripts('/js/lib/xmlsax.js')
//importScripts('/js/lib/xmlw3cdom.js')
/******************************************************************
* Resource Parsing
******************************************************************/
var $XMLResourceNodeParsers = {
sprintf: function (resource, xml) {
var node = new XMLsprintfNode(resource, xml);
return node;
},
sprite: function (resource, xml) {
var node = new XMLResourceSpriteNode(resource, xml);
return node;
},
loop: function (resource, xml) {
var node = new XMLResourceLoopNode(resource, xml);
return node;
},
windowskin: function (resource, xml) {
var node = new XMLResourceWindowSkinNode(resource, xml);
return node;
}
};
//$XMLResourceNodeDelayParsers = {};
function XMLsprintfNode(resource, xml) {
var self = this
self.resource = resource
self.nodeType = 'sprintf'
self.name = "";
self.func = "";
for (var i = 0; i < xml.attributes.length; i++) {
var atter = xml.attributes.item(i)
var val = atter.nodeValue;
if(!isNaN(val)) {
val = parseFloat(val);
}
if(val) self[atter.nodeName.toLowerCase()] = val;
}
self.evaluate = function (map) {
var result;
map['mod'] = '%';
var s = sprintf(String(self.func), map);
result = eval(s);
return result;
};
self.map =function(map) {
map[self.name] = self.evaluate(map);
};
self.exec = function (map) {
self.map(map);
};
}
function XMLResourceURLNode(xml) {
var self = this
self.name = "";
self.value = "";
self.nodeType = 'url'
var URL_MAP = {
RESOURCE_URL: $MEW.RESOURCE_URL,
NODE_URL: $MEW.NODE_URL,
API_URL: $MEW.API_URL
};
for (var i = 0; i < xml.attributes.length; i++) {
var atter = xml.attributes.item(i)
if (atter.nodeName.toLowerCase() === 'name') {
self.name = atter.nodeValue;
} else if (atter.nodeName.toLowerCase() === 'value') {
self.value = sprintf(String(atter.nodeValue), URL_MAP);
}
}
}
function XMLResourceTypeNode(xml, map) {
var self = this
self.name = "";
self.url = "";
self.nodeType = 'type'
self.filetype = ""
for (var i = 0; i < xml.attributes.length; i++) {
var atter = xml.attributes.item(i)
if (atter.nodeName.toLowerCase() === 'name') {
self.name = atter.nodeValue;
} else if (atter.nodeName.toLowerCase() === 'url') {
self.url = map[atter.nodeValue];
}
}
}
function XMLResourceSpriteNode(resource, xml) {
var self = this
self.nodeType = 'sprite'
self.resource = resource
self.name = "";
self.mapx = "";
self.mapy = "";
self.mapw = "";
self.maph = "";
self.url = "";
self.id = -1;
for (var i = 0; i < xml.attributes.length; i++) {
var atter = xml.attributes.item(i)
var val = atter.nodeValue
if(!isNaN(val)) {
val = parseFloat(val)
}
if(val) self[atter.nodeName.toLowerCase()] = val;
}
self.getMappedParams = function (map) {
var params = {};
params.name = sprintf(String(self.name), map);
params.id = parseInt(sprintf(String(self.id), map));
params.mapx = parseInt(sprintf(String(self.mapx), map));
params.mapy = parseInt(sprintf(String(self.mapy), map));
params.mapw = parseInt(sprintf(String(self.mapw), map));
params.maph = parseInt(sprintf(String(self.maph), map));
params.map = {};
params.map[params.name] = [params.mapx, params.mapy];
params.url = sprintf(String(self.url), map);
return params;
};
self.exec = function (map) {
var params = self.getMappedParams(map);
if (self.resource.filetype.toLowerCase() == 'tile') {
postMessage({code : 'SkermishTerrainSprite', data : [params.id, params.name]})
} else if (self.resource.filetype.toLowerCase() == 'sprite') {
postMessage({code : 'PonyPartSprite', data : [params.name, params.url, params.mapx, params.mapy, params.mapw, params.maph]})
}
postMessage({code : 'Sprite', data : [params.mapw, params.maph, params.url, params.map]})
//Crafty.sprite(params.mapw, params.maph, params.url, params.map);
};
}
function XMLResourceWindowSkinNode(resource, xml) {
var self = this
self.resource = resource
self.nodeType = 'windowskin'
self.name = "";
self.top = 0;
self.bot = 0;
self.left = 0;
self.right = 0;
self.width = 0;
self.height = 0;
self.url ="";
for (var i = 0; i < xml.attributes.length; i++) {
var atter = xml.attributes.item(i)
var val = atter.nodeValue;
if(!isNaN(val)) {
val = parseFloat(val);
}
if(val) self[atter.nodeName.toLowerCase()] = val;
}
self.getMappedParams = function (map) {
var params = {};
params.name = sprintf(String(self.name), map);
params.top = parseInt(sprintf(String(self.top), map));
params.bot = parseInt(sprintf(String(self.bot), map));
params.left = parseInt(sprintf(String(self.left), map));
params.right = parseInt(sprintf(String(self.right), map));
params.width = parseInt(sprintf(String(self.width), map));
params.height = parseInt(sprintf(String(self.height), map));
params.url = sprintf(String(self.url), map);
return params;
};
self.exec = function (map) {
var params = self.getMappedParams(map);
postMessage({code : 'WindowSkin', data : [
params.name,
params.top,
params.bot,
params.left,
params.right,
params.width,
params.height,
params.url
]})
};
}
function XMLResourceLoopNode (resource, xml) {
var self = this
self.resource = resource
self.nodeType = 'loop'
self.val = "";
self.start = 0;
self.stop = 0;
self.nodes = [];
self.sprintfmap = {};
for (var i = 0; i < xml.attributes.length; i++) {
var atter = xml.attributes.item(i)
var val = atter.nodeValue;
if(!isNaN(val)) {
val = parseFloat(val);
}
if(val) self[atter.nodeName.toLowerCase()] = val;
}
self.parse = function () {
var children = xml.childNodes;
var node;
for (var i = 0; i < children.length; i++) {
var child = children.item(i)
if ($XMLResourceNodeParsers.hasOwnProperty(child.nodeName.toLowerCase())) {
node = $XMLResourceNodeParsers[child.nodeName.toLowerCase()](self.resource, child);
self.nodes.push(node);
}
}
self.loop();
};
self.loop = function () {
for (var i = self.start; i < self.stop; i++) {
self.sprintfmap[self.val] = i;
for (var j = 0; j < self.nodes.length; j++) {
self.nodes[j].exec(self.sprintfmap);
}
}
};
self.exec = function (map) {
for (var a in map) {
self.sprintfmap[a] = map[a];
}
//self.sprintfmap = clone(map); //--clone doesn't seem to work
self.parse();
};
}
function XMLResourceNode(xml) {
var self = this
self.nodeType = 'resource'
self.file = "";
self.filetype = "";
self.width = 0;
self.height = 0;
self.sprintfmap = {};
self.nodes = [];
self.url = "";
for (var i = 0; i < xml.attributes.length; i++) {
var atter = xml.attributes.item(i)
var val = atter.nodeValue;
if(!isNaN(val)) {
val = parseFloat(val);
}
if(val) self[atter.nodeName.toLowerCase()] = val;
}
self.parse = function () {
var children = xml.childNodes;
var node;
for(var i = 0; i < children.length; i++) {
var child = children.item(i)
if ($XMLResourceNodeParsers.hasOwnProperty(child.nodeName.toLowerCase())) {
node = $XMLResourceNodeParsers[child.nodeName.toLowerCase()](self, child);
self.nodes.push(node);
}
}
self.sprintfmap["width"] = self.width;
self.sprintfmap["height"] = self.height;
self.sprintfmap["url"] = self.url;
_(self.nodes).each( function( node, index, nodes ) {
node.exec(self.sprintfmap);
});
};
self.exec = function (map) {
self.sprintfmap = clone(map);
self.parse();
};
}
function XMLResourceParser(xml) {
var self = this
self.urls = [];
self.types = [];
self.resources = [];
self.sprintfmap = {};
self.typemap = {};
self.parseResources = function (xml) {
var urls = xml.getElementsByTagName('url');
var types = xml.getElementsByTagName('type');
var resources = xml.getElementsByTagName('resource');
for (var i = 0; i < urls.length; i++) {
var urlXML = urls.item(i)
var url = new XMLResourceURLNode(urlXML)
self.sprintfmap[url.name] = url.value
self.urls.push(url)
}
for (var i = 0; i < types.length; i++) {
var typeXML = types.item(i)
var type = new XMLResourceTypeNode(typeXML, self.sprintfmap)
self.typemap[type.name] = type.url
self.types.push(type)
}
for (var i = 0; i < resources.length; i++) {
var resourceXML = resources.item(i)
var resource = new XMLResourceNode(resourceXML)
resource.url = self.typemap[resource.filetype] + resource.file
self.resources.push(resource)
}
};
self.getResourceURLS = function() {
var urls = [];
_(self.resources).each( function( resource, index, resources ) {
urls.push(resource.url);
});
return urls;
};
self.setupResources = function () {
postMessage("Beginning Resource setup")
var resources = self.resources
var sprintfmap = self.sprintfmap
var length = resources.length
for (var i = 0; i < length; i++) {
postMessage("Processing " + resources[i].file)
resources[i].exec(sprintfmap)
var progress = i / length
postMessage({code : 'progress', data : progress})
}
};
self.parseResources(xml);
postMessage("Resources parsed")
}
var parser = null
function setup_parser(xml) {
var domParser = new DOMImplementation()
xmlObj = domParser.loadXML(xml)
parser = new XMLResourceParser(xmlObj)
var urls = parser.getResourceURLS()
postMessage({code :'urls', data : urls})
}
function setup_resources() {
if (parser) {
parser.setupResources()
postMessage({code : 'done', data: null})
} else {
postMessage({code : 'error', data: 'parser not set up'})
}
}
addEventListener('message', function(e) {
var msg = e.data;
switch (msg.code) {
case 'start':
setup_parser(msg.data)
break
case 'setup':
setup_resources()
break
case 'stop':
postMessage('WORKER STOPPED');
close(); // Terminates the worker.
break
default:
postMessage('Unknown command: ' + data.msg);
}
}, false)
postMessage({code : 'started', data : null})
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<!-- DATE 8/19/2013 -->
<!-- URLS -->
<url name="TileResourceURL" value="%(RESOURCE_URL)s/image/0/" />
<url name="SpriteResourceURL" value="%(RESOURCE_URL)s/image/1/" />
<url name="InterfaceResourceURL" value="%(RESOURCE_URL)s/image/2/" />
<type name="sprite" url="SpriteResourceURL" />
<type name="tile" url="TileResourceURL" />
<type name="interface" url="InterfaceResourceURL" />
<!-- Tiles -->
<resource file="grass_block.png" filetype="tile" width="64" height="128">
<sprite id="0" name="GrassSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="everfree_grass_block.png" filetype="tile" width="64" height="128">
<sprite id="1" name="EverfreeGrassSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="flower_block.png" filetype="tile" width="64" height="128">
<sprite id="2" name="FlowerSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="dirt_block.png" filetype="tile" width="64" height="128">
<sprite id="3" name="DirtSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="mud_block.png" filetype="tile" width="64" height="128">
<sprite id="4" name="MudSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="barren.png" filetype="tile" width="64" height="128">
<sprite id="5" name="BarrenSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<!-- MISSING ID 6 -->
<resource file="swamp_block.png" filetype="tile" width="64" height="128">
<sprite id="7" name="SwampSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="bushes_block.png" filetype="tile" width="64" height="128">
<sprite id="8" name="BushesSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="forest_block.png" filetype="tile" width="64" height="128">
<sprite id="9" name="ForestSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="everfree_forest_block.png" filetype="tile" width="64" height="128">
<sprite id="10" name="EverfreeForestSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="rocky_block.png" filetype="tile" width="64" height="128">
<sprite id="11" name="RockySprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="snow_block.png" filetype="tile" width="64" height="128">
<sprite id="12" name="SnowSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="ice_block.png" filetype="tile" width="64" height="128">
<sprite id="13" name="IceSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="water_block.png" filetype="tile" width="64" height="128">
<sprite id="14" name="WaterSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="ravine.png" filetype="tile" width="64" height="128">
<sprite id="15" name="RavineSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="volcano_block.png" filetype="tile" width="64" height="128">
<sprite id="16" name="VolcanoSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="mountain_block.png" filetype="tile" width="64" height="128">
<sprite id="17" name="MountainSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="snow_mountain_block.png" filetype="tile" width="64" height="128">
<sprite id="18" name="SnowMountainSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="desert_2_block.png" filetype="tile" width="64" height="128">
<sprite id="19" name="Desert2Sprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="lava_block.png" filetype="tile" width="64" height="128">
<sprite id="20" name="LavaSprit" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="quicksand_block.png" filetype="tile" width="64" height="128">
<sprite id="21" name="QuicksandSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="poison_joke_block.png" filetype="tile" width="64" height="128">
<sprite id="22" name="PoisonJokeSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="apple_trees_block.png" filetype="tile" width="64" height="128">
<sprite id="23" name="AppleTreesSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="zap_apple_tree_block.png" filetype="tile" width="64" height="128">
<sprite id="24" name="ZapAppleTreeSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="gemstone_block.png" filetype="tile" width="64" height="128">
<sprite id="25" name="GemstoneSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="diamonds_block.png" filetype="tile" width="64" height="128">
<sprite id="26" name="DiamondsSprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<resource file="desert_1_block.png" filetype="tile" width="64" height="128">
<sprite id="27" name="Desert1Sprite" url="%(url)s" mapx="0" mapy="0" mapw="64" maph="128" />
</resource>
<!-- Sprites -->
<!-- Armor -->
<!-- Front -->
<resource file="ARMOROPT.PNG" filetype="sprite" width="2048" height="512">
<sprintf name="cw" func="%(width)s / 32"/>
<sprintf name="ch" func="%(height)s / 8"/>
<sprite name="Armor|0|0|0|0" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Armor|1|0|0|0" url="%(url)s" mapx="0" mapy="1" mapw="%(cw)s" maph="%(ch)s" />
<loop val="y" start="0" stop="8">
<loop val="x" start="1" stop="32">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="varient" func="%(x)s" />
<sprintf name="color" func="Math.floor(%(y)s / 2)" />
<sprite name="Armor|%(sex)s|%(varient)s|%(color)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<resource file="ARMORback.PNG" filetype="sprite" width="2048" height="512">
<sprintf name="cw" func="%(width)s / 32"/>
<sprintf name="ch" func="%(height)s / 8"/>
<sprite name="Armor|0|0|0" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Armor|1|0|0" url="%(url)s" mapx="0" mapy="1" mapw="%(cw)s" maph="%(ch)s" />
<loop val="y" start="0" stop="8">
<loop val="x" start="1" stop="32">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="varient" func="%(x)s" />
<sprintf name="color" func="Math.floor(%(y)s / 2)" />
<sprite name="Armor|%(sex)s|%(varient)s|%(color)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Body -->
<!-- Front & Back-->
<resource file="COLOURS.PNG" filetype="sprite" width="3200" height="256">
<sprintf name="cw" func="%(width)s / 50"/>
<sprintf name="ch" func="%(height)s / 4"/>
<loop val="y" start="0" stop="4">
<loop val="x" start="0" stop="50">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="color" func="%(x)s" />
<sprintf name="front" func="Math.floor(%(y)s / 2)" />
<sprite name="Body|%(sex)s|%(color)s|%(front)s" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Eyes -->
<!-- Front -->
<resource file="EYES.png" filetype="sprite" width="640" height="512">
<sprintf name="cw" func="%(width)s / 10"/>
<sprintf name="ch" func="%(height)s / 8"/>
<loop val="y" start="0" stop="8">
<loop val="x" start="0" stop="10">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="color" func="%(x)s" />
<sprintf name="varient" func="Math.floor(%(y)s / 2)" />
<sprite name="Eyes|%(sex)s|%(color)s|%(varient)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<resource file="EYESBACK.png" filetype="sprite" width="640" height="512">
<sprintf name="cw" func="%(width)s / 10"/>
<sprintf name="ch" func="%(height)s / 8"/>
<loop val="y" start="0" stop="8">
<loop val="x" start="0" stop="10">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="color" func="%(x)s" />
<sprintf name="varient" func="Math.floor(%(y)s / 2)" />
<sprite name="Eyes|%(sex)s|%(color)s|%(varient)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Male Hair-->
<!-- Front -->
<resource file="HAIRMALEFRONT.png" filetype="sprite" width="1344" height="1600">
<sprintf name="cw" func="%(width)s / 21"/>
<sprintf name="ch" func="%(height)s / 25"/>
<sprite name="Mane|0|0|0|0" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|1|0" url="%(url)s" mapx="1" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|2|0" url="%(url)s" mapx="2" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|3|0" url="%(url)s" mapx="3" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|4|0" url="%(url)s" mapx="4" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|5|0" url="%(url)s" mapx="5" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|6|0" url="%(url)s" mapx="6" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|7|0" url="%(url)s" mapx="7" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|8|0" url="%(url)s" mapx="8" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|9|0" url="%(url)s" mapx="9" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|10|0" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprintf name="offset" func="10"/>
<loop val="y" start="1" stop="25">
<loop val="x" start="0" stop="21">
<sprintf name="color" func="%(y)s" />
<sprintf name="varient" func="%(x)s + %(offset)s" />
<sprite name="Mane|0|%(varient)s|%(color)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<resource file="HAIRMALEBACK.PNG" filetype="sprite" width="1344" height="1600">
<sprintf name="cw" func="%(width)s / 21"/>
<sprintf name="ch" func="%(height)s / 25"/>
<sprite name="Mane|0|0|0|1" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|1|1" url="%(url)s" mapx="1" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|2|1" url="%(url)s" mapx="2" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|3|1" url="%(url)s" mapx="3" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|4|1" url="%(url)s" mapx="4" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|5|1" url="%(url)s" mapx="5" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|6|1" url="%(url)s" mapx="6" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|7|1" url="%(url)s" mapx="7" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|8|1" url="%(url)s" mapx="8" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|9|1" url="%(url)s" mapx="9" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|0|0|10|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprintf name="offset" func="10"/>
<loop val="y" start="1" stop="25">
<loop val="x" start="0" stop="21">
<sprintf name="color" func="%(y)s" />
<sprintf name="varient" func="%(x)s + %(offset)s" />
<sprite name="Mane|0|%(varient)s|%(color)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>1
<!-- Female Hair -->
<!-- Front -->
<resource file="HAIRFEMFRONT.PNG" filetype="sprite" width="1856" height="1600">
<sprintf name="cw" func="%(width)s / 29"/>
<sprintf name="ch" func="%(height)s / 25"/>
<sprite name="Mane|1|0|0|0" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|1|0" url="%(url)s" mapx="1" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|2|0" url="%(url)s" mapx="2" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|3|0" url="%(url)s" mapx="3" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|4|0" url="%(url)s" mapx="4" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|5|0" url="%(url)s" mapx="5" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|6|0" url="%(url)s" mapx="6" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|7|0" url="%(url)s" mapx="7" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|8|0" url="%(url)s" mapx="8" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|9|0" url="%(url)s" mapx="9" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|10|0" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprintf name="offset" func="10"/>
<loop val="y" start="1" stop="25|0">
<loop val="x" start="0" stop="29">
<sprintf name="color" func="%(y)s" />
<sprintf name="varient" func="%(x)s + %(offset)s" />
<sprite name="Mane|1|%(varient)s|%(color)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<resource file="HAIRFEMBACK.png" filetype="sprite" width="1856" height="1600">
<sprintf name="cw" func="%(width)s / 29"/>
<sprintf name="ch" func="%(height)s / 25"/>
<sprite name="Mane|1|0|0|1" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|1|1" url="%(url)s" mapx="1" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|2|1" url="%(url)s" mapx="2" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|3|1" url="%(url)s" mapx="3" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|4|1" url="%(url)s" mapx="4" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|5|1" url="%(url)s" mapx="5" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|6|1" url="%(url)s" mapx="6" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|7|1" url="%(url)s" mapx="7" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|8|1" url="%(url)s" mapx="8" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|9|1" url="%(url)s" mapx="9" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Mane|1|0|10|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprintf name="offset" func="10"/>
<loop val="y" start="1" stop="25|0">
<loop val="x" start="0" stop="29">
<sprintf name="color" func="%(y)s" />
<sprintf name="varient" func="%(x)s + %(offset)s" />
<sprite name="Mane|1|%(varient)s|%(color)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Hats -->
<!-- Front -->
<resource file="HATS.PNG" filetype="sprite" width="2048" height="512">
<sprintf name="cw" func="%(width)s / 32"/>
<sprintf name="ch" func="%(height)s / 8"/>
<sprite name="Hat|0|0|0|0" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Hat|1|0|0|0" url="%(url)s" mapx="0" mapy="1" mapw="%(cw)s" maph="%(ch)s" />
<loop val="y" start="0" stop="8">
<loop val="x" start="1" stop="32">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="varient" func="%(x)s" />
<sprintf name="color" func="Math.floor(%(y)s / 2)" />
<sprite name="Hat|%(sex)s|%(varient)s|%(color)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<resource file="HATSback.PNG" filetype="sprite" width="2048" height="512">
<sprintf name="cw" func="%(width)s / 32"/>
<sprintf name="ch" func="%(height)s / 8"/>
<sprite name="Hat|0|0|0|1" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Hat|1|0|0|1" url="%(url)s" mapx="0" mapy="1" mapw="%(cw)s" maph="%(ch)s" />
<loop val="y" start="0" stop="8">
<loop val="x" start="1" stop="32">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="varient" func="%(x)s" />
<sprintf name="color" func="Math.floor(%(y)s / 2)" />
<sprite name="Hat|%(sex)s|%(varient)s|%(color)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Horns -->
<!-- Front -->
<resource file="HORNS.PNG" filetype="sprite" width="3200" height="128">
<sprintf name="cw" func="%(width)s / 50"/>
<sprintf name="ch" func="%(height)s / 2"/>
<loop val="y" start="0" stop="2">
<loop val="x" start="0" stop="50">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="color" func="%(x)s" />
<sprite name="Horn|%(sex)s|%(color)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<resource file="HORNSBACK.png" filetype="sprite" width="3200" height="128">
<sprintf name="cw" func="%(width)s / 50"/>
<sprintf name="ch" func="%(height)s / 2"/>
<loop val="y" start="0" stop="2">
<loop val="x" start="0" stop="50">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="color" func="%(x)s" />
<sprite name="Horn|%(sex)s|%(color)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Male Tails -->
<!-- Front -->
<resource file="Tailsmalefront.png" filetype="sprite" width="1088" height="1600">
<sprintf name="cw" func="%(width)s / 17"/>
<sprintf name="ch" func="%(height)s / 25"/>
<sprite name="Tail|0|0|0|0" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|1|0" url="%(url)s" mapx="1" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|2|0" url="%(url)s" mapx="2" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|3|0" url="%(url)s" mapx="3" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|4|0" url="%(url)s" mapx="4" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|5|0" url="%(url)s" mapx="5" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|6|0" url="%(url)s" mapx="6" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|7|0" url="%(url)s" mapx="7" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|8|0" url="%(url)s" mapx="8" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|9|0" url="%(url)s" mapx="9" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|10|0" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprintf name="offset" func="10"/>
<loop val="y" start="1" stop="25">
<loop val="x" start="0" stop="17">
<sprintf name="color" func="%(y)s" />
<sprintf name="varient" func="%(x)s + %(offset)s" />
<sprite name="Tail|0|%(varient)s|%(color)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<resource file="Tailsmaleback.png" filetype="sprite" width="1088" height="1600">
<sprintf name="cw" func="%(width)s / 17"/>
<sprintf name="ch" func="%(height)s / 25"/>
<sprite name="Tail|0|0|0|1" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|1|1" url="%(url)s" mapx="1" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|2|1" url="%(url)s" mapx="2" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|3|1" url="%(url)s" mapx="3" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|4|1" url="%(url)s" mapx="4" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|5|1" url="%(url)s" mapx="5" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|6|1" url="%(url)s" mapx="6" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|7|1" url="%(url)s" mapx="7" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|8|1" url="%(url)s" mapx="8" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|9|1" url="%(url)s" mapx="9" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|0|0|10|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprintf name="offset" func="10"/>
<loop val="y" start="1" stop="25">
<loop val="x" start="0" stop="17">
<sprintf name="color" func="%(y)s" />
<sprintf name="varient" func="%(x)s + %(offset)s" />
<sprite name="Tail|0|%(varient)s|%(color)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Female Tails -->
<!-- Front -->
<!-- Back -->
<resource file="TAILFEMBACK.PNG" filetype="sprite" width="1856" height="1600">
<sprintf name="cw" func="%(width)s / 29"/>
<sprintf name="ch" func="%(height)s / 25"/>
<sprite name="Tail|1|0|0|1" url="%(url)s" mapx="0" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|1|1" url="%(url)s" mapx="1" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|2|1" url="%(url)s" mapx="2" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|3|1" url="%(url)s" mapx="3" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|4|1" url="%(url)s" mapx="4" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|5|1" url="%(url)s" mapx="5" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|6|1" url="%(url)s" mapx="6" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|7|1" url="%(url)s" mapx="7" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|8|1" url="%(url)s" mapx="8" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|9|1" url="%(url)s" mapx="9" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|10|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|11|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|12|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|13|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|14|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|15|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|16|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|17|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|18|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprite name="Tail|1|0|19|1" url="%(url)s" mapx="10" mapy="0" mapw="%(cw)s" maph="%(ch)s" />
<sprintf name="offset" func="19"/>
<loop val="y" start="1" stop="25">
<loop val="x" start="0" stop="29">
<sprintf name="color" func="%(y)s" />
<sprintf name="varient" func="%(x)s + %(offset)s" />
<sprite name="Tail|1|%(varient)s|%(color)s|1" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Weapons -->
<!-- Front -->
<resource file="WEAPONS.PNG" filetype="sprite" width="1088" height="128">
<sprintf name="cw" func="%(width)s / 17"/>
<sprintf name="ch" func="%(height)s / 2"/>
<loop val="y" start="0" stop="2">
<loop val="x" start="0" stop="17">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="weapon" func="%(x)s" />
<sprite name="Weapon|%(sex)s|%(weapon)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Wings -->
<!-- Front -->
<resource file="Wingsfront.png" filetype="sprite" width="3264" height="256">
<sprintf name="cw" func="%(width)s / 51"/>
<sprintf name="ch" func="%(height)s / 4"/>
<loop val="y" start="0" stop="4">
<loop val="x" start="0" stop="51">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="color" func="%(x)s" />
<sprintf name="open" func="Math.floor(%(y)s / 2)" />
<sprite name="Wings|%(sex)s|%(color)s|%(open)s|0" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Back -->
<!-- Chess -->
<!-- ChessFix -->
<resource file="Chessfix.png" filetype="sprite" width="768" height="256">
<sprintf name="cw" func="%(width)s / 12"/>
<sprintf name="ch" func="%(height)s / 4"/>
<loop val="y" start="0" stop="4">
<loop val="x" start="0" stop="12">
<sprintf name="sex" func="%(y)s %(mod)s 2" />
<sprintf name="color" func="%(x)s %(mod)s 2" />
<sprintf name="piece" func="Math.floor(%(x)s / 2)" />
<sprintf name="front" func="Math.floor(%(y)s / 2)" />
<sprite name="Chessfix|%(sex)s|%(color)s|%(piece)s|%(front)s" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- highlights light -->
<resource file="snow_block2.png" filetype="sprite" width="256" height="128">
<sprintf name="cw" func="%(width)s / 4"/>
<sprintf name="ch" func="%(height)s"/>
<loop val="y" start="0" stop="4">
<loop val="x" start="0" stop="12">
<sprite name="HighlightLight|%(x)s" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- highlights dark-->
<resource file="snow_block3.png" filetype="sprite" width="256" height="128">
<sprintf name="cw" func="%(width)s / 4"/>
<sprintf name="ch" func="%(height)s"/>
<loop val="y" start="0" stop="4">
<loop val="x" start="0" stop="12">
<sprite name="HighlightDark|%(x)s" url="%(url)s" mapx="%(x)s" mapy="%(y)s" mapw="%(cw)s" maph="%(ch)s" />
</loop>
</loop>
</resource>
<!-- Interface -->
<resource file="ParchmentWSV.png" filetype="interface" width="200" height="200">
<windowskin name="ParchmentWSV" url="%(url)s" top="30" bot="170" left="32" right="160" width="%(width)s" height="%(height)s" />
</resource>
<resource file="small_v2_combined.png" filetype="interface" width="144" height="144">
<windowskin name="small_v2_combined" url="%(url)s" top="32" bot="112" left="32" right="112" width="%(width)s" height="%(height)s" />
</resource>
<resource file="mew_login_screen.png" filetype="interface" width="800" height="600">
<sprite name="mew_login_screen_sprite" url="%(url)s" mapx="0" mapy="0" mapw="800" maph="600" />
</resource>
</resources>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment