chooseLevelDlg.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. function StartLevel( %mission, %hostingType )
  23. {
  24. if( %mission $= "" )
  25. {
  26. %id = CL_levelList.getSelectedId();
  27. %mission = getField(CL_levelList.getRowTextById(%id), 1);
  28. }
  29. if (%hostingType !$= "")
  30. {
  31. %serverType = %hostingType;
  32. }
  33. else
  34. {
  35. if ($pref::HostMultiPlayer)
  36. %serverType = "MultiPlayer";
  37. else
  38. %serverType = "SinglePlayer";
  39. }
  40. // Show the loading screen immediately.
  41. if ( isObject( LoadingGui ) )
  42. {
  43. Canvas.setContent("LoadingGui");
  44. LoadingProgress.setValue(1);
  45. LoadingProgressTxt.setValue("LOADING MISSION FILE");
  46. Canvas.repaint();
  47. }
  48. createAndConnectToLocalServer( %serverType, %mission );
  49. }
  50. //----------------------------------------
  51. function ChooseLevelDlg::onWake( %this )
  52. {
  53. CL_levelList.clear();
  54. ChooseLevelWindow->SmallPreviews.clear();
  55. %i = 0;
  56. for(%file = findFirstFile($Server::MissionFileSpec); %file !$= ""; %file = findNextFile($Server::MissionFileSpec))
  57. {
  58. // Skip our new level/mission if we arent choosing a level
  59. // to launch in the editor.
  60. if ( !%this.launchInEditor )
  61. {
  62. if (strstr(%file, "newMission.mis") > -1)
  63. continue;
  64. if (strstr(%file, "newLevel.mis") > -1)
  65. continue;
  66. }
  67. %this.addMissionFile( %file );
  68. }
  69. // Also add the new level mission as defined in the world editor settings
  70. // if we are choosing a level to launch in the editor.
  71. if ( %this.launchInEditor )
  72. {
  73. %file = EditorSettings.value( "WorldEditor/newLevelFile" );
  74. if ( %file !$= "" )
  75. %this.addMissionFile( %file );
  76. }
  77. // Sort our list
  78. CL_levelList.sort(0);
  79. // Set the first row as the selected row
  80. CL_levelList.setSelectedRow(0);
  81. for (%i = 0; %i < CL_levelList.rowCount(); %i++)
  82. {
  83. %preview = new GuiBitmapButtonCtrl() {
  84. internalName = "SmallPreview" @ %i;
  85. Extent = "108 81";
  86. bitmap = "art/gui/no-preview";
  87. command = "ChooseLevelWindow.previewSelected(ChooseLevelWindow->SmallPreviews->SmallPreview" @ %i @ ");";
  88. };
  89. ChooseLevelWindow->SmallPreviews.add(%preview);
  90. // Set this small preview visible
  91. if (%i >= 5)
  92. %preview.setVisible(false);
  93. // Set the level index
  94. %preview.levelIndex = %i;
  95. // Get the name
  96. %name = getField(CL_levelList.getRowText(%i), 0);
  97. %preview.levelName = %name;
  98. %file = getField(CL_levelList.getRowText(%i), 1);
  99. // Find the preview image
  100. %levelPreview = filePath(%file) @ "/" @ fileBase(%file) @ "_preview";
  101. // Test against all of the different image formats
  102. // This should probably be moved into an engine function
  103. if (isFile(%levelPreview @ ".png") ||
  104. isFile(%levelPreview @ ".jpg") ||
  105. isFile(%levelPreview @ ".bmp") ||
  106. isFile(%levelPreview @ ".gif") ||
  107. isFile(%levelPreview @ ".jng") ||
  108. isFile(%levelPreview @ ".mng") ||
  109. isFile(%levelPreview @ ".tga"))
  110. {
  111. %preview.setBitmap(%levelPreview);
  112. }
  113. // Get the description
  114. %desc = getField(CL_levelList.getRowText(%i), 2);
  115. %preview.levelDesc = %desc;
  116. }
  117. ChooseLevelWindow->SmallPreviews.firstVisible = -1;
  118. ChooseLevelWindow->SmallPreviews.lastVisible = -1;
  119. if (ChooseLevelWindow->SmallPreviews.getCount() > 0)
  120. {
  121. ChooseLevelWindow->SmallPreviews.firstVisible = 0;
  122. if (ChooseLevelWindow->SmallPreviews.getCount() < 6)
  123. ChooseLevelWindow->SmallPreviews.lastVisible = ChooseLevelWindow->SmallPreviews.getCount() - 1;
  124. else
  125. ChooseLevelWindow->SmallPreviews.lastVisible = 4;
  126. }
  127. if (ChooseLevelWindow->SmallPreviews.getCount() > 0)
  128. ChooseLevelWindow.previewSelected(ChooseLevelWindow->SmallPreviews.getObject(0));
  129. // If we have 5 or less previews then hide our next/previous buttons
  130. // and resize to fill their positions
  131. if (ChooseLevelWindow->SmallPreviews.getCount() < 6)
  132. {
  133. ChooseLevelWindow->PreviousSmallPreviews.setVisible(false);
  134. ChooseLevelWindow->NextSmallPreviews.setVisible(false);
  135. %previewPos = ChooseLevelWindow->SmallPreviews.getPosition();
  136. %previousPos = ChooseLevelWindow->PreviousSmallPreviews.getPosition();
  137. %previewPosX = getWord(%previousPos, 0);
  138. %previewPosY = getWord(%previewPos, 1);
  139. ChooseLevelWindow->SmallPreviews.setPosition(%previewPosX, %previewPosY);
  140. ChooseLevelWindow->SmallPreviews.colSpacing = 10;//((getWord(NextSmallPreviews.getPosition(), 0)+11)-getWord(PreviousSmallPreviews.getPosition(), 0))/4;
  141. ChooseLevelWindow->SmallPreviews.refresh();
  142. }
  143. if (ChooseLevelWindow->SmallPreviews.getCount() <= 1)
  144. {
  145. // Hide the small previews
  146. ChooseLevelWindow->SmallPreviews.setVisible(false);
  147. // Shrink the ChooseLevelWindow so that we don't have a large blank space
  148. %extentX = getWord(ChooseLevelWindow.getExtent(), 0);
  149. %extentY = getWord(ChooseLevelWindow->SmallPreviews.getPosition(), 1);
  150. ChooseLevelWIndow.setExtent(%extentX, %extentY);
  151. }
  152. else
  153. {
  154. // Make sure the small previews are visible
  155. ChooseLevelWindow->SmallPreviews.setVisible(true);
  156. %extentX = getWord(ChooseLevelWindow.getExtent(), 0);
  157. %extentY = getWord(ChooseLevelWindow->SmallPreviews.getPosition(), 1);
  158. %extentY = %extentY + getWord(ChooseLevelWindow->SmallPreviews.getExtent(), 1);
  159. %extentY = %extentY + 9;
  160. ChooseLevelWIndow.setExtent(%extentX, %extentY);
  161. }
  162. }
  163. function ChooseLevelDlg::addMissionFile( %this, %file )
  164. {
  165. %levelName = fileBase(%file);
  166. %levelDesc = "A Torque level";
  167. %LevelInfoObject = getLevelInfo(%file);
  168. if (%LevelInfoObject != 0)
  169. {
  170. if(%LevelInfoObject.levelName !$= "")
  171. %levelName = %LevelInfoObject.levelName;
  172. else if(%LevelInfoObject.name !$= "")
  173. %levelName = %LevelInfoObject.name;
  174. if (%LevelInfoObject.desc0 !$= "")
  175. %levelDesc = %LevelInfoObject.desc0;
  176. %LevelInfoObject.delete();
  177. }
  178. CL_levelList.addRow( CL_levelList.rowCount(), %levelName TAB %file TAB %levelDesc );
  179. }
  180. function ChooseLevelDlg::onSleep( %this )
  181. {
  182. // This is set from the outside, only stays true for a single wake/sleep
  183. // cycle.
  184. %this.launchInEditor = false;
  185. }
  186. function ChooseLevelWindow::previewSelected(%this, %preview)
  187. {
  188. // Set the selected level
  189. if (isObject(%preview) && %preview.levelIndex !$= "")
  190. CL_levelList.setSelectedRow(%preview.levelIndex);
  191. else
  192. CL_levelList.setSelectedRow(-1);
  193. // Set the large preview image
  194. if (isObject(%preview) && %preview.bitmap !$= "")
  195. %this->CurrentPreview.setBitmap(%preview.bitmap);
  196. else
  197. %this->CurrentPreview.setBitmap("art/gui/no-preview");
  198. // Set the current level name
  199. if (isObject(%preview) && %preview.levelName !$= "")
  200. %this->LevelName.setText(%preview.levelName);
  201. else
  202. %this->LevelName.setText("Level");
  203. // Set the current level description
  204. if (isObject(%preview) && %preview.levelDesc !$= "")
  205. %this->LevelDescription.setText(%preview.levelDesc);
  206. else
  207. %this->LevelDescription.setText("A Torque Level");
  208. }
  209. function ChooseLevelWindow::previousPreviews(%this)
  210. {
  211. %prevHiddenIdx = %this->SmallPreviews.firstVisible - 1;
  212. if (%prevHiddenIdx < 0)
  213. return;
  214. %lastVisibleIdx = %this->SmallPreviews.lastVisible;
  215. if (%lastVisibleIdx >= %this->SmallPreviews.getCount())
  216. return;
  217. %prevHiddenObj = %this->SmallPreviews.getObject(%prevHiddenIdx);
  218. %lastVisibleObj = %this->SmallPreviews.getObject(%lastVisibleIdx);
  219. if (isObject(%prevHiddenObj) && isObject(%lastVisibleObj))
  220. {
  221. %this->SmallPreviews.firstVisible--;
  222. %this->SmallPreviews.lastVisible--;
  223. %prevHiddenObj.setVisible(true);
  224. %lastVisibleObj.setVisible(false);
  225. }
  226. }
  227. function ChooseLevelWindow::nextPreviews(%this)
  228. {
  229. %firstVisibleIdx = %this->SmallPreviews.firstVisible;
  230. if (%firstVisibleIdx < 0)
  231. return;
  232. %firstHiddenIdx = %this->SmallPreviews.lastVisible + 1;
  233. if (%firstHiddenIdx >= %this->SmallPreviews.getCount())
  234. return;
  235. %firstVisibleObj = %this->SmallPreviews.getObject(%firstVisibleIdx);
  236. %firstHiddenObj = %this->SmallPreviews.getObject(%firstHiddenIdx);
  237. if (isObject(%firstVisibleObj) && isObject(%firstHiddenObj))
  238. {
  239. %this->SmallPreviews.firstVisible++;
  240. %this->SmallPreviews.lastVisible++;
  241. %firstVisibleObj.setVisible(false);
  242. %firstHiddenObj.setVisible(true);
  243. }
  244. }
  245. //----------------------------------------
  246. function getLevelInfo( %missionFile )
  247. {
  248. %file = new FileObject();
  249. %LevelInfoObject = "";
  250. if ( %file.openForRead( %missionFile ) ) {
  251. %inInfoBlock = false;
  252. while ( !%file.isEOF() ) {
  253. %line = %file.readLine();
  254. %line = trim( %line );
  255. if( %line $= "new ScriptObject(LevelInfo) {" )
  256. %inInfoBlock = true;
  257. else if( %line $= "new LevelInfo(theLevelInfo) {" )
  258. %inInfoBlock = true;
  259. else if( %inInfoBlock && %line $= "};" ) {
  260. %inInfoBlock = false;
  261. %LevelInfoObject = %LevelInfoObject @ %line;
  262. break;
  263. }
  264. if( %inInfoBlock )
  265. %LevelInfoObject = %LevelInfoObject @ %line @ " ";
  266. }
  267. %file.close();
  268. }
  269. %file.delete();
  270. if( %LevelInfoObject !$= "" )
  271. {
  272. %LevelInfoObject = "%LevelInfoObject = " @ %LevelInfoObject;
  273. eval( %LevelInfoObject );
  274. return %LevelInfoObject;
  275. }
  276. // Didn't find our LevelInfo
  277. return 0;
  278. }