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.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; private static var lastData = ""; 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.readUTFBytes(wrapper.bytesAvailable); for (var i = 0; i < data.length; i++) { var c = data.charAt(i); if (c == "\0") { if (lastData != "") DispatchCommand(lastData); lastData = ""; } else { lastData += c; } } } private function DispatchCommand(command) { Log("Wrapper Command: " + command); _strace("exeucting: " + command); } 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(); } } }