| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- function StartLevel( %mission, %hostingType )
- {
- if( %mission $= "" )
- {
- %id = CL_levelList.getSelectedId();
- %mission = getField(CL_levelList.getRowTextById(%id), 1);
- }
- if (%hostingType !$= "")
- {
- %serverType = %hostingType;
- }
- else
- {
- if ($pref::HostMultiPlayer)
- %serverType = "MultiPlayer";
- else
- %serverType = "SinglePlayer";
- }
- // Show the loading screen immediately.
- if ( isObject( LoadingGui ) )
- {
- Canvas.setContent("LoadingGui");
- LoadingProgress.setValue(1);
- LoadingProgressTxt.setValue("LOADING MISSION FILE");
- Canvas.repaint();
- }
- createAndConnectToLocalServer( %serverType, %mission );
- }
- //----------------------------------------
- function ChooseLevelDlg::onWake( %this )
- {
- CL_levelList.clear();
- ChooseLevelWindow->SmallPreviews.clear();
-
- %i = 0;
- for(%file = findFirstFile($Server::MissionFileSpec); %file !$= ""; %file = findNextFile($Server::MissionFileSpec))
- {
- // Skip our new level/mission if we arent choosing a level
- // to launch in the editor.
- if ( !%this.launchInEditor )
- {
- if (strstr(%file, "newMission.mis") > -1)
- continue;
- if (strstr(%file, "newLevel.mis") > -1)
- continue;
- }
-
- %this.addMissionFile( %file );
- }
-
- // Also add the new level mission as defined in the world editor settings
- // if we are choosing a level to launch in the editor.
- if ( %this.launchInEditor )
- {
- %file = EditorSettings.value( "WorldEditor/newLevelFile" );
- if ( %file !$= "" )
- %this.addMissionFile( %file );
- }
- // Sort our list
- CL_levelList.sort(0);
- // Set the first row as the selected row
- CL_levelList.setSelectedRow(0);
- for (%i = 0; %i < CL_levelList.rowCount(); %i++)
- {
- %preview = new GuiBitmapButtonCtrl() {
- internalName = "SmallPreview" @ %i;
- Extent = "108 81";
- bitmap = "art/gui/no-preview";
- command = "ChooseLevelWindow.previewSelected(ChooseLevelWindow->SmallPreviews->SmallPreview" @ %i @ ");";
- };
- ChooseLevelWindow->SmallPreviews.add(%preview);
- // Set this small preview visible
- if (%i >= 5)
- %preview.setVisible(false);
- // Set the level index
- %preview.levelIndex = %i;
- // Get the name
- %name = getField(CL_levelList.getRowText(%i), 0);
- %preview.levelName = %name;
- %file = getField(CL_levelList.getRowText(%i), 1);
- // Find the preview image
- %levelPreview = filePath(%file) @ "/" @ fileBase(%file) @ "_preview";
- // Test against all of the different image formats
- // This should probably be moved into an engine function
- if (isFile(%levelPreview @ ".png") ||
- isFile(%levelPreview @ ".jpg") ||
- isFile(%levelPreview @ ".bmp") ||
- isFile(%levelPreview @ ".gif") ||
- isFile(%levelPreview @ ".jng") ||
- isFile(%levelPreview @ ".mng") ||
- isFile(%levelPreview @ ".tga"))
- {
- %preview.setBitmap(%levelPreview);
- }
- // Get the description
- %desc = getField(CL_levelList.getRowText(%i), 2);
- %preview.levelDesc = %desc;
- }
- ChooseLevelWindow->SmallPreviews.firstVisible = -1;
- ChooseLevelWindow->SmallPreviews.lastVisible = -1;
- if (ChooseLevelWindow->SmallPreviews.getCount() > 0)
- {
- ChooseLevelWindow->SmallPreviews.firstVisible = 0;
- if (ChooseLevelWindow->SmallPreviews.getCount() < 6)
- ChooseLevelWindow->SmallPreviews.lastVisible = ChooseLevelWindow->SmallPreviews.getCount() - 1;
- else
- ChooseLevelWindow->SmallPreviews.lastVisible = 4;
- }
- if (ChooseLevelWindow->SmallPreviews.getCount() > 0)
- ChooseLevelWindow.previewSelected(ChooseLevelWindow->SmallPreviews.getObject(0));
- // If we have 5 or less previews then hide our next/previous buttons
- // and resize to fill their positions
- if (ChooseLevelWindow->SmallPreviews.getCount() < 6)
- {
- ChooseLevelWindow->PreviousSmallPreviews.setVisible(false);
- ChooseLevelWindow->NextSmallPreviews.setVisible(false);
- %previewPos = ChooseLevelWindow->SmallPreviews.getPosition();
- %previousPos = ChooseLevelWindow->PreviousSmallPreviews.getPosition();
- %previewPosX = getWord(%previousPos, 0);
- %previewPosY = getWord(%previewPos, 1);
- ChooseLevelWindow->SmallPreviews.setPosition(%previewPosX, %previewPosY);
- ChooseLevelWindow->SmallPreviews.colSpacing = 10;//((getWord(NextSmallPreviews.getPosition(), 0)+11)-getWord(PreviousSmallPreviews.getPosition(), 0))/4;
- ChooseLevelWindow->SmallPreviews.refresh();
- }
- if (ChooseLevelWindow->SmallPreviews.getCount() <= 1)
- {
- // Hide the small previews
- ChooseLevelWindow->SmallPreviews.setVisible(false);
- // Shrink the ChooseLevelWindow so that we don't have a large blank space
- %extentX = getWord(ChooseLevelWindow.getExtent(), 0);
- %extentY = getWord(ChooseLevelWindow->SmallPreviews.getPosition(), 1);
- ChooseLevelWIndow.setExtent(%extentX, %extentY);
- }
- else
- {
- // Make sure the small previews are visible
- ChooseLevelWindow->SmallPreviews.setVisible(true);
- %extentX = getWord(ChooseLevelWindow.getExtent(), 0);
-
- %extentY = getWord(ChooseLevelWindow->SmallPreviews.getPosition(), 1);
- %extentY = %extentY + getWord(ChooseLevelWindow->SmallPreviews.getExtent(), 1);
- %extentY = %extentY + 9;
- ChooseLevelWIndow.setExtent(%extentX, %extentY);
- }
- }
- function ChooseLevelDlg::addMissionFile( %this, %file )
- {
- %levelName = fileBase(%file);
- %levelDesc = "A Torque level";
- %LevelInfoObject = getLevelInfo(%file);
- if (%LevelInfoObject != 0)
- {
- if(%LevelInfoObject.levelName !$= "")
- %levelName = %LevelInfoObject.levelName;
- else if(%LevelInfoObject.name !$= "")
- %levelName = %LevelInfoObject.name;
- if (%LevelInfoObject.desc0 !$= "")
- %levelDesc = %LevelInfoObject.desc0;
-
- %LevelInfoObject.delete();
- }
- CL_levelList.addRow( CL_levelList.rowCount(), %levelName TAB %file TAB %levelDesc );
- }
- function ChooseLevelDlg::onSleep( %this )
- {
- // This is set from the outside, only stays true for a single wake/sleep
- // cycle.
- %this.launchInEditor = false;
- }
- function ChooseLevelWindow::previewSelected(%this, %preview)
- {
- // Set the selected level
- if (isObject(%preview) && %preview.levelIndex !$= "")
- CL_levelList.setSelectedRow(%preview.levelIndex);
- else
- CL_levelList.setSelectedRow(-1);
- // Set the large preview image
- if (isObject(%preview) && %preview.bitmap !$= "")
- %this->CurrentPreview.setBitmap(%preview.bitmap);
- else
- %this->CurrentPreview.setBitmap("art/gui/no-preview");
- // Set the current level name
- if (isObject(%preview) && %preview.levelName !$= "")
- %this->LevelName.setText(%preview.levelName);
- else
- %this->LevelName.setText("Level");
- // Set the current level description
- if (isObject(%preview) && %preview.levelDesc !$= "")
- %this->LevelDescription.setText(%preview.levelDesc);
- else
- %this->LevelDescription.setText("A Torque Level");
- }
- function ChooseLevelWindow::previousPreviews(%this)
- {
- %prevHiddenIdx = %this->SmallPreviews.firstVisible - 1;
- if (%prevHiddenIdx < 0)
- return;
- %lastVisibleIdx = %this->SmallPreviews.lastVisible;
- if (%lastVisibleIdx >= %this->SmallPreviews.getCount())
- return;
- %prevHiddenObj = %this->SmallPreviews.getObject(%prevHiddenIdx);
- %lastVisibleObj = %this->SmallPreviews.getObject(%lastVisibleIdx);
- if (isObject(%prevHiddenObj) && isObject(%lastVisibleObj))
- {
- %this->SmallPreviews.firstVisible--;
- %this->SmallPreviews.lastVisible--;
- %prevHiddenObj.setVisible(true);
- %lastVisibleObj.setVisible(false);
- }
- }
- function ChooseLevelWindow::nextPreviews(%this)
- {
- %firstVisibleIdx = %this->SmallPreviews.firstVisible;
- if (%firstVisibleIdx < 0)
- return;
- %firstHiddenIdx = %this->SmallPreviews.lastVisible + 1;
- if (%firstHiddenIdx >= %this->SmallPreviews.getCount())
- return;
- %firstVisibleObj = %this->SmallPreviews.getObject(%firstVisibleIdx);
- %firstHiddenObj = %this->SmallPreviews.getObject(%firstHiddenIdx);
- if (isObject(%firstVisibleObj) && isObject(%firstHiddenObj))
- {
- %this->SmallPreviews.firstVisible++;
- %this->SmallPreviews.lastVisible++;
- %firstVisibleObj.setVisible(false);
- %firstHiddenObj.setVisible(true);
- }
- }
- //----------------------------------------
- function getLevelInfo( %missionFile )
- {
- %file = new FileObject();
-
- %LevelInfoObject = "";
-
- if ( %file.openForRead( %missionFile ) ) {
- %inInfoBlock = false;
-
- while ( !%file.isEOF() ) {
- %line = %file.readLine();
- %line = trim( %line );
-
- if( %line $= "new ScriptObject(LevelInfo) {" )
- %inInfoBlock = true;
- else if( %line $= "new LevelInfo(theLevelInfo) {" )
- %inInfoBlock = true;
- else if( %inInfoBlock && %line $= "};" ) {
- %inInfoBlock = false;
- %LevelInfoObject = %LevelInfoObject @ %line;
- break;
- }
-
- if( %inInfoBlock )
- %LevelInfoObject = %LevelInfoObject @ %line @ " ";
- }
-
- %file.close();
- }
- %file.delete();
- if( %LevelInfoObject !$= "" )
- {
- %LevelInfoObject = "%LevelInfoObject = " @ %LevelInfoObject;
- eval( %LevelInfoObject );
- return %LevelInfoObject;
- }
-
- // Didn't find our LevelInfo
- return 0;
- }
|