2014-10-14 13:11:37 +00:00
/*
* This file is part of the Colobot : Gold Edition source code
* Copyright ( C ) 2001 - 2014 , Daniel Roux , EPSITEC SA & TerranovaTeam
* http : //epsiteс .ch; http://colobot.info; http://github.com/colobot
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* See the GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see http : //gnu.org/licenses
*/
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
# include "object/robotmain.h"
2012-06-26 20:23:05 +00:00
# include "CBot/CBotDll.h"
2012-09-15 13:33:08 +00:00
# include "app/app.h"
2014-12-22 09:35:05 +00:00
# include "app/controller.h"
2014-12-11 18:01:57 +00:00
# include "app/input.h"
2012-09-20 18:37:37 +00:00
2015-03-22 15:32:21 +00:00
# include "clipboard/clipboard.h"
2012-06-26 20:23:05 +00:00
# include "common/event.h"
2012-09-15 13:33:08 +00:00
# include "common/global.h"
# include "common/iman.h"
2012-09-29 23:51:37 +00:00
# include "common/logger.h"
2012-06-26 20:23:05 +00:00
# include "common/misc.h"
# include "common/profile.h"
# include "common/restext.h"
2012-09-20 18:37:37 +00:00
2014-11-01 13:02:39 +00:00
# include "common/resources/resourcemanager.h"
2014-06-22 19:30:23 +00:00
# include "common/resources/inputstream.h"
2014-11-10 17:49:00 +00:00
# include "common/resources/outputstream.h"
2014-06-22 19:30:23 +00:00
2012-09-15 13:33:08 +00:00
# include "graphics/engine/camera.h"
# include "graphics/engine/cloud.h"
# include "graphics/engine/engine.h"
# include "graphics/engine/lightman.h"
# include "graphics/engine/lightning.h"
2013-03-31 11:06:38 +00:00
# include "graphics/engine/modelmanager.h"
2012-09-15 13:33:08 +00:00
# include "graphics/engine/particle.h"
# include "graphics/engine/planet.h"
# include "graphics/engine/pyro.h"
# include "graphics/engine/terrain.h"
# include "graphics/engine/text.h"
# include "graphics/engine/water.h"
2012-09-20 18:37:37 +00:00
2012-09-15 13:33:08 +00:00
# include "math/const.h"
# include "math/geometry.h"
2012-09-20 18:37:37 +00:00
2012-09-15 13:33:08 +00:00
# include "object/auto/auto.h"
# include "object/auto/autobase.h"
# include "object/brain.h"
# include "object/mainmovie.h"
2012-06-26 20:23:05 +00:00
# include "object/motion/motion.h"
# include "object/motion/motionhuman.h"
2012-09-15 13:33:08 +00:00
# include "object/motion/motiontoto.h"
# include "object/object.h"
2014-12-21 16:06:55 +00:00
# include "object/objman.h"
2012-06-26 20:23:05 +00:00
# include "object/task/task.h"
# include "object/task/taskbuild.h"
2012-09-15 13:33:08 +00:00
# include "object/task/taskmanip.h"
2014-09-24 20:54:26 +00:00
# include "object/level/parser.h"
2012-09-20 18:37:37 +00:00
2012-09-15 13:33:08 +00:00
# include "physics/physics.h"
2012-09-20 18:37:37 +00:00
2012-09-15 13:33:08 +00:00
# include "script/cbottoken.h"
# include "script/cmdtoken.h"
# include "script/script.h"
2014-12-20 17:45:46 +00:00
# include "script/scriptfunc.h"
2012-09-20 18:37:37 +00:00
2012-09-15 13:33:08 +00:00
# include "sound/sound.h"
2012-09-20 18:37:37 +00:00
2012-09-15 13:33:08 +00:00
# include "ui/button.h"
2012-06-26 20:23:05 +00:00
# include "ui/displayinfo.h"
2012-09-15 13:33:08 +00:00
# include "ui/displaytext.h"
# include "ui/edit.h"
2012-06-26 20:23:05 +00:00
# include "ui/interface.h"
# include "ui/label.h"
# include "ui/maindialog.h"
# include "ui/mainmap.h"
2012-09-15 13:33:08 +00:00
# include "ui/mainshort.h"
# include "ui/map.h"
# include "ui/shortcut.h"
# include "ui/slider.h"
# include "ui/window.h"
2013-05-26 17:34:05 +00:00
# include <iomanip>
2012-09-15 13:33:08 +00:00
2014-09-24 20:54:26 +00:00
# include <boost/lexical_cast.hpp>
2014-01-18 18:20:40 +00:00
2013-02-16 21:37:43 +00:00
template < > CRobotMain * CSingleton < CRobotMain > : : m_instance = nullptr ;
2012-09-19 16:32:18 +00:00
2012-09-15 13:33:08 +00:00
// TODO: remove once using std::string
const int MAX_FNAME = 255 ;
2012-06-26 20:23:05 +00:00
const float UNIT = 4.0f ;
// Global variables.
long g_id ; // unique identifier
2012-09-17 22:01:00 +00:00
int g_build ; // constructible buildings
int g_researchDone ; // research done
2012-06-26 20:23:05 +00:00
long g_researchEnable ; // research available
float g_unit ; // conversion factor
2012-06-30 23:00:27 +00:00
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
//! Constructor of robot application
2014-12-22 09:35:05 +00:00
CRobotMain : : CRobotMain ( CController * controller )
{
m_ctrl = controller ;
m_app = nullptr ;
m_eventQueue = nullptr ;
m_sound = nullptr ;
m_engine = nullptr ;
m_lightMan = nullptr ;
m_particle = nullptr ;
m_water = nullptr ;
m_cloud = nullptr ;
m_lightning = nullptr ;
m_planet = nullptr ;
m_pause = nullptr ;
m_input = nullptr ;
m_interface = nullptr ;
m_terrain = nullptr ;
m_camera = nullptr ;
m_displayText = nullptr ;
m_movie = nullptr ;
m_dialog = nullptr ;
m_short = nullptr ;
m_map = nullptr ;
2012-09-15 13:33:08 +00:00
m_displayInfo = nullptr ;
2012-06-26 20:23:05 +00:00
m_time = 0.0f ;
m_gameTime = 0.0f ;
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = false ;
m_missionTimerStarted = false ;
m_missionTimer = 0.0f ;
2012-06-26 20:23:05 +00:00
m_phase = PHASE_NAME ;
m_cameraRank = - 1 ;
m_visitLast = EVENT_NULL ;
m_visitObject = 0 ;
m_visitArrow = 0 ;
2013-04-13 14:35:35 +00:00
m_audioTrack = " " ;
2012-09-15 13:33:08 +00:00
m_audioRepeat = true ;
2014-02-21 13:19:58 +00:00
m_satcomTrack = " " ;
m_satcomRepeat = true ;
m_editorTrack = " " ;
m_editorRepeat = true ;
2012-06-26 20:23:05 +00:00
m_delayWriteMessage = 0 ;
m_selectObject = 0 ;
m_infoUsed = 0 ;
2013-04-29 15:26:32 +00:00
m_controller = nullptr ;
2013-03-23 18:04:41 +00:00
m_retroStyle = false ;
2012-09-16 18:00:25 +00:00
m_immediatSatCom = false ;
2012-09-15 13:33:08 +00:00
m_beginSatCom = false ;
2013-03-27 21:20:50 +00:00
m_lockedSatCom = false ;
2012-09-15 13:33:08 +00:00
m_movieLock = false ;
m_satComLock = false ;
m_editLock = false ;
m_editFull = false ;
m_hilite = false ;
m_freePhoto = false ;
m_selectInsect = false ;
m_showSoluce = false ;
2013-06-21 23:11:37 +00:00
# if DEV_BUILD
2012-09-22 15:36:10 +00:00
m_showAll = true ; // for development
2013-06-21 23:11:37 +00:00
# else
m_showAll = false ;
2013-03-09 14:28:36 +00:00
# endif
2013-06-21 23:11:37 +00:00
2012-09-15 13:33:08 +00:00
m_cheatRadar = false ;
m_fixScene = false ;
m_trainerPilot = false ;
m_suspend = false ;
m_friendAim = false ;
m_resetCreate = false ;
m_shortCut = true ;
2014-12-22 09:35:05 +00:00
2012-06-26 20:23:05 +00:00
m_movieInfoIndex = - 1 ;
m_tooltipPos = Math : : Point ( 0.0f , 0.0f ) ;
2013-12-02 23:11:26 +00:00
m_tooltipName . clear ( ) ;
2012-06-26 20:23:05 +00:00
m_tooltipTime = 0.0f ;
m_endingWinRank = 0 ;
m_endingLostRank = 0 ;
2012-09-15 13:33:08 +00:00
m_winTerminate = false ;
2013-12-26 20:54:05 +00:00
2013-12-26 21:13:04 +00:00
m_exitAfterMission = false ;
2014-11-11 13:50:44 +00:00
m_autosave = true ;
2015-04-06 20:04:23 +00:00
m_autosaveInterval = 5 ;
2014-11-11 13:50:44 +00:00
m_autosaveSlots = 3 ;
m_autosaveLast = 0.0f ;
2012-06-26 20:23:05 +00:00
2014-12-22 09:35:05 +00:00
m_cameraPan = 0.0f ;
m_cameraZoom = 0.0f ;
2012-06-26 20:23:05 +00:00
2014-12-22 09:35:05 +00:00
g_id = 0 ;
g_build = 0 ;
g_researchDone = 0 ; // no research done
g_researchEnable = 0 ;
g_unit = UNIT ;
m_gamerName = " " ;
for ( int i = 0 ; i < MAXSHOWLIMIT ; i + + )
{
m_showLimit [ i ] . used = false ;
m_showLimit [ i ] . total = 0 ;
m_showLimit [ i ] . link = 0 ;
}
}
void CRobotMain : : Create ( bool loadProfile )
{
m_app = m_ctrl - > GetApplication ( ) ;
m_eventQueue = m_app - > GetEventQueue ( ) ;
m_sound = m_app - > GetSound ( ) ;
m_engine = Gfx : : CEngine : : GetInstancePointer ( ) ;
m_lightMan = m_engine - > GetLightManager ( ) ;
m_particle = m_engine - > GetParticle ( ) ;
m_water = m_engine - > GetWater ( ) ;
m_cloud = m_engine - > GetCloud ( ) ;
m_lightning = m_engine - > GetLightning ( ) ;
m_planet = m_engine - > GetPlanet ( ) ;
m_pause = CPauseManager : : GetInstancePointer ( ) ;
m_input = CInput : : GetInstancePointer ( ) ;
m_interface = new Ui : : CInterface ( ) ;
m_terrain = new Gfx : : CTerrain ( ) ;
m_camera = new Gfx : : CCamera ( ) ;
m_displayText = new Ui : : CDisplayText ( ) ;
m_movie = new CMainMovie ( ) ;
m_dialog = m_ctrl - > GetMainDialog ( ) ;
m_short = new Ui : : CMainShort ( ) ;
m_map = new Ui : : CMainMap ( ) ;
m_displayInfo = nullptr ;
m_engine - > SetTerrain ( m_terrain ) ;
m_engine - > SetMovieLock ( m_movieLock ) ;
m_movie - > Flush ( ) ;
FlushDisplayInfo ( ) ;
2014-10-19 11:33:19 +00:00
m_fontSize = 19.0f ;
2012-06-26 20:23:05 +00:00
m_windowPos = Math : : Point ( 0.15f , 0.17f ) ;
m_windowDim = Math : : Point ( 0.70f , 0.66f ) ;
2014-12-22 09:35:05 +00:00
2013-05-01 19:02:43 +00:00
float fValue ;
int iValue ;
2014-12-22 09:35:05 +00:00
2013-05-26 15:47:54 +00:00
if ( loadProfile )
{
2014-08-12 19:24:33 +00:00
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " FontSize " , fValue ) ) m_fontSize = fValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " WindowPosX " , fValue ) ) m_windowPos . x = fValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " WindowPosY " , fValue ) ) m_windowPos . y = fValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " WindowDimX " , fValue ) ) m_windowDim . x = fValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " WindowDimY " , fValue ) ) m_windowDim . y = fValue ;
2013-05-04 09:56:03 +00:00
}
2014-12-22 09:35:05 +00:00
2012-06-26 20:23:05 +00:00
m_IOPublic = false ;
m_IODim = Math : : Point ( 320.0f / 640.0f , ( 121.0f + 18.0f * 8 ) / 480.0f ) ;
m_IOPos . x = ( 1.0f - m_IODim . x ) / 2.0f ; // in the middle
m_IOPos . y = ( 1.0f - m_IODim . y ) / 2.0f ;
2014-12-22 09:35:05 +00:00
2013-05-26 15:47:54 +00:00
if ( loadProfile )
{
2014-08-12 19:24:33 +00:00
if ( GetProfile ( ) . GetIntProperty ( " Edit " , " IOPublic " , iValue ) ) m_IOPublic = iValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " IOPosX " , fValue ) ) m_IOPos . x = fValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " IOPosY " , fValue ) ) m_IOPos . y = fValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " IODimX " , fValue ) ) m_IODim . x = fValue ;
if ( GetProfile ( ) . GetFloatProperty ( " Edit " , " IODimY " , fValue ) ) m_IODim . y = fValue ;
2013-05-04 09:56:03 +00:00
}
2014-12-22 09:35:05 +00:00
2012-06-26 20:23:05 +00:00
m_short - > FlushShortcuts ( ) ;
InitEye ( ) ;
2014-12-22 09:35:05 +00:00
2012-06-26 20:23:05 +00:00
m_engine - > SetTracePrecision ( 1.0f ) ;
2014-12-22 09:35:05 +00:00
2014-08-12 19:24:33 +00:00
if ( loadProfile ) GetProfile ( ) . GetStringProperty ( " Gamer " , " LastName " , m_gamerName ) ;
2012-06-26 20:23:05 +00:00
SetGlobalGamerName ( m_gamerName ) ;
ReadFreeParam ( ) ;
2014-12-20 17:03:49 +00:00
2014-12-20 17:45:46 +00:00
CScriptFunctions : : m_filesDir = CResourceManager : : GetSaveLocation ( ) + " / " + m_dialog - > GetFilesDir ( ) ; //TODO: Refactor to PHYSFS while rewriting CBot engine
CScriptFunctions : : Init ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Destructor of robot application
2012-06-26 20:23:05 +00:00
CRobotMain : : ~ CRobotMain ( )
{
2012-09-16 18:00:25 +00:00
delete m_displayText ;
m_displayText = nullptr ;
delete m_interface ;
m_interface = nullptr ;
delete m_terrain ;
m_terrain = nullptr ;
delete m_camera ;
m_camera = nullptr ;
delete m_displayText ;
m_displayText = nullptr ;
2012-06-26 20:23:05 +00:00
delete m_movie ;
2012-09-16 18:00:25 +00:00
m_movie = nullptr ;
2012-06-26 20:23:05 +00:00
delete m_short ;
2012-09-16 18:00:25 +00:00
m_short = nullptr ;
2012-06-26 20:23:05 +00:00
delete m_map ;
2012-09-16 18:00:25 +00:00
m_map = nullptr ;
2014-12-22 09:35:05 +00:00
m_dialog = nullptr ;
2014-12-11 18:01:57 +00:00
m_input = nullptr ;
m_pause = nullptr ;
2012-09-15 13:33:08 +00:00
m_app = nullptr ;
2014-12-22 09:35:05 +00:00
m_ctrl = nullptr ;
2012-09-15 13:33:08 +00:00
}
2012-06-26 20:23:05 +00:00
2013-02-16 21:37:43 +00:00
Gfx : : CCamera * CRobotMain : : GetCamera ( )
{
return m_camera ;
}
Gfx : : CTerrain * CRobotMain : : GetTerrain ( )
{
return m_terrain ;
}
Ui : : CInterface * CRobotMain : : GetInterface ( )
{
return m_interface ;
}
Ui : : CDisplayText * CRobotMain : : GetDisplayText ( )
{
return m_displayText ;
}
2014-10-20 19:54:52 +00:00
void CRobotMain : : ResetAfterDeviceChanged ( )
{
if ( m_phase = = PHASE_SETUPds | |
m_phase = = PHASE_SETUPgs | |
m_phase = = PHASE_SETUPps | |
m_phase = = PHASE_SETUPcs | |
m_phase = = PHASE_SETUPss | |
m_phase = = PHASE_SIMUL | |
m_phase = = PHASE_WIN | |
m_phase = = PHASE_LOST )
ChangeColor ( ) ;
UpdateMap ( ) ;
}
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
//! Creates the file colobot.ini at the first time
2012-06-26 20:23:05 +00:00
void CRobotMain : : CreateIni ( )
{
2013-05-04 09:56:03 +00:00
m_dialog - > SetupMemorize ( ) ;
2014-08-12 19:24:33 +00:00
GetProfile ( ) . SetFloatProperty ( " Edit " , " FontSize " , m_fontSize ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowPosX " , m_windowPos . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowPosY " , m_windowPos . y ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowDimX " , m_windowDim . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowDimY " , m_windowDim . y ) ;
GetProfile ( ) . SetIntProperty ( " Edit " , " IOPublic " , m_IOPublic ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " IOPosX " , m_IOPos . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " IOPosY " , m_IOPos . y ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " IODimX " , m_IODim . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " IODimY " , m_IODim . y ) ;
GetProfile ( ) . Save ( ) ;
2012-06-26 20:23:05 +00:00
}
2014-12-22 09:35:05 +00:00
void CRobotMain : : LoadIni ( )
{
m_dialog - > SetupRecall ( ) ;
}
2012-09-15 13:33:08 +00:00
//! Changes phase
2012-06-26 20:23:05 +00:00
void CRobotMain : : ChangePhase ( Phase phase )
{
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
m_missionTimer = 0.0f ;
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_SIMUL ) // ends a simulation?
2012-06-26 20:23:05 +00:00
{
SaveAllScript ( ) ;
2013-12-28 11:30:46 +00:00
m_sound - > StopMusic ( 0.0f ) ;
2012-09-17 18:47:27 +00:00
m_camera - > SetControllingObject ( 0 ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( m_gameTime > 10.0f ) // did you play at least 10 seconds?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
int rank = m_dialog - > GetSceneRank ( ) ;
int numTry = m_dialog - > GetGamerInfoTry ( rank ) ;
2012-06-26 20:23:05 +00:00
m_dialog - > SetGamerInfoTry ( rank , numTry + 1 ) ;
m_dialog - > WriteGamerInfo ( ) ;
}
}
2012-09-15 13:33:08 +00:00
if ( phase = = PHASE_WIN ) // wins a simulation?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
int rank = m_dialog - > GetSceneRank ( ) ;
2012-06-26 20:23:05 +00:00
m_dialog - > SetGamerInfoPassed ( rank , true ) ;
m_dialog - > NextMission ( ) ; // passes to the next mission
m_dialog - > WriteGamerInfo ( ) ;
}
2012-09-20 18:37:37 +00:00
m_app - > SetLowCPU ( true ) ; // doesn't use much CPU in interface phases
2012-06-26 20:23:05 +00:00
DeleteAllObjects ( ) ; // removes all the current 3D Scene
m_phase = phase ;
m_winDelay = 0.0f ;
m_lostDelay = 0.0f ;
2012-09-15 13:33:08 +00:00
m_beginSatCom = false ;
m_movieLock = false ;
m_satComLock = false ;
m_editLock = false ;
m_freePhoto = false ;
m_resetCreate = false ;
m_engine - > SetMovieLock ( m_movieLock ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_NONE ) ;
2012-06-26 20:23:05 +00:00
FlushDisplayInfo ( ) ;
m_engine - > SetRankView ( 0 ) ;
2013-10-13 12:44:12 +00:00
m_terrain - > FlushRelief ( ) ;
2012-12-26 19:58:02 +00:00
m_engine - > DeleteAllObjects ( ) ;
2013-03-31 11:06:38 +00:00
Gfx : : CModelManager : : GetInstancePointer ( ) - > DeleteAllModelCopies ( ) ;
2012-09-15 13:33:08 +00:00
m_engine - > SetWaterAddColor ( Gfx : : Color ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ;
2012-06-26 20:23:05 +00:00
m_engine - > SetBackground ( " " ) ;
m_engine - > SetBackForce ( false ) ;
2012-09-15 13:33:08 +00:00
m_engine - > SetForegroundName ( " " ) ;
2012-06-26 20:23:05 +00:00
m_engine - > SetOverColor ( ) ;
2012-09-15 13:33:08 +00:00
m_engine - > DeleteGroundMark ( 0 ) ;
2012-06-26 20:23:05 +00:00
SetSpeed ( 1.0f ) ;
m_terrain - > SetWind ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
m_terrain - > FlushBuildingLevel ( ) ;
m_terrain - > FlushFlyingLimit ( ) ;
2012-09-15 13:33:08 +00:00
m_lightMan - > FlushLights ( ) ;
m_particle - > FlushParticle ( ) ;
2012-06-26 20:23:05 +00:00
m_water - > Flush ( ) ;
m_cloud - > Flush ( ) ;
2012-09-15 13:33:08 +00:00
m_lightning - > Flush ( ) ;
2012-06-26 20:23:05 +00:00
m_planet - > Flush ( ) ;
m_interface - > Flush ( ) ;
ClearInterface ( ) ;
FlushNewScriptName ( ) ;
m_sound - > SetListener ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) , Math : : Vector ( 0.0f , 0.0f , 1.0f ) ) ;
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_DIALOG ) ;
2012-06-26 20:23:05 +00:00
m_movie - > Flush ( ) ;
m_movieInfoIndex = - 1 ;
m_cameraPan = 0.0f ;
m_cameraZoom = 0.0f ;
2012-09-15 13:33:08 +00:00
m_shortCut = true ;
2013-02-16 21:37:43 +00:00
CInstanceManager * iMan = CInstanceManager : : GetInstancePointer ( ) ;
iMan - > Flush ( CLASS_PHYSICS ) ;
iMan - > Flush ( CLASS_BRAIN ) ;
iMan - > Flush ( CLASS_PYRO ) ;
2013-12-30 09:51:29 +00:00
CObjectManager : : GetInstancePointer ( ) - > Flush ( ) ;
2013-02-16 21:37:43 +00:00
2012-09-15 13:33:08 +00:00
Math : : Point dim , pos ;
2012-06-26 20:23:05 +00:00
// Creates and hide the command console.
dim . x = 200.0f / 640.0f ;
dim . y = 18.0f / 480.0f ;
pos . x = 50.0f / 640.0f ;
pos . y = 452.0f / 480.0f ;
2012-10-17 19:48:40 +00:00
Ui : : CEdit * pe = static_cast < Ui : : CEdit * > ( m_interface - > CreateEdit ( pos , dim , 0 , EVENT_CMD ) ) ;
2012-09-15 13:33:08 +00:00
if ( pe = = nullptr ) return ;
pe - > ClearState ( Ui : : STATE_VISIBLE ) ;
m_cmdEdit = false ; // hidden for now
2012-06-26 20:23:05 +00:00
// Creates the speedometer.
dim . x = 30.0f / 640.0f ;
dim . y = 20.0f / 480.0f ;
pos . x = 4.0f / 640.0f ;
pos . y = 426.0f / 480.0f ;
2012-09-15 13:33:08 +00:00
Ui : : CButton * pb = m_interface - > CreateButton ( pos , dim , 0 , EVENT_SPEED ) ;
if ( pb = = nullptr ) return ;
pb - > SetState ( Ui : : STATE_SIMPLY ) ;
pb - > ClearState ( Ui : : STATE_VISIBLE ) ;
2012-06-26 20:23:05 +00:00
m_dialog - > ChangePhase ( m_phase ) ;
dim . x = 32.0f / 640.0f ;
dim . y = 32.0f / 480.0f ;
2012-09-15 13:33:08 +00:00
float ox = 3.0f / 640.0f ;
float oy = 3.0f / 480.0f ;
float sx = ( 32.0f + 2.0f ) / 640.0f ;
float sy = ( 32.0f + 2.0f ) / 480.0f ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( m_phase ! = PHASE_PERSO )
2012-06-26 20:23:05 +00:00
{
m_engine - > SetDrawWorld ( true ) ;
m_engine - > SetDrawFront ( false ) ;
2012-09-15 13:33:08 +00:00
m_fixScene = false ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_INIT )
2012-06-26 20:23:05 +00:00
{
2012-09-20 18:37:37 +00:00
m_engine - > DeleteTexture ( " generic.png " ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
{
2012-09-20 18:37:37 +00:00
m_engine - > DeleteTexture ( " interface.png " ) ;
m_app - > SetLowCPU ( false ) ; // high CPU for simulation
2012-06-26 20:23:05 +00:00
2012-09-26 20:57:43 +00:00
bool loading = ( m_dialog - > GetSceneRead ( ) [ 0 ] ! = 0 ) ;
2012-06-26 20:23:05 +00:00
m_map - > CreateMap ( ) ;
2014-09-24 20:54:26 +00:00
try {
CreateScene ( m_dialog - > GetSceneSoluce ( ) , false , false ) ; // interactive scene
if ( m_mapImage )
m_map - > SetFixImage ( m_mapFilename ) ;
2012-09-15 13:33:08 +00:00
2014-09-24 20:54:26 +00:00
m_app - > ResetTimeAfterLoading ( ) ;
2013-06-13 15:25:58 +00:00
2014-09-24 20:54:26 +00:00
if ( m_immediatSatCom & & ! loading & &
m_infoFilename [ SATCOM_HUSTON ] [ 0 ] ! = 0 )
StartDisplayInfo ( SATCOM_HUSTON , false ) ; // shows the instructions
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
m_sound - > StopMusic ( 0.0f ) ;
2014-11-09 18:26:36 +00:00
if ( m_base = = nullptr | | loading ) StartMusic ( ) ;
2014-09-24 20:54:26 +00:00
}
catch ( const CLevelParserException & e )
{
CLogger : : GetInstancePointer ( ) - > Error ( " An error occured while trying to load a level \n " ) ;
CLogger : : GetInstancePointer ( ) - > Error ( " %s \n " , e . what ( ) ) ;
ChangePhase ( PHASE_INIT ) ;
}
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_WIN )
2012-06-26 20:23:05 +00:00
{
2013-03-14 20:30:32 +00:00
m_sound - > StopAll ( ) ;
2012-09-15 13:33:08 +00:00
if ( m_endingWinRank = = - 1 )
2012-06-26 20:23:05 +00:00
{
ChangePhase ( PHASE_TERM ) ;
}
else
{
2012-09-15 13:33:08 +00:00
m_winTerminate = ( m_endingWinRank = = 904 ) ;
2012-06-26 20:23:05 +00:00
m_dialog - > SetSceneName ( " win " ) ;
2012-09-15 13:33:08 +00:00
2012-06-26 20:23:05 +00:00
m_dialog - > SetSceneRank ( m_endingWinRank ) ;
2014-09-24 20:54:26 +00:00
try {
CreateScene ( false , true , false ) ; // sets scene
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
pos . x = ox + sx * 1 ; pos . y = oy + sy * 1 ;
Math : : Point ddim ;
ddim . x = dim . x * 2 ; ddim . y = dim . y * 2 ;
m_interface - > CreateButton ( pos , ddim , 16 , EVENT_BUTTON_OK ) ;
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
if ( m_winTerminate )
{
pos . x = ox + sx * 3 ; pos . y = oy + sy * 0.2f ;
ddim . x = dim . x * 15 ; ddim . y = dim . y * 3.0f ;
pe = m_interface - > CreateEdit ( pos , ddim , 0 , EVENT_EDIT0 ) ;
pe - > SetGenericMode ( true ) ;
pe - > SetFontType ( Gfx : : FONT_COLOBOT ) ;
pe - > SetEditCap ( false ) ;
pe - > SetHighlightCap ( false ) ;
pe - > ReadText ( std : : string ( " help/ " ) + m_app - > GetLanguageChar ( ) + std : : string ( " /win.txt " ) ) ;
}
else
{
m_displayText - > DisplayError ( INFO_WIN , Math : : Vector ( 0.0f , 0.0f , 0.0f ) , 15.0f , 60.0f , 1000.0f ) ;
}
StartMusic ( ) ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
catch ( const CLevelParserException & e )
2012-06-26 20:23:05 +00:00
{
2014-09-24 20:54:26 +00:00
CLogger : : GetInstancePointer ( ) - > Error ( " An error occured while trying to load win scene \n " ) ;
CLogger : : GetInstancePointer ( ) - > Error ( " %s \n " , e . what ( ) ) ;
ChangePhase ( PHASE_TERM ) ;
2012-06-26 20:23:05 +00:00
}
}
}
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_LOST )
2012-06-26 20:23:05 +00:00
{
2013-03-14 20:30:32 +00:00
m_sound - > StopAll ( ) ;
2012-09-15 13:33:08 +00:00
if ( m_endingLostRank = = - 1 )
2012-06-26 20:23:05 +00:00
{
ChangePhase ( PHASE_TERM ) ;
}
else
{
2012-09-15 13:33:08 +00:00
m_winTerminate = false ;
2012-06-26 20:23:05 +00:00
m_dialog - > SetSceneName ( " lost " ) ;
m_dialog - > SetSceneRank ( m_endingLostRank ) ;
2014-09-24 20:54:26 +00:00
try {
CreateScene ( false , true , false ) ; // sets scene
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
pos . x = ox + sx * 1 ; pos . y = oy + sy * 1 ;
Math : : Point ddim ;
ddim . x = dim . x * 2 ; ddim . y = dim . y * 2 ;
m_interface - > CreateButton ( pos , ddim , 16 , EVENT_BUTTON_OK ) ;
m_displayText - > DisplayError ( INFO_LOST , Math : : Vector ( 0.0f , 0.0f , 0.0f ) , 15.0f , 60.0f , 1000.0f ) ;
2013-05-26 15:47:54 +00:00
2014-09-24 20:54:26 +00:00
StartMusic ( ) ;
}
catch ( const CLevelParserException & e )
{
CLogger : : GetInstancePointer ( ) - > Error ( " An error occured while trying to load lost scene \n " ) ;
CLogger : : GetInstancePointer ( ) - > Error ( " %s \n " , e . what ( ) ) ;
ChangePhase ( PHASE_TERM ) ;
}
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_LOADING )
2012-09-20 18:37:37 +00:00
m_app - > SetMouseMode ( MOUSE_NONE ) ;
2012-06-26 20:23:05 +00:00
else
2012-09-20 18:37:37 +00:00
m_app - > SetMouseMode ( MOUSE_ENGINE ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_engine - > LoadAllTextures ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Processes an event
2013-06-16 19:39:21 +00:00
bool CRobotMain : : ProcessEvent ( Event & event )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( event . type = = EVENT_FRAME )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( ! m_movie - > EventProcess ( event ) ) // end of the movie?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
MainMovieType type = m_movie - > GetStopType ( ) ;
if ( type = = MM_SATCOMopen )
2012-06-26 20:23:05 +00:00
{
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_NONE ) ;
2012-06-26 20:23:05 +00:00
SelectObject ( m_infoObject , false ) ; // hands over the command buttons
2012-09-15 13:33:08 +00:00
m_map - > ShowMap ( m_mapShow ) ;
2012-06-26 20:23:05 +00:00
m_displayText - > HideText ( false ) ;
2012-09-15 13:33:08 +00:00
int i = m_movieInfoIndex ;
2012-06-26 20:23:05 +00:00
StartDisplayInfo ( m_movieInfoIndex , false ) ;
m_movieInfoIndex = i ;
}
}
m_displayText - > EventProcess ( event ) ;
RemoteCamera ( m_cameraPan , m_cameraZoom , event . rTime ) ;
m_interface - > EventProcess ( event ) ;
2012-09-15 13:33:08 +00:00
if ( m_displayInfo ! = nullptr ) // current edition?
2012-06-26 20:23:05 +00:00
m_displayInfo - > EventProcess ( event ) ;
2014-10-29 15:08:45 +00:00
2014-10-29 16:53:46 +00:00
UpdateInfoText ( ) ;
2012-09-15 13:33:08 +00:00
2012-06-26 20:23:05 +00:00
return EventFrame ( event ) ;
}
// Management of the console.
2015-04-06 15:23:18 +00:00
if ( event . type = = EVENT_KEY_DOWN & &
2014-11-09 17:58:13 +00:00
event . key . key = = KEY ( BACKQUOTE ) ) // Pause ?
2012-09-15 13:33:08 +00:00
{
2015-04-06 15:23:18 +00:00
if ( m_phase ! = PHASE_NAME & &
! m_movie - > IsExist ( ) & &
! m_movieLock & & ! m_editLock & & ! m_engine - > GetPause ( ) )
{
Ui : : CEdit * pe = static_cast < Ui : : CEdit * > ( m_interface - > SearchControl ( EVENT_CMD ) ) ;
if ( pe = = nullptr ) return false ;
pe - > SetState ( Ui : : STATE_VISIBLE ) ;
pe - > SetFocus ( true ) ;
if ( m_phase = = PHASE_SIMUL ) ChangePause ( PAUSE_CHEAT ) ;
m_cmdEdit = true ;
}
2012-06-26 20:23:05 +00:00
return false ;
}
2012-09-15 13:33:08 +00:00
if ( event . type = = EVENT_KEY_DOWN & &
event . key . key = = KEY ( RETURN ) & & m_cmdEdit )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
char cmd [ 50 ] ;
2012-10-17 19:48:40 +00:00
Ui : : CEdit * pe = static_cast < Ui : : CEdit * > ( m_interface - > SearchControl ( EVENT_CMD ) ) ;
2012-09-15 13:33:08 +00:00
if ( pe = = nullptr ) return false ;
2012-06-26 20:23:05 +00:00
pe - > GetText ( cmd , 50 ) ;
pe - > SetText ( " " ) ;
2012-09-15 13:33:08 +00:00
pe - > ClearState ( Ui : : STATE_VISIBLE ) ;
2013-12-31 11:58:45 +00:00
if ( m_phase = = PHASE_SIMUL ) ChangePause ( PAUSE_NONE ) ;
2012-06-26 20:23:05 +00:00
ExecuteCmd ( cmd ) ;
2012-09-15 13:33:08 +00:00
m_cmdEdit = false ;
2012-06-26 20:23:05 +00:00
return false ;
}
// Management of the speed change.
2012-09-15 13:33:08 +00:00
if ( event . type = = EVENT_SPEED )
2012-06-26 20:23:05 +00:00
SetSpeed ( 1.0f ) ;
2014-12-22 09:35:05 +00:00
if ( event . type = = EVENT_MOUSE_MOVE )
2012-06-26 20:23:05 +00:00
{
2014-12-22 09:35:05 +00:00
m_lastMousePos = event . mousePos ;
HiliteObject ( event . mousePos ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( ! m_displayText - > EventProcess ( event ) )
2012-06-26 20:23:05 +00:00
return false ;
2012-09-15 13:33:08 +00:00
if ( event . type = = EVENT_MOUSE_MOVE )
2012-06-26 20:23:05 +00:00
{
2012-09-21 22:38:17 +00:00
m_lastMousePos = event . mousePos ;
HiliteObject ( event . mousePos ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_displayInfo ! = nullptr ) // current info?
2012-06-26 20:23:05 +00:00
{
m_displayInfo - > EventProcess ( event ) ;
2012-09-15 13:33:08 +00:00
if ( event . type = = EVENT_KEY_DOWN )
2012-06-26 20:23:05 +00:00
{
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_HELP | |
event . key . slot = = INPUT_SLOT_PROG | |
2012-09-15 13:33:08 +00:00
event . key . key = = KEY ( ESCAPE ) )
2012-06-26 20:23:05 +00:00
{
StopDisplayInfo ( ) ;
}
}
2012-09-15 13:33:08 +00:00
if ( event . type = = EVENT_OBJECT_INFOOK )
2012-06-26 20:23:05 +00:00
StopDisplayInfo ( ) ;
2012-09-15 13:33:08 +00:00
2012-06-26 20:23:05 +00:00
return false ;
}
2012-09-15 13:33:08 +00:00
CObject * obj ;
2012-06-26 20:23:05 +00:00
// Simulation phase of the game
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( ! m_editFull )
2012-06-26 20:23:05 +00:00
m_camera - > EventProcess ( event ) ;
2012-09-15 13:33:08 +00:00
switch ( event . type )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
case EVENT_KEY_DOWN :
2014-12-11 18:01:57 +00:00
KeyCamera ( event . type , event . key . slot ) ;
2012-06-26 20:23:05 +00:00
HiliteClear ( ) ;
2012-09-15 13:33:08 +00:00
if ( event . key . key = = KEY ( F11 ) )
2012-06-26 20:23:05 +00:00
{
2012-09-22 12:40:13 +00:00
m_particle - > WriteWheelTrace ( " Savegame/t.png " , 256 , 256 , Math : : Vector ( 16.0f , 0.0f , - 368.0f ) , Math : : Vector ( 140.0f , 0.0f , - 248.0f ) ) ;
2012-06-26 20:23:05 +00:00
return false ;
}
2012-09-15 13:33:08 +00:00
if ( m_editLock ) // current edition?
2012-06-26 20:23:05 +00:00
{
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_HELP )
2012-06-26 20:23:05 +00:00
{
StartDisplayInfo ( SATCOM_HUSTON , false ) ;
return false ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_PROG )
2012-06-26 20:23:05 +00:00
{
StartDisplayInfo ( SATCOM_PROG , false ) ;
return false ;
}
break ;
}
2012-09-15 13:33:08 +00:00
if ( m_movieLock ) // current movie?
2012-06-26 20:23:05 +00:00
{
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_QUIT | |
2012-09-15 13:33:08 +00:00
event . key . key = = KEY ( ESCAPE ) )
2012-06-26 20:23:05 +00:00
{
AbortMovie ( ) ;
}
return false ;
}
2012-09-15 13:33:08 +00:00
if ( m_camera - > GetType ( ) = = Gfx : : CAM_TYPE_VISIT )
2012-06-26 20:23:05 +00:00
{
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_VISIT )
2012-06-26 20:23:05 +00:00
{
StartDisplayVisit ( EVENT_NULL ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_QUIT | |
2012-09-15 13:33:08 +00:00
event . key . key = = KEY ( ESCAPE ) )
2012-06-26 20:23:05 +00:00
{
StopDisplayVisit ( ) ;
}
return false ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_QUIT )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_movie - > IsExist ( ) )
2012-06-26 20:23:05 +00:00
StartDisplayInfo ( SATCOM_HUSTON , false ) ;
2012-09-15 13:33:08 +00:00
else if ( m_winDelay > 0.0f )
2012-06-26 20:23:05 +00:00
ChangePhase ( PHASE_WIN ) ;
2012-09-15 13:33:08 +00:00
else if ( m_lostDelay > 0.0f )
2012-06-26 20:23:05 +00:00
ChangePhase ( PHASE_LOST ) ;
2013-05-26 15:47:54 +00:00
else if ( ! m_cmdEdit )
2012-06-26 20:23:05 +00:00
m_dialog - > StartAbort ( ) ; // do you want to leave?
}
2014-12-14 15:54:32 +00:00
if ( event . key . slot = = INPUT_SLOT_PAUSE )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( ! m_movieLock & & ! m_editLock & & ! m_cmdEdit & &
m_camera - > GetType ( ) ! = Gfx : : CAM_TYPE_VISIT & &
! m_movie - > IsExist ( ) )
2012-06-26 20:23:05 +00:00
{
2013-12-31 11:58:45 +00:00
ChangePause ( m_pause - > GetPause ( PAUSE_USER ) ? PAUSE_NONE : PAUSE_USER ) ;
2012-06-26 20:23:05 +00:00
}
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_CAMERA )
2012-06-26 20:23:05 +00:00
{
ChangeCamera ( ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_DESEL )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_shortCut )
2012-06-26 20:23:05 +00:00
DeselectObject ( ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_HUMAN )
2012-06-26 20:23:05 +00:00
{
SelectHuman ( ) ;
}
2015-03-22 15:02:05 +00:00
if ( event . key . slot = = INPUT_SLOT_NEXT & & ( ( event . kmodState & KEY_MOD ( CTRL ) ) ! = 0 ) )
{
m_short - > SelectShortcut ( EVENT_OBJECT_SHORTCUT00 ) ; // switch bots <-> buildings
return false ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_NEXT )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_shortCut )
2012-06-26 20:23:05 +00:00
m_short - > SelectNext ( ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_HELP )
2012-06-26 20:23:05 +00:00
{
StartDisplayInfo ( SATCOM_HUSTON , true ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_PROG )
2012-06-26 20:23:05 +00:00
{
StartDisplayInfo ( SATCOM_PROG , true ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_VISIT )
2012-06-26 20:23:05 +00:00
{
StartDisplayVisit ( EVENT_NULL ) ;
}
2014-12-14 16:05:28 +00:00
if ( event . key . slot = = INPUT_SLOT_SPEED05 )
{
SetSpeed ( 0.5f ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_SPEED10 )
2012-06-26 20:23:05 +00:00
{
SetSpeed ( 1.0f ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_SPEED15 )
2012-06-26 20:23:05 +00:00
{
SetSpeed ( 1.5f ) ;
}
2014-12-11 18:01:57 +00:00
if ( event . key . slot = = INPUT_SLOT_SPEED20 )
2012-06-26 20:23:05 +00:00
{
SetSpeed ( 2.0f ) ;
}
2014-12-14 16:05:28 +00:00
if ( event . key . slot = = INPUT_SLOT_SPEED30 )
{
SetSpeed ( 3.0f ) ;
}
if ( event . key . slot = = INPUT_SLOT_SPEED40 )
{
SetSpeed ( 4.0f ) ;
}
2015-03-22 15:32:21 +00:00
if ( event . key . key = = KEY ( c ) & & ( ( event . kmodState & KEY_MOD ( CTRL ) ) ! = 0 ) & & m_engine - > GetShowStats ( ) )
{
std : : ostringstream ss ;
CObject * obj = GetSelect ( ) ;
if ( obj ! = nullptr ) {
ss < < " CreateObject type= " < < GetTypeObject ( obj - > GetType ( ) ) < < " pos= " < < std : : fixed < < std : : setprecision ( 3 ) < < obj - > GetPosition ( 0 ) . x / g_unit < < " ; " < < obj - > GetPosition ( 0 ) . z / g_unit < < " dir= " < < ( obj - > GetAngleZ ( 0 ) / ( Math : : PI / 180.0f ) ) ;
}
widgetSetClipboardText ( ss . str ( ) . c_str ( ) ) ;
}
2012-06-26 20:23:05 +00:00
break ;
2012-09-15 13:33:08 +00:00
case EVENT_KEY_UP :
2014-12-11 18:01:57 +00:00
KeyCamera ( event . type , event . key . slot ) ;
2012-06-26 20:23:05 +00:00
break ;
2012-09-15 13:33:08 +00:00
case EVENT_MOUSE_BUTTON_DOWN :
2012-09-29 17:29:51 +00:00
if ( event . mouseButton . button ! = MOUSE_BUTTON_LEFT ) // only left mouse button
2012-09-15 13:33:08 +00:00
break ;
2012-09-21 22:38:17 +00:00
obj = DetectObject ( event . mousePos ) ;
2012-09-15 13:33:08 +00:00
if ( ! m_shortCut ) obj = nullptr ;
if ( obj ! = nullptr & & obj - > GetType ( ) = = OBJECT_TOTO )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_displayInfo ! = nullptr ) // current info?
2012-06-26 20:23:05 +00:00
{
StopDisplayInfo ( ) ;
}
else
{
2012-09-15 13:33:08 +00:00
if ( ! m_editLock )
2012-06-26 20:23:05 +00:00
StartDisplayInfo ( SATCOM_HUSTON , true ) ;
}
}
else
2012-09-15 13:33:08 +00:00
SelectObject ( obj ) ;
2012-06-26 20:23:05 +00:00
break ;
2012-09-15 13:33:08 +00:00
case EVENT_MOUSE_BUTTON_UP :
2012-09-29 17:29:51 +00:00
if ( event . mouseButton . button ! = MOUSE_BUTTON_LEFT ) // only left mouse button
2012-09-15 13:33:08 +00:00
break ;
2012-06-26 20:23:05 +00:00
m_cameraPan = 0.0f ;
m_cameraZoom = 0.0f ;
break ;
case EVENT_OBJECT_LIMIT :
StartShowLimit ( ) ;
break ;
case EVENT_OBJECT_DESELECT :
2012-09-15 13:33:08 +00:00
if ( m_shortCut )
2012-06-26 20:23:05 +00:00
DeselectObject ( ) ;
break ;
case EVENT_OBJECT_HELP :
HelpObject ( ) ;
break ;
case EVENT_OBJECT_CAMERA :
ChangeCamera ( ) ;
break ;
case EVENT_OBJECT_CAMERAleft :
m_cameraPan = - 1.0f ;
break ;
case EVENT_OBJECT_CAMERAright :
m_cameraPan = 1.0f ;
break ;
case EVENT_OBJECT_CAMERAnear :
m_cameraZoom = - 1.0f ;
break ;
case EVENT_OBJECT_CAMERAaway :
m_cameraZoom = 1.0f ;
break ;
case EVENT_OBJECT_DELETE :
m_dialog - > StartDeleteObject ( ) ; // do you want to destroy it?
break ;
case EVENT_OBJECT_BHELP :
StartDisplayInfo ( SATCOM_HUSTON , true ) ;
break ;
case EVENT_OBJECT_SOLUCE :
StartDisplayInfo ( SATCOM_SOLUCE , true ) ;
break ;
case EVENT_OBJECT_MAPZOOM :
m_map - > ZoomMap ( ) ;
break ;
case EVENT_DT_VISIT0 :
case EVENT_DT_VISIT1 :
case EVENT_DT_VISIT2 :
case EVENT_DT_VISIT3 :
case EVENT_DT_VISIT4 :
2012-09-15 13:33:08 +00:00
StartDisplayVisit ( event . type ) ;
2012-06-26 20:23:05 +00:00
break ;
case EVENT_DT_END :
StopDisplayVisit ( ) ;
break ;
case EVENT_OBJECT_SHORTCUT00 :
case EVENT_OBJECT_SHORTCUT01 :
case EVENT_OBJECT_SHORTCUT02 :
case EVENT_OBJECT_SHORTCUT03 :
case EVENT_OBJECT_SHORTCUT04 :
case EVENT_OBJECT_SHORTCUT05 :
case EVENT_OBJECT_SHORTCUT06 :
case EVENT_OBJECT_SHORTCUT07 :
case EVENT_OBJECT_SHORTCUT08 :
case EVENT_OBJECT_SHORTCUT09 :
case EVENT_OBJECT_SHORTCUT10 :
case EVENT_OBJECT_SHORTCUT11 :
case EVENT_OBJECT_SHORTCUT12 :
case EVENT_OBJECT_SHORTCUT13 :
case EVENT_OBJECT_SHORTCUT14 :
case EVENT_OBJECT_SHORTCUT15 :
case EVENT_OBJECT_SHORTCUT16 :
case EVENT_OBJECT_SHORTCUT17 :
case EVENT_OBJECT_SHORTCUT18 :
case EVENT_OBJECT_SHORTCUT19 :
2012-09-15 13:33:08 +00:00
m_short - > SelectShortcut ( event . type ) ;
2012-06-26 20:23:05 +00:00
break ;
case EVENT_OBJECT_MOVIELOCK :
AbortMovie ( ) ;
break ;
case EVENT_WIN :
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2012-06-26 20:23:05 +00:00
ChangePhase ( PHASE_WIN ) ;
break ;
case EVENT_LOST :
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2012-06-26 20:23:05 +00:00
ChangePhase ( PHASE_LOST ) ;
break ;
2012-09-15 13:33:08 +00:00
default :
break ;
2012-06-26 20:23:05 +00:00
}
EventObject ( event ) ;
return false ;
}
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_PERSO )
2012-06-26 20:23:05 +00:00
EventObject ( event ) ;
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_WIN | |
m_phase = = PHASE_LOST )
2012-06-26 20:23:05 +00:00
{
EventObject ( event ) ;
2012-09-15 13:33:08 +00:00
switch ( event . type )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
case EVENT_KEY_DOWN :
if ( event . key . key = = KEY ( ESCAPE ) | |
event . key . key = = KEY ( RETURN ) )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_winTerminate )
2012-06-26 20:23:05 +00:00
ChangePhase ( PHASE_INIT ) ;
else
ChangePhase ( PHASE_TERM ) ;
}
break ;
case EVENT_BUTTON_OK :
2012-09-15 13:33:08 +00:00
if ( m_winTerminate )
2012-06-26 20:23:05 +00:00
ChangePhase ( PHASE_INIT ) ;
else
ChangePhase ( PHASE_TERM ) ;
2013-12-26 20:54:05 +00:00
2012-06-26 20:23:05 +00:00
break ;
2012-09-15 13:33:08 +00:00
default :
2012-06-26 20:23:05 +00:00
break ;
}
}
return true ;
}
2012-09-15 13:33:08 +00:00
//! Executes a command
2012-06-26 20:23:05 +00:00
void CRobotMain : : ExecuteCmd ( char * cmd )
{
2012-09-15 13:33:08 +00:00
if ( cmd [ 0 ] = = 0 ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " winmission " ) = = 0 )
m_eventQueue - > AddEvent ( Event ( EVENT_WIN ) ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " lostmission " ) = = 0 )
m_eventQueue - > AddEvent ( Event ( EVENT_LOST ) ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " trainerpilot " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_trainerPilot = ! m_trainerPilot ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " fly " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
g_researchDone | = RESEARCH_FLY ;
2012-09-15 13:33:08 +00:00
m_eventQueue - > AddEvent ( Event ( EVENT_UPDINTERFACE ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " allresearch " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
g_researchDone = - 1 ; // all research are done
2012-09-15 13:33:08 +00:00
m_eventQueue - > AddEvent ( Event ( EVENT_UPDINTERFACE ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2013-04-12 20:52:32 +00:00
if ( strcmp ( cmd , " allbuildings " ) = = 0 )
{
g_build = - 1 ; // all buildings are available
m_eventQueue - > AddEvent ( Event ( EVENT_UPDINTERFACE ) ) ;
return ;
}
if ( strcmp ( cmd , " all " ) = = 0 )
{
g_researchDone = - 1 ; // all research are done
g_build = - 1 ; // all buildings are available
m_eventQueue - > AddEvent ( Event ( EVENT_UPDINTERFACE ) ) ;
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " nolimit " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
m_terrain - > SetFlyingMaxHeight ( 280.0f ) ;
return ;
}
2013-04-29 15:26:32 +00:00
if ( strcmp ( cmd , " controller " ) = = 0 )
{
2013-05-26 15:47:54 +00:00
if ( m_controller ! = nullptr )
{
2013-04-29 15:26:32 +00:00
// Don't use SelectObject because it checks if the object is selectable
if ( m_camera - > GetType ( ) = = Gfx : : CAM_TYPE_VISIT )
StopDisplayVisit ( ) ;
CObject * prev = DeselectAll ( ) ;
if ( prev ! = nullptr & & prev ! = m_controller )
m_controller - > AddDeselList ( prev ) ;
SelectOneObject ( m_controller , true ) ;
m_short - > UpdateShortcuts ( ) ;
}
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " photo1 " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_freePhoto = ! m_freePhoto ;
if ( m_freePhoto )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_FREE ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_PHOTO ) ;
2012-06-26 20:23:05 +00:00
}
else
{
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_BACK ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_NONE ) ;
2012-06-26 20:23:05 +00:00
}
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " photo2 " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_freePhoto = ! m_freePhoto ;
if ( m_freePhoto )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_FREE ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_PHOTO ) ;
2012-06-26 20:23:05 +00:00
DeselectAll ( ) ; // removes the control buttons
m_map - > ShowMap ( false ) ;
m_displayText - > HideText ( true ) ;
}
else
{
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_BACK ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_NONE ) ;
2012-09-15 13:33:08 +00:00
m_map - > ShowMap ( m_mapShow ) ;
2012-06-26 20:23:05 +00:00
m_displayText - > HideText ( false ) ;
}
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " noclip " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
2012-06-26 20:23:05 +00:00
object - > SetClip ( false ) ;
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " clip " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
2012-06-26 20:23:05 +00:00
object - > SetClip ( true ) ;
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " addhusky " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
object - > SetMagnifyDamage ( object - > GetMagnifyDamage ( ) * 0.1f ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " addfreezer " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
object - > SetRange ( object - > GetRange ( ) * 10.0f ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2013-05-26 15:47:54 +00:00
2012-09-29 23:51:37 +00:00
if ( strcmp ( cmd , " \155 \157 \157 " ) = = 0 )
{
// VGhpcyBpcyBlYXN0ZXItZWdnIGFuZCBzbyBpdCBzaG91bGQgYmUgb2JmdXNjYXRlZCEgRG8gbm90
// IGNsZWFuLXVwIHRoaXMgY29kZSEK
GetLogger ( ) - > Info ( " _________________________ \n " ) ;
GetLogger ( ) - > Info ( " < \x50 \x6F \x6C \x73 \x6B \x69 \x50 \x6F \x72 \x74 \x61 \x6C C \x6F \x6C \x6F \x62 \x6F \x74 \x61 ! \x3E \n " ) ;
GetLogger ( ) - > Info ( " ------------------------- \n " ) ;
GetLogger ( ) - > Info ( " \x5C \x20 \x20 \x20 \x5E \x5F \x5F \x5E \n " ) ;
GetLogger ( ) - > Info ( " \x20 \x5C \x20 \x20 \x28 \x6F \x6F \x29 \x5C \x5F \x5F \x5F \x5F \x5F \x5F \x5F \n " ) ;
GetLogger ( ) - > Info ( " \x28 \x5F \x5F \x29 \x5C \x20 \x20 \x20 \x20 \x29 \x5C \x2F \x5C \n " ) ;
GetLogger ( ) - > Info ( " \x20 \x20 \x20 \x20 \x7C | \x2D \x2D \x2D \x2D \x77 \x20 \x7C \n " ) ;
GetLogger ( ) - > Info ( " \x20 \x20 \x7C \x7C \x20 \x20 \x20 \x20 || \n " ) ;
}
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " fullpower " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * power = object - > GetPower ( ) ;
if ( power ! = nullptr )
2012-06-26 20:23:05 +00:00
power - > SetEnergy ( 1.0f ) ;
2012-09-15 13:33:08 +00:00
2012-06-26 20:23:05 +00:00
object - > SetShield ( 1.0f ) ;
2012-09-15 13:33:08 +00:00
CPhysics * physics = object - > GetPhysics ( ) ;
if ( physics ! = nullptr )
2012-06-26 20:23:05 +00:00
physics - > SetReactorRange ( 1.0f ) ;
}
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " fullenergy " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * power = object - > GetPower ( ) ;
if ( power ! = nullptr )
2012-06-26 20:23:05 +00:00
power - > SetEnergy ( 1.0f ) ;
}
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " fullshield " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
2012-06-26 20:23:05 +00:00
object - > SetShield ( 1.0f ) ;
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " fullrange " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * object = GetSelect ( ) ;
if ( object ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CPhysics * physics = object - > GetPhysics ( ) ;
if ( physics ! = nullptr )
2012-06-26 20:23:05 +00:00
physics - > SetReactorRange ( 1.0f ) ;
}
return ;
}
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " debugmode " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2013-06-16 19:39:21 +00:00
if ( m_app - > IsDebugModeActive ( DEBUG_ALL ) )
{
m_app - > SetDebugModeActive ( DEBUG_ALL , false ) ;
}
else
{
m_app - > SetDebugModeActive ( DEBUG_ALL , true ) ;
}
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " showstat " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetShowStats ( ! m_engine - > GetShowStats ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invshadow " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetShadow ( ! m_engine - > GetShadow ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invdirty " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetDirty ( ! m_engine - > GetDirty ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invfog " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetFog ( ! m_engine - > GetFog ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invlens " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetLensMode ( ! m_engine - > GetLensMode ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invwater " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetWaterMode ( ! m_engine - > GetWaterMode ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invsky " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetSkyMode ( ! m_engine - > GetSkyMode ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invplanet " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_engine - > SetPlanetMode ( ! m_engine - > GetPlanetMode ( ) ) ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " selectinsect " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_selectInsect = ! m_selectInsect ;
2012-06-26 20:23:05 +00:00
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " showsoluce " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_showSoluce = ! m_showSoluce ;
2012-06-26 20:23:05 +00:00
m_dialog - > ShowSoluceUpdate ( ) ;
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " allmission " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_showAll = ! m_showAll ;
2012-06-26 20:23:05 +00:00
m_dialog - > AllMissionUpdate ( ) ;
return ;
}
2012-09-15 13:33:08 +00:00
if ( strcmp ( cmd , " invradar " ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_cheatRadar = ! m_cheatRadar ;
2012-06-26 20:23:05 +00:00
return ;
}
2013-05-26 15:47:54 +00:00
if ( strcmp ( cmd , " speed4 " ) = = 0 )
{
2012-10-06 21:35:27 +00:00
SetSpeed ( 4.0f ) ;
UpdateSpeedLabel ( ) ;
2013-05-26 15:47:54 +00:00
return ;
2012-10-06 21:35:27 +00:00
}
2013-05-26 15:47:54 +00:00
if ( strcmp ( cmd , " speed8 " ) = = 0 )
{
2012-10-06 21:35:27 +00:00
SetSpeed ( 8.0f ) ;
UpdateSpeedLabel ( ) ;
2013-05-26 15:47:54 +00:00
return ;
2012-10-06 21:35:27 +00:00
}
2013-05-26 15:47:54 +00:00
if ( strcmp ( cmd , " crazy " ) = = 0 )
{
2013-04-12 20:52:32 +00:00
SetSpeed ( 1000.0f ) ;
UpdateSpeedLabel ( ) ;
2013-05-26 15:47:54 +00:00
return ;
2013-04-12 20:52:32 +00:00
}
2012-10-06 21:35:27 +00:00
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
m_displayText - > DisplayError ( ERR_CMD , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
}
2012-09-15 13:33:08 +00:00
//! Returns the type of current movie
MainMovieType CRobotMain : : GetMainMovie ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_movie - > GetType ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Clears the display of instructions
2012-06-26 20:23:05 +00:00
void CRobotMain : : FlushDisplayInfo ( )
{
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < SATCOM_MAX ; i + + )
2012-06-26 20:23:05 +00:00
{
m_infoFilename [ i ] [ 0 ] = 0 ;
m_infoPos [ i ] = 0 ;
}
2013-05-26 09:34:53 +00:00
strcpy ( m_infoFilename [ SATCOM_OBJECT ] , " objects.txt " ) ;
2012-06-26 20:23:05 +00:00
m_infoIndex = 0 ;
}
2012-09-15 13:33:08 +00:00
//! Beginning of the displaying of instructions.
//! index: SATCOM_*
void CRobotMain : : StartDisplayInfo ( int index , bool movie )
2012-06-26 20:23:05 +00:00
{
2013-03-27 21:20:50 +00:00
if ( m_cmdEdit | | m_satComLock | | m_lockedSatCom ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CObject * obj = GetSelect ( ) ;
bool human = obj ! = nullptr & & obj - > GetType ( ) = = OBJECT_HUMAN ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! m_editLock & & movie & & ! m_movie - > IsExist ( ) & & human )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CMotion * motion = obj - > GetMotion ( ) ;
if ( motion ! = nullptr & & motion - > GetAction ( ) = = - 1 )
2012-06-26 20:23:05 +00:00
{
m_movieInfoIndex = index ;
m_movie - > Start ( MM_SATCOMopen , 2.5f ) ;
2013-12-31 15:58:21 +00:00
ChangePause ( PAUSE_SATCOMMOVIE ) ;
2012-06-26 20:23:05 +00:00
m_infoObject = DeselectAll ( ) ; // removes the control buttons
m_displayText - > HideText ( true ) ;
return ;
}
}
2012-09-15 13:33:08 +00:00
if ( m_movie - > IsExist ( ) )
2012-06-26 20:23:05 +00:00
{
m_movie - > Stop ( ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_NONE ) ;
2012-06-26 20:23:05 +00:00
SelectObject ( m_infoObject , false ) ; // hands over the command buttons
m_displayText - > HideText ( false ) ;
}
StartDisplayInfo ( m_infoFilename [ index ] , index ) ;
}
2012-09-15 13:33:08 +00:00
//! Beginning of the displaying of instructions
2012-09-17 22:01:00 +00:00
void CRobotMain : : StartDisplayInfo ( const char * filename , int index )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_cmdEdit ) return ;
2012-06-26 20:23:05 +00:00
m_movieInfoIndex = - 1 ;
ClearInterface ( ) ; // removes setting evidence and tooltip
2012-09-15 13:33:08 +00:00
if ( ! m_editLock )
2012-06-26 20:23:05 +00:00
{
m_infoObject = DeselectAll ( ) ; // removes the control buttons
m_displayText - > HideText ( true ) ;
m_sound - > MuteAll ( true ) ;
}
2012-09-15 13:33:08 +00:00
bool soluce = m_dialog - > GetSceneSoluce ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_displayInfo = new Ui : : CDisplayInfo ( ) ;
m_displayInfo - > StartDisplayInfo ( filename , index , soluce ) ;
2012-06-26 20:23:05 +00:00
m_infoIndex = index ;
2012-09-15 13:33:08 +00:00
if ( index ! = - 1 )
2012-06-26 20:23:05 +00:00
m_displayInfo - > SetPosition ( m_infoPos [ index ] ) ;
}
2012-09-15 13:33:08 +00:00
//! End of displaying of instructions
2012-06-26 20:23:05 +00:00
void CRobotMain : : StopDisplayInfo ( )
{
2013-03-23 19:33:14 +00:00
if ( m_cmdEdit ) return ;
2013-05-26 15:47:54 +00:00
2012-09-15 13:33:08 +00:00
if ( m_movieInfoIndex ! = - 1 ) // film to read the SatCom?
2012-06-26 20:23:05 +00:00
m_movie - > Start ( MM_SATCOMclose , 2.0f ) ;
2012-09-15 13:33:08 +00:00
if ( m_infoIndex ! = - 1 )
m_infoPos [ m_infoIndex ] = m_displayInfo - > GetPosition ( ) ;
2012-06-26 20:23:05 +00:00
m_displayInfo - > StopDisplayInfo ( ) ;
delete m_displayInfo ;
2012-09-15 13:33:08 +00:00
m_displayInfo = nullptr ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! m_editLock )
2012-06-26 20:23:05 +00:00
{
SelectObject ( m_infoObject , false ) ; // gives the command buttons
m_displayText - > HideText ( false ) ;
m_sound - > MuteAll ( false ) ;
}
2012-09-15 13:33:08 +00:00
if ( m_infoUsed = = 0 )
2012-06-26 20:23:05 +00:00
m_displayText - > ClearText ( ) ; // removes message "see SatCom ..."
m_infoUsed + + ;
}
2012-09-15 13:33:08 +00:00
//! Returns the name of the text display
char * CRobotMain : : GetDisplayInfoName ( int index )
2012-06-26 20:23:05 +00:00
{
return m_infoFilename [ index ] ;
}
2012-09-15 13:33:08 +00:00
//! Returns the name of the text display
int CRobotMain : : GetDisplayInfoPosition ( int index )
2012-06-26 20:23:05 +00:00
{
return m_infoPos [ index ] ;
}
2012-09-15 13:33:08 +00:00
//! Returns the name of the text display
2012-06-26 20:23:05 +00:00
void CRobotMain : : SetDisplayInfoPosition ( int index , int pos )
{
m_infoPos [ index ] = pos ;
}
2012-09-15 13:33:08 +00:00
//! Beginning of a dialogue during the game
2012-06-26 20:23:05 +00:00
void CRobotMain : : StartSuspend ( )
{
m_map - > ShowMap ( false ) ;
m_infoObject = DeselectAll ( ) ; // removes the control buttons
m_displayText - > HideText ( true ) ;
2012-09-15 13:33:08 +00:00
m_suspend = true ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! End of dialogue during the game
2012-06-26 20:23:05 +00:00
void CRobotMain : : StopSuspend ( )
{
SelectObject ( m_infoObject , false ) ; // gives the command buttons
2012-09-15 13:33:08 +00:00
m_map - > ShowMap ( m_mapShow ) ;
2012-06-26 20:23:05 +00:00
m_displayText - > HideText ( false ) ;
2012-09-15 13:33:08 +00:00
m_suspend = false ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the absolute time of the game
float CRobotMain : : GetGameTime ( )
2012-06-26 20:23:05 +00:00
{
return m_gameTime ;
}
2012-09-15 13:33:08 +00:00
//! Managing the size of the default fonts
2012-06-26 20:23:05 +00:00
void CRobotMain : : SetFontSize ( float size )
{
m_fontSize = size ;
2014-08-12 19:24:33 +00:00
GetProfile ( ) . SetFloatProperty ( " Edit " , " FontSize " , m_fontSize ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
float CRobotMain : : GetFontSize ( )
2012-06-26 20:23:05 +00:00
{
return m_fontSize ;
}
2012-09-15 13:33:08 +00:00
//! Managing the size of the default window
2012-06-26 20:23:05 +00:00
void CRobotMain : : SetWindowPos ( Math : : Point pos )
{
m_windowPos = pos ;
2014-08-12 19:24:33 +00:00
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowPosX " , m_windowPos . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowPosY " , m_windowPos . y ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
Math : : Point CRobotMain : : GetWindowPos ( )
2012-06-26 20:23:05 +00:00
{
return m_windowPos ;
}
void CRobotMain : : SetWindowDim ( Math : : Point dim )
{
m_windowDim = dim ;
2014-08-12 19:24:33 +00:00
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowDimX " , m_windowDim . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " WindowDimY " , m_windowDim . y ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
Math : : Point CRobotMain : : GetWindowDim ( )
2012-06-26 20:23:05 +00:00
{
return m_windowDim ;
}
2012-09-15 13:33:08 +00:00
//! Managing windows open/save
void CRobotMain : : SetIOPublic ( bool mode )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_IOPublic = mode ;
2014-08-12 19:24:33 +00:00
GetProfile ( ) . SetIntProperty ( " Edit " , " IOPublic " , m_IOPublic ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetIOPublic ( )
2012-06-26 20:23:05 +00:00
{
return m_IOPublic ;
}
void CRobotMain : : SetIOPos ( Math : : Point pos )
{
m_IOPos = pos ;
2014-08-12 19:24:33 +00:00
GetProfile ( ) . SetFloatProperty ( " Edit " , " IOPosX " , m_IOPos . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " IOPosY " , m_IOPos . y ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
Math : : Point CRobotMain : : GetIOPos ( )
2012-06-26 20:23:05 +00:00
{
return m_IOPos ;
}
void CRobotMain : : SetIODim ( Math : : Point dim )
{
m_IODim = dim ;
2014-08-12 19:24:33 +00:00
GetProfile ( ) . SetFloatProperty ( " Edit " , " IODimX " , m_IODim . x ) ;
GetProfile ( ) . SetFloatProperty ( " Edit " , " IODimY " , m_IODim . y ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
Math : : Point CRobotMain : : GetIODim ( )
2012-06-26 20:23:05 +00:00
{
return m_IODim ;
}
2012-09-15 13:33:08 +00:00
//! Start of the visit instead of an error
void CRobotMain : : StartDisplayVisit ( EventType event )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_editLock ) return ;
2012-06-26 20:23:05 +00:00
2012-10-17 19:48:40 +00:00
Ui : : CWindow * pw = static_cast < Ui : : CWindow * > ( m_interface - > SearchControl ( EVENT_WINDOW2 ) ) ;
2012-09-15 13:33:08 +00:00
if ( pw = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( event = = EVENT_NULL ) // visit by keyboard shortcut?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
int i ;
if ( m_visitLast ! = EVENT_NULL ) // already a current visit?
2012-06-26 20:23:05 +00:00
i = m_visitLast - EVENT_DT_VISIT0 ;
else
2012-09-15 13:33:08 +00:00
i = Ui : : MAXDTLINE ;
2012-06-26 20:23:05 +00:00
// Seeks the last.
2012-09-15 13:33:08 +00:00
for ( int j = 0 ; j < Ui : : MAXDTLINE ; j + + )
2012-06-26 20:23:05 +00:00
{
i - - ;
2012-09-15 13:33:08 +00:00
if ( i < 0 ) i = Ui : : MAXDTLINE - 1 ;
2012-06-26 20:23:05 +00:00
2012-10-17 19:48:40 +00:00
Ui : : CButton * button = static_cast < Ui : : CButton * > ( pw - > SearchControl ( static_cast < EventType > ( EVENT_DT_VISIT0 + i ) ) ) ;
2012-09-15 13:33:08 +00:00
if ( button = = nullptr | | ! button - > TestState ( Ui : : STATE_ENABLE ) ) continue ;
2012-06-26 20:23:05 +00:00
2012-10-17 19:48:40 +00:00
Ui : : CGroup * group = static_cast < Ui : : CGroup * > ( pw - > SearchControl ( static_cast < EventType > ( EVENT_DT_GROUP0 + i ) ) ) ;
2012-09-15 13:33:08 +00:00
if ( group ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
event = static_cast < EventType > ( EVENT_DT_VISIT0 + i ) ;
2012-06-26 20:23:05 +00:00
break ;
}
}
}
2012-09-15 13:33:08 +00:00
if ( event = = EVENT_NULL )
2012-06-26 20:23:05 +00:00
{
m_sound - > Play ( SOUND_TZOING ) ; // nothing to do!
return ;
}
m_visitLast = event ;
ClearInterface ( ) ; // removes setting evidence and tooltip
2012-09-15 13:33:08 +00:00
if ( m_camera - > GetType ( ) = = Gfx : : CAM_TYPE_VISIT ) // already a current visit?
2012-06-26 20:23:05 +00:00
{
m_camera - > StopVisit ( ) ;
m_displayText - > ClearVisit ( ) ;
}
else
{
m_visitObject = DeselectAll ( ) ; // removes the control buttons
}
// Creates the "continue" button.
2012-09-15 13:33:08 +00:00
if ( m_interface - > SearchControl ( EVENT_DT_END ) = = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Point pos , dim ;
2012-06-26 20:23:05 +00:00
pos . x = 10.0f / 640.0f ;
pos . y = 10.0f / 480.0f ;
dim . x = 50.0f / 640.0f ;
dim . y = 50.0f / 480.0f ;
m_interface - > CreateButton ( pos , dim , 16 , EVENT_DT_END ) ;
}
// Creates the arrow to show the place.
2012-09-15 13:33:08 +00:00
if ( m_visitArrow ! = 0 )
2012-06-26 20:23:05 +00:00
{
m_visitArrow - > DeleteObject ( ) ;
delete m_visitArrow ;
m_visitArrow = 0 ;
}
2012-09-15 13:33:08 +00:00
Math : : Vector goal = m_displayText - > GetVisitGoal ( event ) ;
2013-12-29 11:08:59 +00:00
m_visitArrow = CObjectManager : : GetInstancePointer ( ) - > CreateObject ( goal , 0.0f , OBJECT_SHOW , - 1.0f , 1.0f , 10.0f ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_visitPos = m_visitArrow - > GetPosition ( 0 ) ;
2012-06-26 20:23:05 +00:00
m_visitPosArrow = m_visitPos ;
2012-09-15 13:33:08 +00:00
m_visitPosArrow . y + = m_displayText - > GetVisitHeight ( event ) ;
2012-06-26 20:23:05 +00:00
m_visitArrow - > SetPosition ( 0 , m_visitPosArrow ) ;
m_visitTime = 0.0 ;
2012-09-15 13:33:08 +00:00
m_visitParticle = 0.0f ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_particle - > DeleteParticle ( Gfx : : PARTISHOW ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_camera - > StartVisit ( m_displayText - > GetVisitGoal ( event ) ,
m_displayText - > GetVisitDist ( event ) ) ;
2012-06-26 20:23:05 +00:00
m_displayText - > SetVisit ( event ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_VISIT ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Move the arrow to visit
2012-06-26 20:23:05 +00:00
void CRobotMain : : FrameVisit ( float rTime )
{
2012-09-15 13:33:08 +00:00
if ( m_visitArrow = = 0 ) return ;
2012-06-26 20:23:05 +00:00
// Moves the arrow.
m_visitTime + = rTime ;
2012-09-15 13:33:08 +00:00
Math : : Vector pos = m_visitPosArrow ;
2012-06-26 20:23:05 +00:00
pos . y + = 1.5f + sinf ( m_visitTime * 4.0f ) * 4.0f ;
m_visitArrow - > SetPosition ( 0 , pos ) ;
m_visitArrow - > SetAngleY ( 0 , m_visitTime * 2.0f ) ;
// Manages the particles "arrows".
2012-09-15 13:33:08 +00:00
m_visitParticle - = rTime ;
if ( m_visitParticle < = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_visitParticle = 1.5f ;
2012-06-26 20:23:05 +00:00
pos = m_visitPos ;
2012-09-15 13:33:08 +00:00
float level = m_terrain - > GetFloorLevel ( pos ) + 2.0f ;
if ( pos . y < level ) pos . y = level ; // not below the ground
Math : : Vector speed ( 0.0f , 0.0f , 0.0f ) ;
Math : : Point dim ;
2012-06-26 20:23:05 +00:00
dim . x = 30.0f ;
dim . y = dim . x ;
2012-09-15 13:33:08 +00:00
m_particle - > CreateParticle ( pos , speed , dim , Gfx : : PARTISHOW , 2.0f ) ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! End of the visit instead of an error
2012-06-26 20:23:05 +00:00
void CRobotMain : : StopDisplayVisit ( )
{
m_visitLast = EVENT_NULL ;
// Removes the button.
m_interface - > DeleteControl ( EVENT_DT_END ) ;
// Removes the arrow.
2012-09-15 13:33:08 +00:00
if ( m_visitArrow ! = nullptr )
2012-06-26 20:23:05 +00:00
{
m_visitArrow - > DeleteObject ( ) ;
delete m_visitArrow ;
2012-09-15 13:33:08 +00:00
m_visitArrow = nullptr ;
2012-06-26 20:23:05 +00:00
}
// Removes particles "arrows".
2012-09-15 13:33:08 +00:00
m_particle - > DeleteParticle ( Gfx : : PARTISHOW ) ;
2012-06-26 20:23:05 +00:00
m_camera - > StopVisit ( ) ;
m_displayText - > ClearVisit ( ) ;
2013-12-31 11:58:45 +00:00
ChangePause ( PAUSE_NONE ) ;
2012-09-15 13:33:08 +00:00
if ( m_visitObject ! = 0 )
2012-06-26 20:23:05 +00:00
{
SelectObject ( m_visitObject , false ) ; // gives the command buttons
m_visitObject = 0 ;
}
}
2012-09-15 13:33:08 +00:00
//! Updates all the shortcuts
2012-06-26 20:23:05 +00:00
void CRobotMain : : UpdateShortcuts ( )
{
m_short - > UpdateShortcuts ( ) ;
}
2012-09-15 13:33:08 +00:00
//! Returns the object that default was select after the creation of a scene
CObject * CRobotMain : : GetSelectObject ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_selectObject ! = nullptr ) return m_selectObject ;
2012-06-26 20:23:05 +00:00
return SearchHuman ( ) ;
}
2012-09-15 13:33:08 +00:00
//! Deselects everything, and returns the object that was selected
2012-06-26 20:23:05 +00:00
CObject * CRobotMain : : DeselectAll ( )
{
2012-09-15 13:33:08 +00:00
CObject * prev = nullptr ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj - > GetSelect ( ) ) prev = obj ;
obj - > SetSelect ( false ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
return prev ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Selects an object, without attending to deselect the rest
void CRobotMain : : SelectOneObject ( CObject * obj , bool displayError )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetSelect ( true , displayError ) ;
2012-09-17 18:47:27 +00:00
m_camera - > SetControllingObject ( obj ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
2012-06-26 20:23:05 +00:00
if ( type = = OBJECT_HUMAN | |
type = = OBJECT_MOBILEfa | |
type = = OBJECT_MOBILEta | |
type = = OBJECT_MOBILEwa | |
type = = OBJECT_MOBILEia | |
type = = OBJECT_MOBILEfc | |
type = = OBJECT_MOBILEtc | |
type = = OBJECT_MOBILEwc | |
type = = OBJECT_MOBILEic | |
type = = OBJECT_MOBILEfi | |
type = = OBJECT_MOBILEti | |
type = = OBJECT_MOBILEwi | |
type = = OBJECT_MOBILEii | |
type = = OBJECT_MOBILEfs | |
type = = OBJECT_MOBILEts | |
type = = OBJECT_MOBILEws | |
type = = OBJECT_MOBILEis | |
type = = OBJECT_MOBILErt | |
type = = OBJECT_MOBILErc | |
type = = OBJECT_MOBILErr | |
type = = OBJECT_MOBILErs | |
type = = OBJECT_MOBILEsa | |
type = = OBJECT_MOBILEft | |
type = = OBJECT_MOBILEtt | |
type = = OBJECT_MOBILEwt | |
type = = OBJECT_MOBILEit | |
type = = OBJECT_MOBILEdr | |
type = = OBJECT_APOLLO2 )
{
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( obj - > GetCameraType ( ) ) ;
m_camera - > SetDist ( obj - > GetCameraDist ( ) ) ;
2012-06-26 20:23:05 +00:00
}
else
{
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_BACK ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
CObject * toto = SearchToto ( ) ;
if ( toto ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-10-17 19:48:40 +00:00
CMotionToto * mt = static_cast < CMotionToto * > ( toto - > GetMotion ( ) ) ;
2012-09-15 13:33:08 +00:00
if ( mt ! = nullptr )
2012-06-26 20:23:05 +00:00
mt - > SetLinkType ( type ) ;
}
}
2012-09-15 13:33:08 +00:00
//! Selects the object aimed by the mouse
bool CRobotMain : : SelectObject ( CObject * obj , bool displayError )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_camera - > GetType ( ) = = Gfx : : CAM_TYPE_VISIT )
2012-06-26 20:23:05 +00:00
StopDisplayVisit ( ) ;
2013-12-31 11:58:45 +00:00
if ( m_movieLock | | m_editLock | | m_pause - > GetPause ( ) ) return false ;
2012-09-15 13:33:08 +00:00
if ( m_movie - > IsExist ( ) ) return false ;
if ( obj = = nullptr | | ! IsSelectable ( obj ) ) return false ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CObject * prev = DeselectAll ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( prev ! = nullptr & & prev ! = obj )
obj - > AddDeselList ( prev ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
SelectOneObject ( obj , displayError ) ;
2012-06-26 20:23:05 +00:00
m_short - > UpdateShortcuts ( ) ;
return true ;
}
2012-09-15 13:33:08 +00:00
//! Deselects the selected object
2012-06-26 20:23:05 +00:00
bool CRobotMain : : DeselectObject ( )
{
2012-09-15 13:33:08 +00:00
CObject * obj = nullptr ;
CObject * prev = DeselectAll ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( prev = = nullptr )
obj = SearchHuman ( ) ;
2012-06-26 20:23:05 +00:00
else
2012-09-15 13:33:08 +00:00
obj = prev - > SubDeselList ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj = = nullptr )
obj = SearchHuman ( ) ;
if ( obj ! = nullptr )
SelectOneObject ( obj ) ;
2012-06-26 20:23:05 +00:00
else
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_FREE ) ;
2012-06-26 20:23:05 +00:00
m_short - > UpdateShortcuts ( ) ;
return true ;
}
2012-09-15 13:33:08 +00:00
//! Quickly removes all objects
2012-06-26 20:23:05 +00:00
void CRobotMain : : DeleteAllObjects ( )
{
2013-02-16 21:37:43 +00:00
CInstanceManager * iMan = CInstanceManager : : GetInstancePointer ( ) ;
2012-06-26 20:23:05 +00:00
// Removes all pyrotechnic effects in progress.
2012-09-15 13:33:08 +00:00
while ( true )
2012-06-26 20:23:05 +00:00
{
2013-02-16 21:37:43 +00:00
Gfx : : CPyro * pyro = static_cast < Gfx : : CPyro * > ( iMan - > SearchInstance ( CLASS_PYRO , 0 ) ) ;
2012-09-15 13:33:08 +00:00
if ( pyro = = nullptr ) break ;
2012-06-26 20:23:05 +00:00
pyro - > DeleteObject ( ) ;
delete pyro ;
}
// Removes the arrow.
2012-09-15 13:33:08 +00:00
if ( m_visitArrow ! = nullptr )
2012-06-26 20:23:05 +00:00
{
m_visitArrow - > DeleteObject ( ) ;
delete m_visitArrow ;
2012-09-15 13:33:08 +00:00
m_visitArrow = nullptr ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < MAXSHOWLIMIT ; i + + )
2012-06-26 20:23:05 +00:00
FlushShowLimit ( i ) ;
2014-12-21 16:06:55 +00:00
2015-03-29 13:50:47 +00:00
while ( CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) . size ( ) > 0 )
2012-06-26 20:23:05 +00:00
{
2015-03-29 13:50:47 +00:00
CObject * obj = CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) . begin ( ) - > second ;
2012-06-26 20:23:05 +00:00
2015-03-29 13:50:47 +00:00
obj - > DeleteObject ( true ) ; // destroys rapidly
delete obj ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Selects the human
2012-06-26 20:23:05 +00:00
void CRobotMain : : SelectHuman ( )
{
SelectObject ( SearchHuman ( ) ) ;
}
2012-09-15 13:33:08 +00:00
//! Returns the object human
2012-06-26 20:23:05 +00:00
CObject * CRobotMain : : SearchHuman ( )
{
2014-12-21 16:06:55 +00:00
return CObjectManager : : GetInstancePointer ( ) - > FindNearest ( nullptr , OBJECT_HUMAN ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the object toto
2012-06-26 20:23:05 +00:00
CObject * CRobotMain : : SearchToto ( )
{
2014-12-21 16:06:55 +00:00
return CObjectManager : : GetInstancePointer ( ) - > FindNearest ( nullptr , OBJECT_TOTO ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the nearest selectable object from a given position
CObject * CRobotMain : : SearchNearest ( Math : : Vector pos , CObject * exclu )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float min = 100000.0f ;
CObject * best = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj = = exclu ) continue ;
if ( ! IsSelectable ( obj ) ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_TOTO ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Math : : Vector oPos = obj - > GetPosition ( 0 ) ;
float dist = Math : : DistanceProjected ( oPos , pos ) ;
if ( dist < min )
2012-06-26 20:23:05 +00:00
{
min = dist ;
2012-09-15 13:33:08 +00:00
best = obj ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
return best ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the selected object
CObject * CRobotMain : : GetSelect ( )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj - > GetSelect ( ) )
return obj ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
return nullptr ;
2012-06-26 20:23:05 +00:00
}
CObject * CRobotMain : : SearchObject ( ObjectType type )
{
2014-12-21 16:06:55 +00:00
return CObjectManager : : GetInstancePointer ( ) - > FindNearest ( nullptr , type ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Detects the object aimed by the mouse
2012-06-26 20:23:05 +00:00
CObject * CRobotMain : : DetectObject ( Math : : Point pos )
{
2012-09-15 13:33:08 +00:00
int objRank = m_engine - > DetectObject ( pos ) ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! obj - > GetActif ( ) ) continue ;
2013-04-20 09:17:21 +00:00
CObject * truck = obj - > GetTruck ( ) ;
if ( truck ! = nullptr ) if ( ! truck - > GetActif ( ) ) continue ;
2012-09-15 13:33:08 +00:00
if ( obj - > GetProxyActivate ( ) ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CObject * target = nullptr ;
ObjectType type = obj - > GetType ( ) ;
2012-06-26 20:23:05 +00:00
if ( type = = OBJECT_PORTICO | |
type = = OBJECT_BASE | |
type = = OBJECT_DERRICK | |
type = = OBJECT_FACTORY | |
type = = OBJECT_REPAIR | |
type = = OBJECT_DESTROYER | |
type = = OBJECT_STATION | |
type = = OBJECT_CONVERT | |
type = = OBJECT_TOWER | |
type = = OBJECT_RESEARCH | |
type = = OBJECT_RADAR | |
type = = OBJECT_INFO | |
type = = OBJECT_ENERGY | |
type = = OBJECT_LABO | |
type = = OBJECT_NUCLEAR | |
type = = OBJECT_PARA | |
type = = OBJECT_SAFE | |
type = = OBJECT_HUSTON | |
type = = OBJECT_TARGET1 | |
type = = OBJECT_TARGET2 | |
type = = OBJECT_START | |
type = = OBJECT_END | |
type = = OBJECT_STONE | |
type = = OBJECT_URANIUM | |
type = = OBJECT_BULLET | |
type = = OBJECT_METAL | |
type = = OBJECT_BBOX | |
type = = OBJECT_KEYa | |
type = = OBJECT_KEYb | |
type = = OBJECT_KEYc | |
type = = OBJECT_KEYd | |
type = = OBJECT_TNT | |
type = = OBJECT_SCRAP1 | |
type = = OBJECT_SCRAP2 | |
type = = OBJECT_SCRAP3 | |
type = = OBJECT_SCRAP4 | |
type = = OBJECT_SCRAP5 | |
type = = OBJECT_BOMB | |
type = = OBJECT_BAG | |
type = = OBJECT_WAYPOINT | |
type = = OBJECT_FLAGb | |
type = = OBJECT_FLAGr | |
type = = OBJECT_FLAGg | |
type = = OBJECT_FLAGy | |
type = = OBJECT_FLAGv | |
type = = OBJECT_MARKPOWER | |
type = = OBJECT_MARKSTONE | |
type = = OBJECT_MARKURANIUM | |
type = = OBJECT_MARKKEYa | |
type = = OBJECT_MARKKEYb | |
type = = OBJECT_MARKKEYc | |
type = = OBJECT_MARKKEYd | |
type = = OBJECT_HUMAN | |
type = = OBJECT_TECH | |
type = = OBJECT_TOTO | |
type = = OBJECT_MOBILEfa | |
type = = OBJECT_MOBILEta | |
type = = OBJECT_MOBILEwa | |
type = = OBJECT_MOBILEia | |
type = = OBJECT_MOBILEfc | |
type = = OBJECT_MOBILEtc | |
type = = OBJECT_MOBILEwc | |
type = = OBJECT_MOBILEic | |
type = = OBJECT_MOBILEfi | |
type = = OBJECT_MOBILEti | |
type = = OBJECT_MOBILEwi | |
type = = OBJECT_MOBILEii | |
type = = OBJECT_MOBILEfs | |
type = = OBJECT_MOBILEts | |
type = = OBJECT_MOBILEws | |
type = = OBJECT_MOBILEis | |
type = = OBJECT_MOBILErt | |
type = = OBJECT_MOBILErc | |
type = = OBJECT_MOBILErr | |
type = = OBJECT_MOBILErs | |
type = = OBJECT_MOBILEsa | |
type = = OBJECT_MOBILEtg | |
type = = OBJECT_MOBILEft | |
type = = OBJECT_MOBILEtt | |
type = = OBJECT_MOBILEwt | |
type = = OBJECT_MOBILEit | |
type = = OBJECT_MOBILEdr | |
type = = OBJECT_MOTHER | |
type = = OBJECT_ANT | |
type = = OBJECT_SPIDER | |
type = = OBJECT_BEE | |
type = = OBJECT_WORM | |
type = = OBJECT_EGG | |
type = = OBJECT_RUINmobilew1 | |
type = = OBJECT_RUINmobilew2 | |
type = = OBJECT_RUINmobilet1 | |
type = = OBJECT_RUINmobilet2 | |
type = = OBJECT_RUINmobiler1 | |
type = = OBJECT_RUINmobiler2 | |
type = = OBJECT_RUINfactory | |
type = = OBJECT_RUINdoor | |
type = = OBJECT_RUINsupport | |
type = = OBJECT_RUINradar | |
type = = OBJECT_RUINconvert | |
type = = OBJECT_RUINbase | |
type = = OBJECT_RUINhead | |
type = = OBJECT_APOLLO1 | |
type = = OBJECT_APOLLO2 | |
type = = OBJECT_APOLLO3 | |
type = = OBJECT_APOLLO4 | |
type = = OBJECT_APOLLO5 )
{
2012-09-15 13:33:08 +00:00
target = obj ;
2012-06-26 20:23:05 +00:00
}
2015-03-29 18:30:29 +00:00
else if ( type = = OBJECT_POWER | | type = = OBJECT_ATOMIC )
{
target = obj - > GetTruck ( ) ; // battery connected
if ( ! target ) target = obj ; // standalone battery
}
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
for ( int j = 0 ; j < OBJECTMAXPART ; j + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
int rank = obj - > GetObjectRank ( j ) ;
if ( rank = = - 1 ) continue ;
if ( rank ! = objRank ) continue ;
return target ;
2012-06-26 20:23:05 +00:00
}
}
return 0 ;
}
2012-09-15 13:33:08 +00:00
//! Indicates whether an object is selectable
bool CRobotMain : : IsSelectable ( CObject * obj )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( ! obj - > GetSelectable ( ) ) return false ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
2012-06-26 20:23:05 +00:00
if ( type = = OBJECT_HUMAN | |
type = = OBJECT_TOTO | |
type = = OBJECT_MOBILEfa | |
type = = OBJECT_MOBILEta | |
type = = OBJECT_MOBILEwa | |
type = = OBJECT_MOBILEia | |
type = = OBJECT_MOBILEfc | |
type = = OBJECT_MOBILEtc | |
type = = OBJECT_MOBILEwc | |
type = = OBJECT_MOBILEic | |
type = = OBJECT_MOBILEfi | |
type = = OBJECT_MOBILEti | |
type = = OBJECT_MOBILEwi | |
type = = OBJECT_MOBILEii | |
type = = OBJECT_MOBILEfs | |
type = = OBJECT_MOBILEts | |
type = = OBJECT_MOBILEws | |
type = = OBJECT_MOBILEis | |
type = = OBJECT_MOBILErt | |
type = = OBJECT_MOBILErc | |
type = = OBJECT_MOBILErr | |
type = = OBJECT_MOBILErs | |
type = = OBJECT_MOBILEsa | |
type = = OBJECT_MOBILEft | |
type = = OBJECT_MOBILEtt | |
type = = OBJECT_MOBILEwt | |
type = = OBJECT_MOBILEit | |
type = = OBJECT_MOBILEdr | |
type = = OBJECT_APOLLO2 | |
type = = OBJECT_BASE | |
type = = OBJECT_DERRICK | |
type = = OBJECT_FACTORY | |
type = = OBJECT_REPAIR | |
type = = OBJECT_DESTROYER | |
type = = OBJECT_STATION | |
type = = OBJECT_CONVERT | |
type = = OBJECT_TOWER | |
type = = OBJECT_RESEARCH | |
type = = OBJECT_RADAR | |
type = = OBJECT_INFO | |
type = = OBJECT_ENERGY | |
type = = OBJECT_LABO | |
type = = OBJECT_NUCLEAR | |
type = = OBJECT_PARA | |
type = = OBJECT_SAFE | |
type = = OBJECT_HUSTON )
{
return true ;
}
2012-09-15 13:33:08 +00:00
if ( m_selectInsect )
2012-06-26 20:23:05 +00:00
{
if ( type = = OBJECT_MOTHER | |
type = = OBJECT_ANT | |
type = = OBJECT_SPIDER | |
type = = OBJECT_BEE | |
type = = OBJECT_WORM | |
type = = OBJECT_MOBILEtg )
{
return true ;
}
}
return false ;
}
2012-09-15 13:33:08 +00:00
//! Deletes the selected object
2012-06-26 20:23:05 +00:00
bool CRobotMain : : DeleteObject ( )
{
2012-09-15 13:33:08 +00:00
CObject * obj = GetSelect ( ) ;
if ( obj = = nullptr ) return false ;
2012-06-26 20:23:05 +00:00
2013-02-16 21:37:43 +00:00
Gfx : : CPyro * pyro = new Gfx : : CPyro ( ) ;
2012-09-15 13:33:08 +00:00
pyro - > Create ( Gfx : : PT_FRAGT , obj ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
obj - > SetSelect ( false ) ; // deselects the object
m_camera - > SetType ( Gfx : : CAM_TYPE_EXPLO ) ;
2012-06-26 20:23:05 +00:00
DeselectAll ( ) ;
2012-09-15 13:33:08 +00:00
obj - > DeleteDeselList ( obj ) ;
2012-06-26 20:23:05 +00:00
return true ;
}
2012-09-15 13:33:08 +00:00
//! Removes setting evidence of the object with the mouse hovers over
2012-06-26 20:23:05 +00:00
void CRobotMain : : HiliteClear ( )
{
ClearTooltip ( ) ;
2013-12-02 23:11:26 +00:00
m_tooltipName . clear ( ) ; // really removes the tooltip
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! m_hilite ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
int rank = - 1 ;
m_engine - > SetHighlightRank ( & rank ) ; // nothing more selected
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
obj - > SetHilite ( false ) ;
m_map - > SetHighlight ( 0 ) ;
m_short - > SetHighlight ( 0 ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
m_hilite = false ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Highlights the object with the mouse hovers over
2012-06-26 20:23:05 +00:00
void CRobotMain : : HiliteObject ( Math : : Point pos )
{
2012-09-15 13:33:08 +00:00
if ( m_fixScene & & m_phase ! = PHASE_PERSO ) return ;
if ( m_movieLock ) return ;
if ( m_movie - > IsExist ( ) ) return ;
2012-09-20 18:37:37 +00:00
if ( m_app - > GetMouseMode ( ) = = MOUSE_NONE ) return ;
2012-06-26 20:23:05 +00:00
ClearInterface ( ) ; // removes setting evidence and tooltip
2012-09-15 13:33:08 +00:00
CObject * obj = m_short - > DetectShort ( pos ) ;
2013-12-02 23:11:26 +00:00
std : : string interfaceTooltipName ;
if ( m_dialog - > GetTooltip ( ) & & m_interface - > GetTooltip ( pos , interfaceTooltipName ) )
2012-06-26 20:23:05 +00:00
{
m_tooltipPos = pos ;
2013-12-02 23:11:26 +00:00
m_tooltipName = interfaceTooltipName ;
2012-06-26 20:23:05 +00:00
m_tooltipTime = 0.0f ;
2012-09-15 13:33:08 +00:00
if ( obj = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_suspend ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj = = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-16 18:00:25 +00:00
bool inMap = false ;
2012-09-15 13:33:08 +00:00
obj = m_map - > DetectMap ( pos , inMap ) ;
if ( obj = = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( inMap ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
obj = DetectObject ( pos ) ;
2012-06-26 20:23:05 +00:00
2012-09-17 18:47:27 +00:00
if ( ( m_camera - > GetType ( ) = = Gfx : : CAM_TYPE_ONBOARD ) & &
( m_camera - > GetControllingObject ( ) = = obj ) )
2012-06-26 20:23:05 +00:00
return ;
}
}
2012-09-15 13:33:08 +00:00
if ( obj ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2013-12-02 23:11:26 +00:00
std : : string objectTooltipName ;
if ( m_dialog - > GetTooltip ( ) & & obj - > GetTooltipName ( objectTooltipName ) )
2012-06-26 20:23:05 +00:00
{
m_tooltipPos = pos ;
2013-12-02 23:11:26 +00:00
m_tooltipName = objectTooltipName ;
2012-06-26 20:23:05 +00:00
m_tooltipTime = 0.0f ;
}
2012-09-15 13:33:08 +00:00
if ( IsSelectable ( obj ) )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetHilite ( true ) ;
2012-09-15 19:47:19 +00:00
m_map - > SetHighlight ( obj ) ;
m_short - > SetHighlight ( obj ) ;
2012-09-15 13:33:08 +00:00
m_hilite = true ;
2012-06-26 20:23:05 +00:00
}
}
}
2012-09-15 13:33:08 +00:00
//! Highlights the object with the mouse hovers over
2012-06-26 20:23:05 +00:00
void CRobotMain : : HiliteFrame ( float rTime )
{
2012-09-15 13:33:08 +00:00
if ( m_fixScene & & m_phase ! = PHASE_PERSO ) return ;
if ( m_movieLock ) return ;
if ( m_movie - > IsExist ( ) ) return ;
2012-06-26 20:23:05 +00:00
m_tooltipTime + = rTime ;
ClearTooltip ( ) ;
2013-12-02 23:11:26 +00:00
if ( m_tooltipTime > = 0.2f & & ! m_tooltipName . empty ( ) )
2012-06-26 20:23:05 +00:00
{
CreateTooltip ( m_tooltipPos , m_tooltipName ) ;
}
}
2012-09-15 13:33:08 +00:00
//! Creates a tooltip
2013-12-02 23:11:26 +00:00
void CRobotMain : : CreateTooltip ( Math : : Point pos , const std : : string & text )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Point corner ;
2012-06-26 20:23:05 +00:00
corner . x = pos . x + 0.022f ;
corner . y = pos . y - 0.052f ;
2012-09-15 13:33:08 +00:00
Math : : Point start , end ;
m_engine - > GetText ( ) - > SizeText ( text , Gfx : : FONT_COLOBOT , Gfx : : FONT_SIZE_SMALL ,
corner , Gfx : : TEXT_ALIGN_LEFT ,
start , end ) ;
2012-06-26 20:23:05 +00:00
start . x - = 0.010f ;
2013-11-19 16:22:25 +00:00
start . y - = 0.006f ;
2012-06-26 20:23:05 +00:00
end . x + = 0.010f ;
2013-11-19 16:22:25 +00:00
end . y + = 0.008f ; // small'ish margin
2012-06-26 20:23:05 +00:00
pos . x = start . x ;
pos . y = start . y ;
2012-09-15 13:33:08 +00:00
Math : : Point dim ;
2012-06-26 20:23:05 +00:00
dim . x = end . x - start . x ;
dim . y = end . y - start . y ;
2012-09-15 13:33:08 +00:00
Math : : Point offset ;
2012-06-26 20:23:05 +00:00
offset . x = 0.0f ;
offset . y = 0.0f ;
2012-09-15 13:33:08 +00:00
if ( pos . x + dim . x > 1.0f ) offset . x = 1.0f - ( pos . x + dim . x ) ;
if ( pos . y < 0.0f ) offset . y = - pos . y ;
2012-06-26 20:23:05 +00:00
corner . x + = offset . x ;
corner . y + = offset . y ;
pos . x + = offset . x ;
pos . y + = offset . y ;
m_interface - > CreateWindows ( pos , dim , 1 , EVENT_TOOLTIP ) ;
2012-10-17 19:48:40 +00:00
Ui : : CWindow * pw = static_cast < Ui : : CWindow * > ( m_interface - > SearchControl ( EVENT_TOOLTIP ) ) ;
2012-09-15 13:33:08 +00:00
if ( pw ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
pw - > SetState ( Ui : : STATE_SHADOW ) ;
2012-06-26 20:23:05 +00:00
pw - > SetTrashEvent ( false ) ;
2012-09-15 13:33:08 +00:00
pos . y - = m_engine - > GetText ( ) - > GetHeight ( Gfx : : FONT_COLOBOT , Gfx : : FONT_SIZE_SMALL ) / 2.0f ;
2012-06-26 20:23:05 +00:00
pw - > CreateLabel ( pos , dim , - 1 , EVENT_LABEL2 , text ) ;
}
}
2012-09-15 13:33:08 +00:00
//! Clears the previous tooltip
2012-06-26 20:23:05 +00:00
void CRobotMain : : ClearTooltip ( )
{
m_interface - > DeleteControl ( EVENT_TOOLTIP ) ;
}
2012-09-15 13:33:08 +00:00
//! Displays help for an object
2012-06-26 20:23:05 +00:00
void CRobotMain : : HelpObject ( )
{
2012-09-15 13:33:08 +00:00
CObject * obj = GetSelect ( ) ;
if ( obj = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2013-03-29 09:03:35 +00:00
const char * filename = GetHelpFilename ( obj - > GetType ( ) ) . c_str ( ) ;
2012-09-15 13:33:08 +00:00
if ( filename [ 0 ] = = 0 ) return ;
2012-06-26 20:23:05 +00:00
StartDisplayInfo ( filename , - 1 ) ;
}
2012-09-15 13:33:08 +00:00
//! Change the mode of the camera
2012-06-26 20:23:05 +00:00
void CRobotMain : : ChangeCamera ( )
{
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj - > GetSelect ( ) )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( obj - > GetCameraLock ( ) ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType oType = obj - > GetType ( ) ;
Gfx : : CameraType type = obj - > GetCameraType ( ) ;
2012-06-26 20:23:05 +00:00
if ( oType ! = OBJECT_MOBILEfa & &
oType ! = OBJECT_MOBILEta & &
oType ! = OBJECT_MOBILEwa & &
oType ! = OBJECT_MOBILEia & &
oType ! = OBJECT_MOBILEfc & &
oType ! = OBJECT_MOBILEtc & &
oType ! = OBJECT_MOBILEwc & &
oType ! = OBJECT_MOBILEic & &
oType ! = OBJECT_MOBILEfi & &
oType ! = OBJECT_MOBILEti & &
oType ! = OBJECT_MOBILEwi & &
oType ! = OBJECT_MOBILEii & &
oType ! = OBJECT_MOBILEfs & &
oType ! = OBJECT_MOBILEts & &
oType ! = OBJECT_MOBILEws & &
oType ! = OBJECT_MOBILEis & &
oType ! = OBJECT_MOBILErt & &
oType ! = OBJECT_MOBILErc & &
oType ! = OBJECT_MOBILErr & &
oType ! = OBJECT_MOBILErs & &
oType ! = OBJECT_MOBILEsa & &
oType ! = OBJECT_MOBILEtg & &
oType ! = OBJECT_MOBILEft & &
oType ! = OBJECT_MOBILEtt & &
oType ! = OBJECT_MOBILEwt & &
oType ! = OBJECT_MOBILEit & &
oType ! = OBJECT_MOBILEdr & &
oType ! = OBJECT_APOLLO2 ) return ;
2012-09-15 13:33:08 +00:00
if ( oType = = OBJECT_MOBILEdr ) // designer?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( type = = Gfx : : CAM_TYPE_PLANE ) type = Gfx : : CAM_TYPE_BACK ;
else if ( type = = Gfx : : CAM_TYPE_BACK ) type = Gfx : : CAM_TYPE_PLANE ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
else if ( obj - > GetTrainer ( ) ) // trainer?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( type = = Gfx : : CAM_TYPE_ONBOARD ) type = Gfx : : CAM_TYPE_FIX ;
else if ( type = = Gfx : : CAM_TYPE_FIX ) type = Gfx : : CAM_TYPE_PLANE ;
else if ( type = = Gfx : : CAM_TYPE_PLANE ) type = Gfx : : CAM_TYPE_BACK ;
else if ( type = = Gfx : : CAM_TYPE_BACK ) type = Gfx : : CAM_TYPE_ONBOARD ;
2012-06-26 20:23:05 +00:00
}
else
{
2012-09-15 13:33:08 +00:00
if ( type = = Gfx : : CAM_TYPE_ONBOARD ) type = Gfx : : CAM_TYPE_BACK ;
else if ( type = = Gfx : : CAM_TYPE_BACK ) type = Gfx : : CAM_TYPE_ONBOARD ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
obj - > SetCameraType ( type ) ;
2012-06-26 20:23:05 +00:00
m_camera - > SetType ( type ) ;
}
}
}
2012-09-15 13:33:08 +00:00
//! Remote control the camera using the arrow keys
2014-12-11 18:01:57 +00:00
void CRobotMain : : KeyCamera ( EventType type , InputSlot key )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( type = = EVENT_KEY_UP )
2012-06-26 20:23:05 +00:00
{
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_LEFT )
2012-06-26 20:23:05 +00:00
{
m_cameraPan = 0.0f ;
}
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_RIGHT )
2012-06-26 20:23:05 +00:00
{
m_cameraPan = 0.0f ;
}
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_UP )
2012-06-26 20:23:05 +00:00
{
m_cameraZoom = 0.0f ;
}
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_DOWN )
2012-06-26 20:23:05 +00:00
{
m_cameraZoom = 0.0f ;
}
}
2012-09-15 13:33:08 +00:00
if ( m_phase ! = PHASE_SIMUL ) return ;
if ( m_editLock ) return ; // current edition?
if ( m_trainerPilot ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CObject * obj = GetSelect ( ) ;
if ( obj = = nullptr ) return ;
if ( ! obj - > GetTrainer ( ) ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( type = = EVENT_KEY_DOWN )
2012-06-26 20:23:05 +00:00
{
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_LEFT )
2012-06-26 20:23:05 +00:00
{
m_cameraPan = - 1.0f ;
}
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_RIGHT )
2012-06-26 20:23:05 +00:00
{
m_cameraPan = 1.0f ;
}
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_UP )
2012-06-26 20:23:05 +00:00
{
m_cameraZoom = - 1.0f ;
}
2014-12-11 18:01:57 +00:00
if ( key = = INPUT_SLOT_DOWN )
2012-06-26 20:23:05 +00:00
{
m_cameraZoom = 1.0f ;
}
}
}
2012-09-15 13:33:08 +00:00
//! Panned with the camera if a button is pressed
2012-06-26 20:23:05 +00:00
void CRobotMain : : RemoteCamera ( float pan , float zoom , float rTime )
{
2012-09-15 13:33:08 +00:00
if ( pan ! = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float value = m_camera - > GetRemotePan ( ) ;
2012-06-26 20:23:05 +00:00
value + = pan * rTime * 1.5f ;
m_camera - > SetRemotePan ( value ) ;
}
2012-09-15 13:33:08 +00:00
if ( zoom ! = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float value = m_camera - > GetRemoteZoom ( ) ;
2012-06-26 20:23:05 +00:00
value + = zoom * rTime * 0.3f ;
m_camera - > SetRemoteZoom ( value ) ;
}
}
2012-09-15 13:33:08 +00:00
//! Cancels the current movie
2012-06-26 20:23:05 +00:00
void CRobotMain : : AbortMovie ( )
{
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CAuto * automat = obj - > GetAuto ( ) ;
if ( automat ! = 0 )
2012-06-26 20:23:05 +00:00
automat - > Abort ( ) ;
}
2012-09-20 18:37:37 +00:00
m_app - > SetMouseMode ( MOUSE_ENGINE ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Updates the text information
2012-06-26 20:23:05 +00:00
void CRobotMain : : UpdateInfoText ( )
{
2014-10-29 16:53:46 +00:00
if ( m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
{
2014-10-29 16:53:46 +00:00
CObject * obj = GetSelect ( ) ;
if ( obj ! = nullptr )
{
Math : : Vector pos = obj - > GetPosition ( 0 ) ;
m_engine - > SetStatisticPos ( pos ) ;
}
2012-06-26 20:23:05 +00:00
}
2014-10-29 16:53:46 +00:00
m_engine - > SetTimerDisplay ( m_missionTimerEnabled & & m_missionTimerStarted ? TimeFormat ( m_missionTimer ) : " " ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Initializes the view
2012-06-26 20:23:05 +00:00
void CRobotMain : : InitEye ( )
{
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
m_camera - > Init ( Math : : Vector ( 0.0f , 10.0f , 0.0f ) ,
Math : : Vector ( 10.0f , 5.0f , 0.0f ) , 0.0f ) ;
}
2012-09-15 13:33:08 +00:00
//! Advances the entire scene
2012-06-26 20:23:05 +00:00
bool CRobotMain : : EventFrame ( const Event & event )
{
m_time + = event . rTime ;
2014-11-11 13:50:44 +00:00
if ( ! m_movieLock & & m_pause - > GetPause ( ) = = PAUSE_NONE ) m_gameTime + = event . rTime ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! m_immediatSatCom & & ! m_beginSatCom & &
m_gameTime > 0.1f & & m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
{
m_displayText - > DisplayError ( INFO_BEGINSATCOM , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
2012-09-15 13:33:08 +00:00
m_beginSatCom = true ; // message appears
2012-06-26 20:23:05 +00:00
}
2014-10-29 16:53:46 +00:00
if ( ! m_movieLock & & m_pause - > GetPause ( ) = = PAUSE_NONE & & m_missionTimerStarted )
m_missionTimer + = event . rTime ;
2014-11-11 13:50:44 +00:00
if ( m_pause - > GetPause ( ) = = PAUSE_NONE & & m_autosave & & m_gameTime > = m_autosaveLast + ( m_autosaveInterval * 60 ) & & m_phase = = PHASE_SIMUL ) {
m_autosaveLast = m_gameTime ;
Autosave ( ) ;
}
//CLogger::GetInstancePointer()->Debug("%f %f %d\n", m_gameTime, m_autosaveLast, m_autosaveInterval);
2012-06-26 20:23:05 +00:00
m_water - > EventProcess ( event ) ;
m_cloud - > EventProcess ( event ) ;
2012-09-15 13:33:08 +00:00
m_lightning - > EventProcess ( event ) ;
2012-06-26 20:23:05 +00:00
m_planet - > EventProcess ( event ) ;
2012-09-15 13:33:08 +00:00
Ui : : CMap * pm = nullptr ;
2012-10-17 19:48:40 +00:00
Ui : : CWindow * pw = static_cast < Ui : : CWindow * > ( m_interface - > SearchControl ( EVENT_WINDOW1 ) ) ;
2012-09-15 13:33:08 +00:00
if ( pw = = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
pm = nullptr ;
2012-06-26 20:23:05 +00:00
}
else
{
2012-10-17 19:48:40 +00:00
pm = static_cast < Ui : : CMap * > ( pw - > SearchControl ( EVENT_OBJECT_MAP ) ) ;
2012-09-15 13:33:08 +00:00
if ( pm ! = nullptr ) pm - > FlushObject ( ) ;
2012-06-26 20:23:05 +00:00
}
2014-12-21 16:06:55 +00:00
2013-02-16 21:37:43 +00:00
CInstanceManager * iMan = CInstanceManager : : GetInstancePointer ( ) ;
2014-12-21 16:06:55 +00:00
CObjectManager * objman = CObjectManager : : GetInstancePointer ( ) ;
2013-02-16 21:37:43 +00:00
2012-09-15 13:33:08 +00:00
CObject * toto = nullptr ;
if ( ! m_freePhoto )
2012-06-26 20:23:05 +00:00
{
// Advances all the robots, but not toto.
2014-12-21 16:06:55 +00:00
for ( auto it : objman - > GetAllObjects ( ) )
2012-09-15 13:33:08 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-15 13:33:08 +00:00
if ( pm ! = nullptr ) pm - > UpdateObject ( obj ) ;
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_TOTO )
toto = obj ;
2012-06-26 20:23:05 +00:00
else
2012-09-15 13:33:08 +00:00
obj - > EventProcess ( event ) ;
2012-06-26 20:23:05 +00:00
}
// Advances all objects transported by robots.
2014-12-21 16:06:55 +00:00
for ( auto it : objman - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-15 13:33:08 +00:00
if ( obj - > GetTruck ( ) = = nullptr ) continue ;
obj - > EventProcess ( event ) ;
2012-06-26 20:23:05 +00:00
}
// Advances pyrotechnic effects.
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < 1000000 ; i + + )
2012-06-26 20:23:05 +00:00
{
2013-02-16 21:37:43 +00:00
Gfx : : CPyro * pyro = static_cast < Gfx : : CPyro * > ( iMan - > SearchInstance ( CLASS_PYRO , i ) ) ;
2012-09-15 13:33:08 +00:00
if ( pyro = = nullptr ) break ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
pyro - > EventProcess ( event ) ;
if ( pyro - > IsEnded ( ) ! = ERR_CONTINUE )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
pyro - > DeleteObject ( ) ;
delete pyro ;
2012-06-26 20:23:05 +00:00
}
}
}
// The camera follows the object, because its position
2012-09-15 13:33:08 +00:00
// may depend on the selected object (Gfx::CAM_TYPE_ONBOARD or Gfx::CAM_TYPE_BACK).
if ( m_phase = = PHASE_SIMUL & & ! m_editFull )
2012-06-26 20:23:05 +00:00
{
m_camera - > EventProcess ( event ) ;
2012-09-15 13:33:08 +00:00
if ( m_engine - > GetFog ( ) )
m_camera - > SetOverBaseColor ( m_particle - > GetFogColor ( m_engine - > GetEyePt ( ) ) ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_PERSO | |
m_phase = = PHASE_WIN | |
m_phase = = PHASE_LOST )
2012-06-26 20:23:05 +00:00
{
m_camera - > EventProcess ( event ) ;
}
// Advances toto following the camera, because its position depends on the camera.
2012-09-15 13:33:08 +00:00
if ( toto ! = nullptr )
2012-06-26 20:23:05 +00:00
toto - > EventProcess ( event ) ;
HiliteFrame ( event . rTime ) ;
// Moves the film indicator.
2012-09-15 13:33:08 +00:00
if ( m_movieLock & & ! m_editLock ) // movie in progress?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Ui : : CControl * pc = m_interface - > SearchControl ( EVENT_OBJECT_MOVIELOCK ) ;
if ( pc ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Point pos , dim ;
2012-06-26 20:23:05 +00:00
dim . x = 32.0f / 640.0f ;
dim . y = 32.0f / 480.0f ;
pos . x = 20.0f / 640.0f ;
pos . y = ( 480.0f - 24.0f ) / 480.0f ;
2012-09-15 13:33:08 +00:00
float zoom = 1.0f + sinf ( m_time * 6.0f ) * 0.1f ; // 0.9 .. 1.1
2012-06-26 20:23:05 +00:00
dim . x * = zoom ;
dim . y * = zoom ;
pos . x - = dim . x / 2.0f ;
pos . y - = dim . y / 2.0f ;
pc - > SetPos ( pos ) ;
pc - > SetDim ( dim ) ;
}
}
// Moves edition indicator.
2013-12-31 11:58:45 +00:00
if ( m_editLock | | m_pause - > GetPause ( ) ) // edition in progress?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Ui : : CControl * pc = m_interface - > SearchControl ( EVENT_OBJECT_EDITLOCK ) ;
if ( pc ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Point pos , dim ;
if ( m_editFull | | m_editLock )
2012-06-26 20:23:05 +00:00
{
dim . x = 10.0f / 640.0f ;
dim . y = 10.0f / 480.0f ;
pos . x = - 20.0f / 640.0f ;
pos . y = - 20.0f / 480.0f ; // invisible!
}
else
{
dim . x = 32.0f / 640.0f ;
dim . y = 32.0f / 480.0f ;
pos . x = 20.0f / 640.0f ;
pos . y = ( 480.0f - 24.0f ) / 480.0f ;
2012-09-15 13:33:08 +00:00
float zoom = 1.0f + sinf ( m_time * 6.0f ) * 0.1f ; // 0.9 .. 1.1
2012-06-26 20:23:05 +00:00
dim . x * = zoom ;
dim . y * = zoom ;
pos . x - = dim . x / 2.0f ;
pos . y - = dim . y / 2.0f ;
}
pc - > SetPos ( pos ) ;
pc - > SetDim ( dim ) ;
}
}
// Will move the arrow to visit.
2012-09-15 13:33:08 +00:00
if ( m_camera - > GetType ( ) = = Gfx : : CAM_TYPE_VISIT )
2012-06-26 20:23:05 +00:00
FrameVisit ( event . rTime ) ;
// Moves the boundaries.
FrameShowLimit ( event . rTime ) ;
2012-09-15 13:33:08 +00:00
if ( m_phase = = PHASE_SIMUL )
2012-06-26 20:23:05 +00:00
{
2014-11-09 18:19:14 +00:00
if ( ! m_editLock )
2012-06-26 20:23:05 +00:00
{
CheckEndMission ( true ) ;
2013-04-13 13:07:08 +00:00
UpdateAudio ( true ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_winDelay > 0.0f & & ! m_editLock )
2012-06-26 20:23:05 +00:00
{
m_winDelay - = event . rTime ;
2012-09-15 13:33:08 +00:00
if ( m_winDelay < = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_movieLock )
2012-06-26 20:23:05 +00:00
m_winDelay = 1.0f ;
else
2012-09-15 13:33:08 +00:00
m_eventQueue - > AddEvent ( Event ( EVENT_WIN ) ) ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
if ( m_lostDelay > 0.0f & & ! m_editLock )
2012-06-26 20:23:05 +00:00
{
m_lostDelay - = event . rTime ;
2012-09-15 13:33:08 +00:00
if ( m_lostDelay < = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_movieLock )
2012-06-26 20:23:05 +00:00
m_winDelay = 1.0f ;
else
2012-09-15 13:33:08 +00:00
m_eventQueue - > AddEvent ( Event ( EVENT_LOST ) ) ;
2012-06-26 20:23:05 +00:00
}
}
}
2012-09-15 13:33:08 +00:00
if ( m_delayWriteMessage > 0 )
2012-06-26 20:23:05 +00:00
{
m_delayWriteMessage - - ;
2012-09-15 13:33:08 +00:00
if ( m_delayWriteMessage = = 0 )
2012-06-26 20:23:05 +00:00
{
m_displayText - > DisplayError ( INFO_WRITEOK , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
}
}
2012-09-15 13:33:08 +00:00
return true ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Makes the event for all robots
2012-06-26 20:23:05 +00:00
bool CRobotMain : : EventObject ( const Event & event )
{
2012-09-15 13:33:08 +00:00
if ( m_freePhoto ) return true ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_resetCreate = false ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
obj - > EventProcess ( event ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( m_resetCreate )
2012-06-26 20:23:05 +00:00
ResetCreate ( ) ;
2012-09-15 13:33:08 +00:00
return true ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Calculates the point of arrival of the camera
2012-06-26 20:23:05 +00:00
Math : : Vector CRobotMain : : LookatPoint ( Math : : Vector eye , float angleH , float angleV ,
float length )
{
2012-09-15 13:33:08 +00:00
Math : : Vector lookat = eye ;
2012-06-26 20:23:05 +00:00
lookat . z + = length ;
RotatePoint ( eye , angleH , angleV , lookat ) ;
return lookat ;
}
2012-09-15 13:33:08 +00:00
//! Load the scene for the character
2012-06-26 20:23:05 +00:00
void CRobotMain : : ScenePerso ( )
{
DeleteAllObjects ( ) ; // removes all the current 3D Scene
2013-10-13 12:44:12 +00:00
m_terrain - > FlushRelief ( ) ;
2012-12-26 19:58:02 +00:00
m_engine - > DeleteAllObjects ( ) ;
2013-03-31 11:06:38 +00:00
Gfx : : CModelManager : : GetInstancePointer ( ) - > DeleteAllModelCopies ( ) ;
2012-06-26 20:23:05 +00:00
m_terrain - > FlushBuildingLevel ( ) ;
m_terrain - > FlushFlyingLimit ( ) ;
2012-09-15 13:33:08 +00:00
m_lightMan - > FlushLights ( ) ;
m_particle - > FlushParticle ( ) ;
2013-02-16 21:37:43 +00:00
CInstanceManager * iMan = CInstanceManager : : GetInstancePointer ( ) ;
iMan - > Flush ( CLASS_PHYSICS ) ;
iMan - > Flush ( CLASS_BRAIN ) ;
iMan - > Flush ( CLASS_PYRO ) ;
2013-12-30 09:51:29 +00:00
CObjectManager : : GetInstancePointer ( ) - > Flush ( ) ;
2014-11-22 12:30:05 +00:00
2015-03-22 16:40:08 +00:00
ChangeColor ( ) ;
2012-06-26 20:23:05 +00:00
m_dialog - > SetSceneName ( " perso " ) ;
m_dialog - > SetSceneRank ( 0 ) ;
2014-09-24 20:54:26 +00:00
try {
CreateScene ( false , true , false ) ; // sets scene
}
catch ( const CLevelParserException & e )
{
CLogger : : GetInstancePointer ( ) - > Error ( " An error occured while trying to load apperance scene \n " ) ;
CLogger : : GetInstancePointer ( ) - > Error ( " %s \n " , e . what ( ) ) ;
}
2012-06-26 20:23:05 +00:00
m_engine - > SetDrawWorld ( false ) ; // does not draw anything on the interface
m_engine - > SetDrawFront ( true ) ; // draws on the human interface
2012-09-15 13:33:08 +00:00
CObject * obj = SearchHuman ( ) ;
if ( obj ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetDrawFront ( true ) ; // draws the interface
2012-06-26 20:23:05 +00:00
2012-09-17 22:01:00 +00:00
CMotionHuman * mh = static_cast < CMotionHuman * > ( obj - > GetMotion ( ) ) ;
2012-09-15 13:33:08 +00:00
if ( mh ! = nullptr )
2012-06-26 20:23:05 +00:00
mh - > StartDisplayPerso ( ) ;
}
}
2012-09-15 13:33:08 +00:00
//! Creates the whole scene
void CRobotMain : : CreateScene ( bool soluce , bool fixScene , bool resetObject )
2012-06-26 20:23:05 +00:00
{
2012-09-26 20:57:43 +00:00
char * base = m_dialog - > GetSceneName ( ) ;
int rank = m_dialog - > GetSceneRank ( ) ;
const char * read = m_dialog - > GetSceneRead ( ) . c_str ( ) ;
const char * stack = m_dialog - > GetStackRead ( ) . c_str ( ) ;
2012-09-22 15:36:10 +00:00
2012-09-15 13:33:08 +00:00
m_fixScene = fixScene ;
2012-06-26 20:23:05 +00:00
g_id = 0 ;
2014-11-09 18:26:36 +00:00
m_base = nullptr ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! resetObject )
2012-06-26 20:23:05 +00:00
{
g_build = 0 ;
g_researchDone = 0 ; // no research done
g_researchEnable = 0 ;
FlushDisplayInfo ( ) ;
2012-09-15 13:33:08 +00:00
m_terrain - > FlushMaterials ( ) ;
2013-04-13 14:35:35 +00:00
m_audioTrack = " " ;
2012-09-15 13:33:08 +00:00
m_audioRepeat = true ;
2014-02-21 13:19:58 +00:00
m_satcomTrack = " " ;
m_satcomRepeat = true ;
m_editorTrack = " " ;
m_editorRepeat = true ;
2012-06-26 20:23:05 +00:00
m_displayText - > SetDelay ( 1.0f ) ;
m_displayText - > SetEnable ( true ) ;
2012-09-15 13:33:08 +00:00
m_immediatSatCom = false ;
2013-03-27 21:20:50 +00:00
m_lockedSatCom = false ;
2012-06-26 20:23:05 +00:00
m_endingWinRank = 0 ;
m_endingLostRank = 0 ;
2013-04-13 09:44:16 +00:00
m_audioChangeTotal = 0 ;
2012-06-26 20:23:05 +00:00
m_endTakeTotal = 0 ;
m_endTakeResearch = 0 ;
2013-04-28 16:33:59 +00:00
m_endTakeNever = false ;
2012-06-26 20:23:05 +00:00
m_endTakeWinDelay = 2.0f ;
m_endTakeLostDelay = 2.0f ;
m_obligatoryTotal = 0 ;
m_prohibitedTotal = 0 ;
2012-09-15 13:33:08 +00:00
m_mapShow = true ;
m_mapImage = false ;
2012-06-26 20:23:05 +00:00
m_mapFilename [ 0 ] = 0 ;
2013-04-29 15:26:32 +00:00
m_controller = nullptr ;
2012-06-26 20:23:05 +00:00
m_colorRefBot . r = 10.0f / 256.0f ;
m_colorRefBot . g = 166.0f / 256.0f ;
m_colorRefBot . b = 254.0f / 256.0f ; // blue
m_colorRefBot . a = 0.0f ;
m_colorNewBot = m_colorRefBot ;
m_colorRefAlien . r = 135.0f / 256.0f ;
m_colorRefAlien . g = 170.0f / 256.0f ;
m_colorRefAlien . b = 13.0f / 256.0f ; // green
m_colorRefAlien . a = 0.0f ;
m_colorNewAlien = m_colorRefAlien ;
m_colorRefGreen . r = 135.0f / 256.0f ;
m_colorRefGreen . g = 170.0f / 256.0f ;
m_colorRefGreen . b = 13.0f / 256.0f ; // green
m_colorRefGreen . a = 0.0f ;
m_colorNewGreen = m_colorRefGreen ;
m_colorRefWater . r = 25.0f / 256.0f ;
m_colorRefWater . g = 255.0f / 256.0f ;
m_colorRefWater . b = 240.0f / 256.0f ; // cyan
m_colorRefWater . a = 0.0f ;
m_colorNewWater = m_colorRefWater ;
2014-11-11 14:38:11 +00:00
m_engine - > SetAmbientColor ( Gfx : : Color ( 0.5f , 0.5f , 0.5f , 0.5f ) , 0 ) ;
m_engine - > SetAmbientColor ( Gfx : : Color ( 0.5f , 0.5f , 0.5f , 0.5f ) , 1 ) ;
m_engine - > SetFogColor ( Gfx : : Color ( 1.0f , 1.0f , 1.0f , 1.0f ) , 0 ) ;
m_engine - > SetFogColor ( Gfx : : Color ( 1.0f , 1.0f , 1.0f , 1.0f ) , 1 ) ;
m_engine - > SetDeepView ( 1000.0f , 0 ) ;
m_engine - > SetDeepView ( 1000.0f , 1 ) ;
m_engine - > SetFogStart ( 0.75f , 0 ) ;
m_engine - > SetFogStart ( 0.75f , 1 ) ;
m_engine - > SetSecondTexture ( " " ) ;
m_engine - > SetForegroundName ( " " ) ;
2012-06-26 20:23:05 +00:00
m_dialog - > BuildResumeName ( m_title , base , rank ) ;
m_dialog - > BuildResumeName ( m_resume , base , rank ) ;
2013-12-02 23:11:26 +00:00
std : : string scriptNameStr ;
GetResource ( RES_TEXT , RT_SCRIPT_NEW , scriptNameStr ) ;
strcpy ( m_scriptName , scriptNameStr . c_str ( ) ) ;
2012-06-26 20:23:05 +00:00
m_scriptFile [ 0 ] = 0 ;
2013-03-23 18:04:41 +00:00
m_retroStyle = false ;
2013-04-30 19:43:59 +00:00
m_missionResult = ERR_MISSION_NOTERM ;
2012-06-26 20:23:05 +00:00
}
2014-06-22 19:30:23 +00:00
2014-10-29 16:53:46 +00:00
//NOTE: Reset timer always, even when only resetting object positions
m_missionTimerEnabled = false ;
m_missionTimerStarted = false ;
m_missionTimer = 0.0f ;
2014-11-10 21:50:00 +00:00
try {
CLevelParser * level = new CLevelParser ( base , rank / 100 , rank % 100 ) ;
level - > Load ( ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 21:50:00 +00:00
int rankObj = 0 ;
int rankGadget = 0 ;
CObject * sel = 0 ;
2013-02-28 21:56:44 +00:00
2014-11-10 21:50:00 +00:00
/*
* NOTE : Moving frequently used lines to the top
* may speed up loading
*/
2013-05-05 18:33:49 +00:00
2014-11-10 21:50:00 +00:00
for ( auto & line : level - > GetLines ( ) )
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " Title " & & ! resetObject )
{
strcpy ( m_title , line - > GetParam ( " text " ) - > AsString ( ) . c_str ( ) ) ;
continue ;
2014-10-29 16:53:46 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " Resume " & & ! resetObject )
2013-04-13 09:44:16 +00:00
{
2014-11-10 21:50:00 +00:00
strcpy ( m_resume , line - > GetParam ( " text " ) - > AsString ( ) . c_str ( ) ) ;
continue ;
2013-04-13 09:44:16 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " ScriptName " & & ! resetObject )
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
strcpy ( m_scriptName , line - > GetParam ( " text " ) - > AsString ( ) . c_str ( ) ) ;
continue ;
2013-05-26 15:47:54 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " ScriptFile " & & ! resetObject )
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
strcpy ( m_scriptFile , line - > GetParam ( " name " ) - > AsString ( ) . c_str ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " Instructions " & & ! resetObject )
{
strcpy ( m_infoFilename [ SATCOM_HUSTON ] , line - > GetParam ( " name " ) - > AsPath ( " help/%lng% " ) . c_str ( ) ) ;
2014-02-21 13:19:58 +00:00
2014-11-10 21:50:00 +00:00
m_immediatSatCom = line - > GetParam ( " immediat " ) - > AsBool ( false ) ;
2015-03-28 10:23:29 +00:00
m_beginSatCom = m_lockedSatCom = line - > GetParam ( " lock " ) - > AsBool ( false ) ;
2014-11-10 21:50:00 +00:00
if ( m_app - > GetSceneTestMode ( ) ) m_immediatSatCom = false ;
continue ;
}
if ( line - > GetCommand ( ) = = " Satellite " & & ! resetObject )
{
strcpy ( m_infoFilename [ SATCOM_SAT ] , line - > GetParam ( " name " ) - > AsPath ( " help/%lng% " ) . c_str ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " Loading " & & ! resetObject )
{
strcpy ( m_infoFilename [ SATCOM_LOADING ] , line - > GetParam ( " name " ) - > AsPath ( " help/%lng% " ) . c_str ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " HelpFile " & & ! resetObject )
{
strcpy ( m_infoFilename [ SATCOM_PROG ] , line - > GetParam ( " name " ) - > AsPath ( " help/%lng% " ) . c_str ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " SoluceFile " & & ! resetObject )
{
strcpy ( m_infoFilename [ SATCOM_SOLUCE ] , line - > GetParam ( " name " ) - > AsPath ( " help/%lng% " ) . c_str ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " EndingFile " & & ! resetObject )
{
// NOTE: The old default was 0, but I think -1 is more correct - 0 means "ending file 000", while -1 means "no ending file"
m_endingWinRank = line - > GetParam ( " win " ) - > AsInt ( - 1 ) ;
m_endingLostRank = line - > GetParam ( " lost " ) - > AsInt ( - 1 ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " MessageDelay " & & ! resetObject )
{
m_displayText - > SetDelay ( line - > GetParam ( " factor " ) - > AsFloat ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " MissionTimer " )
{
m_missionTimerEnabled = line - > GetParam ( " enabled " ) - > AsBool ( ) ;
if ( ! line - > GetParam ( " program " ) - > AsBool ( false ) ) {
m_missionTimerStarted = true ;
2014-10-26 17:30:56 +00:00
}
2014-11-10 21:50:00 +00:00
continue ;
2013-04-26 13:34:02 +00:00
}
2014-11-10 21:50:00 +00:00
2015-03-28 10:23:29 +00:00
if ( line - > GetCommand ( ) = = " CacheAudio " & & ! resetObject )
2014-11-10 21:50:00 +00:00
{
m_sound - > CacheMusic ( std : : string ( " ../ " ) + line - > GetParam ( " filename " ) - > AsPath ( " music " ) ) ;
continue ;
2014-11-10 19:46:39 +00:00
}
2014-09-24 20:54:26 +00:00
2015-03-28 10:23:29 +00:00
if ( line - > GetCommand ( ) = = " AudioChange " & & ! resetObject & & m_controller = = nullptr )
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
int i = m_audioChangeTotal ;
if ( i < 10 )
{
m_audioChange [ i ] . pos = line - > GetParam ( " pos " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) * g_unit ;
m_audioChange [ i ] . dist = line - > GetParam ( " dist " ) - > AsFloat ( 1000.0f ) * g_unit ;
m_audioChange [ i ] . type = line - > GetParam ( " type " ) - > AsObjectType ( OBJECT_NULL ) ;
m_audioChange [ i ] . min = line - > GetParam ( " min " ) - > AsInt ( 1 ) ;
m_audioChange [ i ] . max = line - > GetParam ( " max " ) - > AsInt ( 9999 ) ;
m_audioChange [ i ] . powermin = line - > GetParam ( " powermin " ) - > AsFloat ( - 1 ) ;
m_audioChange [ i ] . powermax = line - > GetParam ( " powermax " ) - > AsFloat ( 100 ) ;
m_audioChange [ i ] . tool = line - > GetParam ( " tool " ) - > AsToolType ( TOOL_OTHER ) ;
m_audioChange [ i ] . drive = line - > GetParam ( " drive " ) - > AsDriveType ( DRIVE_OTHER ) ;
strcpy ( m_audioChange [ i ] . music , ( std : : string ( " ../ " ) + line - > GetParam ( " filename " ) - > AsPath ( " music " ) ) . c_str ( ) ) ;
m_audioChange [ i ] . repeat = line - > GetParam ( " repeat " ) - > AsBool ( true ) ;
m_audioChange [ i ] . changed = false ;
m_sound - > CacheMusic ( m_audioChange [ i ] . music ) ;
m_audioChangeTotal + + ;
}
continue ;
2013-03-23 18:04:41 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " Audio " & & ! resetObject & & m_controller = = nullptr )
{
2015-03-28 10:23:29 +00:00
if ( line - > GetParam ( " track " ) - > IsDefined ( ) )
2014-09-24 20:54:26 +00:00
{
2015-03-28 10:23:29 +00:00
if ( line - > GetParam ( " filename " ) - > IsDefined ( ) )
throw new CLevelParserException ( " You can't use track and filename at the same time " ) ;
CLogger : : GetInstancePointer ( ) - > Warn ( " Using track= is deprecated. Please replace this with filename= \n " ) ;
2014-11-10 21:50:00 +00:00
int trackid = line - > GetParam ( " track " ) - > AsInt ( ) ;
if ( trackid ! = 0 )
2014-09-24 20:54:26 +00:00
{
2014-11-10 21:50:00 +00:00
std : : stringstream filenameStr ;
filenameStr < < " music " < < std : : setfill ( ' 0 ' ) < < std : : setw ( 3 ) < < trackid < < " .ogg " ;
m_audioTrack = filenameStr . str ( ) ;
2014-09-24 20:54:26 +00:00
}
2015-03-28 10:23:29 +00:00
else
{
m_audioTrack = " " ;
}
2014-09-24 20:54:26 +00:00
}
2014-11-10 21:50:00 +00:00
else
2014-09-24 20:54:26 +00:00
{
2015-03-28 10:23:29 +00:00
if ( line - > GetParam ( " filename " ) - > IsDefined ( ) )
{
m_audioTrack = std : : string ( " ../ " ) + line - > GetParam ( " filename " ) - > AsPath ( " music " ) ;
2014-11-10 21:50:00 +00:00
}
2015-03-28 10:23:29 +00:00
else
{
m_audioTrack = " " ;
2014-11-10 21:50:00 +00:00
}
2015-03-28 10:23:29 +00:00
}
if ( ! m_audioTrack . empty ( ) )
{
m_audioRepeat = line - > GetParam ( " repeat " ) - > AsBool ( true ) ;
}
2014-11-10 21:50:00 +00:00
2015-03-28 10:23:29 +00:00
if ( line - > GetParam ( " satcom " ) - > IsDefined ( ) ) {
m_satcomTrack = std : : string ( " ../ " ) + line - > GetParam ( " satcom " ) - > AsPath ( " music " ) ;
m_satcomRepeat = line - > GetParam ( " satcomRepeat " ) - > AsBool ( true ) ;
} else {
m_satcomTrack = " " ;
2014-09-24 20:54:26 +00:00
}
2015-03-28 10:23:29 +00:00
if ( line - > GetParam ( " editor " ) - > IsDefined ( ) ) {
m_editorTrack = std : : string ( " ../ " ) + line - > GetParam ( " editor " ) - > AsPath ( " music " ) ;
m_editorRepeat = line - > GetParam ( " editorRepeat " ) - > AsBool ( true ) ;
} else {
m_editorTrack = " " ;
}
if ( ! m_audioTrack . empty ( ) ) m_sound - > CacheMusic ( m_audioTrack ) ;
if ( ! m_satcomTrack . empty ( ) ) m_sound - > CacheMusic ( m_satcomTrack ) ;
if ( ! m_editorTrack . empty ( ) ) m_sound - > CacheMusic ( m_editorTrack ) ;
2014-11-10 21:50:00 +00:00
continue ;
2013-03-23 18:04:41 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " AmbientColor " & & ! resetObject )
{
m_engine - > SetAmbientColor ( line - > GetParam ( " air " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) , 0 ) ;
m_engine - > SetAmbientColor ( line - > GetParam ( " water " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) , 1 ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " FogColor " & & ! resetObject )
{
m_engine - > SetFogColor ( line - > GetParam ( " air " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) , 0 ) ;
m_engine - > SetFogColor ( line - > GetParam ( " water " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) , 1 ) ;
continue ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " VehicleColor " & & ! resetObject )
{
m_colorNewBot = line - > GetParam ( " color " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " InsectColor " & & ! resetObject )
{
m_colorNewAlien = line - > GetParam ( " color " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " GreeneryColor " & & ! resetObject )
2013-04-28 18:05:19 +00:00
{
2014-11-10 21:50:00 +00:00
m_colorNewGreen = line - > GetParam ( " color " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) ;
continue ;
2013-04-28 18:05:19 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " DeepView " & & ! resetObject )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
m_engine - > SetDeepView ( line - > GetParam ( " air " ) - > AsFloat ( 500.0f ) * g_unit , 0 , true ) ;
m_engine - > SetDeepView ( line - > GetParam ( " water " ) - > AsFloat ( 100.0f ) * g_unit , 1 , true ) ;
continue ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " FogStart " & & ! resetObject )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
m_engine - > SetFogStart ( line - > GetParam ( " air " ) - > AsFloat ( 0.5f ) , 0 ) ;
m_engine - > SetFogStart ( line - > GetParam ( " water " ) - > AsFloat ( 0.5f ) , 1 ) ;
continue ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " SecondTexture " & & ! resetObject )
{
if ( line - > GetParam ( " rank " ) - > IsDefined ( ) ) {
char tex [ 20 ] = { 0 } ;
sprintf ( tex , " dirty%.2d.png " , line - > GetParam ( " rank " ) - > AsInt ( ) ) ;
m_engine - > SetSecondTexture ( tex ) ;
} else {
m_engine - > SetSecondTexture ( " ../ " + line - > GetParam ( " texture " ) - > AsPath ( " textures " ) ) ;
}
continue ;
}
2014-01-01 15:45:08 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " Background " & & ! resetObject )
2014-01-01 15:45:08 +00:00
{
2014-11-10 21:50:00 +00:00
std : : string path = " " ;
if ( line - > GetParam ( " image " ) - > IsDefined ( ) )
path = " ../ " + line - > GetParam ( " image " ) - > AsPath ( " textures " ) ;
m_engine - > SetBackground ( path . c_str ( ) ,
line - > GetParam ( " up " ) - > AsColor ( Gfx : : Color ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ,
line - > GetParam ( " down " ) - > AsColor ( Gfx : : Color ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ,
line - > GetParam ( " cloudUp " ) - > AsColor ( Gfx : : Color ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ,
line - > GetParam ( " cloudDown " ) - > AsColor ( Gfx : : Color ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ,
line - > GetParam ( " full " ) - > AsBool ( false ) ) ;
continue ;
2014-01-01 15:45:08 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " Planet " & & ! resetObject )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
Math : : Vector ppos , uv1 , uv2 ;
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
ppos = line - > GetParam ( " pos " ) - > AsPoint ( ) ;
uv1 = line - > GetParam ( " uv1 " ) - > AsPoint ( ) ;
uv2 = line - > GetParam ( " uv2 " ) - > AsPoint ( ) ;
m_planet - > Create ( line - > GetParam ( " mode " ) - > AsInt ( 0 ) ,
Math : : Point ( ppos . x , ppos . z ) ,
line - > GetParam ( " dim " ) - > AsFloat ( 0.2f ) ,
line - > GetParam ( " speed " ) - > AsFloat ( 0.0f ) ,
line - > GetParam ( " dir " ) - > AsFloat ( 0.0f ) ,
" ../ " + line - > GetParam ( " image " ) - > AsPath ( " textures " ) ,
Math : : Point ( uv1 . x , uv1 . z ) ,
Math : : Point ( uv2 . x , uv2 . z ) ,
line - > GetParam ( " image " ) - > AsPath ( " textures " ) . find ( " planet " ) ! = std : : string : : npos // TODO: add transparent op or modify textures
) ;
continue ;
}
if ( line - > GetCommand ( ) = = " ForegroundName " & & ! resetObject )
{
m_engine - > SetForegroundName ( " ../ " + line - > GetParam ( " image " ) - > AsPath ( " textures " ) ) ;
continue ;
}
2015-03-28 10:23:29 +00:00
if ( ( line - > GetCommand ( ) = = " Global " | | line - > GetCommand ( ) = = " Mission " ) & & ! resetObject )
2014-11-10 21:50:00 +00:00
{
2015-03-28 10:23:29 +00:00
if ( line - > GetCommand ( ) = = " Global " )
CLogger : : GetInstancePointer ( ) - > Warn ( " Using Global is deprecated. Please use Mission instead. \n " ) ;
2014-11-10 21:50:00 +00:00
g_unit = line - > GetParam ( " unitScale " ) - > AsFloat ( 4.0f ) ;
m_engine - > SetTracePrecision ( line - > GetParam ( " traceQuality " ) - > AsFloat ( 1.0f ) ) ;
m_shortCut = line - > GetParam ( " shortcut " ) - > AsBool ( true ) ;
2015-03-28 10:23:29 +00:00
m_retroStyle = line - > GetParam ( " retro " ) - > AsBool ( false ) ;
if ( m_retroStyle ) GetLogger ( ) - > Info ( " Retro mode enabled. \n " ) ;
2014-11-10 21:50:00 +00:00
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainGenerate " & & ! resetObject )
{
m_terrain - > Generate ( line - > GetParam ( " mosaic " ) - > AsInt ( 20 ) ,
line - > GetParam ( " brick " ) - > AsInt ( 3 ) ,
line - > GetParam ( " size " ) - > AsFloat ( 20.0f ) ,
line - > GetParam ( " vision " ) - > AsFloat ( 500.0f ) * g_unit ,
line - > GetParam ( " depth " ) - > AsInt ( 2 ) ,
line - > GetParam ( " hard " ) - > AsFloat ( 0.5f ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainWind " & & ! resetObject )
{
m_terrain - > SetWind ( line - > GetParam ( " speed " ) - > AsPoint ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainRelief " & & ! resetObject )
{
m_terrain - > LoadRelief (
line - > GetParam ( " image " ) - > AsPath ( " textures " ) ,
line - > GetParam ( " factor " ) - > AsFloat ( 1.0f ) ,
line - > GetParam ( " border " ) - > AsBool ( true ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainRandomRelief " & & ! resetObject )
{
m_terrain - > RandomizeRelief ( ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainResource " & & ! resetObject )
{
m_terrain - > LoadResources ( line - > GetParam ( " image " ) - > AsPath ( " textures " ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainWater " & & ! resetObject )
{
Math : : Vector pos ;
pos . x = line - > GetParam ( " moxeX " ) - > AsFloat ( 0.0f ) ;
pos . y = line - > GetParam ( " moxeY " ) - > AsFloat ( 0.0f ) ;
pos . z = pos . x ;
m_water - > Create ( line - > GetParam ( " air " ) - > AsWaterType ( Gfx : : WATER_TT ) ,
line - > GetParam ( " water " ) - > AsWaterType ( Gfx : : WATER_TT ) ,
" ../ " + line - > GetParam ( " image " ) - > AsPath ( " textures " ) ,
line - > GetParam ( " diffuse " ) - > AsColor ( Gfx : : Color ( 1.0f , 1.0f , 1.0f , 1.0f ) ) ,
line - > GetParam ( " ambient " ) - > AsColor ( Gfx : : Color ( 1.0f , 1.0f , 1.0f , 1.0f ) ) ,
line - > GetParam ( " level " ) - > AsFloat ( 100.0f ) * g_unit ,
line - > GetParam ( " glint " ) - > AsFloat ( 1.0f ) ,
pos ) ;
m_colorNewWater = line - > GetParam ( " color " ) - > AsColor ( m_colorRefWater ) ;
m_colorShiftWater = line - > GetParam ( " brightness " ) - > AsFloat ( 0.0f ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainLava " & & ! resetObject )
{
m_water - > SetLava ( line - > GetParam ( " mode " ) - > AsBool ( ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainCloud " & & ! resetObject )
{
std : : string path = " " ;
if ( line - > GetParam ( " image " ) - > IsDefined ( ) )
path = " ../ " + line - > GetParam ( " image " ) - > AsPath ( " textures " ) ;
m_cloud - > Create ( path ,
line - > GetParam ( " diffuse " ) - > AsColor ( Gfx : : Color ( 1.0f , 1.0f , 1.0f , 1.0f ) ) ,
line - > GetParam ( " ambient " ) - > AsColor ( Gfx : : Color ( 1.0f , 1.0f , 1.0f , 1.0f ) ) ,
line - > GetParam ( " level " ) - > AsFloat ( 500.0f ) * g_unit ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainBlitz " & & ! resetObject )
{
m_lightning - > Create ( line - > GetParam ( " sleep " ) - > AsFloat ( 0.0f ) ,
line - > GetParam ( " delay " ) - > AsFloat ( 3.0f ) ,
line - > GetParam ( " magnetic " ) - > AsFloat ( 50.0f ) * g_unit ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainInitTextures " & & ! resetObject )
{
std : : string name = " ../ " + line - > GetParam ( " image " ) - > AsPath ( " textures " ) ;
if ( name . find ( " . " ) = = std : : string : : npos )
name + = " .png " ;
unsigned int dx = line - > GetParam ( " dx " ) - > AsInt ( 1 ) ;
unsigned int dy = line - > GetParam ( " dy " ) - > AsInt ( 1 ) ;
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
int tt [ 100 ] ; //TODO: I have no idea how TerrainInitTextures works, but maybe we shuld remove the limit to 100?
if ( dx * dy > 100 )
throw CLevelParserException ( " In TerrainInitTextures: dx*dy must be <100 " ) ;
if ( line - > GetParam ( " table " ) - > IsDefined ( ) ) {
const std : : vector < CLevelParserParam * > & table = line - > GetParam ( " table " ) - > AsArray ( ) ;
if ( table . size ( ) > dx * dy )
throw CLevelParserException ( " In TerrainInitTextures: table size must be dx*dy " ) ;
for ( unsigned int i = 0 ; i < dx * dy ; i + + )
{
if ( i > = table . size ( ) )
{
tt [ i ] = 0 ;
} else {
tt [ i ] = table [ i ] - > AsInt ( ) ;
}
2014-09-24 20:54:26 +00:00
}
2014-11-10 21:50:00 +00:00
} else {
for ( unsigned int i = 0 ; i < dx * dy ; i + + )
2014-09-24 20:54:26 +00:00
{
2014-11-10 21:50:00 +00:00
tt [ i ] = 0 ;
2014-09-24 20:54:26 +00:00
}
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
m_terrain - > InitTextures ( name . c_str ( ) , tt , dx , dy ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainInit " & & ! resetObject )
{
m_terrain - > InitMaterials ( line - > GetParam ( " id " ) - > AsInt ( 1 ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainMaterial " & & ! resetObject )
{
std : : string name = line - > GetParam ( " image " ) - > AsPath ( " textures " ) ;
if ( name . find ( " . " ) = = std : : string : : npos )
name + = " .png " ;
name = " ../ " + name ;
m_terrain - > AddMaterial ( line - > GetParam ( " id " ) - > AsInt ( 0 ) ,
name . c_str ( ) ,
Math : : Point ( line - > GetParam ( " u " ) - > AsFloat ( ) ,
line - > GetParam ( " v " ) - > AsFloat ( ) ) ,
line - > GetParam ( " up " ) - > AsInt ( ) ,
line - > GetParam ( " right " ) - > AsInt ( ) ,
line - > GetParam ( " down " ) - > AsInt ( ) ,
line - > GetParam ( " left " ) - > AsInt ( ) ,
line - > GetParam ( " hard " ) - > AsFloat ( 0.5f ) ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainLevel " & & ! resetObject )
{
int id [ 50 ] ; //TODO: I have no idea how TerrainLevel works, but maybe we should remove the limit to 50?
if ( line - > GetParam ( " id " ) - > IsDefined ( ) ) {
const std : : vector < CLevelParserParam * > & id_array = line - > GetParam ( " id " ) - > AsArray ( ) ;
if ( id_array . size ( ) > 50 )
throw CLevelParserException ( " In TerrainLevel: id array size must be < 50 " ) ;
unsigned int i = 0 ;
while ( i < 50 )
2014-09-24 20:54:26 +00:00
{
2014-11-10 21:50:00 +00:00
id [ i ] = id_array [ i ] - > AsInt ( ) ;
i + + ;
if ( i > = id_array . size ( ) ) break ;
2014-09-24 20:54:26 +00:00
}
2014-11-10 21:50:00 +00:00
id [ i ] = 0 ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
m_terrain - > GenerateMaterials ( id ,
line - > GetParam ( " min " ) - > AsFloat ( 0.0f ) * g_unit ,
line - > GetParam ( " max " ) - > AsFloat ( 100.0f ) * g_unit ,
line - > GetParam ( " slope " ) - > AsFloat ( 5.0f ) ,
line - > GetParam ( " freq " ) - > AsFloat ( 100.0f ) ,
line - > GetParam ( " center " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) * g_unit ,
line - > GetParam ( " radius " ) - > AsFloat ( 0.0f ) * g_unit ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " TerrainCreate " & & ! resetObject )
{
m_terrain - > CreateObjects ( ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " BeginObject " )
{
InitEye ( ) ;
SetMovieLock ( false ) ;
if ( read [ 0 ] ! = 0 ) // loading file ?
sel = IOReadScene ( read , stack ) ;
continue ;
}
2015-03-28 10:23:29 +00:00
if ( line - > GetCommand ( ) = = " MissionController " & & read [ 0 ] = = 0 )
2014-11-10 21:50:00 +00:00
{
m_controller = CObjectManager : : GetInstancePointer ( ) - > CreateObject ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) , 0.0f , OBJECT_CONTROLLER , 100.0f ) ;
m_controller - > SetMagnifyDamage ( 100.0f ) ;
m_controller - > SetIgnoreBuildCheck ( true ) ;
CBrain * brain = m_controller - > GetBrain ( ) ;
2015-03-29 12:21:02 +00:00
if ( brain ! = nullptr & & line - > GetParam ( " script " ) - > IsDefined ( ) )
2012-06-26 20:23:05 +00:00
{
2015-03-29 12:21:02 +00:00
Program * program = brain - > AddProgram ( ) ;
program - > filename = " ../ " + line - > GetParam ( " script " ) - > AsPath ( " ai " ) ;
2015-04-06 14:07:49 +00:00
program - > readOnly = true ;
2015-03-29 12:21:02 +00:00
brain - > SetScriptRun ( program ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
continue ;
}
if ( line - > GetCommand ( ) = = " CreateObject " & & read [ 0 ] = = 0 )
{
ObjectType type = line - > GetParam ( " type " ) - > AsObjectType ( ) ;
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
int gadget = line - > GetParam ( " gadget " ) - > AsInt ( - 1 ) ;
if ( gadget = = - 1 )
{
gadget = 0 ;
if ( type = = OBJECT_TECH | |
( type > = OBJECT_PLANT0 & &
type < = OBJECT_PLANT19 ) | |
( type > = OBJECT_TREE0 & &
type < = OBJECT_TREE5 ) | |
( type > = OBJECT_TEEN0 & &
type < = OBJECT_TEEN44 ) | |
( type > = OBJECT_QUARTZ0 & &
type < = OBJECT_QUARTZ3 ) | |
( type > = OBJECT_ROOT0 & &
type < = OBJECT_ROOT4 ) ) // not ROOT5!
{
if ( type ! = OBJECT_TEEN11 & & // lamp?
type ! = OBJECT_TEEN12 & & // coke?
type ! = OBJECT_TEEN20 & & // wall?
type ! = OBJECT_TEEN21 & & // wall?
type ! = OBJECT_TEEN22 & & // wall?
type ! = OBJECT_TEEN26 & & // lamp?
type ! = OBJECT_TEEN28 & & // bottle?
type ! = OBJECT_TEEN34 ) // stone?
{
gadget = 1 ;
}
}
}
if ( gadget ! = 0 ) // is this a gadget?
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
if ( ! TestGadgetQuantity ( rankGadget + + ) ) continue ;
2013-04-27 11:43:01 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
Math : : Vector pos = line - > GetParam ( " pos " ) - > AsPoint ( ) * g_unit ;
float dirAngle = line - > GetParam ( " dir " ) - > AsFloat ( 0.0f ) * Math : : PI ;
bool trainer ;
CObject * obj = CObjectManager : : GetInstancePointer ( ) - > CreateObject (
pos , dirAngle ,
type ,
line - > GetParam ( " power " ) - > AsFloat ( 1.0f ) ,
line - > GetParam ( " z " ) - > AsFloat ( 1.0f ) ,
line - > GetParam ( " h " ) - > AsFloat ( 0.0f ) ,
trainer = line - > GetParam ( " trainer " ) - > AsBool ( false ) ,
line - > GetParam ( " toy " ) - > AsBool ( false ) ,
line - > GetParam ( " option " ) - > AsInt ( 0 )
) ;
if ( m_fixScene & & type = = OBJECT_HUMAN )
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
CMotion * motion = obj - > GetMotion ( ) ;
if ( m_phase = = PHASE_WIN ) motion - > SetAction ( MHS_WIN , 0.4f ) ;
if ( m_phase = = PHASE_LOST ) motion - > SetAction ( MHS_LOST , 0.5f ) ;
2013-03-27 18:55:27 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( obj ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
obj - > SetDefRank ( rankObj ) ;
if ( type = = OBJECT_BASE ) m_base = obj ;
Gfx : : CameraType cType = line - > GetParam ( " camera " ) - > AsCameraType ( Gfx : : CAM_TYPE_NULL ) ;
if ( cType ! = Gfx : : CAM_TYPE_NULL )
obj - > SetCameraType ( cType ) ;
obj - > SetCameraDist ( line - > GetParam ( " cameraDist " ) - > AsFloat ( 50.0f ) ) ;
obj - > SetCameraLock ( line - > GetParam ( " cameraLock " ) - > AsBool ( false ) ) ;
Gfx : : PyroType pType = line - > GetParam ( " pyro " ) - > AsPyroType ( Gfx : : PT_NULL ) ;
if ( pType ! = Gfx : : PT_NULL )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
Gfx : : CPyro * pyro = new Gfx : : CPyro ( ) ;
pyro - > Create ( pType , obj ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
// Puts information in terminal (OBJECT_INFO).
for ( int i = 0 ; i < OBJECTMAXINFO ; i + + )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
std : : string op = " info " + boost : : lexical_cast < std : : string > ( i + 1 ) ;
if ( ! line - > GetParam ( op ) - > IsDefined ( ) ) break ;
std : : string text = line - > GetParam ( op ) - > AsString ( ) ;
std : : size_t p = text . find_first_of ( " = " ) ;
if ( p = = std : : string : : npos )
throw CLevelParserExceptionBadParam ( line - > GetParam ( op ) , " info " ) ;
Info info ;
strcpy ( info . name , text . substr ( 0 , p ) . c_str ( ) ) ;
try {
info . value = boost : : lexical_cast < float > ( text . substr ( p + 1 ) . c_str ( ) ) ;
2014-09-24 20:54:26 +00:00
}
2014-11-10 21:50:00 +00:00
catch ( . . . )
{
throw CLevelParserExceptionBadParam ( line - > GetParam ( op ) , " info.value (float) " ) ;
}
obj - > SetInfo ( i , info ) ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
// Sets the parameters of the command line.
if ( line - > GetParam ( " cmdline " ) - > IsDefined ( ) ) {
const std : : vector < CLevelParserParam * > & cmdline = line - > GetParam ( " cmdline " ) - > AsArray ( ) ;
for ( unsigned int i = 0 ; i < OBJECTMAXCMDLINE & & i < cmdline . size ( ) ; i + + ) //TODO: get rid of the limit
{
obj - > SetCmdLine ( i , cmdline [ i ] - > AsFloat ( ) ) ;
}
}
if ( line - > GetParam ( " select " ) - > AsBool ( false ) )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
sel = obj ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
bool selectable = line - > GetParam ( " selectable " ) - > AsBool ( true ) ;
obj - > SetSelectable ( selectable ) ;
obj - > SetIgnoreBuildCheck ( line - > GetParam ( " ignoreBuildCheck " ) - > AsBool ( false ) ) ;
obj - > SetEnable ( line - > GetParam ( " enable " ) - > AsBool ( true ) ) ;
obj - > SetProxyActivate ( line - > GetParam ( " proxyActivate " ) - > AsBool ( false ) ) ;
obj - > SetProxyDistance ( line - > GetParam ( " proxyDistance " ) - > AsFloat ( 15.0f ) * g_unit ) ;
obj - > SetRange ( line - > GetParam ( " range " ) - > AsFloat ( 30.0f ) ) ;
obj - > SetShield ( line - > GetParam ( " shield " ) - > AsFloat ( 1.0f ) ) ;
obj - > SetMagnifyDamage ( line - > GetParam ( " magnifyDamage " ) - > AsFloat ( 1.0f ) ) ;
obj - > SetClip ( line - > GetParam ( " clip " ) - > AsBool ( true ) ) ;
2015-03-28 10:23:29 +00:00
obj - > SetCheckToken ( ! line - > GetParam ( " checkToken " ) - > IsDefined ( ) ? trainer | | ! selectable : line - > GetParam ( " checkToken " ) - > AsBool ( true ) ) ;
2014-11-10 21:50:00 +00:00
// SetManual will affect bot speed
if ( type = = OBJECT_MOBILEdr )
2012-06-26 20:23:05 +00:00
{
2015-03-28 10:23:29 +00:00
obj - > SetManual ( ! trainer ) ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2015-03-28 10:23:29 +00:00
Math : : Vector zoom = line - > GetParam ( " zoom " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
if ( zoom . x ! = 0.0f | | zoom . y ! = 0.0f | | zoom . z ! = 0.0f )
obj - > SetZoom ( 0 , zoom ) ;
2014-11-10 21:50:00 +00:00
//TODO: I don't remember what this is used for
CMotion * motion = obj - > GetMotion ( ) ;
if ( motion ! = nullptr & & line - > GetParam ( " param " ) - > IsDefined ( ) )
{
const std : : vector < CLevelParserParam * > & p = line - > GetParam ( " param " ) - > AsArray ( ) ;
for ( unsigned int i = 0 ; i < 10 & & i < p . size ( ) ; i + + )
{
motion - > SetParam ( i , p [ i ] - > AsFloat ( ) ) ;
}
}
int run = - 1 ;
2015-03-29 12:21:02 +00:00
std : : map < int , Program * > loadedPrograms ;
2014-11-10 21:50:00 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain ! = nullptr )
{
for ( int i = 0 ; i < 10 ; i + + )
{
std : : string op = " script " + boost : : lexical_cast < std : : string > ( i + 1 ) ; // script1..script10
2015-04-06 14:07:49 +00:00
std : : string opReadOnly = " scriptReadOnly " + boost : : lexical_cast < std : : string > ( i + 1 ) ; // scriptReadOnly1..scriptReadOnly10
2014-11-10 21:50:00 +00:00
if ( line - > GetParam ( op ) - > IsDefined ( ) ) {
2015-03-29 12:21:02 +00:00
Program * program = brain - > AddProgram ( ) ;
program - > filename = " ../ " + line - > GetParam ( op ) - > AsPath ( " ai " ) ;
2015-04-06 14:07:49 +00:00
program - > readOnly = line - > GetParam ( opReadOnly ) - > AsBool ( true ) ;
2015-03-29 12:21:02 +00:00
loadedPrograms [ i ] = program ;
2014-11-10 21:50:00 +00:00
}
}
int i = line - > GetParam ( " run " ) - > AsInt ( 0 ) ;
if ( i ! = 0 )
{
run = i - 1 ;
2015-03-29 12:21:02 +00:00
brain - > SetScriptRun ( loadedPrograms [ run ] ) ;
2014-11-10 21:50:00 +00:00
}
}
CAuto * automat = obj - > GetAuto ( ) ;
if ( automat ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
type = line - > GetParam ( " autoType " ) - > AsObjectType ( OBJECT_NULL ) ;
automat - > SetType ( type ) ;
for ( int i = 0 ; i < 5 ; i + + )
{
std : : string op = " autoValue " + boost : : lexical_cast < std : : string > ( i + 1 ) ; // autoValue1..autoValue5
automat - > SetValue ( i , line - > GetParam ( op ) - > AsFloat ( 0.0f ) ) ;
}
automat - > SetString ( const_cast < char * > ( line - > GetParam ( " autoString " ) - > AsPath ( " ai " , " " ) . c_str ( ) ) ) ;
int i = line - > GetParam ( " run " ) - > AsInt ( - 1 ) ;
if ( i ! = - 1 )
{
if ( i ! = PARAM_FIXSCENE & &
! m_dialog - > GetMovies ( ) ) i = 0 ;
automat - > Start ( i ) ; // starts the film
}
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( soluce & & brain ! = nullptr & & line - > GetParam ( " soluce " ) - > IsDefined ( ) )
2015-04-06 15:00:22 +00:00
brain - > SetSoluceName ( const_cast < char * > ( line - > GetParam ( " soluce " ) - > AsPath ( " ai " ) . c_str ( ) ) ) ;
2014-11-10 21:50:00 +00:00
obj - > SetResetPosition ( obj - > GetPosition ( 0 ) ) ;
obj - > SetResetAngle ( obj - > GetAngle ( 0 ) ) ;
2015-03-29 12:21:02 +00:00
obj - > SetResetRun ( loadedPrograms [ run ] ) ;
2014-11-10 21:50:00 +00:00
if ( line - > GetParam ( " reset " ) - > AsBool ( false ) )
obj - > SetResetCap ( RESET_MOVE ) ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
rankObj + + ;
continue ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " CreateFog " & & ! resetObject )
{
Gfx : : ParticleType type = static_cast < Gfx : : ParticleType > ( Gfx : : PARTIFOG0 + ( line - > GetParam ( " type " ) - > AsInt ( ) ) ) ;
Math : : Vector pos = line - > GetParam ( " pos " ) - > AsPoint ( ) * g_unit ;
float height = line - > GetParam ( " height " ) - > AsFloat ( 1.0f ) * g_unit ;
float ddim = line - > GetParam ( " dim " ) - > AsFloat ( 50.0f ) * g_unit ;
float delay = line - > GetParam ( " delay " ) - > AsFloat ( 2.0f ) ;
m_terrain - > AdjustToFloor ( pos ) ;
pos . y + = height ;
Math : : Point dim ;
dim . x = ddim ;
dim . y = dim . x ;
m_particle - > CreateParticle ( pos , Math : : Vector ( 0.0f , 0.0f , 0.0f ) , dim , type , delay , 0.0f , 0.0f ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " CreateLight " & & ! resetObject )
{
Gfx : : EngineObjectType type ;
int lightRank = CreateLight ( line - > GetParam ( " dir " ) - > AsPoint ( ) ,
line - > GetParam ( " color " ) - > AsColor ( Gfx : : Color ( 0.5f , 0.5f , 0.5f , 1.0f ) ) ) ;
type = line - > GetParam ( " type " ) - > AsTerrainType ( Gfx : : ENG_OBJTYPE_NULL ) ;
if ( type = = Gfx : : ENG_OBJTYPE_TERRAIN )
{
m_lightMan - > SetLightPriority ( lightRank , Gfx : : LIGHT_PRI_HIGHEST ) ;
m_lightMan - > SetLightIncludeType ( lightRank , Gfx : : ENG_OBJTYPE_TERRAIN ) ;
}
if ( type = = Gfx : : ENG_OBJTYPE_QUARTZ )
m_lightMan - > SetLightIncludeType ( lightRank , Gfx : : ENG_OBJTYPE_QUARTZ ) ;
if ( type = = Gfx : : ENG_OBJTYPE_METAL )
m_lightMan - > SetLightIncludeType ( lightRank , Gfx : : ENG_OBJTYPE_METAL ) ;
if ( type = = Gfx : : ENG_OBJTYPE_FIX )
m_lightMan - > SetLightExcludeType ( lightRank , Gfx : : ENG_OBJTYPE_TERRAIN ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " CreateSpot " & & ! resetObject )
{
Gfx : : EngineObjectType type ;
int rankLight = CreateSpot ( line - > GetParam ( " pos " ) - > AsPoint ( ) * g_unit ,
2014-09-24 20:54:26 +00:00
line - > GetParam ( " color " ) - > AsColor ( Gfx : : Color ( 0.5f , 0.5f , 0.5f , 1.0f ) ) ) ;
2014-11-10 21:50:00 +00:00
type = line - > GetParam ( " type " ) - > AsTerrainType ( Gfx : : ENG_OBJTYPE_NULL ) ;
if ( type = = Gfx : : ENG_OBJTYPE_TERRAIN )
m_lightMan - > SetLightIncludeType ( rankLight , Gfx : : ENG_OBJTYPE_TERRAIN ) ;
if ( type = = Gfx : : ENG_OBJTYPE_QUARTZ )
m_lightMan - > SetLightIncludeType ( rankLight , Gfx : : ENG_OBJTYPE_QUARTZ ) ;
if ( type = = Gfx : : ENG_OBJTYPE_METAL )
m_lightMan - > SetLightIncludeType ( rankLight , Gfx : : ENG_OBJTYPE_METAL ) ;
if ( type = = Gfx : : ENG_OBJTYPE_FIX )
m_lightMan - > SetLightExcludeType ( rankLight , Gfx : : ENG_OBJTYPE_TERRAIN ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " GroundSpot " & & ! resetObject )
2013-06-20 21:14:37 +00:00
{
2014-11-10 21:50:00 +00:00
rank = m_engine - > CreateGroundSpot ( ) ;
if ( rank ! = - 1 )
{
m_engine - > SetObjectGroundSpotPos ( rank , line - > GetParam ( " pos " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) * g_unit ) ;
m_engine - > SetObjectGroundSpotRadius ( rank , line - > GetParam ( " radius " ) - > AsFloat ( 10.0f ) * g_unit ) ;
m_engine - > SetObjectGroundSpotColor ( rank , line - > GetParam ( " color " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) ) ;
m_engine - > SetObjectGroundSpotSmooth ( rank , line - > GetParam ( " smooth " ) - > AsFloat ( 1.0f ) ) ;
m_engine - > SetObjectGroundSpotMinMax ( rank , line - > GetParam ( " min " ) - > AsFloat ( 0.0f ) * g_unit ,
line - > GetParam ( " max " ) - > AsFloat ( 0.0f ) * g_unit ) ;
}
continue ;
2013-06-20 21:14:37 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " WaterColor " & & ! resetObject )
{
m_engine - > SetWaterAddColor ( line - > GetParam ( " color " ) - > AsColor ( ) ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " MapColor " & & ! resetObject )
{
m_map - > FloorColorMap ( line - > GetParam ( " floor " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) ,
line - > GetParam ( " water " ) - > AsColor ( Gfx : : Color ( 0.533f , 0.533f , 0.533f , 0.533f ) ) ) ;
m_mapShow = line - > GetParam ( " show " ) - > AsBool ( true ) ;
m_map - > ShowMap ( m_mapShow ) ;
m_map - > SetToy ( line - > GetParam ( " toyIcon " ) - > AsBool ( false ) ) ;
m_mapImage = line - > GetParam ( " image " ) - > AsBool ( false ) ;
if ( m_mapImage )
{
Math : : Vector offset ;
strcpy ( m_mapFilename , ( " ../ " + line - > GetParam ( " filename " ) - > AsPath ( " textures " ) ) . c_str ( ) ) ;
offset = line - > GetParam ( " offset " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
m_map - > SetFixParam ( line - > GetParam ( " zoom " ) - > AsFloat ( 1.0f ) ,
offset . x , offset . z ,
line - > GetParam ( " angle " ) - > AsFloat ( 0.0f ) * Math : : PI / 180.0f ,
line - > GetParam ( " mode " ) - > AsInt ( 0 ) ,
line - > GetParam ( " debug " ) - > AsBool ( false ) ) ;
}
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " MapZoom " & & ! resetObject )
{
m_map - > ZoomMap ( line - > GetParam ( " factor " ) - > AsFloat ( 2.0f ) ) ;
m_map - > MapEnable ( line - > GetParam ( " enable " ) - > AsBool ( true ) ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " MaxFlyingHeight " & & ! resetObject )
{
m_terrain - > SetFlyingMaxHeight ( line - > GetParam ( " max " ) - > AsFloat ( 280.0f ) * g_unit ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " AddFlyingHeight " & & ! resetObject )
{
m_terrain - > AddFlyingLimit ( line - > GetParam ( " center " ) - > AsPoint ( ) * g_unit ,
line - > GetParam ( " extRadius " ) - > AsFloat ( 20.0f ) * g_unit ,
line - > GetParam ( " intRadius " ) - > AsFloat ( 10.0f ) * g_unit ,
line - > GetParam ( " maxHeight " ) - > AsFloat ( 200.0f ) ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " Camera " )
{
m_camera - > Init ( line - > GetParam ( " eye " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) * g_unit ,
line - > GetParam ( " lookat " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) * g_unit ,
resetObject ? 0.0f : line - > GetParam ( " delay " ) - > AsFloat ( 0.0f ) ) ;
if ( line - > GetParam ( " fadeIn " ) - > AsBool ( false ) )
m_camera - > StartOver ( Gfx : : CAM_OVER_EFFECT_FADEIN_WHITE , Math : : Vector ( 0.0f , 0.0f , 0.0f ) , 1.0f ) ;
m_camera - > SetFixDirection ( line - > GetParam ( " fixDirection " ) - > AsFloat ( 0.25f ) * Math : : PI ) ;
continue ;
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " EndMissionTake " & & ! resetObject & & m_controller = = nullptr )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
int i = m_endTakeTotal ;
if ( i < 10 )
{
m_endTake [ i ] . pos = line - > GetParam ( " pos " ) - > AsPoint ( Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) * g_unit ;
2015-03-28 10:23:29 +00:00
m_endTake [ i ] . dist = line - > GetParam ( " dist " ) - > AsFloat ( 8.0f ) * g_unit ;
2014-11-10 21:50:00 +00:00
m_endTake [ i ] . type = line - > GetParam ( " type " ) - > AsObjectType ( OBJECT_NULL ) ;
m_endTake [ i ] . min = line - > GetParam ( " min " ) - > AsInt ( 1 ) ;
m_endTake [ i ] . max = line - > GetParam ( " max " ) - > AsInt ( 9999 ) ;
2015-03-28 10:23:29 +00:00
m_endTake [ i ] . powermin = line - > GetParam ( " powermin " ) - > AsFloat ( - 1 ) ;
m_endTake [ i ] . powermax = line - > GetParam ( " powermax " ) - > AsFloat ( 100 ) ;
m_endTake [ i ] . tool = line - > GetParam ( " tool " ) - > AsToolType ( TOOL_OTHER ) ;
m_endTake [ i ] . drive = line - > GetParam ( " drive " ) - > AsDriveType ( DRIVE_OTHER ) ;
2014-11-10 21:50:00 +00:00
m_endTake [ i ] . lost = line - > GetParam ( " lost " ) - > AsInt ( - 1 ) ;
m_endTake [ i ] . immediat = line - > GetParam ( " immediat " ) - > AsBool ( false ) ;
2015-03-29 13:38:48 +00:00
m_endTake [ i ] . countTransported = line - > GetParam ( " countTransported " ) - > AsBool ( true ) ;
2014-11-10 21:50:00 +00:00
strcpy ( m_endTake [ i ] . message , line - > GetParam ( " message " ) - > AsString ( " " ) . c_str ( ) ) ; //TODO: Really, ending mission on message()? Is this used anywhere? Do we need that?
m_endTakeTotal + + ;
}
continue ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " EndMissionDelay " & & ! resetObject & & m_controller = = nullptr )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
m_endTakeWinDelay = line - > GetParam ( " win " ) - > AsFloat ( 2.0f ) ;
m_endTakeLostDelay = line - > GetParam ( " lost " ) - > AsFloat ( 2.0f ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " EndMissionResearch " & & ! resetObject & & m_controller = = nullptr ) //TODO: Is this used anywhere?
{
m_endTakeResearch | = line - > GetParam ( " type " ) - > AsResearchFlag ( ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " EndMissionNever " & & ! resetObject & & m_controller = = nullptr )
{
m_endTakeNever = true ;
continue ;
2012-06-26 20:23:05 +00:00
}
2014-09-24 20:54:26 +00:00
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " ObligatoryToken " & & ! resetObject ) //NOTE: This was used only in CeeBot, maybe we should add this to some Colobot exercises?
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
int i = m_obligatoryTotal ;
if ( i < 100 ) //TODO: remove the limit
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
strcpy ( m_obligatoryToken [ i ] , line - > GetParam ( " text " ) - > AsString ( ) . c_str ( ) ) ;
m_obligatoryTotal + + ;
2013-05-26 15:47:54 +00:00
}
2014-11-10 21:50:00 +00:00
continue ;
}
if ( line - > GetCommand ( ) = = " ProhibitedToken " & & ! resetObject ) //NOTE: This was used only in CeeBot, maybe we should add this to some Colobot exercises?
{
int i = m_prohibitedTotal ;
if ( i < 100 ) //TODO: remove the limit
2013-05-26 15:47:54 +00:00
{
2014-11-10 21:50:00 +00:00
strcpy ( m_prohibitedToken [ i ] , line - > GetParam ( " text " ) - > AsString ( ) . c_str ( ) ) ;
m_prohibitedTotal + + ;
2013-04-20 10:08:48 +00:00
}
2014-11-10 21:50:00 +00:00
continue ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " EnableBuild " & & ! resetObject )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
g_build | = line - > GetParam ( " type " ) - > AsBuildFlag ( ) ;
continue ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " EnableResearch " & & ! resetObject )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
g_researchEnable | = line - > GetParam ( " type " ) - > AsResearchFlag ( ) ;
continue ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( line - > GetCommand ( ) = = " DoneResearch " & & read [ 0 ] = = 0 & & ! resetObject ) // not loading file?
{
g_researchDone | = line - > GetParam ( " type " ) - > AsResearchFlag ( ) ;
continue ;
}
if ( line - > GetCommand ( ) = = " NewScript " & & ! resetObject )
{
AddNewScriptName ( line - > GetParam ( " type " ) - > AsObjectType ( OBJECT_NULL ) , const_cast < char * > ( line - > GetParam ( " name " ) - > AsPath ( " ai " ) . c_str ( ) ) ) ;
continue ;
}
if ( read [ 0 ] ! = 0 ) continue ; // ignore errors when loading saved game (TODO: don't report ones that are just not loaded when loading saved game)
if ( resetObject ) continue ; // ignore when reseting just objects (TODO: see above)
throw CLevelParserException ( " Unknown command: ' " + line - > GetCommand ( ) + " ' in " + line - > GetLevel ( ) - > GetFilename ( ) + " : " + boost : : lexical_cast < std : : string > ( line - > GetLineNumber ( ) ) ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( read [ 0 ] = = 0 )
CompileScript ( soluce ) ; // compiles all scripts
2012-06-26 20:23:05 +00:00
2014-11-10 21:50:00 +00:00
if ( strcmp ( base , " missions " ) = = 0 & & ! resetObject ) // mission?
WriteFreeParam ( ) ;
2012-09-15 13:33:08 +00:00
2014-11-10 21:50:00 +00:00
if ( strcmp ( base , " freemissions " ) = = 0 & & ! resetObject ) // free play?
{
g_researchDone = m_freeResearch ;
2012-06-26 20:23:05 +00:00
2014-11-10 21:50:00 +00:00
g_build = m_freeBuild ;
g_build & = ~ BUILD_RESEARCH ;
g_build & = ~ BUILD_LABO ;
g_build | = BUILD_FACTORY ;
g_build | = BUILD_GFLAT ;
g_build | = BUILD_FLAG ;
}
2012-06-26 20:23:05 +00:00
2015-03-22 16:40:08 +00:00
if ( ! resetObject & & ! fixScene )
2014-11-10 21:50:00 +00:00
{
ChangeColor ( ) ; // changes the colors of texture
m_short - > SetMode ( false ) ; // vehicles?
}
2012-06-26 20:23:05 +00:00
2014-11-10 21:50:00 +00:00
CreateShortcuts ( ) ;
m_map - > UpdateMap ( ) ;
// TODO: m_engine->TimeInit(); ??
2014-12-11 18:01:57 +00:00
m_input - > ResetKeyStates ( ) ;
2014-11-10 21:50:00 +00:00
m_time = 0.0f ;
m_gameTime = 0.0f ;
2014-11-11 13:50:44 +00:00
m_autosaveLast = 0.0f ;
2014-11-10 21:50:00 +00:00
m_infoUsed = 0 ;
2012-06-26 20:23:05 +00:00
2014-11-10 21:50:00 +00:00
m_selectObject = sel ;
2012-09-15 13:33:08 +00:00
2014-11-10 21:50:00 +00:00
if ( m_base = = nullptr & & // no main base?
! m_fixScene ) // interractive scene?
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:50:00 +00:00
CObject * obj ;
if ( sel = = nullptr )
obj = SearchHuman ( ) ;
else
obj = sel ;
if ( obj ! = nullptr )
{
SelectObject ( obj ) ;
m_camera - > SetControllingObject ( obj ) ;
m_camera - > SetType ( obj - > GetCameraType ( ) ) ;
}
2012-06-26 20:23:05 +00:00
}
2014-11-10 21:50:00 +00:00
if ( m_fixScene )
m_camera - > SetType ( Gfx : : CAM_TYPE_SCRIPT ) ;
2012-09-15 13:33:08 +00:00
2014-11-10 21:50:00 +00:00
if ( read [ 0 ] ! = 0 & & sel ! = 0 ) // loading file?
{
Math : : Vector pos = sel - > GetPosition ( 0 ) ;
m_camera - > Init ( pos , pos , 0.0f ) ;
m_camera - > FixCamera ( ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 21:50:00 +00:00
SelectObject ( sel ) ;
m_camera - > SetControllingObject ( sel ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 21:50:00 +00:00
m_beginSatCom = true ; // message already displayed
}
} catch ( . . . ) {
m_dialog - > SetSceneRead ( " " ) ;
m_dialog - > SetStackRead ( " " ) ;
throw ;
2012-06-26 20:23:05 +00:00
}
m_dialog - > SetSceneRead ( " " ) ;
m_dialog - > SetStackRead ( " " ) ;
2013-12-26 21:13:04 +00:00
if ( m_app - > GetSceneTestMode ( ) )
2014-11-10 19:23:18 +00:00
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Creates a directional light
int CRobotMain : : CreateLight ( Math : : Vector direction , Gfx : : Color color )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( direction . x = = 0.0f & &
direction . y = = 0.0f & &
direction . z = = 0.0f )
2012-06-26 20:23:05 +00:00
{
direction . y = - 1.0f ;
}
2012-09-15 13:33:08 +00:00
Gfx : : Light light ;
light . type = Gfx : : LIGHT_DIRECTIONAL ;
light . diffuse = color ;
2013-02-28 20:26:09 +00:00
light . ambient = color * 0.1f ;
2012-09-15 13:33:08 +00:00
light . direction = direction ;
2012-09-26 21:18:57 +00:00
int obj = m_lightMan - > CreateLight ( Gfx : : LIGHT_PRI_HIGH ) ;
2012-09-15 13:33:08 +00:00
m_lightMan - > SetLight ( obj , light ) ;
2012-06-26 20:23:05 +00:00
return obj ;
}
2012-09-15 13:33:08 +00:00
//! Creates a light spot
int CRobotMain : : CreateSpot ( Math : : Vector pos , Gfx : : Color color )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( ! m_engine - > GetLightMode ( ) ) return - 1 ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
pos . y + = m_terrain - > GetFloorLevel ( pos ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Gfx : : Light light ;
light . type = Gfx : : LIGHT_SPOT ;
light . diffuse = color ;
2013-02-28 20:26:09 +00:00
light . ambient = color * 0.1f ;
2012-09-15 13:33:08 +00:00
light . position = pos ;
light . direction = Math : : Vector ( 0.0f , - 1.0f , 0.0f ) ;
light . spotIntensity = 1.0f ;
light . spotAngle = 90.0f * Math : : PI / 180.0f ;
light . attenuation0 = 2.0f ;
light . attenuation1 = 0.0f ;
light . attenuation2 = 0.0f ;
2012-09-26 21:18:57 +00:00
int obj = m_lightMan - > CreateLight ( Gfx : : LIGHT_PRI_HIGH ) ;
2012-09-15 13:33:08 +00:00
m_lightMan - > SetLight ( obj , light ) ;
2012-06-26 20:23:05 +00:00
return obj ;
}
2012-09-15 13:33:08 +00:00
//! Change the colors and textures
2012-06-26 20:23:05 +00:00
void CRobotMain : : ChangeColor ( )
{
2012-09-15 13:33:08 +00:00
Math : : Point ts = Math : : Point ( 0.0f , 0.0f ) ;
Math : : Point ti = Math : : Point ( 1.0f , 1.0f ) ; // the entire image
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Gfx : : Color colorRef1 , colorNew1 , colorRef2 , colorNew2 ;
2012-06-26 20:23:05 +00:00
colorRef1 . a = 0.0f ;
colorRef2 . a = 0.0f ;
colorRef1 . r = 206.0f / 256.0f ;
colorRef1 . g = 206.0f / 256.0f ;
colorRef1 . b = 204.0f / 256.0f ; // ~white
2012-09-15 13:33:08 +00:00
colorNew1 = m_dialog - > GetGamerColorCombi ( ) ;
2012-06-26 20:23:05 +00:00
colorRef2 . r = 255.0f / 256.0f ;
colorRef2 . g = 132.0f / 256.0f ;
colorRef2 . b = 1.0f / 256.0f ; // orange
2012-09-15 13:33:08 +00:00
colorNew2 = m_dialog - > GetGamerColorBand ( ) ;
Math : : Point exclu [ 6 ] ;
2012-06-26 20:23:05 +00:00
exclu [ 0 ] = Math : : Point ( 192.0f / 256.0f , 0.0f / 256.0f ) ;
exclu [ 1 ] = Math : : Point ( 256.0f / 256.0f , 64.0f / 256.0f ) ; // crystals + cylinders
exclu [ 2 ] = Math : : Point ( 208.0f / 256.0f , 224.0f / 256.0f ) ;
exclu [ 3 ] = Math : : Point ( 256.0f / 256.0f , 256.0f / 256.0f ) ; // SatCom screen
exclu [ 4 ] = Math : : Point ( 0.0f , 0.0f ) ;
exclu [ 5 ] = Math : : Point ( 0.0f , 0.0f ) ; // terminator
2014-11-11 14:52:08 +00:00
m_engine - > ChangeTextureColor ( " textures/objects/human.png " , colorRef1 , colorNew1 , colorRef2 , colorNew2 , 0.30f , 0.01f , ts , ti , exclu ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
float tolerance ;
int face = GetGamerFace ( ) ;
if ( face = = 0 ) // normal?
2012-06-26 20:23:05 +00:00
{
colorRef1 . r = 90.0f / 256.0f ;
colorRef1 . g = 95.0f / 256.0f ;
colorRef1 . b = 85.0f / 256.0f ; // black
tolerance = 0.15f ;
}
2012-09-15 13:33:08 +00:00
if ( face = = 1 ) // bald?
2012-06-26 20:23:05 +00:00
{
colorRef1 . r = 74.0f / 256.0f ;
colorRef1 . g = 58.0f / 256.0f ;
colorRef1 . b = 46.0f / 256.0f ; // brown
tolerance = 0.20f ;
}
2012-09-15 13:33:08 +00:00
if ( face = = 2 ) // carlos?
2012-06-26 20:23:05 +00:00
{
colorRef1 . r = 70.0f / 256.0f ;
colorRef1 . g = 40.0f / 256.0f ;
colorRef1 . b = 8.0f / 256.0f ; // brown
tolerance = 0.30f ;
}
2012-09-15 13:33:08 +00:00
if ( face = = 3 ) // blonde?
2012-06-26 20:23:05 +00:00
{
colorRef1 . r = 74.0f / 256.0f ;
colorRef1 . g = 16.0f / 256.0f ;
colorRef1 . b = 0.0f / 256.0f ; // yellow
tolerance = 0.20f ;
}
2012-09-15 13:33:08 +00:00
colorNew1 = m_dialog - > GetGamerColorHair ( ) ;
2012-06-26 20:23:05 +00:00
colorRef2 . r = 0.0f ;
colorRef2 . g = 0.0f ;
colorRef2 . b = 0.0f ;
colorNew2 . r = 0.0f ;
colorNew2 . g = 0.0f ;
colorNew2 . b = 0.0f ;
2012-09-15 13:33:08 +00:00
char name [ 100 ] ;
2014-11-11 14:52:08 +00:00
sprintf ( name , " textures/objects/face%.2d.png " , face + 1 ) ;
2012-06-26 20:23:05 +00:00
exclu [ 0 ] = Math : : Point ( 105.0f / 256.0f , 47.0f / 166.0f ) ;
exclu [ 1 ] = Math : : Point ( 153.0f / 256.0f , 79.0f / 166.0f ) ; // blue canister
exclu [ 2 ] = Math : : Point ( 0.0f , 0.0f ) ;
exclu [ 3 ] = Math : : Point ( 0.0f , 0.0f ) ; // terminator
2012-09-29 21:37:38 +00:00
m_engine - > ChangeTextureColor ( name , colorRef1 , colorNew1 , colorRef2 , colorNew2 , tolerance , 0.00f , ts , ti , exclu ) ;
2012-06-26 20:23:05 +00:00
colorRef2 . r = 0.0f ;
colorRef2 . g = 0.0f ;
colorRef2 . b = 0.0f ;
colorNew2 . r = 0.0f ;
colorNew2 . g = 0.0f ;
colorNew2 . b = 0.0f ;
2014-11-11 14:52:08 +00:00
m_engine - > ChangeTextureColor ( " textures/objects/base1.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , 0 , 0 , true ) ;
m_engine - > ChangeTextureColor ( " textures/objects/convert.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , 0 , 0 , true ) ;
m_engine - > ChangeTextureColor ( " textures/objects/derrick.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , 0 , 0 , true ) ;
m_engine - > ChangeTextureColor ( " textures/objects/factory.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , 0 , 0 , true ) ;
m_engine - > ChangeTextureColor ( " textures/objects/lemt.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , 0 , 0 , true ) ;
m_engine - > ChangeTextureColor ( " textures/objects/roller.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , 0 , 0 , true ) ;
m_engine - > ChangeTextureColor ( " textures/objects/search.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , 0 , 0 , true ) ;
2012-06-26 20:23:05 +00:00
exclu [ 0 ] = Math : : Point ( 0.0f / 256.0f , 160.0f / 256.0f ) ;
exclu [ 1 ] = Math : : Point ( 256.0f / 256.0f , 256.0f / 256.0f ) ; // pencils
exclu [ 2 ] = Math : : Point ( 0.0f , 0.0f ) ;
exclu [ 3 ] = Math : : Point ( 0.0f , 0.0f ) ; // terminator
2014-11-11 14:52:08 +00:00
m_engine - > ChangeTextureColor ( " textures/objects/drawer.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , exclu , 0 , true ) ;
2012-06-26 20:23:05 +00:00
exclu [ 0 ] = Math : : Point ( 237.0f / 256.0f , 176.0f / 256.0f ) ;
exclu [ 1 ] = Math : : Point ( 256.0f / 256.0f , 220.0f / 256.0f ) ; // blue canister
exclu [ 2 ] = Math : : Point ( 106.0f / 256.0f , 150.0f / 256.0f ) ;
exclu [ 3 ] = Math : : Point ( 130.0f / 256.0f , 214.0f / 256.0f ) ; // safe location
exclu [ 4 ] = Math : : Point ( 0.0f , 0.0f ) ;
exclu [ 5 ] = Math : : Point ( 0.0f , 0.0f ) ; // terminator
2014-11-11 14:52:08 +00:00
m_engine - > ChangeTextureColor ( " textures/objects/subm.png " , m_colorRefBot , m_colorNewBot , colorRef2 , colorNew2 , 0.10f , - 1.0f , ts , ti , exclu , 0 , true ) ;
2012-06-26 20:23:05 +00:00
exclu [ 0 ] = Math : : Point ( 128.0f / 256.0f , 160.0f / 256.0f ) ;
exclu [ 1 ] = Math : : Point ( 256.0f / 256.0f , 256.0f / 256.0f ) ; // SatCom
exclu [ 2 ] = Math : : Point ( 0.0f , 0.0f ) ;
exclu [ 3 ] = Math : : Point ( 0.0f , 0.0f ) ; // terminator
2014-11-11 14:52:08 +00:00
m_engine - > ChangeTextureColor ( " textures/objects/ant.png " , m_colorRefAlien , m_colorNewAlien , colorRef2 , colorNew2 , 0.50f , - 1.0f , ts , ti , exclu ) ;
m_engine - > ChangeTextureColor ( " textures/objects/mother.png " , m_colorRefAlien , m_colorNewAlien , colorRef2 , colorNew2 , 0.50f , - 1.0f , ts , ti ) ;
2012-06-26 20:23:05 +00:00
2014-11-11 14:52:08 +00:00
m_engine - > ChangeTextureColor ( " textures/objects/plant.png " , m_colorRefGreen , m_colorNewGreen , colorRef2 , colorNew2 , 0.50f , - 1.0f , ts , ti ) ;
2012-06-26 20:23:05 +00:00
// PARTIPLOUF0 and PARTIDROP :
ts = Math : : Point ( 0.500f , 0.500f ) ;
ti = Math : : Point ( 0.875f , 0.750f ) ;
2014-09-27 16:26:29 +00:00
m_engine - > ChangeTextureColor ( " textures/effect00.png " , m_colorRefWater , m_colorNewWater , colorRef2 , colorNew2 , 0.20f , - 1.0f , ts , ti , 0 , m_colorShiftWater , true ) ;
2012-06-26 20:23:05 +00:00
// PARTIFLIC :
ts = Math : : Point ( 0.00f , 0.75f ) ;
ti = Math : : Point ( 0.25f , 1.00f ) ;
2014-09-27 16:26:29 +00:00
m_engine - > ChangeTextureColor ( " textures/effect02.png " , m_colorRefWater , m_colorNewWater , colorRef2 , colorNew2 , 0.20f , - 1.0f , ts , ti , 0 , m_colorShiftWater , true ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Updates the number of unnecessary objects
2012-06-26 20:23:05 +00:00
bool CRobotMain : : TestGadgetQuantity ( int rank )
{
static int table10 [ 10 ] = { 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
static int table20 [ 10 ] = { 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 } ;
static int table30 [ 10 ] = { 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 } ;
static int table40 [ 10 ] = { 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 } ;
static int table50 [ 10 ] = { 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 } ;
static int table60 [ 10 ] = { 0 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 } ;
static int table70 [ 10 ] = { 0 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 } ;
static int table80 [ 10 ] = { 0 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 } ;
static int table90 [ 10 ] = { 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 } ;
2012-09-15 13:33:08 +00:00
float percent = m_engine - > GetGadgetQuantity ( ) ;
if ( percent = = 0.0f ) return false ;
if ( percent = = 1.0f ) return true ;
int * table ;
if ( percent < = 0.15f ) table = table10 ;
else if ( percent < = 0.25f ) table = table20 ;
else if ( percent < = 0.35f ) table = table30 ;
else if ( percent < = 0.45f ) table = table40 ;
else if ( percent < = 0.55f ) table = table50 ;
else if ( percent < = 0.65f ) table = table60 ;
else if ( percent < = 0.75f ) table = table70 ;
else if ( percent < = 0.85f ) table = table80 ;
else table = table90 ;
2012-06-26 20:23:05 +00:00
return table [ rank % 10 ] ;
}
2012-09-15 13:33:08 +00:00
//! Calculates the distance to the nearest object
2012-06-26 20:23:05 +00:00
float CRobotMain : : SearchNearestObject ( Math : : Vector center , CObject * exclu )
{
2012-09-15 13:33:08 +00:00
float min = 100000.0f ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! obj - > GetActif ( ) ) continue ; // inactive?
if ( obj - > GetTruck ( ) ! = nullptr ) continue ; // object carries?
if ( obj = = exclu ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( type = = OBJECT_BASE )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Vector oPos = obj - > GetPosition ( 0 ) ;
if ( oPos . x ! = center . x | |
oPos . z ! = center . z )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float dist = Math : : Distance ( center , oPos ) - 80.0f ;
if ( dist < 0.0f ) dist = 0.0f ;
2012-06-26 20:23:05 +00:00
min = Math : : Min ( min , dist ) ;
continue ;
}
}
2012-09-15 13:33:08 +00:00
if ( type = = OBJECT_STATION | |
type = = OBJECT_REPAIR | |
type = = OBJECT_DESTROYER )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Vector oPos = obj - > GetPosition ( 0 ) ;
float dist = Math : : Distance ( center , oPos ) - 8.0f ;
if ( dist < 0.0f ) dist = 0.0f ;
2012-06-26 20:23:05 +00:00
min = Math : : Min ( min , dist ) ;
}
2012-09-15 13:33:08 +00:00
int j = 0 ;
Math : : Vector oPos ;
float oRadius ;
while ( obj - > GetCrashSphere ( j + + , oPos , oRadius ) )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float dist = Math : : Distance ( center , oPos ) - oRadius ;
if ( dist < 0.0f ) dist = 0.0f ;
2012-06-26 20:23:05 +00:00
min = Math : : Min ( min , dist ) ;
}
}
return min ;
}
2012-09-15 13:33:08 +00:00
//! Calculates a free space
2012-06-26 20:23:05 +00:00
bool CRobotMain : : FreeSpace ( Math : : Vector & center , float minRadius , float maxRadius ,
float space , CObject * exclu )
{
2012-09-15 13:33:08 +00:00
if ( minRadius < maxRadius ) // from internal to external?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
for ( float radius = minRadius ; radius < = maxRadius ; radius + = space )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float ia = space / radius ;
for ( float angle = 0.0f ; angle < Math : : PI * 2.0f ; angle + = ia )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Point p ;
2012-06-26 20:23:05 +00:00
p . x = center . x + radius ;
p . y = center . z ;
p = Math : : RotatePoint ( Math : : Point ( center . x , center . z ) , angle , p ) ;
2012-09-15 13:33:08 +00:00
Math : : Vector pos ;
2012-06-26 20:23:05 +00:00
pos . x = p . x ;
pos . z = p . y ;
pos . y = 0.0f ;
2012-09-15 13:33:08 +00:00
m_terrain - > AdjustToFloor ( pos , true ) ;
float dist = SearchNearestObject ( pos , exclu ) ;
if ( dist > = space )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float flat = m_terrain - > GetFlatZoneRadius ( pos , dist / 2.0f ) ;
if ( flat > = dist / 2.0f )
2012-06-26 20:23:05 +00:00
{
center = pos ;
return true ;
}
}
}
}
}
else // from external to internal?
{
2012-09-15 13:33:08 +00:00
for ( float radius = maxRadius ; radius > = minRadius ; radius - = space )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float ia = space / radius ;
for ( float angle = 0.0f ; angle < Math : : PI * 2.0f ; angle + = ia )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
Math : : Point p ;
2012-06-26 20:23:05 +00:00
p . x = center . x + radius ;
p . y = center . z ;
p = Math : : RotatePoint ( Math : : Point ( center . x , center . z ) , angle , p ) ;
2012-09-15 13:33:08 +00:00
Math : : Vector pos ;
2012-06-26 20:23:05 +00:00
pos . x = p . x ;
pos . z = p . y ;
pos . y = 0.0f ;
2012-09-15 13:33:08 +00:00
m_terrain - > AdjustToFloor ( pos , true ) ;
float dist = SearchNearestObject ( pos , exclu ) ;
if ( dist > = space )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float flat = m_terrain - > GetFlatZoneRadius ( pos , dist / 2.0f ) ;
if ( flat > = dist / 2.0f )
2012-06-26 20:23:05 +00:00
{
center = pos ;
return true ;
}
}
}
}
}
return false ;
}
2012-09-15 13:33:08 +00:00
//! Calculates the maximum radius of a free space
float CRobotMain : : GetFlatZoneRadius ( Math : : Vector center , float maxRadius ,
2012-06-26 20:23:05 +00:00
CObject * exclu )
{
2012-09-15 13:33:08 +00:00
float dist = SearchNearestObject ( center , exclu ) ;
if ( dist = = 0.0f ) return 0.0f ;
if ( dist < maxRadius )
2012-06-26 20:23:05 +00:00
maxRadius = dist ;
2012-09-15 13:33:08 +00:00
return m_terrain - > GetFlatZoneRadius ( center , maxRadius ) ;
}
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
//! Hides buildable area when a cube of metal is taken up
2012-06-26 20:23:05 +00:00
void CRobotMain : : HideDropZone ( CObject * metal )
{
2012-09-15 13:33:08 +00:00
if ( m_showLimit [ 1 ] . used & &
m_showLimit [ 1 ] . link = = metal )
2012-06-26 20:23:05 +00:00
{
FlushShowLimit ( 1 ) ;
}
2012-09-15 13:33:08 +00:00
if ( m_showLimit [ 2 ] . used & &
m_showLimit [ 2 ] . link = = metal )
2012-06-26 20:23:05 +00:00
{
FlushShowLimit ( 2 ) ;
}
}
2012-09-15 13:33:08 +00:00
//! Shows the buildable area when a cube of metal is deposited
2012-06-26 20:23:05 +00:00
void CRobotMain : : ShowDropZone ( CObject * metal , CObject * truck )
{
2012-09-15 13:33:08 +00:00
if ( metal = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Math : : Vector center = metal - > GetPosition ( 0 ) ;
2012-06-26 20:23:05 +00:00
// Calculates the maximum radius possible depending on other items.
2012-09-15 13:33:08 +00:00
float oMax = 30.0f ; // radius to build the biggest building
float tMax ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-15 13:33:08 +00:00
if ( ! obj - > GetActif ( ) ) continue ; // inactive?
if ( obj - > GetTruck ( ) ! = nullptr ) continue ; // object carried?
if ( obj = = metal ) continue ;
if ( obj = = truck ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Math : : Vector oPos ;
float oRadius ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_BASE )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
oPos = obj - > GetPosition ( 0 ) ;
float dist = Math : : Distance ( center , oPos ) - 80.0f ;
2012-06-26 20:23:05 +00:00
oMax = Math : : Min ( oMax , dist ) ;
}
else
{
2012-09-15 13:33:08 +00:00
int j = 0 ;
while ( obj - > GetCrashSphere ( j + + , oPos , oRadius ) )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float dist = Math : : Distance ( center , oPos ) - oRadius ;
2012-06-26 20:23:05 +00:00
oMax = Math : : Min ( oMax , dist ) ;
}
}
if ( type = = OBJECT_DERRICK | |
type = = OBJECT_FACTORY | |
type = = OBJECT_STATION | |
type = = OBJECT_CONVERT | |
type = = OBJECT_REPAIR | |
type = = OBJECT_DESTROYER | |
type = = OBJECT_TOWER | |
type = = OBJECT_RESEARCH | |
type = = OBJECT_RADAR | |
type = = OBJECT_ENERGY | |
type = = OBJECT_LABO | |
type = = OBJECT_NUCLEAR | |
type = = OBJECT_START | |
type = = OBJECT_END | |
type = = OBJECT_INFO | |
type = = OBJECT_PARA | |
type = = OBJECT_SAFE | |
type = = OBJECT_HUSTON ) // building?
{
2012-09-15 13:33:08 +00:00
int j = 0 ;
while ( obj - > GetCrashSphere ( j + + , oPos , oRadius ) )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
float dist = Math : : Distance ( center , oPos ) - oRadius - BUILDMARGIN ;
2012-06-26 20:23:05 +00:00
oMax = Math : : Min ( oMax , dist ) ;
}
}
}
// Calculates the maximum possible radius depending on terrain.
2012-09-15 13:33:08 +00:00
if ( oMax > = 2.0f )
tMax = m_terrain - > GetFlatZoneRadius ( center , 30.0f ) ;
2012-06-26 20:23:05 +00:00
else
tMax = 0.0f ;
2012-09-15 13:33:08 +00:00
float radius = Math : : Min ( oMax , tMax ) ;
if ( radius > = 2.0f )
SetShowLimit ( 1 , Gfx : : PARTILIMIT2 , metal , center , radius , 10.0f ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Erases the boundaries shown
2012-06-26 20:23:05 +00:00
void CRobotMain : : FlushShowLimit ( int i )
{
2012-09-15 13:33:08 +00:00
if ( m_showLimit [ i ] . link ! = 0 )
2012-06-26 20:23:05 +00:00
{
m_showLimit [ i ] . link - > StopShowLimit ( ) ;
}
2012-09-15 13:33:08 +00:00
for ( int j = 0 ; j < m_showLimit [ i ] . total ; j + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_showLimit [ i ] . parti [ j ] = = 0 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_particle - > DeleteParticle ( m_showLimit [ i ] . parti [ j ] ) ;
2012-06-26 20:23:05 +00:00
m_showLimit [ i ] . parti [ j ] = 0 ;
}
m_showLimit [ i ] . total = 0 ;
m_showLimit [ i ] . link = 0 ;
2012-09-15 13:33:08 +00:00
m_showLimit [ i ] . used = false ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Specifies the boundaries to show
void CRobotMain : : SetShowLimit ( int i , Gfx : : ParticleType parti , CObject * obj ,
2012-06-26 20:23:05 +00:00
Math : : Vector pos , float radius , float duration )
{
FlushShowLimit ( i ) ; // erases the current boundaries
2012-09-15 13:33:08 +00:00
if ( radius < = 0.0f ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Math : : Point dim ;
float dist ;
if ( radius < = 50.0f )
2012-06-26 20:23:05 +00:00
{
dim = Math : : Point ( 0.3f , 0.3f ) ;
dist = 2.5f ;
}
else
{
dim = Math : : Point ( 1.5f , 1.5f ) ;
dist = 10.0f ;
}
2012-09-15 13:33:08 +00:00
m_showLimit [ i ] . used = true ;
m_showLimit [ i ] . link = obj ;
2012-06-26 20:23:05 +00:00
m_showLimit [ i ] . pos = pos ;
m_showLimit [ i ] . radius = radius ;
m_showLimit [ i ] . duration = duration ;
2012-09-17 22:01:00 +00:00
m_showLimit [ i ] . total = static_cast < int > ( ( radius * 2.0f * Math : : PI ) / dist ) ;
2012-09-15 13:33:08 +00:00
if ( m_showLimit [ i ] . total > MAXSHOWPARTI ) m_showLimit [ i ] . total = MAXSHOWPARTI ;
2012-06-26 20:23:05 +00:00
m_showLimit [ i ] . time = 0.0f ;
2012-09-15 13:33:08 +00:00
for ( int j = 0 ; j < m_showLimit [ i ] . total ; j + + )
2012-06-26 20:23:05 +00:00
{
2012-09-10 21:29:38 +00:00
m_showLimit [ i ] . parti [ j ] = m_particle - > CreateParticle ( pos , Math : : Vector ( 0.0f , 0.0f , 0.0f ) , dim , parti , duration ) ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Adjusts the boundaries to show
2012-06-26 20:23:05 +00:00
void CRobotMain : : AdjustShowLimit ( int i , Math : : Vector pos )
{
m_showLimit [ i ] . pos = pos ;
}
2012-09-15 13:33:08 +00:00
//! Mount the boundaries of the selected object
2012-06-26 20:23:05 +00:00
void CRobotMain : : StartShowLimit ( )
{
2012-09-15 13:33:08 +00:00
CObject * obj = GetSelect ( ) ;
if ( obj = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
obj - > StartShowLimit ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Advances the boundaries shown
2012-06-26 20:23:05 +00:00
void CRobotMain : : FrameShowLimit ( float rTime )
{
2012-09-15 13:33:08 +00:00
if ( m_engine - > GetPause ( ) ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < MAXSHOWLIMIT ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( ! m_showLimit [ i ] . used ) continue ;
2012-06-26 20:23:05 +00:00
m_showLimit [ i ] . time + = rTime ;
2012-09-15 13:33:08 +00:00
if ( m_showLimit [ i ] . time > = m_showLimit [ i ] . duration )
2012-06-26 20:23:05 +00:00
{
FlushShowLimit ( i ) ;
continue ;
}
2012-09-15 13:33:08 +00:00
float factor ;
if ( m_showLimit [ i ] . time < 1.0f )
2012-06-26 20:23:05 +00:00
factor = m_showLimit [ i ] . time ;
2012-09-15 13:33:08 +00:00
else if ( m_showLimit [ i ] . time > m_showLimit [ i ] . duration - 1.0f )
2012-06-26 20:23:05 +00:00
factor = m_showLimit [ i ] . duration - m_showLimit [ i ] . time ;
else
factor = 1.0f ;
2012-09-15 13:33:08 +00:00
float speed = 0.4f - m_showLimit [ i ] . radius * 0.001f ;
if ( speed < 0.1f ) speed = 0.1f ;
float angle = m_showLimit [ i ] . time * speed ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
for ( int j = 0 ; j < m_showLimit [ i ] . total ; j + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_showLimit [ i ] . parti [ j ] = = 0 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Math : : Point center ;
2012-06-26 20:23:05 +00:00
center . x = m_showLimit [ i ] . pos . x ;
center . y = m_showLimit [ i ] . pos . z ;
2012-09-15 13:33:08 +00:00
Math : : Point rotate ;
2012-06-26 20:23:05 +00:00
rotate . x = center . x + m_showLimit [ i ] . radius * factor ;
rotate . y = center . y ;
rotate = Math : : RotatePoint ( center , angle , rotate ) ;
2012-09-15 13:33:08 +00:00
Math : : Vector pos ;
2012-06-26 20:23:05 +00:00
pos . x = rotate . x ;
pos . z = rotate . y ;
pos . y = 0.0f ;
2012-09-15 13:33:08 +00:00
m_terrain - > AdjustToFloor ( pos , true ) ;
if ( m_showLimit [ i ] . radius < = 50.0f ) pos . y + = 0.5f ;
else pos . y + = 2.0f ;
2012-09-10 21:29:38 +00:00
m_particle - > SetPosition ( m_showLimit [ i ] . parti [ j ] , pos ) ;
2012-06-26 20:23:05 +00:00
angle + = ( 2.0f * Math : : PI ) / m_showLimit [ i ] . total ;
}
}
}
2012-09-15 13:33:08 +00:00
//! Compiles all scripts of robots
void CRobotMain : : CompileScript ( bool soluce )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
int nbError = 0 ;
int lastError = 0 ;
2014-12-21 16:06:55 +00:00
CObjectManager * objman = CObjectManager : : GetInstancePointer ( ) ;
2013-02-16 21:37:43 +00:00
2012-06-26 20:23:05 +00:00
do
{
lastError = nbError ;
nbError = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : objman - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-15 13:33:08 +00:00
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) continue ;
2012-06-26 20:23:05 +00:00
2015-03-29 12:21:02 +00:00
for ( Program * program : brain - > GetPrograms ( ) )
2012-06-26 20:23:05 +00:00
{
2015-03-29 12:21:02 +00:00
//? if (brain->GetCompile(j)) continue;
if ( program - > filename . empty ( ) ) continue ;
2012-06-26 20:23:05 +00:00
2015-03-29 12:21:02 +00:00
std : : string name = " ai/ " + program - > filename ;
if ( ! brain - > ReadProgram ( program , const_cast < char * > ( name . c_str ( ) ) ) ) {
CLogger : : GetInstancePointer ( ) - > Error ( " Unable to read script from file \" %s \" \n " , name . c_str ( ) ) ;
2012-06-26 20:23:05 +00:00
}
2015-03-29 12:21:02 +00:00
if ( ! brain - > GetCompile ( program ) ) nbError + + ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
LoadOneScript ( obj , nbError ) ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
while ( nbError > 0 & & nbError ! = lastError ) ;
2012-06-26 20:23:05 +00:00
// Load all solutions.
2012-09-15 13:33:08 +00:00
if ( soluce )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
for ( auto it : objman - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-15 13:33:08 +00:00
if ( obj - > GetTruck ( ) ! = 0 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = 0 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
char * name = brain - > GetSoluceName ( ) ;
if ( name [ 0 ] ! = 0 )
2012-06-26 20:23:05 +00:00
{
brain - > ReadSoluce ( name ) ; // load solution
}
}
}
// Start all programs according to the command "run".
2014-12-21 16:06:55 +00:00
for ( auto it : objman - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-15 13:33:08 +00:00
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) continue ;
2012-06-26 20:23:05 +00:00
2015-03-29 12:21:02 +00:00
Program * program = brain - > GetScriptRun ( ) ;
if ( program ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2015-03-29 12:21:02 +00:00
brain - > RunProgram ( program ) ; // starts the program
2012-06-26 20:23:05 +00:00
}
}
}
2012-09-15 13:33:08 +00:00
//! Load all programs of the robot
void CRobotMain : : LoadOneScript ( CObject * obj , int & nbError )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! IsSelectable ( obj ) ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_HUMAN ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
int objRank = obj - > GetDefRank ( ) ;
if ( objRank = = - 1 ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
char * name = m_dialog - > GetSceneName ( ) ;
int rank = m_dialog - > GetSceneRank ( ) ;
2012-06-26 20:23:05 +00:00
2015-04-07 11:18:34 +00:00
for ( unsigned int i = 0 ; i < = 999 ; i + + )
2012-06-26 20:23:05 +00:00
{
2015-03-29 12:21:02 +00:00
//? if (brain->GetCompile(i)) continue;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
char filename [ MAX_FNAME ] ;
2015-03-29 12:21:02 +00:00
sprintf ( filename , " %s/%s/%c%.3d%.3d%.3d.txt " ,
2014-11-10 18:02:07 +00:00
GetSavegameDir ( ) , m_gamerName . c_str ( ) , name [ 0 ] , rank , objRank , i ) ;
2015-03-29 12:21:02 +00:00
if ( CResourceManager : : Exists ( filename ) )
{
Program * program = brain - > GetOrAddProgram ( i ) ;
brain - > ReadProgram ( program , filename ) ;
if ( ! brain - > GetCompile ( program ) ) nbError + + ;
}
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Load all programs of the robot
2012-09-26 20:57:43 +00:00
void CRobotMain : : LoadFileScript ( CObject * obj , const char * filename , int objRank ,
2012-06-26 20:23:05 +00:00
int & nbError )
{
2012-09-15 13:33:08 +00:00
if ( objRank = = - 1 ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_HUMAN ) return ;
2012-06-26 20:23:05 +00:00
2014-11-10 17:34:29 +00:00
std : : string dirname = filename ;
dirname = dirname . substr ( 0 , dirname . find_last_of ( " / " ) ) ;
2014-10-27 20:49:03 +00:00
2014-11-10 17:34:29 +00:00
char fn [ MAX_FNAME ] ; //TODO: Refactor to std::string
2015-04-07 11:18:34 +00:00
for ( unsigned int i = 0 ; i < = 999 ; i + + )
2012-06-26 20:23:05 +00:00
{
2015-03-29 12:21:02 +00:00
sprintf ( fn , " %s/prog%.3d%.3d.txt " , dirname . c_str ( ) , objRank , i ) ;
if ( CResourceManager : : Exists ( fn ) )
{
Program * program = brain - > GetOrAddProgram ( i ) ;
brain - > ReadProgram ( program , fn ) ;
if ( ! brain - > GetCompile ( program ) ) nbError + + ;
}
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Saves all programs of all the robots
2012-06-26 20:23:05 +00:00
void CRobotMain : : SaveAllScript ( )
{
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
SaveOneScript ( obj ) ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Saves all programs of the robot.
//! If a program does not exist, the corresponding file is destroyed.
void CRobotMain : : SaveOneScript ( CObject * obj )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! IsSelectable ( obj ) ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_HUMAN ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
int objRank = obj - > GetDefRank ( ) ;
if ( objRank = = - 1 ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
char * name = m_dialog - > GetSceneName ( ) ;
int rank = m_dialog - > GetSceneRank ( ) ;
2012-06-26 20:23:05 +00:00
2015-03-29 12:21:02 +00:00
auto programs = brain - > GetPrograms ( ) ;
// TODO: Find a better way to do that
2015-04-07 11:18:34 +00:00
for ( unsigned int i = 0 ; i < = 999 ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
char filename [ MAX_FNAME ] ;
2015-03-29 12:21:02 +00:00
sprintf ( filename , " %s/%s/%c%.3d%.3d%.3d.txt " ,
2014-11-10 18:02:07 +00:00
GetSavegameDir ( ) , m_gamerName . c_str ( ) , name [ 0 ] , rank , objRank , i ) ;
2015-03-29 12:21:02 +00:00
if ( i < programs . size ( ) )
{
brain - > WriteProgram ( programs [ i ] , filename ) ;
}
else
{
CResourceManager : : Remove ( filename ) ;
}
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Saves all programs of the robot.
//! If a program does not exist, the corresponding file is destroyed.
2012-09-26 20:57:43 +00:00
void CRobotMain : : SaveFileScript ( CObject * obj , const char * filename , int objRank )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( objRank = = - 1 ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) return ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_HUMAN ) return ;
2014-11-10 17:34:29 +00:00
std : : string dirname = filename ;
dirname = dirname . substr ( 0 , dirname . find_last_of ( " / " ) ) ;
char fn [ MAX_FNAME ] ; //TODO: Refactor to std::string
2015-03-29 12:21:02 +00:00
auto programs = brain - > GetPrograms ( ) ;
// TODO: Find a better way to do that
2015-04-07 11:18:34 +00:00
for ( unsigned int i = 0 ; i < = 999 ; i + + )
2012-06-26 20:23:05 +00:00
{
2015-03-29 12:21:02 +00:00
sprintf ( fn , " %s/prog%.3d%.3d.txt " , dirname . c_str ( ) , objRank , i ) ;
if ( i < programs . size ( ) )
{
brain - > WriteProgram ( programs [ i ] , fn ) ;
}
else
{
CResourceManager : : Remove ( fn ) ;
}
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Saves the stack of the program in execution of a robot
bool CRobotMain : : SaveFileStack ( CObject * obj , FILE * file , int objRank )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( objRank = = - 1 ) return true ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) return true ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_HUMAN ) return true ;
2012-06-26 20:23:05 +00:00
return brain - > WriteStack ( file ) ;
}
2012-09-15 13:33:08 +00:00
//! Resumes the execution stack of the program in a robot
bool CRobotMain : : ReadFileStack ( CObject * obj , FILE * file , int objRank )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( objRank = = - 1 ) return true ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) return true ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_HUMAN ) return true ;
2012-06-26 20:23:05 +00:00
return brain - > ReadStack ( file ) ;
}
2012-09-15 13:33:08 +00:00
//! Empty the list
2012-06-26 20:23:05 +00:00
bool CRobotMain : : FlushNewScriptName ( )
{
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < MAXNEWSCRIPTNAME ; i + + )
m_newScriptName [ i ] . used = false ;
2012-06-26 20:23:05 +00:00
return true ;
}
2012-09-15 13:33:08 +00:00
//! Adds a script name
2012-06-26 20:23:05 +00:00
bool CRobotMain : : AddNewScriptName ( ObjectType type , char * name )
{
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < MAXNEWSCRIPTNAME ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( ! m_newScriptName [ i ] . used )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_newScriptName [ i ] . used = true ;
2012-06-26 20:23:05 +00:00
m_newScriptName [ i ] . type = type ;
strcpy ( m_newScriptName [ i ] . name , name ) ;
return true ;
}
}
return false ;
}
2012-09-15 13:33:08 +00:00
//! Seeks a script name for a given type
char * CRobotMain : : GetNewScriptName ( ObjectType type , int rank )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < MAXNEWSCRIPTNAME ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_newScriptName [ i ] . used & &
( m_newScriptName [ i ] . type = = type | |
m_newScriptName [ i ] . type = = OBJECT_NULL ) )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( rank = = 0 ) return m_newScriptName [ i ] . name ;
else rank - - ;
2012-06-26 20:23:05 +00:00
}
}
2015-04-06 14:41:05 +00:00
return nullptr ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Seeks if an object occupies in a spot, to prevent a backup of the game
2012-06-26 20:23:05 +00:00
bool CRobotMain : : IsBusy ( )
{
2014-12-20 17:45:46 +00:00
if ( CScriptFunctions : : m_CompteurFileOpen > 0 ) return true ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( brain - > IsBusy ( ) ) return true ;
2012-06-26 20:23:05 +00:00
}
}
return false ;
}
2012-09-15 13:33:08 +00:00
//! Writes an object into the backup file
2014-11-10 13:16:32 +00:00
void CRobotMain : : IOWriteObject ( CLevelParserLine * line , CObject * obj )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( obj - > GetType ( ) = = OBJECT_FIX ) return ;
2013-05-26 15:47:54 +00:00
2014-11-10 13:16:32 +00:00
line - > AddParam ( " type " , new CLevelParserParam ( obj - > GetType ( ) ) ) ;
line - > AddParam ( " id " , new CLevelParserParam ( obj - > GetID ( ) ) ) ;
line - > AddParam ( " pos " , new CLevelParserParam ( obj - > GetPosition ( 0 ) / g_unit ) ) ;
line - > AddParam ( " angle " , new CLevelParserParam ( obj - > GetAngle ( 0 ) / ( Math : : PI / 180.0f ) ) ) ;
line - > AddParam ( " zoom " , new CLevelParserParam ( obj - > GetZoom ( 0 ) ) ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Math : : Vector pos ;
for ( int i = 1 ; i < OBJECTMAXPART ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( obj - > GetObjectRank ( i ) = = - 1 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
pos = obj - > GetPosition ( i ) ;
if ( pos . x ! = 0.0f | | pos . y ! = 0.0f | | pos . z ! = 0.0f )
2012-06-26 20:23:05 +00:00
{
pos / = g_unit ;
2014-11-10 13:16:32 +00:00
line - > AddParam ( " p " + boost : : lexical_cast < std : : string > ( i ) , new CLevelParserParam ( pos ) ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
pos = obj - > GetAngle ( i ) ;
if ( pos . x ! = 0.0f | | pos . y ! = 0.0f | | pos . z ! = 0.0f )
2012-06-26 20:23:05 +00:00
{
pos / = ( Math : : PI / 180.0f ) ;
2014-11-10 13:16:32 +00:00
line - > AddParam ( " a " + boost : : lexical_cast < std : : string > ( i ) , new CLevelParserParam ( pos ) ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
pos = obj - > GetZoom ( i ) ;
if ( pos . x ! = 1.0f | | pos . y ! = 1.0f | | pos . z ! = 1.0f )
2012-06-26 20:23:05 +00:00
{
2014-11-10 13:16:32 +00:00
line - > AddParam ( " z " + boost : : lexical_cast < std : : string > ( i ) , new CLevelParserParam ( pos ) ) ;
2012-06-26 20:23:05 +00:00
}
}
2014-11-10 13:16:32 +00:00
line - > AddParam ( " trainer " , new CLevelParserParam ( obj - > GetTrainer ( ) ) ) ;
line - > AddParam ( " ignoreBuildCheck " , new CLevelParserParam ( obj - > GetIgnoreBuildCheck ( ) ) ) ;
line - > AddParam ( " option " , new CLevelParserParam ( obj - > GetOption ( ) ) ) ;
if ( obj = = m_infoObject )
line - > AddParam ( " select " , new CLevelParserParam ( 1 ) ) ;
2014-03-03 20:55:28 +00:00
2012-09-15 13:33:08 +00:00
obj - > Write ( line ) ;
2014-11-10 13:16:32 +00:00
if ( obj - > GetType ( ) = = OBJECT_BASE )
line - > AddParam ( " run " , new CLevelParserParam ( 3 ) ) ; // stops and open (PARAM_FIXSCENE)
2012-09-15 13:33:08 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
int run = brain - > GetProgram ( ) ;
if ( run ! = - 1 )
2012-06-26 20:23:05 +00:00
{
2014-11-10 13:16:32 +00:00
line - > AddParam ( " run " , new CLevelParserParam ( run + 1 ) ) ;
2012-06-26 20:23:05 +00:00
}
2015-04-07 11:27:11 +00:00
auto programs = brain - > GetPrograms ( ) ;
for ( unsigned int i = 0 ; i < programs . size ( ) ; i + + )
{
if ( programs [ i ] - > readOnly )
{
line - > AddParam ( " scriptReadOnly " + boost : : lexical_cast < std : : string > ( i + 1 ) , new CLevelParserParam ( true ) ) ;
}
}
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
//! Saves the current game
2012-09-26 20:57:43 +00:00
bool CRobotMain : : IOWriteScene ( const char * filename , const char * filecbot , char * info )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:19:52 +00:00
CLevelParser * level = new CLevelParser ( filename ) ;
2014-11-10 13:16:32 +00:00
CLevelParserLine * line ;
2012-06-26 20:23:05 +00:00
2014-11-10 13:16:32 +00:00
line = new CLevelParserLine ( " Title " ) ;
line - > AddParam ( " text " , new CLevelParserParam ( std : : string ( info ) ) ) ;
level - > AddLine ( line ) ;
//TODO: Do we need that? It's not used anyway
line = new CLevelParserLine ( " Version " ) ;
line - > AddParam ( " maj " , new CLevelParserParam ( 0 ) ) ;
line - > AddParam ( " min " , new CLevelParserParam ( 1 ) ) ;
level - > AddLine ( line ) ;
2014-11-11 11:08:19 +00:00
line = new CLevelParserLine ( " Created " ) ;
line - > AddParam ( " date " , new CLevelParserParam ( GetCurrentTimestamp ( ) ) ) ;
level - > AddLine ( line ) ;
2012-06-26 21:01:17 +00:00
2012-09-15 13:33:08 +00:00
char * name = m_dialog - > GetSceneName ( ) ;
2014-11-10 13:16:32 +00:00
line = new CLevelParserLine ( " Mission " ) ;
line - > AddParam ( " base " , new CLevelParserParam ( std : : string ( name ) ) ) ;
line - > AddParam ( " rank " , new CLevelParserParam ( m_dialog - > GetSceneRank ( ) ) ) ;
if ( std : : string ( name ) = = " custom " )
2012-06-26 20:23:05 +00:00
{
2014-11-10 13:16:32 +00:00
line - > AddParam ( " dir " , new CLevelParserParam ( std : : string ( m_dialog - > GetSceneDir ( ) ) ) ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 13:16:32 +00:00
level - > AddLine ( line ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 13:16:32 +00:00
line = new CLevelParserLine ( " Map " ) ;
line - > AddParam ( " zoom " , new CLevelParserParam ( m_map - > GetZoomMap ( ) ) ) ;
level - > AddLine ( line ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 13:16:32 +00:00
line = new CLevelParserLine ( " DoneResearch " ) ;
line - > AddParam ( " bits " , new CLevelParserParam ( static_cast < int > ( g_researchDone ) ) ) ;
level - > AddLine ( line ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
float sleep , delay , magnetic , progress ;
if ( m_lightning - > GetStatus ( sleep , delay , magnetic , progress ) )
2012-06-26 20:23:05 +00:00
{
2014-11-10 13:16:32 +00:00
line = new CLevelParserLine ( " BlitzMode " ) ;
line - > AddParam ( " sleep " , new CLevelParserParam ( sleep ) ) ;
line - > AddParam ( " delay " , new CLevelParserParam ( delay ) ) ;
line - > AddParam ( " magnetic " , new CLevelParserParam ( magnetic / g_unit ) ) ;
line - > AddParam ( " progress " , new CLevelParserParam ( progress ) ) ;
level - > AddLine ( line ) ;
2012-06-26 20:23:05 +00:00
}
2014-12-21 16:06:55 +00:00
2012-09-15 13:33:08 +00:00
int objRank = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj - > GetType ( ) = = OBJECT_TOTO ) continue ;
if ( obj - > GetType ( ) = = OBJECT_FIX ) continue ;
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
if ( obj - > GetBurn ( ) ) continue ;
if ( obj - > GetDead ( ) ) continue ;
if ( obj - > GetExplo ( ) ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
CObject * power = obj - > GetPower ( ) ;
CObject * fret = obj - > GetFret ( ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 13:16:32 +00:00
if ( fret ! = nullptr ) { // object transported?
line = new CLevelParserLine ( " CreateFret " ) ;
IOWriteObject ( line , fret ) ;
level - > AddLine ( line ) ;
}
2012-06-26 20:23:05 +00:00
2014-11-10 13:16:32 +00:00
if ( power ! = nullptr ) { // battery transported?
line = new CLevelParserLine ( " CreatePower " ) ;
IOWriteObject ( line , power ) ;
level - > AddLine ( line ) ;
}
line = new CLevelParserLine ( " CreateObject " ) ;
IOWriteObject ( line , obj ) ;
level - > AddLine ( line ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
SaveFileScript ( obj , filename , objRank + + ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 13:16:32 +00:00
try {
level - > Save ( ) ;
} catch ( CLevelParserException & e ) {
CLogger : : GetInstancePointer ( ) - > Error ( " Failed to save level state - %s \n " , e . what ( ) ) ;
delete level ;
return false ;
}
delete level ;
2012-06-26 20:23:05 +00:00
// Writes the file of stacks of execution.
2014-11-10 13:16:32 +00:00
FILE * file = fOpen ( filecbot , " wb " ) ;
2012-09-15 13:33:08 +00:00
if ( file = = NULL ) return false ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
long version = 1 ;
2012-06-26 20:23:05 +00:00
fWrite ( & version , sizeof ( long ) , 1 , file ) ; // version of COLOBOT
2012-08-11 18:59:35 +00:00
version = CBotProgram : : GetVersion ( ) ;
2012-06-26 20:23:05 +00:00
fWrite ( & version , sizeof ( long ) , 1 , file ) ; // version of CBOT
objRank = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj - > GetType ( ) = = OBJECT_TOTO ) continue ;
if ( obj - > GetType ( ) = = OBJECT_FIX ) continue ;
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
if ( obj - > GetBurn ( ) ) continue ;
if ( obj - > GetDead ( ) ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! SaveFileStack ( obj , file , objRank + + ) ) break ;
2012-06-26 20:23:05 +00:00
}
CBotClass : : SaveStaticState ( file ) ;
fClose ( file ) ;
m_delayWriteMessage = 4 ; // displays message in 3 frames
return true ;
}
2012-09-15 13:33:08 +00:00
//! Resumes the game
2014-11-10 16:15:34 +00:00
CObject * CRobotMain : : IOReadObject ( CLevelParserLine * line , const char * filename , int objRank )
2012-06-26 20:23:05 +00:00
{
2014-11-10 16:15:34 +00:00
Math : : Vector pos = line - > GetParam ( " pos " ) - > AsPoint ( ) * g_unit ;
Math : : Vector dir = line - > GetParam ( " angle " ) - > AsPoint ( ) * ( Math : : PI / 180.0f ) ;
Math : : Vector zoom = line - > GetParam ( " zoom " ) - > AsPoint ( ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
ObjectType type = line - > GetParam ( " type " ) - > AsObjectType ( ) ;
int id = line - > GetParam ( " id " ) - > AsInt ( ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
bool trainer = line - > GetParam ( " trainer " ) - > AsBool ( false ) ;
bool toy = line - > GetParam ( " toy " ) - > AsBool ( false ) ;
int option = line - > GetParam ( " option " ) - > AsInt ( 0 ) ;
2012-06-26 20:23:05 +00:00
2013-12-29 11:08:59 +00:00
CObject * obj = CObjectManager : : GetInstancePointer ( ) - > CreateObject ( pos , dir . y , type , 0.0f , 1.0f , 0.0f , trainer , toy , option ) ;
2012-09-15 13:33:08 +00:00
obj - > SetDefRank ( objRank ) ;
obj - > SetPosition ( 0 , pos ) ;
obj - > SetAngle ( 0 , dir ) ;
2014-11-10 16:15:34 +00:00
obj - > SetIgnoreBuildCheck ( line - > GetParam ( " ignoreBuildCheck " ) - > AsBool ( false ) ) ;
2012-09-15 13:33:08 +00:00
obj - > SetID ( id ) ;
if ( g_id < id ) g_id = id ;
if ( zoom . x ! = 0.0f | | zoom . y ! = 0.0f | | zoom . z ! = 0.0f )
obj - > SetZoom ( 0 , zoom ) ;
for ( int i = 1 ; i < OBJECTMAXPART ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( obj - > GetObjectRank ( i ) = = - 1 ) continue ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
pos = line - > GetParam ( std : : string ( " p " ) + boost : : lexical_cast < std : : string > ( i ) ) - > AsPoint ( Math : : Vector ( ) ) ;
2012-09-15 13:33:08 +00:00
if ( pos . x ! = 0.0f | | pos . y ! = 0.0f | | pos . z ! = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetPosition ( i , pos * g_unit ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 16:15:34 +00:00
dir = line - > GetParam ( std : : string ( " a " ) + boost : : lexical_cast < std : : string > ( i ) ) - > AsPoint ( Math : : Vector ( ) ) ;
2012-09-15 13:33:08 +00:00
if ( dir . x ! = 0.0f | | dir . y ! = 0.0f | | dir . z ! = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetAngle ( i , dir * ( Math : : PI / 180.0f ) ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 16:15:34 +00:00
zoom = line - > GetParam ( std : : string ( " z " ) + boost : : lexical_cast < std : : string > ( i ) ) - > AsPoint ( Math : : Vector ( ) ) ;
2012-09-15 13:33:08 +00:00
if ( zoom . x ! = 0.0f | | zoom . y ! = 0.0f | | zoom . z ! = 0.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetZoom ( i , zoom ) ;
2012-06-26 20:23:05 +00:00
}
}
2014-11-09 18:26:36 +00:00
if ( type = = OBJECT_BASE ) m_base = obj ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
obj - > Read ( line ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
int run = line - > GetParam ( " run " ) - > AsInt ( - 1 ) ;
2012-09-15 13:33:08 +00:00
if ( run ! = - 1 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CAuto * automat = obj - > GetAuto ( ) ;
if ( automat ! = nullptr )
automat - > Start ( run ) ; // starts the film
2015-04-07 11:27:11 +00:00
}
2015-04-07 11:18:34 +00:00
2015-04-07 11:27:11 +00:00
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain ! = nullptr )
{
if ( run ! = - 1 )
2015-04-07 11:18:34 +00:00
{
Program * program = brain - > GetOrAddProgram ( run - 1 ) ;
brain - > SetScriptRun ( program ) ; // marks the program to be started
}
2015-04-07 11:27:11 +00:00
for ( unsigned int i = 0 ; i < = 999 ; i + + )
{
if ( line - > GetParam ( " scriptReadOnly " + boost : : lexical_cast < std : : string > ( i + 1 ) ) - > AsBool ( false ) )
{
Program * prog = brain - > GetOrAddProgram ( i ) ;
prog - > readOnly = true ;
}
}
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
return obj ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Resumes some part of the game
2012-09-26 20:57:43 +00:00
CObject * CRobotMain : : IOReadScene ( const char * filename , const char * filecbot )
2012-06-26 20:23:05 +00:00
{
2014-11-10 21:19:52 +00:00
CLevelParser * level = new CLevelParser ( filename ) ;
2014-11-10 16:15:34 +00:00
level - > Load ( ) ;
2013-05-26 15:47:54 +00:00
2014-11-10 16:15:34 +00:00
m_base = nullptr ;
2012-09-15 13:33:08 +00:00
CObject * fret = nullptr ;
CObject * power = nullptr ;
CObject * sel = nullptr ;
int objRank = 0 ;
2014-11-10 16:15:34 +00:00
for ( auto & line : level - > GetLines ( ) )
2012-06-26 20:23:05 +00:00
{
2014-11-10 16:15:34 +00:00
if ( line - > GetCommand ( ) = = " Map " )
m_map - > ZoomMap ( line - > GetParam ( " zoom " ) - > AsFloat ( ) ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
if ( line - > GetCommand ( ) = = " DoneResearch " )
g_researchDone = line - > GetParam ( " bits " ) - > AsInt ( ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
if ( line - > GetCommand ( ) = = " BlitzMode " )
2012-06-26 20:23:05 +00:00
{
2014-11-10 16:15:34 +00:00
float sleep = line - > GetParam ( " sleep " ) - > AsFloat ( ) ;
float delay = line - > GetParam ( " delay " ) - > AsFloat ( ) ;
float magnetic = line - > GetParam ( " magnetic " ) - > AsFloat ( ) * g_unit ;
float progress = line - > GetParam ( " progress " ) - > AsFloat ( ) ;
2012-09-15 13:33:08 +00:00
m_lightning - > SetStatus ( sleep , delay , magnetic , progress ) ;
2012-06-26 20:23:05 +00:00
}
2014-11-10 16:15:34 +00:00
if ( line - > GetCommand ( ) = = " CreateFret " )
2012-09-15 13:33:08 +00:00
fret = IOReadObject ( line , filename , - 1 ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
if ( line - > GetCommand ( ) = = " CreatePower " )
2012-09-15 13:33:08 +00:00
power = IOReadObject ( line , filename , - 1 ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
if ( line - > GetCommand ( ) = = " CreateObject " )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
CObject * obj = IOReadObject ( line , filename , objRank + + ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 16:15:34 +00:00
if ( line - > GetParam ( " select " ) - > AsBool ( false ) )
2012-09-15 13:33:08 +00:00
sel = obj ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( fret ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetFret ( fret ) ;
2013-02-16 21:37:43 +00:00
CTaskManip * task = new CTaskManip ( obj ) ;
2012-06-26 20:23:05 +00:00
task - > Start ( TMO_AUTO , TMA_GRAB ) ; // holds the object!
delete task ;
}
2012-09-15 13:33:08 +00:00
if ( power ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
obj - > SetPower ( power ) ;
power - > SetTruck ( obj ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
fret = nullptr ;
power = nullptr ;
2012-06-26 20:23:05 +00:00
}
}
2014-11-10 16:15:34 +00:00
delete level ;
2014-12-21 16:06:55 +00:00
CObjectManager * objman = CObjectManager : : GetInstancePointer ( ) ;
2013-02-16 21:37:43 +00:00
2012-06-26 20:23:05 +00:00
// Compiles scripts.
2012-09-15 13:33:08 +00:00
int nbError = 0 ;
int lastError = 0 ;
2012-06-26 20:23:05 +00:00
do
{
lastError = nbError ;
nbError = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : objman - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-15 13:33:08 +00:00
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
objRank = obj - > GetDefRank ( ) ;
if ( objRank = = - 1 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
LoadFileScript ( obj , filename , objRank , nbError ) ;
2012-06-26 20:23:05 +00:00
}
}
2012-09-15 13:33:08 +00:00
while ( nbError > 0 & & nbError ! = lastError ) ;
2012-06-26 20:23:05 +00:00
2015-04-07 11:18:34 +00:00
// Starts scripts
for ( auto it : objman - > GetAllObjects ( ) )
{
CObject * obj = it . second ;
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
if ( obj - > GetDefRank ( ) = = - 1 ) continue ;
CBrain * brain = obj - > GetBrain ( ) ;
if ( brain = = nullptr ) continue ;
Program * program = brain - > GetScriptRun ( ) ;
if ( program ! = nullptr )
{
brain - > RunProgram ( program ) ; // starts the program
}
}
2012-06-26 20:23:05 +00:00
// Reads the file of stacks of execution.
2014-11-10 16:15:34 +00:00
FILE * file = fOpen ( filecbot , " rb " ) ;
2012-09-15 13:33:08 +00:00
if ( file ! = NULL )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
long version ;
2012-06-26 20:23:05 +00:00
fRead ( & version , sizeof ( long ) , 1 , file ) ; // version of COLOBOT
2012-09-15 13:33:08 +00:00
if ( version = = 1 )
2012-06-26 20:23:05 +00:00
{
fRead ( & version , sizeof ( long ) , 1 , file ) ; // version of CBOT
2012-09-15 13:33:08 +00:00
if ( version = = CBotProgram : : GetVersion ( ) )
2012-06-26 20:23:05 +00:00
{
objRank = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : objman - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( obj - > GetType ( ) = = OBJECT_TOTO ) continue ;
if ( obj - > GetType ( ) = = OBJECT_FIX ) continue ;
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
if ( obj - > GetBurn ( ) ) continue ;
if ( obj - > GetDead ( ) ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( ! ReadFileStack ( obj , file , objRank + + ) ) break ;
2012-06-26 20:23:05 +00:00
}
}
}
CBotClass : : RestoreStaticState ( file ) ;
fClose ( file ) ;
}
2012-09-15 13:33:08 +00:00
return sel ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Writes the global parameters for free play
2012-06-26 20:23:05 +00:00
void CRobotMain : : WriteFreeParam ( )
{
m_freeResearch | = g_researchDone ;
m_freeBuild | = g_build ;
2013-05-01 19:02:43 +00:00
if ( m_gamerName = = " " ) return ;
2012-06-26 20:23:05 +00:00
2014-11-10 17:49:00 +00:00
COutputStream file ;
2014-11-10 18:02:07 +00:00
file . open ( std : : string ( GetSavegameDir ( ) ) + " / " + m_gamerName + " /research.gam " ) ;
2014-11-10 17:49:00 +00:00
if ( ! file . is_open ( ) )
{
CLogger : : GetInstancePointer ( ) - > Error ( " Unable to write free game unlock state \n " ) ;
return ;
}
file < < " research= " < < m_freeResearch < < " build= " < < m_freeBuild < < " \n " ;
file . close ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Reads the global parameters for free play
2012-06-26 20:23:05 +00:00
void CRobotMain : : ReadFreeParam ( )
{
m_freeResearch = 0 ;
m_freeBuild = 0 ;
2013-05-01 19:02:43 +00:00
if ( m_gamerName = = " " ) return ;
2012-06-26 20:23:05 +00:00
2014-11-10 18:02:07 +00:00
if ( ! CResourceManager : : Exists ( std : : string ( GetSavegameDir ( ) ) + " / " + m_gamerName + " /research.gam " ) )
2014-11-10 17:49:00 +00:00
return ;
CInputStream file ;
2014-11-10 18:02:07 +00:00
file . open ( std : : string ( GetSavegameDir ( ) ) + " / " + m_gamerName + " /research.gam " ) ;
2014-11-10 17:49:00 +00:00
if ( ! file . is_open ( ) )
{
CLogger : : GetInstancePointer ( ) - > Error ( " Unable to read free game unlock state \n " ) ;
return ;
}
2012-06-26 20:23:05 +00:00
2014-11-10 17:49:00 +00:00
std : : string line ;
2014-11-10 18:23:51 +00:00
std : : getline ( file , line ) ;
2014-11-10 17:49:00 +00:00
sscanf ( line . c_str ( ) , " research=%d build=%d \n " , & m_freeResearch , & m_freeBuild ) ;
2012-06-26 20:23:05 +00:00
2014-11-10 17:49:00 +00:00
file . close ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Resets all objects to their original position
2012-06-26 20:23:05 +00:00
void CRobotMain : : ResetObject ( )
{
2012-09-15 13:33:08 +00:00
// TODO: ?
2012-06-26 20:23:05 +00:00
#if 0
2012-09-15 13:33:08 +00:00
CObject * obj ;
CObject * truck ;
CAuto * objAuto ;
2012-06-26 20:23:05 +00:00
CBrain * brain ;
CPyro * pyro ;
ResetCap cap ;
Math : : Vector pos , angle ;
int i ;
2013-02-16 21:37:43 +00:00
CInstanceManager * iMan = CInstanceManager : : GetInstancePointer ( ) ;
2012-06-26 20:23:05 +00:00
// Removes all pyrotechnic effects in progress.
while ( true )
{
2013-02-16 21:37:43 +00:00
pyro = static_cast < CPyro * > ( iMan - > SearchInstance ( CLASS_PYRO , 0 ) ) ;
2012-06-26 20:23:05 +00:00
if ( pyro = = 0 ) break ;
pyro - > DeleteObject ( ) ;
delete pyro ;
}
// Removes all bullets in progress.
2012-09-15 13:33:08 +00:00
m_particle - > DeleteParticle ( PARTIGUN1 ) ;
m_particle - > DeleteParticle ( PARTIGUN2 ) ;
m_particle - > DeleteParticle ( PARTIGUN3 ) ;
m_particle - > DeleteParticle ( PARTIGUN4 ) ;
2012-06-26 20:23:05 +00:00
for ( i = 0 ; i < 1000000 ; i + + )
{
2013-02-16 21:37:43 +00:00
obj = static_cast < CObject * > ( iMan - > SearchInstance ( CLASS_OBJECT , i ) ) ;
2012-09-15 13:33:08 +00:00
if ( obj = = 0 ) break ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
cap = obj - > GetResetCap ( ) ;
2012-06-26 20:23:05 +00:00
if ( cap = = RESET_NONE ) continue ;
if ( cap = = RESET_DELETE )
{
2012-09-15 13:33:08 +00:00
truck = obj - > GetTruck ( ) ;
if ( truck ! = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
truck - > SetFret ( 0 ) ;
obj - > SetTruck ( 0 ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
obj - > DeleteObject ( ) ;
delete obj ;
2012-06-26 20:23:05 +00:00
i - - ;
continue ;
}
2012-09-15 13:33:08 +00:00
objAuto = obj - > GetAuto ( ) ;
if ( objAuto ! = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
objAuto - > Abort ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
if ( obj - > GetEnable ( ) ) // object still active?
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
brain = obj - > GetBrain ( ) ;
2012-06-26 20:23:05 +00:00
if ( brain ! = 0 )
{
2012-09-15 13:33:08 +00:00
pos = obj - > GetResetPosition ( ) ;
angle = obj - > GetResetAngle ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( pos = = obj - > GetPosition ( 0 ) & &
angle = = obj - > GetAngle ( 0 ) ) continue ;
2012-06-26 20:23:05 +00:00
brain - > StartTaskReset ( pos , angle ) ;
continue ;
}
}
2012-09-15 13:33:08 +00:00
obj - > SetEnable ( true ) ; // active again
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
pos = obj - > GetResetPosition ( ) ;
angle = obj - > GetResetAngle ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( pos = = obj - > GetPosition ( 0 ) & &
angle = = obj - > GetAngle ( 0 ) ) continue ;
2012-06-26 20:23:05 +00:00
2013-02-16 21:37:43 +00:00
pyro = new CPyro ( ) ;
2012-09-15 13:33:08 +00:00
pyro - > Create ( PT_RESET , obj ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
brain = obj - > GetBrain ( ) ;
2012-06-26 20:23:05 +00:00
if ( brain ! = 0 )
{
2012-09-15 13:33:08 +00:00
brain - > RunProgram ( obj - > GetResetRun ( ) ) ;
2012-06-26 20:23:05 +00:00
}
}
# else
2012-09-15 13:33:08 +00:00
m_resetCreate = true ;
2012-06-26 20:23:05 +00:00
# endif
}
2012-09-15 13:33:08 +00:00
//! Resets all objects to their original position
2012-06-26 20:23:05 +00:00
void CRobotMain : : ResetCreate ( )
{
SaveAllScript ( ) ;
// Removes all bullets in progress.
2012-09-15 13:33:08 +00:00
m_particle - > DeleteParticle ( Gfx : : PARTIGUN1 ) ;
m_particle - > DeleteParticle ( Gfx : : PARTIGUN2 ) ;
m_particle - > DeleteParticle ( Gfx : : PARTIGUN3 ) ;
m_particle - > DeleteParticle ( Gfx : : PARTIGUN4 ) ;
2012-06-26 20:23:05 +00:00
DeselectAll ( ) ; // removes the control buttons
DeleteAllObjects ( ) ; // removes all the current 3D Scene
2012-09-15 13:33:08 +00:00
m_particle - > FlushParticle ( ) ;
2012-06-26 20:23:05 +00:00
m_terrain - > FlushBuildingLevel ( ) ;
2013-02-16 21:37:43 +00:00
CInstanceManager * iMan = CInstanceManager : : GetInstancePointer ( ) ;
iMan - > Flush ( CLASS_PHYSICS ) ;
iMan - > Flush ( CLASS_BRAIN ) ;
iMan - > Flush ( CLASS_PYRO ) ;
2013-12-30 09:51:29 +00:00
CObjectManager : : GetInstancePointer ( ) - > Flush ( ) ;
2013-02-16 21:37:43 +00:00
2012-09-15 13:33:08 +00:00
m_camera - > SetType ( Gfx : : CAM_TYPE_DIALOG ) ;
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
try {
CreateScene ( m_dialog - > GetSceneSoluce ( ) , false , true ) ;
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
if ( ! GetNiceReset ( ) ) return ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2014-09-24 20:54:26 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
ResetCap cap = obj - > GetResetCap ( ) ;
if ( cap = = RESET_NONE ) continue ;
2012-06-26 20:23:05 +00:00
2014-09-24 20:54:26 +00:00
Gfx : : CPyro * pyro = new Gfx : : CPyro ( ) ;
pyro - > Create ( Gfx : : PT_RESET , obj ) ;
}
}
catch ( const CLevelParserException & e )
{
CLogger : : GetInstancePointer ( ) - > Error ( " An error occured while trying to reset scene \n " ) ;
CLogger : : GetInstancePointer ( ) - > Error ( " %s \n " , e . what ( ) ) ;
ChangePhase ( PHASE_TERM ) ;
2012-06-26 20:23:05 +00:00
}
}
2013-04-13 09:44:16 +00:00
//! Updates the audiotracks
void CRobotMain : : UpdateAudio ( bool frame )
{
for ( int t = 0 ; t < m_audioChangeTotal ; t + + )
{
2013-05-26 15:47:54 +00:00
if ( m_audioChange [ t ] . changed ) continue ;
2013-04-13 13:07:08 +00:00
2013-04-13 09:44:16 +00:00
Math : : Vector bPos = m_audioChange [ t ] . pos ;
bPos . y = 0.0f ;
Math : : Vector oPos ;
int nb = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2013-04-13 09:44:16 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2013-04-13 09:44:16 +00:00
// Do not use GetActif () because an invisible worm (underground)
// should be regarded as existing here!
if ( obj - > GetLock ( ) ) continue ;
if ( obj - > GetRuin ( ) ) continue ;
if ( ! obj - > GetEnable ( ) ) continue ;
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_SCRAP2 | |
type = = OBJECT_SCRAP3 | |
type = = OBJECT_SCRAP4 | |
type = = OBJECT_SCRAP5 ) // wastes?
{
type = OBJECT_SCRAP1 ;
}
2013-12-29 14:03:21 +00:00
ToolType tool = CObject : : GetToolFromObject ( type ) ;
DriveType drive = CObject : : GetDriveFromObject ( type ) ;
if ( m_audioChange [ t ] . tool ! = TOOL_OTHER ) if ( tool ! = m_audioChange [ t ] . tool ) continue ;
if ( m_audioChange [ t ] . drive ! = DRIVE_OTHER ) if ( drive ! = m_audioChange [ t ] . drive ) continue ;
2013-04-13 09:44:16 +00:00
2013-12-29 14:03:21 +00:00
if ( m_audioChange [ t ] . tool = = TOOL_OTHER & & m_audioChange [ t ] . drive = = DRIVE_OTHER ) if ( type ! = m_audioChange [ t ] . type ) continue ;
2013-04-13 09:44:16 +00:00
2013-04-20 10:08:48 +00:00
float energyLevel = - 1 ;
CObject * power = obj - > GetPower ( ) ;
2013-05-26 15:47:54 +00:00
if ( power ! = nullptr )
{
2013-04-20 10:08:48 +00:00
energyLevel = power - > GetEnergy ( ) ;
if ( power - > GetType ( ) = = OBJECT_ATOMIC ) energyLevel * = 100 ;
2015-03-28 11:21:56 +00:00
} else {
if ( obj - > GetType ( ) = = OBJECT_POWER | | obj - > GetType ( ) = = OBJECT_ATOMIC )
{
energyLevel = obj - > GetEnergy ( ) ;
if ( obj - > GetType ( ) = = OBJECT_ATOMIC ) energyLevel * = 100 ;
}
2013-04-20 10:08:48 +00:00
}
2013-12-25 17:53:32 +00:00
if ( energyLevel < m_audioChange [ t ] . powermin | | energyLevel > m_audioChange [ t ] . powermax )
continue ;
2013-04-20 10:08:48 +00:00
2013-04-13 09:44:16 +00:00
if ( obj - > GetTruck ( ) = = 0 )
oPos = obj - > GetPosition ( 0 ) ;
else
oPos = obj - > GetTruck ( ) - > GetPosition ( 0 ) ;
oPos . y = 0.0f ;
if ( Math : : DistanceProjected ( oPos , bPos ) < = m_audioChange [ t ] . dist )
nb + + ;
}
if ( nb > = m_audioChange [ t ] . min & &
2013-04-13 13:07:08 +00:00
nb < = m_audioChange [ t ] . max )
2013-04-13 09:44:16 +00:00
{
2013-12-25 17:53:32 +00:00
CLogger : : GetInstancePointer ( ) - > Info ( " Changing music to \" %s \" \n " , m_audioChange [ t ] . music ) ;
2013-04-13 09:44:16 +00:00
m_sound - > PlayMusic ( std : : string ( m_audioChange [ t ] . music ) , m_audioChange [ t ] . repeat ) ;
m_audioChange [ t ] . changed = true ;
}
}
}
2013-04-30 19:43:59 +00:00
void CRobotMain : : SetEndMission ( Error result , float delay )
{
2013-05-26 15:47:54 +00:00
if ( m_controller ! = nullptr )
{
2013-04-30 19:43:59 +00:00
m_endTakeWinDelay = delay ;
m_endTakeLostDelay = delay ;
m_missionResult = result ;
}
}
2012-09-15 13:33:08 +00:00
//! Checks if the mission is over
Error CRobotMain : : CheckEndMission ( bool frame )
2012-06-26 20:23:05 +00:00
{
2013-05-26 15:47:54 +00:00
if ( m_controller ! = nullptr )
{
if ( m_missionResult = = INFO_LOST ) //mission lost?
{
2013-04-30 19:43:59 +00:00
m_displayText - > DisplayError ( INFO_LOST , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2013-04-30 19:43:59 +00:00
m_winDelay = 0.0f ;
2013-05-26 15:47:54 +00:00
if ( m_lostDelay = = 0 ) m_lostDelay = m_endTakeLostDelay ;
2013-04-30 19:43:59 +00:00
m_displayText - > SetEnable ( false ) ;
2014-10-31 19:49:40 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2013-04-30 19:43:59 +00:00
}
2013-05-26 15:47:54 +00:00
if ( m_missionResult = = INFO_LOSTq ) //mission lost?
{
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2013-04-30 19:43:59 +00:00
m_winDelay = 0.0f ;
2013-05-26 15:47:54 +00:00
if ( m_lostDelay = = 0 ) m_lostDelay = 0.1f ;
2013-04-30 19:43:59 +00:00
m_displayText - > SetEnable ( false ) ;
2014-10-31 19:49:40 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2013-04-30 19:43:59 +00:00
}
2014-11-09 18:26:36 +00:00
if ( frame & & m_base ! = nullptr & & m_base - > GetSelectable ( ) ) return ERR_MISSION_NOTERM ;
2013-04-30 19:43:59 +00:00
if ( m_missionResult = = ERR_OK ) { //mission win?
2013-05-01 10:12:32 +00:00
m_displayText - > DisplayError ( INFO_WIN , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
2014-10-29 16:53:46 +00:00
if ( m_missionTimerEnabled & & m_missionTimerStarted ) {
CLogger : : GetInstancePointer ( ) - > Info ( " Mission time: %s \n " , TimeFormat ( m_missionTimer ) . c_str ( ) ) ;
m_displayText - > DisplayText ( ( " Time: " + TimeFormat ( m_missionTimer ) ) . c_str ( ) , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
}
m_missionTimerEnabled = m_missionTimerStarted = false ;
2013-05-26 15:47:54 +00:00
if ( m_winDelay = = 0 ) m_winDelay = m_endTakeWinDelay ;
2013-04-30 19:43:59 +00:00
m_lostDelay = 0.0f ;
m_displayText - > SetEnable ( false ) ;
2014-10-31 19:49:40 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2013-04-30 19:43:59 +00:00
}
if ( m_missionResult = = ERR_MISSION_NOTERM ) m_displayText - > SetEnable ( true ) ;
return m_missionResult ;
}
2013-04-28 18:05:19 +00:00
2012-09-15 13:33:08 +00:00
for ( int t = 0 ; t < m_endTakeTotal ; t + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_endTake [ t ] . message [ 0 ] ! = 0 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
Math : : Vector bPos = m_endTake [ t ] . pos ;
2012-06-26 20:23:05 +00:00
bPos . y = 0.0f ;
2012-09-15 13:33:08 +00:00
Math : : Vector oPos ;
int nb = 0 ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-06-26 20:23:05 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
// Do not use GetActif () because an invisible worm (underground)
2012-06-26 20:23:05 +00:00
// should be regarded as existing here!
2012-09-15 13:33:08 +00:00
if ( obj - > GetLock ( ) ) continue ;
if ( obj - > GetRuin ( ) ) continue ;
if ( ! obj - > GetEnable ( ) ) continue ;
2015-03-28 11:19:40 +00:00
if ( ! m_endTake [ t ] . countTransported )
{
if ( obj - > GetTruck ( ) ! = nullptr ) continue ;
}
2012-09-15 13:33:08 +00:00
ObjectType type = obj - > GetType ( ) ;
if ( type = = OBJECT_SCRAP2 | |
type = = OBJECT_SCRAP3 | |
type = = OBJECT_SCRAP4 | |
type = = OBJECT_SCRAP5 ) // wastes?
2012-06-26 20:23:05 +00:00
{
type = OBJECT_SCRAP1 ;
}
2013-12-29 14:03:21 +00:00
ToolType tool = CObject : : GetToolFromObject ( type ) ;
DriveType drive = CObject : : GetDriveFromObject ( type ) ;
if ( m_endTake [ t ] . tool ! = TOOL_OTHER ) if ( tool ! = m_endTake [ t ] . tool ) continue ;
if ( m_endTake [ t ] . drive ! = DRIVE_OTHER ) if ( drive ! = m_endTake [ t ] . drive ) continue ;
if ( m_endTake [ t ] . tool = = TOOL_OTHER & & m_endTake [ t ] . drive = = DRIVE_OTHER ) if ( type ! = m_endTake [ t ] . type ) continue ;
2012-09-15 13:33:08 +00:00
2013-04-20 10:08:48 +00:00
float energyLevel = - 1 ;
CObject * power = obj - > GetPower ( ) ;
2013-05-26 15:47:54 +00:00
if ( power ! = nullptr )
{
2013-04-20 10:08:48 +00:00
energyLevel = power - > GetEnergy ( ) ;
if ( power - > GetType ( ) = = OBJECT_ATOMIC ) energyLevel * = 100 ;
2015-03-28 11:21:56 +00:00
} else {
if ( obj - > GetType ( ) = = OBJECT_POWER | | obj - > GetType ( ) = = OBJECT_ATOMIC )
{
energyLevel = obj - > GetEnergy ( ) ;
if ( obj - > GetType ( ) = = OBJECT_ATOMIC ) energyLevel * = 100 ;
}
2013-04-20 10:08:48 +00:00
}
if ( energyLevel < m_endTake [ t ] . powermin | | energyLevel > m_endTake [ t ] . powermax ) continue ;
2012-09-15 13:33:08 +00:00
if ( obj - > GetTruck ( ) = = 0 )
oPos = obj - > GetPosition ( 0 ) ;
2012-06-26 20:23:05 +00:00
else
2012-09-15 13:33:08 +00:00
oPos = obj - > GetTruck ( ) - > GetPosition ( 0 ) ;
2012-06-26 20:23:05 +00:00
oPos . y = 0.0f ;
2012-09-15 13:33:08 +00:00
if ( Math : : DistanceProjected ( oPos , bPos ) < = m_endTake [ t ] . dist )
2012-06-26 20:23:05 +00:00
nb + + ;
}
2012-09-15 13:33:08 +00:00
if ( nb < = m_endTake [ t ] . lost )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_endTake [ t ] . type = = OBJECT_HUMAN )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_lostDelay = = 0.0f )
2012-06-26 20:23:05 +00:00
{
m_lostDelay = 0.1f ; // lost immediately
m_winDelay = 0.0f ;
}
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2012-06-26 20:23:05 +00:00
m_displayText - > SetEnable ( false ) ;
2014-11-10 19:23:18 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2012-06-26 20:23:05 +00:00
return INFO_LOSTq ;
}
else
{
2012-09-15 13:33:08 +00:00
if ( m_lostDelay = = 0.0f )
2012-06-26 20:23:05 +00:00
{
m_displayText - > DisplayError ( INFO_LOST , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
m_lostDelay = m_endTakeLostDelay ; // lost in 6 seconds
m_winDelay = 0.0f ;
}
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2012-06-26 20:23:05 +00:00
m_displayText - > SetEnable ( false ) ;
2014-11-10 19:23:18 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2012-06-26 20:23:05 +00:00
return INFO_LOST ;
}
}
2012-09-15 13:33:08 +00:00
if ( nb < m_endTake [ t ] . min | |
2013-04-28 16:33:59 +00:00
nb > m_endTake [ t ] . max | |
2013-04-28 18:05:19 +00:00
m_endTakeNever )
2012-06-26 20:23:05 +00:00
{
m_displayText - > SetEnable ( true ) ;
return ERR_MISSION_NOTERM ;
}
2012-09-15 13:33:08 +00:00
if ( m_endTake [ t ] . immediat )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_winDelay = = 0.0f )
2012-06-26 20:23:05 +00:00
{
m_winDelay = m_endTakeWinDelay ; // wins in x seconds
m_lostDelay = 0.0f ;
}
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2012-06-26 20:23:05 +00:00
m_displayText - > SetEnable ( false ) ;
2014-11-10 19:23:18 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2012-06-26 20:23:05 +00:00
return ERR_OK ; // mission ended
}
}
2012-09-15 13:33:08 +00:00
if ( m_endTakeResearch ! = 0 )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_endTakeResearch ! = ( m_endTakeResearch & g_researchDone ) )
2012-06-26 20:23:05 +00:00
{
m_displayText - > SetEnable ( true ) ;
return ERR_MISSION_NOTERM ;
}
}
2012-09-15 13:33:08 +00:00
if ( m_endTakeWinDelay = = - 1.0f )
2012-06-26 20:23:05 +00:00
{
m_winDelay = 1.0f ; // wins in one second
m_lostDelay = 0.0f ;
2014-10-29 16:53:46 +00:00
m_missionTimerEnabled = m_missionTimerStarted = false ;
2012-06-26 20:23:05 +00:00
m_displayText - > SetEnable ( false ) ;
2014-10-31 19:49:40 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2012-06-26 20:23:05 +00:00
return ERR_OK ; // mission ended
}
2014-11-09 18:26:36 +00:00
if ( frame & & m_base ! = nullptr & & m_base - > GetSelectable ( ) ) return ERR_MISSION_NOTERM ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( m_winDelay = = 0.0f )
2012-06-26 20:23:05 +00:00
{
m_displayText - > DisplayError ( INFO_WIN , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
2014-10-29 16:53:46 +00:00
if ( m_missionTimerEnabled & & m_missionTimerStarted ) {
CLogger : : GetInstancePointer ( ) - > Info ( " Mission time: %s \n " , TimeFormat ( m_missionTimer ) . c_str ( ) ) ;
m_displayText - > DisplayText ( ( " Time: " + TimeFormat ( m_missionTimer ) ) . c_str ( ) , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
}
m_missionTimerEnabled = m_missionTimerStarted = false ;
2012-06-26 20:23:05 +00:00
m_winDelay = m_endTakeWinDelay ; // wins in two seconds
m_lostDelay = 0.0f ;
}
2014-11-10 19:23:18 +00:00
if ( m_exitAfterMission )
m_eventQueue - > AddEvent ( Event ( EVENT_QUIT ) ) ;
2012-06-26 20:23:05 +00:00
m_displayText - > SetEnable ( false ) ;
return ERR_OK ; // mission ended
}
2012-09-15 13:33:08 +00:00
//! Checks if the mission is finished after displaying a message
2012-09-15 16:50:51 +00:00
void CRobotMain : : CheckEndMessage ( const char * message )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
for ( int t = 0 ; t < m_endTakeTotal ; t + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_endTake [ t ] . message [ 0 ] = = 0 ) continue ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( strcmp ( m_endTake [ t ] . message , message ) = = 0 )
2012-06-26 20:23:05 +00:00
{
m_displayText - > DisplayError ( INFO_WIN , Math : : Vector ( 0.0f , 0.0f , 0.0f ) ) ;
m_winDelay = m_endTakeWinDelay ; // wins in 2 seconds
m_lostDelay = 0.0f ;
}
}
}
2012-09-15 13:33:08 +00:00
//! Returns the number of instructions required
int CRobotMain : : GetObligatoryToken ( )
2012-06-26 20:23:05 +00:00
{
return m_obligatoryTotal ;
}
2012-09-15 13:33:08 +00:00
//! Returns the name of a required instruction
char * CRobotMain : : GetObligatoryToken ( int i )
2012-06-26 20:23:05 +00:00
{
return m_obligatoryToken [ i ] ;
}
2012-09-15 13:33:08 +00:00
//! Checks if an instruction is part of the obligatory list
2012-09-15 16:50:51 +00:00
int CRobotMain : : IsObligatoryToken ( const char * token )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < m_obligatoryTotal ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( strcmp ( token , m_obligatoryToken [ i ] ) = = 0 )
2012-06-26 20:23:05 +00:00
return i ;
}
return - 1 ;
}
2012-09-15 13:33:08 +00:00
//! Checks if an instruction is not part of the banned list
2012-09-15 16:50:51 +00:00
bool CRobotMain : : IsProhibitedToken ( const char * token )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
for ( int i = 0 ; i < m_prohibitedTotal ; i + + )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( strcmp ( token , m_prohibitedToken [ i ] ) = = 0 )
2012-06-26 20:23:05 +00:00
return false ;
}
return true ;
}
2012-09-15 13:33:08 +00:00
//! Indicates whether it is possible to control a driving robot
bool CRobotMain : : GetTrainerPilot ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_trainerPilot ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Indicates whether the scene is fixed, without interaction
bool CRobotMain : : GetFixScene ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_fixScene ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
char * CRobotMain : : GetTitle ( )
2012-06-26 20:23:05 +00:00
{
return m_title ;
}
2012-09-15 13:33:08 +00:00
char * CRobotMain : : GetResume ( )
2012-06-26 20:23:05 +00:00
{
return m_resume ;
}
2012-09-15 13:33:08 +00:00
char * CRobotMain : : GetScriptName ( )
2012-06-26 20:23:05 +00:00
{
return m_scriptName ;
}
2012-09-15 13:33:08 +00:00
char * CRobotMain : : GetScriptFile ( )
2012-06-26 20:23:05 +00:00
{
return m_scriptFile ;
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetGlint ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetGlint ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetSoluce4 ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetSoluce4 ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetMovies ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetMovies ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetNiceReset ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetNiceReset ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetHimselfDamage ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetHimselfDamage ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetShowSoluce ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_showSoluce ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetSceneSoluce ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( m_infoFilename [ SATCOM_SOLUCE ] [ 0 ] = = 0 ) return false ;
return m_dialog - > GetSceneSoluce ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetShowAll ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_showAll ;
2012-06-26 20:23:05 +00:00
}
2012-09-29 23:51:37 +00:00
bool CRobotMain : : GetRadar ( )
2012-06-26 20:23:05 +00:00
{
2012-09-29 23:51:37 +00:00
if ( m_cheatRadar )
return true ;
2014-12-21 16:06:55 +00:00
for ( auto it : CObjectManager : : GetInstancePointer ( ) - > GetAllObjects ( ) )
2012-09-29 23:51:37 +00:00
{
2014-12-21 16:06:55 +00:00
CObject * obj = it . second ;
2012-09-29 23:51:37 +00:00
ObjectType type = obj - > GetType ( ) ;
2013-04-11 13:34:03 +00:00
if ( type = = OBJECT_RADAR & & ! obj - > GetLock ( ) )
2012-09-29 23:51:37 +00:00
return true ;
}
return false ;
2012-06-26 20:23:05 +00:00
}
2012-09-26 20:57:43 +00:00
const char * CRobotMain : : GetSavegameDir ( )
2012-06-26 20:23:05 +00:00
{
2014-11-10 18:26:36 +00:00
return m_dialog - > GetSavegameDir ( ) . c_str ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-26 20:57:43 +00:00
const char * CRobotMain : : GetPublicDir ( )
2012-06-26 20:23:05 +00:00
{
2012-09-26 20:57:43 +00:00
return m_dialog - > GetPublicDir ( ) . c_str ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-26 20:57:43 +00:00
const char * CRobotMain : : GetFilesDir ( )
2012-06-26 20:23:05 +00:00
{
2012-09-26 20:57:43 +00:00
return m_dialog - > GetFilesDir ( ) . c_str ( ) ;
2012-06-26 20:23:05 +00:00
}
2013-03-24 18:05:20 +00:00
bool CRobotMain : : GetRetroMode ( )
{
return m_retroStyle ;
}
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
//! Change the player's name
2012-09-18 20:33:28 +00:00
void CRobotMain : : SetGamerName ( const char * name )
2012-06-26 20:23:05 +00:00
{
2013-05-01 19:02:43 +00:00
m_gamerName = std : : string ( name ) ;
2012-06-26 20:23:05 +00:00
SetGlobalGamerName ( m_gamerName ) ;
ReadFreeParam ( ) ;
}
2013-05-01 19:02:43 +00:00
//! Gets the player's name
2012-09-15 13:33:08 +00:00
char * CRobotMain : : GetGamerName ( )
2012-06-26 20:23:05 +00:00
{
2013-05-01 19:02:43 +00:00
return const_cast < char * > ( m_gamerName . c_str ( ) ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the representation to use for the player
int CRobotMain : : GetGamerFace ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetGamerFace ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the representation to use for the player
int CRobotMain : : GetGamerGlasses ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetGamerGlasses ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the mode with just the head
bool CRobotMain : : GetGamerOnlyHead ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetGamerOnlyHead ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Returns the angle of presentation
float CRobotMain : : GetPersoAngle ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_dialog - > GetPersoAngle ( ) ;
2012-06-26 20:23:05 +00:00
}
2014-07-11 14:40:07 +00:00
char * CRobotMain : : GetSceneName ( )
{
return m_dialog - > GetSceneName ( ) ;
}
int CRobotMain : : GetSceneRank ( )
{
return m_dialog - > GetSceneRank ( ) ;
}
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
//! Changes on the pause mode
2013-12-31 11:58:45 +00:00
void CRobotMain : : ChangePause ( PauseType pause )
2012-06-26 20:23:05 +00:00
{
2013-12-31 11:58:45 +00:00
if ( pause ! = PAUSE_NONE )
m_pause - > SetPause ( pause ) ;
else
m_pause - > ClearPause ( ) ;
2012-06-26 20:23:05 +00:00
2013-12-31 11:58:45 +00:00
m_sound - > MuteAll ( m_pause - > GetPause ( ) ) ;
2012-06-26 20:23:05 +00:00
CreateShortcuts ( ) ;
2013-12-31 11:58:45 +00:00
if ( m_pause - > GetPause ( ) ) HiliteClear ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Changes game speed
2012-06-26 20:23:05 +00:00
void CRobotMain : : SetSpeed ( float speed )
{
2012-10-06 21:35:27 +00:00
m_app - > SetSimulationSpeed ( speed ) ;
UpdateSpeedLabel ( ) ;
}
float CRobotMain : : GetSpeed ( )
{
return m_app - > GetSimulationSpeed ( ) ;
}
2012-06-26 20:23:05 +00:00
2012-10-06 21:35:27 +00:00
void CRobotMain : : UpdateSpeedLabel ( )
{
2012-10-17 19:48:40 +00:00
Ui : : CButton * pb = static_cast < Ui : : CButton * > ( m_interface - > SearchControl ( EVENT_SPEED ) ) ;
2012-10-06 21:35:27 +00:00
float speed = m_app - > GetSimulationSpeed ( ) ;
2012-10-17 19:48:40 +00:00
2012-09-15 13:33:08 +00:00
if ( pb ! = nullptr )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
if ( speed = = 1.0f )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
pb - > ClearState ( Ui : : STATE_VISIBLE ) ;
2012-06-26 20:23:05 +00:00
}
else
{
2012-09-15 13:33:08 +00:00
char text [ 10 ] ;
2012-06-26 20:23:05 +00:00
sprintf ( text , " x%.1f " , speed ) ;
pb - > SetName ( text ) ;
2012-09-15 13:33:08 +00:00
pb - > SetState ( Ui : : STATE_VISIBLE ) ;
2012-06-26 20:23:05 +00:00
}
}
}
2012-09-15 13:33:08 +00:00
//! Creates interface shortcuts to the units
2012-06-26 20:23:05 +00:00
bool CRobotMain : : CreateShortcuts ( )
{
2012-09-15 13:33:08 +00:00
if ( m_phase ! = PHASE_SIMUL ) return false ;
if ( ! m_shortCut ) return false ;
2012-06-26 20:23:05 +00:00
return m_short - > CreateShortcuts ( ) ;
}
2012-09-15 13:33:08 +00:00
//! Updates the map
2012-06-26 20:23:05 +00:00
void CRobotMain : : UpdateMap ( )
{
m_map - > UpdateMap ( ) ;
}
2012-09-15 13:33:08 +00:00
//! Indicates whether the mini-map is visible
bool CRobotMain : : GetShowMap ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_map - > GetShowMap ( ) & & m_mapShow ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Management of the lock mode for movies
void CRobotMain : : SetMovieLock ( bool lock )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_movieLock = lock ;
m_engine - > SetMovieLock ( m_movieLock ) ;
2012-06-26 20:23:05 +00:00
CreateShortcuts ( ) ;
2012-09-15 13:33:08 +00:00
m_map - > ShowMap ( ! m_movieLock & & m_mapShow ) ;
if ( m_movieLock ) HiliteClear ( ) ;
2012-09-20 18:37:37 +00:00
if ( m_movieLock )
m_app - > SetMouseMode ( MOUSE_NONE ) ;
else
m_app - > SetMouseMode ( MOUSE_ENGINE ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetMovieLock ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_movieLock ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetInfoLock ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_displayInfo ! = nullptr ; // info in progress?
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Management of the blocking of the call of SatCom
void CRobotMain : : SetSatComLock ( bool lock )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_satComLock = lock ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetSatComLock ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_satComLock ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Management of the lock mode for the edition
void CRobotMain : : SetEditLock ( bool lock , bool edit )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_editLock = lock ;
2012-06-26 20:23:05 +00:00
CreateShortcuts ( ) ;
// Do not remove the card if it contains a still image.
2012-09-15 13:33:08 +00:00
if ( ! lock | | ! m_map - > GetFixImage ( ) )
m_map - > ShowMap ( ! m_editLock & & m_mapShow ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
m_displayText - > HideText ( lock ) ;
2014-12-11 18:01:57 +00:00
m_input - > ResetKeyStates ( ) ;
2012-06-26 20:23:05 +00:00
2012-09-15 13:33:08 +00:00
if ( m_editLock )
2012-06-26 20:23:05 +00:00
HiliteClear ( ) ;
else
2012-09-15 13:33:08 +00:00
m_editFull = false ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetEditLock ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_editLock ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Management of the fullscreen mode during editing
void CRobotMain : : SetEditFull ( bool full )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_editFull = full ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetEditFull ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_editFull ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetFreePhoto ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_freePhoto ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Indicates whether mouse is on an friend object, on which we should not shoot
void CRobotMain : : SetFriendAim ( bool friendAim )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
m_friendAim = friendAim ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
bool CRobotMain : : GetFriendAim ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_friendAim ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Management of the precision of drawing the ground
2012-06-26 20:23:05 +00:00
void CRobotMain : : SetTracePrecision ( float factor )
{
m_engine - > SetTracePrecision ( factor ) ;
}
2012-09-15 13:33:08 +00:00
float CRobotMain : : GetTracePrecision ( )
2012-06-26 20:23:05 +00:00
{
2012-09-15 13:33:08 +00:00
return m_engine - > GetTracePrecision ( ) ;
2012-06-26 20:23:05 +00:00
}
2012-09-15 13:33:08 +00:00
//! Starts music with a mission
2012-06-26 20:23:05 +00:00
void CRobotMain : : StartMusic ( )
{
2013-04-13 09:44:16 +00:00
CLogger : : GetInstancePointer ( ) - > Debug ( " Starting music... \n " ) ;
2013-04-13 14:35:35 +00:00
if ( m_audioTrack ! = " " )
2012-06-26 20:23:05 +00:00
{
2013-12-28 11:30:46 +00:00
m_sound - > PlayMusic ( m_audioTrack , m_audioRepeat , 0.0f ) ;
2013-05-26 15:47:54 +00:00
}
2012-06-26 20:23:05 +00:00
}
2014-02-21 13:19:58 +00:00
//! Starts pause music
void CRobotMain : : StartPauseMusic ( PauseType pause )
{
switch ( pause ) {
case PAUSE_EDITOR :
2014-03-02 13:39:29 +00:00
if ( m_editorTrack ! = " " )
m_sound - > PlayPauseMusic ( m_editorTrack , m_editorRepeat ) ;
2014-02-21 13:19:58 +00:00
break ;
case PAUSE_SATCOM :
2014-03-02 13:39:29 +00:00
if ( m_satcomTrack ! = " " )
m_sound - > PlayPauseMusic ( m_satcomTrack , m_satcomRepeat ) ;
2014-02-21 13:19:58 +00:00
break ;
default :
// Don't change music
break ;
}
}
2012-09-15 13:33:08 +00:00
//! Removes hilite and tooltip
2012-06-26 20:23:05 +00:00
void CRobotMain : : ClearInterface ( )
{
HiliteClear ( ) ; // removes setting evidence
2013-12-02 23:11:26 +00:00
m_tooltipName . clear ( ) ; // really removes the tooltip
2012-06-26 20:23:05 +00:00
}
2013-04-01 16:24:12 +00:00
2013-06-24 20:09:39 +00:00
void CRobotMain : : DisplayError ( Error err , CObject * pObj , float time )
{
m_displayText - > DisplayError ( err , pObj , time ) ;
}
void CRobotMain : : DisplayError ( Error err , Math : : Vector goal , float height , float dist , float time )
{
m_displayText - > DisplayError ( err , goal , height , dist , time ) ;
}
2014-07-11 14:40:07 +00:00
2014-09-26 18:53:11 +00:00
std : : string & CRobotMain : : GetUserLevelName ( int id )
2014-07-11 14:40:07 +00:00
{
2014-09-26 18:53:11 +00:00
return m_dialog - > GetUserLevelName ( id ) ;
2014-07-11 14:40:07 +00:00
}
2014-10-29 16:53:46 +00:00
void CRobotMain : : StartMissionTimer ( )
{
if ( m_missionTimerEnabled & & ! m_missionTimerStarted ) {
CLogger : : GetInstancePointer ( ) - > Info ( " Starting mission timer... \n " ) ;
m_missionTimerStarted = true ;
}
}
2014-11-11 13:50:44 +00:00
void CRobotMain : : SetAutosave ( bool enable )
{
m_autosave = enable ;
m_autosaveLast = m_gameTime ;
AutosaveRotate ( false ) ;
}
bool CRobotMain : : GetAutosave ( )
{
return m_autosave ;
}
void CRobotMain : : SetAutosaveInterval ( int interval )
{
m_autosaveInterval = interval ;
m_autosaveLast = m_gameTime ;
}
int CRobotMain : : GetAutosaveInterval ( )
{
return m_autosaveInterval ;
}
void CRobotMain : : SetAutosaveSlots ( int slots )
{
m_autosaveSlots = slots ;
AutosaveRotate ( false ) ;
}
int CRobotMain : : GetAutosaveSlots ( )
{
return m_autosaveSlots ;
}
int CRobotMain : : AutosaveRotate ( bool freeOne )
{
CLogger : : GetInstancePointer ( ) - > Debug ( " Rotate autosaves... \n " ) ;
// Find autosave dirs
auto saveDirs = CResourceManager : : ListDirectories ( std : : string ( GetSavegameDir ( ) ) + " / " + GetGamerName ( ) ) ;
std : : map < int , std : : string > autosaveDirs ;
for ( auto & dir : saveDirs )
{
try
{
const std : : string autosavePrefix = " autosave " ;
if ( dir . substr ( 0 , autosavePrefix . length ( ) ) = = " autosave " )
{
int id = boost : : lexical_cast < int > ( dir . substr ( autosavePrefix . length ( ) ) ) ;
autosaveDirs [ id ] = std : : string ( GetSavegameDir ( ) ) + " / " + GetGamerName ( ) + " / " + dir ;
}
}
catch ( . . . )
{
2014-11-11 13:56:19 +00:00
CLogger : : GetInstancePointer ( ) - > Info ( " Bad autosave found: %s \n " , dir . c_str ( ) ) ;
2014-11-11 13:50:44 +00:00
// skip
}
}
if ( autosaveDirs . size ( ) = = 0 ) return 1 ;
// Remove all but last m_autosaveSlots
std : : map < int , std : : string > autosavesToKeep ;
int last_id = autosaveDirs . rbegin ( ) - > first ;
int count = 0 ;
int to_keep = m_autosaveSlots - ( freeOne ? 1 : 0 ) ;
int new_last_id = Math : : Min ( autosaveDirs . size ( ) , to_keep ) ;
bool rotate = false ;
for ( int i = last_id ; i > 0 ; i - - )
{
if ( autosaveDirs . count ( i ) > 0 )
{
count + + ;
if ( count > m_autosaveSlots - ( freeOne ? 1 : 0 ) | | ! m_autosave )
{
CLogger : : GetInstancePointer ( ) - > Trace ( " Remove %s \n " , autosaveDirs [ i ] . c_str ( ) ) ;
CResourceManager : : RemoveDirectory ( autosaveDirs [ i ] ) ;
rotate = true ;
}
else
{
CLogger : : GetInstancePointer ( ) - > Trace ( " Keep %s \n " , autosaveDirs [ i ] . c_str ( ) ) ;
autosavesToKeep [ new_last_id - count + 1 ] = autosaveDirs [ i ] ;
}
}
}
// Rename autosaves that we kept
if ( rotate ) {
for ( auto & save : autosavesToKeep ) {
std : : string newDir = std : : string ( GetSavegameDir ( ) ) + " / " + GetGamerName ( ) + " /autosave " + boost : : lexical_cast < std : : string > ( save . first ) ;
CLogger : : GetInstancePointer ( ) - > Trace ( " Rename %s -> %s \n " , save . second . c_str ( ) , newDir . c_str ( ) ) ;
CResourceManager : : Move ( save . second , newDir ) ;
}
}
return rotate ? count : count + 1 ;
}
void CRobotMain : : Autosave ( )
{
int id = AutosaveRotate ( true ) ;
CLogger : : GetInstancePointer ( ) - > Info ( " Autosave! \n " ) ;
std : : string dir = std : : string ( GetSavegameDir ( ) ) + " / " + GetGamerName ( ) + " /autosave " + boost : : lexical_cast < std : : string > ( id ) ;
if ( ! CResourceManager : : DirectoryExists ( dir ) )
{
CResourceManager : : CreateDirectory ( dir ) ;
}
std : : string savegameFileName = dir + " /data.sav " ;
std : : string fileCBot = CResourceManager : : GetSaveLocation ( ) + " / " + dir + " /cbot.run " ;
char timestr [ 100 ] ;
TimeToAscii ( time ( NULL ) , timestr ) ;
IOWriteScene ( savegameFileName . c_str ( ) , fileCBot . c_str ( ) , const_cast < char * > ( ( std : : string ( " [AUTOSAVE] " ) + timestr ) . c_str ( ) ) ) ;
m_dialog - > MakeSaveScreenshot ( dir + " /screen.png " ) ;
2014-12-22 09:35:05 +00:00
}
void CRobotMain : : SetExitAfterMission ( bool exit )
{
m_exitAfterMission = exit ;
2014-11-11 13:50:44 +00:00
}