/zombie-stick-level-editor-workspace/level-editor/src/com/jxl/zombiestick/services/SaveLevelService.as

https://github.com/JesterXL/ZombieStick · ActionScript · 191 lines · 169 code · 22 blank · 0 comment · 30 complexity · 5854dacd750de3b7c76399027c2db069 MD5 · raw file

  1. package com.jxl.zombiestick.services
  2. {
  3. import com.jxl.zombiestick.events.SaveLevelServiceEvent;
  4. import com.jxl.zombiestick.vo.DialogueVO;
  5. import com.jxl.zombiestick.vo.GameObjectVO;
  6. import com.jxl.zombiestick.vo.LevelVO;
  7. import com.jxl.zombiestick.vo.MovieVO;
  8. import flash.errors.IOError;
  9. import flash.events.Event;
  10. import flash.events.EventDispatcher;
  11. import flash.events.IEventDispatcher;
  12. import flash.events.IOErrorEvent;
  13. import flash.filesystem.File;
  14. import flash.filesystem.FileMode;
  15. import flash.filesystem.FileStream;
  16. public class SaveLevelService extends EventDispatcher
  17. {
  18. private var str:String;
  19. private var file:File;
  20. private var stream:FileStream;
  21. private var level:LevelVO;
  22. public function SaveLevelService()
  23. {
  24. super();
  25. }
  26. public function saveLevel(level:LevelVO):void
  27. {
  28. this.level = level;
  29. if(file == null)
  30. {
  31. file = new File();
  32. file.addEventListener(IOErrorEvent.IO_ERROR, onFileError);
  33. file.addEventListener(Event.SELECT, onFileSelect);
  34. }
  35. try
  36. {
  37. file.browseForSave("Save");
  38. }
  39. catch(err:Error)
  40. {
  41. trace("SaveLevelService::file error: " + err);
  42. }
  43. }
  44. private function onFileError(event:IOErrorEvent):void
  45. {
  46. trace("SaveLevelService::onFileError: " + event);
  47. }
  48. private function onFileSelect(event:Event):void
  49. {
  50. copyImages();
  51. copyAudioFiles();
  52. var obj:Object;
  53. try
  54. {
  55. obj = level.toObject();
  56. }
  57. catch(err:Error)
  58. {
  59. trace("SaveLevelService::object parsing error: " + err);
  60. return;
  61. }
  62. try
  63. {
  64. str = JSON.stringify(obj);
  65. }
  66. catch(err:Error)
  67. {
  68. trace("SaveLevelService::JSON encoding error: " + err);
  69. return;
  70. }
  71. if(stream == null)
  72. {
  73. stream = new FileStream();
  74. }
  75. stream.open(file, FileMode.WRITE);
  76. stream.writeUTFBytes(str);
  77. stream.close();
  78. dispatchEvent(new SaveLevelServiceEvent(SaveLevelServiceEvent.SUCCESS));
  79. }
  80. private function copyAudioFiles():void
  81. {
  82. if(level == null)
  83. return;
  84. if(level.movies == null || level.movies.length < 1)
  85. return;
  86. if(file == null)
  87. return;
  88. var folder:File = file.parent;
  89. var len:int = level.movies.length;
  90. while(len--)
  91. {
  92. var movie:MovieVO = level.movies[len];
  93. if(movie.dialogues && movie.dialogues.length > 0)
  94. {
  95. var dLen:int = movie.dialogues.length;
  96. while(dLen--)
  97. {
  98. var dialogue:DialogueVO = movie.dialogues[dLen];
  99. if(dialogue.audioFile && dialogue.audioFile != "")
  100. {
  101. var audioNameArray:Array = dialogue.audioFile.split("/");
  102. dialogue.audioName = audioNameArray[audioNameArray.length - 1];
  103. var audioFile:File = new File(dialogue.audioFile);
  104. if(audioFile.exists && audioFile.parent.url != folder.url)
  105. {
  106. audioFile.copyTo(folder, true);
  107. }
  108. }
  109. }
  110. }
  111. }
  112. }
  113. private function copyImages():void
  114. {
  115. level.levelDirectory = file.url;
  116. var len:int = level.events.length;
  117. var imageFile:File;
  118. var newImageFile:File;
  119. while(len--)
  120. {
  121. var obj:Object = level.events[len];
  122. if(obj is GameObjectVO)
  123. {
  124. var gameObject:GameObjectVO = obj as GameObjectVO;
  125. if(gameObject.image != null && gameObject.image.length > 0 && gameObject.imageRelativeToLevelPath == false)
  126. {
  127. imageFile = new File();
  128. imageFile.url = gameObject.image;
  129. newImageFile = new File();
  130. newImageFile.url = file.url.substring(0, file.url.lastIndexOf("/")) + "/";
  131. newImageFile = newImageFile.resolvePath(imageFile.name);
  132. try
  133. {
  134. if(newImageFile.exists == false)
  135. {
  136. imageFile.copyTo(newImageFile, false);
  137. }
  138. gameObject.image = newImageFile.url;
  139. }
  140. catch(err:Error)
  141. {
  142. trace("SaveLevelService::copyImages, copying GameObjectVO image: " + err);
  143. }
  144. }
  145. }
  146. }
  147. if(level.backgroundImage)
  148. {
  149. imageFile = new File();
  150. imageFile.url = level.backgroundImage;
  151. newImageFile = new File();
  152. newImageFile.url = file.url.substring(0, file.url.lastIndexOf("/")) + "/";
  153. newImageFile = newImageFile.resolvePath(imageFile.name);
  154. try
  155. {
  156. if(newImageFile.exists == false)
  157. {
  158. imageFile.copyTo(newImageFile, false);
  159. }
  160. level.backgroundImage = newImageFile.url;
  161. }
  162. catch(err:Error)
  163. {
  164. trace("SaveLevelService::copyImages, copying Level's backgroundImage: " + err);
  165. }
  166. }
  167. }
  168. }
  169. }