package {
import flash.display.MovieClip;
import flash.display.Loader;
import flash.events.*;
import flash.text.*;
import flash.net.URLRequest;
import flash.utils.*;
import flash.net.*;
import flash.ui.Keyboard;
import flash.utils.getTimer;
import flash.geom.*;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import com.adobe.crypto.MD5;
import flash.system.fscommand;
import flash.desktop.*;
import djarts.core.*;
import djarts.events.*;
import djarts.components.*;
import djarts.utils.*;
import djarts.resources.*;
import djarts.display.*;
import djarts.utils.Base64;
import com.adobe.images.JPGEncoder;
import flash.display.BitmapData;
import com.adobe.serialization.json.JSON;
import com.adobe.serialization.json.*;
import flash.display.Stage3D;
import flash.display.Bitmap;
import Packer.AsyncGraphicPacker;
import Defs.GraphicDef;
import Defs.HeroDef;
import CharacterExport.CharacterExporter;
import CharacterExport.ExportBuilder;
import CharacterExport.PieceLibrary;
import GraphicExport.IconPacker;
import GraphicExport.SkelAnimPacker;
import Defs.MapDef;
import GraphicExport.AnimSetPacker;
import GraphicExport.AnimPiecePacker;
import GraphicExport.ScenePacker;
import flash.filesystem.*;
public class GraphicExport extends MovieClip
{
var UILayer:MovieClip = new MovieClip();
public static var ISLOCAL = true;
public static var wrapper:Socket = null;
public function GraphicExport()
{
GraphicFactory.FAILEDGRAPHICASBLANK = true;
GameSettings.ISLOCAL = true;
DialogManager.Instance().SetUILayer(UILayer);
DialogManager.Instance().SetUIOverLayer(UILayer);
DialogManager.Instance().ResolutionChanged(stage.width, stage.height);
this.stage.addChild(UILayer);
this.removeChild(newGraphicDialog);
Init();
try
{
NativeApplication.nativeApplication.addEventListener("invoke", ApplicationInvoked);
}
catch (e)
{
// not an air runtime app
ConnectWrapper(7890); // try default port
}
}
public function ApplicationInvoked(e)
{
if (e.arguments.length == 1)
{
ConnectWrapper(parseInt(e.arguments[0]));
}
else
{
StartUI();
}
}
private function WrapperIOError(e)
{
Log("Couldn't connect wrapper");
Log(e.toString());
StartUI();
}
private function WrapperConnect(e:Event)
{
wrapper = e.target as Socket;
Log("Wrapper Connected");
_strace("Wrapper Connected");
wrapper.addEventListener(ProgressEvent.SOCKET_DATA, WrapperData);
}
private function WrapperData(e:ProgressEvent)
{
var data:String = wrapper.readUTF();
DispatchCommand(com.adobe.serialization.json.JSON.decode(data));
SendCommand({command:"done"});
}
private function DispatchCommand(msg)
{
if (msg.hasOwnProperty("command"))
{
var cmd = msg.command;
switch (cmd)
{
case "quit":
Log("Quitting");
fscommand("quit");
NativeApplication.nativeApplication.exit();
break;
default:
Log("Sent command: " + com.adobe.serialization.json.JSON.encode(msg));
break;
}
}
}
public static function SendCommand(obj)
{
if (wrapper != null)
{
wrapper.writeUTF(com.adobe.serialization.json.JSON.encode(obj));
wrapper.flush();
}
}
private function ConnectWrapper(port)
{
Log("Attempting to connect wrapper");
try
{
var s = new Socket();
s.addEventListener(IOErrorEvent.IO_ERROR, WrapperIOError);
s.addEventListener(Event.CONNECT, WrapperConnect);
s.connect("localhost", port);
} catch (e)
{
Log("Error establishing wrapper connection");
StartUI();
return;
}
}
public function Init()
{
_trace("Initializing game params!!");
//Set a scale mode for window resizing
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
GameSettings.GameplayArea = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
ResourceManager.Instance().Init(ISLOCAL, "RootGame");
ResourceManager.Instance().SetLocations([""]);
GameSettings.Instance().SetStage(this.stage);
Globals.Instance().SetStage(this.stage);
FlashConsole.Instance().Admin = true;
stage.addEventListener(Event.ENTER_FRAME, EnterFrame);
stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
this.addChild(previewHolder);
CreateUI();
ActivateExportButtons(false);
}
var exportButtons:Array = [];
public function ActivateExportButtons(active)
{
for(var i = 0; i < exportButtons.length; i++)
{
exportButtons[i].Enabled = active;
}
this.heuristicCheck.Enabled = active;
this.edgeExpand.Enabled = active;
this.skeletal_scale.type = active ? TextFieldType.INPUT : TextFieldType.DYNAMIC;
}
protected function CreateUI()
{
/*
var maxWidth = 0;
for (var i = 0; i < exportButtons.length; i++) maxWidth = Math.max(maxWidth, exportButtons[i].width);
var startX = buttonArea.x + (maxWidth / 2); //stage.stageWidth - 110;
var startY = buttonArea.y + 20;
for(var i = 0; i < exportButtons.length; i++)
{
this.addChild(exportButtons[i])
exportButtons[i].x = startX;
exportButtons[i].y = startY;
maxWidth = Math.max(maxWidth, exportButtons[i].width);
if (exportButtons[i].GetButtonText() == "Generic Use")
{
addChild(genericUseText);
genericUseText.x = startX - exportButtons[i].width / 2;
genericUseText.y = startY + 18;
startY += 25;
}
if (exportButtons[i].GetButtonText() == "Single ID")
{
addChild(singleIdText);
singleIdText.x = startX - exportButtons[i].width / 2;
singleIdText.y = startY + 18;
startY += 25;
}
if (exportButtons[i].GetButtonText() == "Single Asset")
{
addChild(singleAssetText);
singleAssetText.x = startX - exportButtons[i].width / 2;
singleAssetText.y = startY + 18;
startY += 25;
}
startY += 35;
if (startY > buttonArea.y + buttonArea.height - 20)
{
startY = buttonArea.y + 20;
startX += (maxWidth + 20);
maxWidth = 0;
}
}
*/
heuristicCheck.Checked = false;
heuristicCheck.OnClickParam = heuristicCheck;
heuristicCheck.OnClick = ClickedHeuristic;
heuristicCheck.Text = "Flat Animated Clip Heuristic";
edgeExpand.Checked = false;
edgeExpand.OnClickParam = edgeExpand;
edgeExpand.OnClick = ClickedEdgeExpand;
edgeExpand.Text = "Expand edge alpha.";
PNGExportHelper.UseExpandedBitmaps = true;
edgeExpand.Checked = PNGExportHelper.UseExpandedBitmaps;
this.skeletal_scale.addEventListener(Event.CHANGE, SkeletalScaleChanged);
}
public function StartUI()
{
ActivateExportButtons(true);
ShowNewGraphicDialog();
}
public function ShowNewGraphicDialog()
{
newGraphicDialog.Show(this);
}
public function ExportGraphicDef(graphicDef)
{
ExportItem(graphicDef.ID, DoneAll);
}
public function ExportGraphicDefs(graphicDefs:Array)
{
var graphicIDs = new Array();
for(var i = 0; i < graphicDefs.length; i++)
{
graphicIDs.push(graphicDefs[i].ID);
}
ExportItems(graphicIDs, DoneAll);
}
var skeletalScale = 1;
private function SkeletalScaleChanged(e:Event)
{
try
{
var number = Number(skeletal_scale.text);
skeletalScale = number;
} catch(exception){
}
}
private function ClickedHeuristic(button:Checkbox)
{
AsyncGraphicPacker.UseFlatHeuristic = !AsyncGraphicPacker.UseFlatHeuristic;
button.Checked = AsyncGraphicPacker.UseFlatHeuristic;
}
private function ClickedEdgeExpand(button:Checkbox)
{
PNGExportHelper.UseExpandedBitmaps = !PNGExportHelper.UseExpandedBitmaps;
button.Checked = PNGExportHelper.UseExpandedBitmaps;
}
var outputFormat = "json_png_set";
protected var lastTime = null;
protected function EnterFrame(e:Event)
{
var now = getTimer() / 1000.0;
if (lastTime == null) lastTime = now;
var timeElapsed = now - lastTime;
ResourceManager.Instance().StartUpdateLoop();
EnterFrameManager.Instance().EnterFrame(new TimeElapsedEvent(timeElapsed), timeElapsed);
ResourceManager.Instance().EndUpdateLoop();
HeroSpriteLoader.Instance().Update(1);
lastTime = now;
}
protected var graphicPreloader:GraphicPreloader = new GraphicPreloader();
protected function KeyUp(e:KeyboardEvent)
{
if (this.stage.focus is TextField) return;
if (e.keyCode == Keyboard.P)
{
HeroSpriteLoader.Instance().BeginLoadingHeroes(null);
graphicPreloader.PackHeros(/*true*/);
}
if (e.keyCode == Keyboard.I)
{
ExportAsset(1);
}
}
protected function ExportAll(doItems = true, doAssets = true, startingGraphicID = 1, endingGraphicID = 999999)
{
ActivateExportButtons(false);
var items:Array = [];
var assets:Array = [];
var defs:Array = GameData.Instance().GraphicDefines;
for (var i in defs)
{
if (defs[i].ID < startingGraphicID || defs[i].ID > endingGraphicID) continue;
if (defs[i].ExportParams.hasOwnProperty("asset_id"))
{
if (doAssets && assets.indexOf(defs[i].ExportParams.asset_id) == -1)
{
assets.push(defs[i].ExportParams.asset_id);
}
} else {
if (doItems && items.indexOf(defs[i].ID) == -1)
{
items.push(defs[i].ID);
}
}
}
ExportItems(items, function()
{
ExportAssets(assets, DoneAll);
});
}
protected function ExportByUse(useType, doItems = true, doAssets = true, startingGraphicID = 1, endingGraphicID = 999999)
{
ActivateExportButtons(false);
var items:Array = [];
var assets:Array = [];
var defs:Array = GameData.Instance().GraphicDefines;
for (var i in defs)
{
if (defs[i].ID < startingGraphicID || defs[i].ID > endingGraphicID) continue;
if (defs[i].ExportParams.hasOwnProperty("uses") && defs[i].ExportParams.uses.indexOf(useType) != -1)
{
if (defs[i].ExportParams.hasOwnProperty("asset_id"))
{
if (doAssets && assets.indexOf(defs[i].ExportParams.asset_id) == -1)
{
assets.push(defs[i].ExportParams.asset_id);
}
} else {
if (doItems && items.indexOf(defs[i].ID) == -1)
{
items.push(defs[i].ID);
}
}
}
}
ExportItems(items, function()
{
ExportAssets(assets, DoneAll);
});
}
protected function DoneAll()
{
ActivateExportButtons(true);
_trace("========= DONE ALL =========");
}
protected function ExportItems(items:Array, callback)
{
if (items.length == 0)
{
if (callback) callback();
} else {
var itemId = items.shift();
ExportItem(itemId, function(){ExportItems(items, callback);});
}
}
protected function ExportAssets(assets:Array, callback)
{
if (assets.length == 0)
{
if (callback) callback();
} else {
var assetId = assets.shift();
ExportAsset(assetId, function(){ExportAssets(assets, callback);});
}
}
protected var lastCallback;
protected function ExportItem(graphicId, callback = null)
{
this.lastCallback = callback;
var def:Defs.GraphicDef = GameData.Instance().GetGraphicDefByID(graphicId);
var graphicDefs:Array = [def];
var type = def.Type;
var assetDef:Defs.GraphicDef = null;
if (def.ExportParams.hasOwnProperty("asset_id"))
{
assetDef = GameData.Instance().GetGraphicDefByID(def.ExportParams.asset_id);
type = assetDef.Type;
}
switch (type)
{
case Defs.GraphicDef.EXPORT_FORMAT_SPRITESHEET:
if (def.ExportParams.hasOwnProperty("export_animation"))
{
var graphicPacker:AsyncGraphicPacker = new AsyncGraphicPacker();
graphicPacker.ExportDefs(graphicDefs, DoneAsset, def, outputFormat);
} else {
var iconPacker:IconPacker = new IconPacker(DoneAsset, def, previewHolder, outputFormat);
iconPacker.ExportDefs(graphicDefs);
}
break;
case Defs.GraphicDef.EXPORT_FORMAT_CACHEDCLIP:
break;
case Defs.GraphicDef.EXPORT_FORMAT_SKELANIM:
var skelPacker:SkelAnimPacker = new SkelAnimPacker(DoneAsset, def, previewHolder,
assetDef && assetDef.ExportParams.hasOwnProperty("export_type") ? assetDef.ExportParams.export_type : null, skeletalScale, outputFormat);
skelPacker.ExportDefs(graphicDefs);
break;
case Defs.GraphicDef.EXPORT_FORMAT_ANIMSETS:
var animSetPacker:AnimSetPacker = new AnimSetPacker(DoneAsset, def, previewHolder);
animSetPacker.ExportDef(graphicDefs[0]);
break;
case Defs.GraphicDef.EXPORT_FORMAT_ANIMPIECES:
var animPiecePacker:AnimPiecePacker = new AnimPiecePacker(DoneAsset, def, previewHolder);
animPiecePacker.ExportDefs(graphicDefs);
break;
case Defs.GraphicDef.EXPORT_FORMAT_SCENE:
var scenePacker:ScenePacker = new ScenePacker(DoneAsset, def, previewHolder, outputFormat);
scenePacker.ExportDef(graphicDefs[0]);
break;
default:
_trace("COULDN'T DETERMINE EXPORT FORMAT");
break;
}
}
protected function ExportAsset(assetId, callback = null)
{
ActivateExportButtons(false);
this.lastCallback = callback;
var graphicDefs:Array = [];
var defs:Array = GameData.Instance().GraphicDefines;
for (var i in defs)
{
if (defs[i].ExportParams.hasOwnProperty("asset_id") && defs[i].ExportParams.asset_id == assetId)
{
graphicDefs.push(defs[i]);
}
}
_trace(graphicDefs.length);
var assetDef:Defs.GraphicDef = GameData.Instance().GetGraphicDefByID(assetId);
if (assetDef)
{
switch (assetDef.Type)
{
case Defs.GraphicDef.EXPORT_FORMAT_SPRITESHEET:
if (assetDef.ExportParams.hasOwnProperty("export_animation"))
{
var graphicPacker:AsyncGraphicPacker = new AsyncGraphicPacker();
graphicPacker.ExportDefs(graphicDefs, DoneAsset, assetDef);
} else {
var iconPacker:IconPacker = new IconPacker(DoneAsset, assetDef, previewHolder, outputFormat);
iconPacker.ExportDefs(graphicDefs);
}
break;
case Defs.GraphicDef.EXPORT_FORMAT_CACHEDCLIP:
break;
case Defs.GraphicDef.EXPORT_FORMAT_SKELANIM:
var skelPacker:SkelAnimPacker = new SkelAnimPacker(DoneAsset, assetDef, previewHolder,
assetDef.ExportParams.hasOwnProperty("export_type") ? assetDef.ExportParams.export_type : null, skeletalScale);
skelPacker.ExportDefs(graphicDefs);
break;
case Defs.GraphicDef.EXPORT_FORMAT_ANIMSETS:
throw new Error("Assetified Animation Sets are not supported! (Just put multiple avatars in this def)");
break;
case Defs.GraphicDef.EXPORT_FORMAT_ANIMPIECES:
var animPiecePacker:AnimPiecePacker = new AnimPiecePacker(DoneAsset, assetDef, previewHolder);
animPiecePacker.ExportDefs(graphicDefs);
break;
default:
_trace("COULDN'T DETERMINE EXPORT FORMAT");
break;
}
}
}
// TODO: make this more generic...
public static const UPLOAD = 0;
public static const SAVE = 1;
public static const TEST = 2;
protected var saveMode = SAVE;
public function Log(logStr)
{
logText.text += logStr + "\n";
}
protected function DoneAsset(output, assetDef:Defs.GraphicDef)
{
Log(assetDef.Folder + assetDef.Name);
var fileExport:FileExportSet = null;
if (output is FileExportSet) fileExport = output;
if (output is JSONPNGSet)
{
fileExport = new FileExportSet();
output.AssetName = assetDef.Name;
fileExport.AddJSONPNGSet(output);
}
if (output is ByteArray)
{
fileExport = new FileExportSet();
fileExport.Add(assetDef.Name, output);
}
if (saveMode == SAVE)
{
fileExport.Save(lastCallback);
}
/*
if (saveMode == UPLOAD)
{
var uploadURL = "";
fileExport.Upload(uploadURL, assetDef.Folder, lastCallback);
}
*/
if (saveMode == TEST && lastCallback) lastCallback();
}
}
}