mirror of
https://github.com/MapMakersAndProgrammers/alternativa-editor-mod.git
synced 2025-10-26 01:49:05 -07:00
239 lines
8.2 KiB
ActionScript
239 lines
8.2 KiB
ActionScript
package alternativa.editor.propslib
|
|
{
|
|
import alternativa.editor.propslib.events.PropLibProgressEvent;
|
|
import alternativa.editor.propslib.loaders.MeshLoader;
|
|
import alternativa.editor.propslib.loaders.SpriteLoader;
|
|
import alternativa.editor.engine3d.loaders.TextureMapsInfo;
|
|
import alternativa.types.Map;
|
|
import flash.events.ErrorEvent;
|
|
import flash.events.Event;
|
|
import flash.events.EventDispatcher;
|
|
import flash.events.IOErrorEvent;
|
|
import flash.events.SecurityErrorEvent;
|
|
import flash.net.URLLoader;
|
|
import flash.net.URLRequest;
|
|
import flash.system.ApplicationDomain;
|
|
import flash.system.LoaderContext;
|
|
|
|
public class PropsLibrary extends EventDispatcher
|
|
{
|
|
public var name:String;
|
|
|
|
public var rootGroup:PropGroup;
|
|
|
|
private var url:String;
|
|
|
|
private var configLoader:URLLoader;
|
|
|
|
private var loaders:Vector.<ObjectLoaderPair>;
|
|
|
|
private var currLoader:ObjectLoaderPair;
|
|
|
|
private var propsLoaded:int;
|
|
|
|
private var propsTotal:int;
|
|
|
|
public function PropsLibrary(param1:String = null)
|
|
{
|
|
super();
|
|
if(param1 != null)
|
|
{
|
|
this.load(param1);
|
|
}
|
|
}
|
|
|
|
private static function xmlReadAttrString(param1:XML, param2:String, param3:String = null) : String
|
|
{
|
|
var loc4:XMLList = param1.attribute(param2);
|
|
if(loc4.length() > 0)
|
|
{
|
|
return loc4[0].toString();
|
|
}
|
|
return param3;
|
|
}
|
|
|
|
private static function xmlReadAttrNumber(param1:XML, param2:String, param3:Number) : Number
|
|
{
|
|
var loc4:XMLList = param1.attribute(param2);
|
|
if(loc4.length() > 0)
|
|
{
|
|
return Number(loc4[0]);
|
|
}
|
|
return param3;
|
|
}
|
|
|
|
public function load(param1:String) : void
|
|
{
|
|
if(param1 == null)
|
|
{
|
|
throw new ArgumentError();
|
|
}
|
|
this.url = param1.length > 0 && param1.charAt(param1.length - 1) != "/" ? param1 + "/" : param1;
|
|
this.configLoader = new URLLoader(new URLRequest(this.url + "library.xml"));
|
|
this.configLoader.addEventListener(Event.COMPLETE,this.onXMLLoadingComplete);
|
|
this.configLoader.addEventListener(IOErrorEvent.IO_ERROR,this.onErrorEvent);
|
|
this.configLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,this.onErrorEvent);
|
|
}
|
|
|
|
private function onErrorEvent(param1:ErrorEvent) : void
|
|
{
|
|
dispatchEvent(param1);
|
|
}
|
|
|
|
private function onXMLLoadingComplete(param1:Event) : void
|
|
{
|
|
var loc2:XML = XML(this.configLoader.data);
|
|
this.configLoader.removeEventListener(Event.COMPLETE,this.onXMLLoadingComplete);
|
|
this.configLoader.removeEventListener(IOErrorEvent.IO_ERROR,this.onErrorEvent);
|
|
this.configLoader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,this.onErrorEvent);
|
|
this.configLoader = null;
|
|
this.name = loc2.@name;
|
|
this.loaders = new Vector.<ObjectLoaderPair>();
|
|
this.rootGroup = this.parseGroup(loc2);
|
|
this.propsLoaded = 0;
|
|
this.propsTotal = this.loaders.length;
|
|
this.loadPropObject();
|
|
}
|
|
|
|
private function loadPropObject() : void
|
|
{
|
|
this.currLoader = this.loaders.pop();
|
|
this.currLoader.loader.addEventListener(Event.COMPLETE,this.onPropObjectLoadingComplete);
|
|
this.currLoader.loader.addEventListener(IOErrorEvent.IO_ERROR,this.onErrorEvent);
|
|
this.currLoader.loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,this.onErrorEvent);
|
|
var loc1:LoaderContext = new LoaderContext();
|
|
loc1.applicationDomain = ApplicationDomain.currentDomain;
|
|
this.currLoader.loader.load(loc1);
|
|
}
|
|
|
|
private function onPropObjectLoadingComplete(param1:Event) : void
|
|
{
|
|
var loc2:PropLibMesh = null;
|
|
var loc3:MeshLoader = null;
|
|
this.currLoader.loader.removeEventListener(Event.COMPLETE,this.onPropObjectLoadingComplete);
|
|
this.currLoader.loader.removeEventListener(IOErrorEvent.IO_ERROR,this.onErrorEvent);
|
|
this.currLoader.loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,this.onErrorEvent);
|
|
if(this.currLoader.propObject is PropLibMesh)
|
|
{
|
|
loc2 = this.currLoader.propObject as PropLibMesh;
|
|
loc3 = this.currLoader.loader as MeshLoader;
|
|
loc2.mainObject = loc3.object;
|
|
loc2.bitmaps = loc3.bitmaps;
|
|
loc2.objects = loc3.objects;
|
|
}
|
|
else
|
|
{
|
|
this.currLoader.propObject.mainObject = (this.currLoader.loader as SpriteLoader).sprite;
|
|
}
|
|
++this.propsLoaded;
|
|
if(hasEventListener(PropLibProgressEvent.PROGRESS))
|
|
{
|
|
dispatchEvent(new PropLibProgressEvent(this.propsLoaded,this.propsTotal));
|
|
}
|
|
if(this.loaders.length > 0)
|
|
{
|
|
this.loadPropObject();
|
|
}
|
|
else
|
|
{
|
|
this.currLoader = null;
|
|
dispatchEvent(new Event(Event.COMPLETE));
|
|
}
|
|
}
|
|
|
|
private function parseGroup(param1:XML) : PropGroup
|
|
{
|
|
var loc2:XML = null;
|
|
var loc3:PropGroup = new PropGroup(param1.@name);
|
|
for each(loc2 in param1.prop)
|
|
{
|
|
loc3.addProp(this.parseProp(loc2));
|
|
}
|
|
for each(loc2 in param1.elements("prop-group"))
|
|
{
|
|
loc3.addGroup(this.parseGroup(loc2));
|
|
}
|
|
return loc3;
|
|
}
|
|
|
|
private function parseProp(param1:XML) : PropLibObject
|
|
{
|
|
var loc2:ObjectLoaderPair = this.createObjectLoaderPair(param1);
|
|
this.loaders.push(loc2);
|
|
return loc2.propObject;
|
|
}
|
|
|
|
private function createObjectLoaderPair(param1:XML) : ObjectLoaderPair
|
|
{
|
|
if(param1.mesh.length() > 0)
|
|
{
|
|
return this.createMeshLoaderPair(param1);
|
|
}
|
|
if(param1.sprite.length() > 0)
|
|
{
|
|
return this.createSpriteLoaderPair(param1);
|
|
}
|
|
throw new Error("Unknown prop: " + param1);
|
|
}
|
|
|
|
private function createMeshLoaderPair(param1:XML) : ObjectLoaderPair
|
|
{
|
|
var loc3:Map = null;
|
|
var loc5:XML = null;
|
|
var loc6:String = null;
|
|
var loc7:String = null;
|
|
var loc2:XML = param1.mesh[0];
|
|
if(loc2.texture.length() > 0)
|
|
{
|
|
loc3 = new Map();
|
|
for each(loc5 in loc2.texture)
|
|
{
|
|
loc6 = loc5.attribute("diffuse-map").toString().toLowerCase();
|
|
loc7 = xmlReadAttrString(loc5,"opacity-map");
|
|
if(loc7 != null)
|
|
{
|
|
loc7 = this.url + loc7.toLowerCase();
|
|
}
|
|
loc3.add(loc5.@name.toString(),new TextureMapsInfo(this.url + loc6,loc7));
|
|
}
|
|
}
|
|
var loc4:ObjectLoaderPair = new ObjectLoaderPair();
|
|
loc4.propObject = new PropLibMesh(param1.@name);
|
|
loc4.loader = new MeshLoader(this.url + loc2.attribute("file").toString().toLowerCase(),xmlReadAttrString(loc2,"object"),loc3,this.url);
|
|
return loc4;
|
|
}
|
|
|
|
private function createSpriteLoaderPair(param1:XML) : ObjectLoaderPair
|
|
{
|
|
var loc2:XML = param1.sprite[0];
|
|
var loc3:String = xmlReadAttrString(loc2,"alpha");
|
|
if(loc3 != null)
|
|
{
|
|
loc3 = this.url + loc3.toLowerCase();
|
|
}
|
|
var loc4:Number = xmlReadAttrNumber(loc2,"origin-x",0.5);
|
|
var loc5:Number = xmlReadAttrNumber(loc2,"origin-y",1);
|
|
var loc6:Number = xmlReadAttrNumber(loc2,"scale",1);
|
|
var loc7:ObjectLoaderPair = new ObjectLoaderPair();
|
|
loc7.propObject = new PropLibObject(param1.@name);
|
|
loc7.loader = new SpriteLoader(this.url + loc2.attribute("file").toString().toLowerCase(),loc3,loc4,loc5,loc6);
|
|
return loc7;
|
|
}
|
|
}
|
|
}
|
|
|
|
import alternativa.editor.propslib.loaders.ObjectLoader;
|
|
import alternativa.editor.propslib.PropLibObject;
|
|
|
|
class ObjectLoaderPair
|
|
{
|
|
public var propObject:PropLibObject;
|
|
|
|
public var loader:ObjectLoader;
|
|
|
|
public function ObjectLoaderPair()
|
|
{
|
|
super();
|
|
}
|
|
}
|