| 1 |
#include "stdafx.h" |
| 2 |
#include "HighTimer.h" |
| 3 |
#include "Capture.h" |
| 4 |
#include "RSPV.h" |
| 5 |
#include "CJobTimer.h" |
| 6 |
#include "CScene.h" |
| 7 |
#include "CSaveFile.h" |
| 8 |
#include "CToggleIcon.h" |
| 9 |
#include "CPopMenu.h" |
| 10 |
#include "CDragContainer.h" |
| 11 |
#include "CModelSwitch.h" |
| 12 |
#include "CSkinPlugin.h" |
| 13 |
#include "CRailPlugin.h" |
| 14 |
#include "CTiePlugin.h" |
| 15 |
#include "CGirderPlugin.h" |
| 16 |
#include "CPierPlugin.h" |
| 17 |
#include "CLinePlugin.h" |
| 18 |
#include "CPolePlugin.h" |
| 19 |
#include "CTrainPlugin.h" |
| 20 |
#include "CStationPlugin.h" |
| 21 |
#include "CSurfacePlugin.h" |
| 22 |
#include "CEnvPlugin.h" |
| 23 |
#include "CNeutralMode.h" |
| 24 |
#include "CRailSelectMode.h" |
| 25 |
#include "CTieSelectMode.h" |
| 26 |
#include "CGirderSelectMode.h" |
| 27 |
#include "CPierSelectMode.h" |
| 28 |
#include "CLineSelectMode.h" |
| 29 |
#include "CPoleSelectMode.h" |
| 30 |
#include "CRailBuildMode.h" |
| 31 |
#include "CRailEditMode.h" |
| 32 |
#include "CTrainEditMode.h" |
| 33 |
#include "CDiaEditMode.h" |
| 34 |
#include "CTrainSetMode.h" |
| 35 |
#include "CTrainViewMode.h" |
| 36 |
#include "CStationSelectMode.h" |
| 37 |
#include "CStationBuildMode.h" |
| 38 |
#include "CStationEditMode.h" |
| 39 |
#include "CSceneEditMode.h" |
| 40 |
#include "CEnvEditMode.h" |
| 41 |
#include "CSimulationMode.h" |
| 42 |
#include "CFileMode.h" |
| 43 |
#include "CConfigMode.h" |
| 44 |
#include "CSkinSelectMode.h" |
| 45 |
#include "CVideoMode.h" |
| 46 |
#include "CExitMode.h" |
| 47 |
|
| 48 |
// �������� |
| 49 |
void ModelPluginFreeInst(); |
| 50 |
namespace LanguageResource{ |
| 51 |
bool InitLanguage(); |
| 52 |
} |
| 53 |
|
| 54 |
// �������� |
| 55 |
const int MODE_LABEL_WIDTH = TILE_UNIT*6; // ���[�h�\������ |
| 56 |
const int PANEL_HIDE_FRAME = MAXFPS; // �p�l���\������ |
| 57 |
const int MODE_SUB[MODE_NUM] = {8, 4, 3, 3, 3, 5}; // �T�u���[�h�� |
| 58 |
const float PANEL_SHOW_RATIO = 0.5f; // �p�l���\�����x |
| 59 |
const float PANEL_HIDE_RATIO = 0.1f; // �p�l���B�����x |
| 60 |
|
| 61 |
// �O���O���[�o�� |
| 62 |
extern bool g_IgnoreAcceleration; |
| 63 |
|
| 64 |
// �����O���[�o�� |
| 65 |
int g_BlinkCounter = 0; // ���p�_���J�E���^ (0..MAXFPS-1) |
| 66 |
float g_BlinkAlpha = 0.0f; // ���p�_���A���t�@ (0.0..1.0) |
| 67 |
bool g_RenderBlink = false; // �����_�����O�_���t���O |
| 68 |
LONGLONG g_SoundSync = 0; // �T�E���h�����p�^�C�} |
| 69 |
float g_FrameDelta = 0.0f; // �t���[������ [ms] |
| 70 |
bool g_CursorLockable = false; // �J�[�\�����b�N�J�n |
| 71 |
|
| 72 |
CNeutralMode *g_NeutralMode; // �j���[�g�������[�h |
| 73 |
CRailSelectMode *g_RailSelectMode; // ���[���I�����[�h |
| 74 |
CTieSelectMode *g_TieSelectMode; // �����I�����[�h |
| 75 |
CGirderSelectMode *g_GirderSelectMode; // �����I�����[�h |
| 76 |
CPierSelectMode *g_PierSelectMode; // ���r�I�����[�h |
| 77 |
CLineSelectMode *g_LineSelectMode; // �����I�����[�h |
| 78 |
CPoleSelectMode *g_PoleSelectMode; // �������I�����[�h |
| 79 |
CRailBuildMode *g_RailBuildMode; // ���H���u���[�h |
| 80 |
CRailEditMode *g_RailEditMode; // ���H���W���[�h |
| 81 |
CTrainEditMode *g_TrainEditMode; // ���q�������[�h |
| 82 |
CDiaEditMode *g_DiaEditMode; // �^�s�������[�h |
| 83 |
CTrainSetMode *g_TrainSetMode; // ���q�z�u���[�h |
| 84 |
CTrainViewMode *g_TrainViewMode; // ���q���_���[�h |
| 85 |
CStructSelectMode *g_StructSelectMode; // �{���I�����[�h |
| 86 |
CStructBuildMode *g_StructBuildMode; // �{�����u���[�h |
| 87 |
CStructEditMode *g_StructEditMode; // �{�����W���[�h |
| 88 |
CStationSelectMode *g_StationSelectMode; // �{���I�����[�h |
| 89 |
CStationBuildMode *g_StationBuildMode; // �{�����u���[�h |
| 90 |
CStationEditMode *g_StationEditMode; // �{�����W���[�h |
| 91 |
CSceneEditMode *g_SceneEditMode; // �V�[�����W���[�h |
| 92 |
CEnvEditMode *g_EnvEditMode; // �������W���[�h |
| 93 |
CSimulationMode *g_SimulationMode; // �V�~�����[�V�����������[�h |
| 94 |
CFileMode *g_FileMode; // �t�@�C�����[�h |
| 95 |
CConfigMode *g_ConfigMode; // �����������[�h |
| 96 |
CSkinSelectMode *g_SkinSelectMode; // �X�L���I�����[�h |
| 97 |
CVideoMode *g_VideoMode; // �r�f�I���[�h |
| 98 |
CExitMode *g_ExitMode; // �I�����[�h |
| 99 |
CWindowCtrl *g_ModalDialog = NULL; // ���[�_���E�B���h�E |
| 100 |
|
| 101 |
// static �����o |
| 102 |
int CGameMode::ms_TopPanelTime; |
| 103 |
int CGameMode::ms_RightPanelTime; |
| 104 |
float CGameMode::ms_TopPanelShow; |
| 105 |
float CGameMode::ms_RightPanelShow; |
| 106 |
float CGameMode::ms_WindDirTemp; |
| 107 |
string CGameMode::ms_ModeLabel; |
| 108 |
CGameMode *CGameMode::ms_ActiveMode; |
| 109 |
CToggleIcon *CGameMode::ms_MenuIcon[]; |
| 110 |
|
| 111 |
/* |
| 112 |
* [static] |
| 113 |
* �������������� |
| 114 |
*/ |
| 115 |
void CGameMode::WakeUp(){ |
| 116 |
LanguageResource::InitLanguage(); |
| 117 |
g_ConfigMode = new CConfigMode; |
| 118 |
g_ConfigMode->Load(); |
| 119 |
} |
| 120 |
|
| 121 |
/* |
| 122 |
* [static] |
| 123 |
* �e���[�h������ |
| 124 |
*/ |
| 125 |
void CGameMode::InitMenu(){ |
| 126 |
CPluginMode::InitMenu(); |
| 127 |
int i, j; |
| 128 |
ms_TopPanelTime = ms_RightPanelTime = PANEL_HIDE_FRAME*3; |
| 129 |
ms_TopPanelShow = ms_RightPanelShow = 1.0f; |
| 130 |
string name[MODE_NUM][9] = {{ |
| 131 |
FlashIn("%s (F1)", lang(RailOperation)), |
| 132 |
FlashIn("%s (1)", lang(SelectRail)), |
| 133 |
FlashIn("%s (2)", lang(SelectTie)), |
| 134 |
FlashIn("%s (3)", lang(SelectGirder)), |
| 135 |
FlashIn("%s (4)", lang(SelectPier)), |
| 136 |
FlashIn("%s (5)", lang(SelectLine)), |
| 137 |
FlashIn("%s (6)", lang(SelectPole)), |
| 138 |
FlashIn("%s (7)", lang(BuildRail)), |
| 139 |
FlashIn("%s (8)", lang(EditRail)) |
| 140 |
}, { |
| 141 |
FlashIn("%s (F2)", lang(TrainOperation)), |
| 142 |
FlashIn("%s (1)", lang(EditTrain)), |
| 143 |
FlashIn("%s (2)", lang(TravelSetting)), |
| 144 |
FlashIn("%s (3)", lang(SetTrain)), |
| 145 |
FlashIn("%s (4)", lang(TrainView)) |
| 146 |
}, { |
| 147 |
FlashIn("%s (F3)", lang(StationOperation)), |
| 148 |
FlashIn("%s (1)", lang(SelectStation)), |
| 149 |
FlashIn("%s (2)", lang(BuildStation)), |
| 150 |
FlashIn("%s (3)", lang(EditStation)) |
| 151 |
}, { |
| 152 |
FlashIn("%s (F4)", lang(StructOperation)), |
| 153 |
FlashIn("%s (1)", lang(SelectStruct)), |
| 154 |
FlashIn("%s (2)", lang(BuildStruct)), |
| 155 |
FlashIn("%s (3)", lang(EditStruct)) |
| 156 |
}, { |
| 157 |
FlashIn("%s (F5)", lang(SceneOperation)), |
| 158 |
FlashIn("%s (1)", lang(EditScene)), |
| 159 |
FlashIn("%s (2)", lang(SelectEnv)), |
| 160 |
FlashIn("%s (3)", lang(SimulationSetting)) |
| 161 |
}, { |
| 162 |
FlashIn("%s (F6)", lang(System)), |
| 163 |
FlashIn("%s (1)", lang(File)), |
| 164 |
FlashIn("%s (2)", lang(Configuration)), |
| 165 |
FlashIn("%s (3)", lang(SelectSkin)), |
| 166 |
FlashIn("%s (4)", lang(Video)), |
| 167 |
FlashIn("%s (5)", lang(Quit)) |
| 168 |
}}; |
| 169 |
char *expr[MODE_NUM][9] = {{ |
| 170 |
lang(RailOperationModeExp), |
| 171 |
lang(SelectRailModeExp), |
| 172 |
lang(SelectTieModeExp), |
| 173 |
lang(SelectGirderModeExp), |
| 174 |
lang(SelectPierModeExp), |
| 175 |
lang(SelectLineModeExp), |
| 176 |
lang(SelectPoleModeExp), |
| 177 |
lang(BuildRailModeExp), |
| 178 |
lang(EditRailModeExp) |
| 179 |
}, { |
| 180 |
lang(TrainOperationModeExp), |
| 181 |
lang(EditTrainModeExp), |
| 182 |
lang(TravelSettingModeExp), |
| 183 |
lang(SetTrainModeExp), |
| 184 |
lang(TrainViewModeExp) |
| 185 |
}, { |
| 186 |
lang(StationOperationModeExp), |
| 187 |
lang(SelectStationModeExp), |
| 188 |
lang(BuildStationModeExp), |
| 189 |
lang(EditStationModeExp) |
| 190 |
}, { |
| 191 |
lang(StructOperationModeExp), |
| 192 |
lang(SelectStructModeExp), |
| 193 |
lang(BuildStructModeExp), |
| 194 |
lang(EditStructModeExp) |
| 195 |
}, { |
| 196 |
lang(SceneOperationModeExp), |
| 197 |
lang(EditSceneModeExp), |
| 198 |
lang(SelectEnvModeExp), |
| 199 |
lang(SimulationSettingModeExp) |
| 200 |
}, { |
| 201 |
lang(SystemModeExp), |
| 202 |
lang(FileModeExp), |
| 203 |
lang(ConfigurationModeExp), |
| 204 |
lang(SelectSkinModeExp), |
| 205 |
lang(VideoModeExp), |
| 206 |
lang(QuitModeExp) |
| 207 |
}}; |
| 208 |
CGameMode *mode[MODE_NUM][9] = { |
| 209 |
{NULL, g_RailSelectMode, g_TieSelectMode, g_GirderSelectMode, g_PierSelectMode, |
| 210 |
g_LineSelectMode, g_PoleSelectMode, g_RailBuildMode, g_RailEditMode}, |
| 211 |
{NULL, g_TrainEditMode, g_DiaEditMode, g_TrainSetMode, g_TrainViewMode}, |
| 212 |
{NULL, g_StationSelectMode, g_StationBuildMode, g_StationEditMode}, |
| 213 |
{NULL, g_StructSelectMode, g_StructBuildMode, g_StructEditMode}, |
| 214 |
{NULL, g_SceneEditMode, g_EnvEditMode, g_SimulationMode}, |
| 215 |
{NULL, g_FileMode, g_ConfigMode, g_SkinSelectMode, g_VideoMode, g_ExitMode}}; |
| 216 |
for(i = 0; i<MODE_NUM; i++){ |
| 217 |
int sub = MODE_SUB[i]; |
| 218 |
ms_MenuIcon[i] = new CToggleIcon[sub+1]; |
| 219 |
ms_MenuIcon[i][0].Init( |
| 220 |
0, 0, TILE_UNIT*2, TILE_UNIT*2, (char *)name[i][0].c_str(), expr[i][0], NULL, |
| 221 |
i ? &ms_MenuIcon[i-1][0] : NULL, NULL, DIK_F1+i, |
| 222 |
0.875f, 0.25f, 0.875f, 0.125f, 0.0f, 0.0f, i); |
| 223 |
ms_MenuIcon[i][0].SetSlidePos( |
| 224 |
g_DispWidth-TILE_UNIT*2, g_DispHeight*(i+2), true); |
| 225 |
ms_MenuIcon[i][1].Init( |
| 226 |
0, 0, TILE_UNIT*2, TILE_UNIT*2, (char *)name[i][1].c_str(), expr[i][1], NULL, |
| 227 |
i ? &ms_MenuIcon[i-1][MODE_SUB[i-1]] : NULL, mode[i][1], DIK_1, |
| 228 |
0.625f, 0.125f, 0.75f, 0.125f, 0.25f, 0.0, i); |
| 229 |
for(j = 2; j<sub; j++) ms_MenuIcon[i][j].Init( |
| 230 |
0, 0, TILE_UNIT*2, TILE_UNIT*2, (char *)name[i][j].c_str(), expr[i][j], NULL, |
| 231 |
&ms_MenuIcon[i][j-1], mode[i][j], DIK_1+j-1, |
| 232 |
0.625f, 0.25f, 0.75f, 0.25f, (j%4)*0.25f, (j/4)*0.25f, i); |
| 233 |
ms_MenuIcon[i][sub].Init( |
| 234 |
0, 0, TILE_UNIT*2, TILE_UNIT*2, (char *)name[i][sub].c_str(), expr[i][sub], NULL, |
| 235 |
&ms_MenuIcon[i][j-1], mode[i][sub], DIK_1+j-1, 0.625f, 0.375f, |
| 236 |
0.75f, 0.375f, (sub%4)*0.25f, (sub/4)*0.25f, i); |
| 237 |
} |
| 238 |
ms_MenuIcon[0][0].ClearGroupCheck(); |
| 239 |
ms_MenuIcon[0][1].ClearGroupCheck(); |
| 240 |
if(g_RSPV==RSPV_SKIN){ |
| 241 |
ms_MenuIcon[5][0].SetCheck(false); |
| 242 |
ms_MenuIcon[5][3].SetCheck(false); |
| 243 |
} |
| 244 |
void InitNetworkInterface(); |
| 245 |
InitNetworkInterface(); |
| 246 |
} |
| 247 |
|
| 248 |
/* |
| 249 |
* [static] |
| 250 |
* ���C�����[�v |
| 251 |
*/ |
| 252 |
void CGameMode::MainLoop(){ |
| 253 |
CArrowSceneryMode::InitInterface(); |
| 254 |
CRailBuildMode::InitRailwayInterface(); |
| 255 |
CStructBuildMode::InitInterface(); |
| 256 |
g_NeutralMode = new CNeutralMode; |
| 257 |
g_RailSelectMode = new CRailSelectMode; |
| 258 |
g_TieSelectMode = new CTieSelectMode; |
| 259 |
g_GirderSelectMode = new CGirderSelectMode; |
| 260 |
g_PierSelectMode = new CPierSelectMode; |
| 261 |
g_LineSelectMode = new CLineSelectMode; |
| 262 |
g_PoleSelectMode = new CPoleSelectMode; |
| 263 |
g_RailBuildMode = new CRailBuildMode; |
| 264 |
g_RailEditMode = new CRailEditMode; |
| 265 |
g_TrainEditMode = new CTrainEditMode; |
| 266 |
g_DiaEditMode = new CDiaEditMode; |
| 267 |
g_TrainSetMode = new CTrainSetMode; |
| 268 |
g_TrainViewMode = new CTrainViewMode; |
| 269 |
g_StructSelectMode = new CStructSelectMode; |
| 270 |
g_StructBuildMode = new CStructBuildMode; |
| 271 |
g_StructEditMode = new CStructEditMode; |
| 272 |
g_StationSelectMode = new CStationSelectMode; |
| 273 |
g_StationBuildMode = new CStationBuildMode; |
| 274 |
g_StationEditMode = new CStationEditMode; |
| 275 |
g_SceneEditMode = new CSceneEditMode; |
| 276 |
g_EnvEditMode = new CEnvEditMode; |
| 277 |
g_SimulationMode = new CSimulationMode; |
| 278 |
g_FileMode = new CFileMode; |
| 279 |
//g_ConfigMode = new CConfigMode; |
| 280 |
g_SkinSelectMode = new CSkinSelectMode; |
| 281 |
g_VideoMode = new CVideoMode; |
| 282 |
g_ExitMode = new CExitMode; |
| 283 |
if(!g_RSPV){ |
| 284 |
LoadModeSettings(); |
| 285 |
}else{ |
| 286 |
DELETE_A(g_ConfigBuffer); |
| 287 |
} |
| 288 |
InitCapture(); |
| 289 |
g_ConfigMode->CheckHardware(); |
| 290 |
switch(g_RSPV){ |
| 291 |
case RSPV_RAIL: |
| 292 |
g_RailPluginList->FindAvailable()->SetPreview(); |
| 293 |
g_RailSelectMode->Enter(); |
| 294 |
break; |
| 295 |
case RSPV_TIE: |
| 296 |
g_TiePluginList->FindAvailable()->SetPreview(); |
| 297 |
g_TieSelectMode->Enter(); |
| 298 |
break; |
| 299 |
case RSPV_GIRDER: |
| 300 |
g_GirderPluginList->FindAvailable()->SetPreview(); |
| 301 |
g_GirderSelectMode->Enter(); |
| 302 |
break; |
| 303 |
case RSPV_PIER: |
| 304 |
g_PierPluginList->FindAvailable()->SetPreview(); |
| 305 |
g_PierSelectMode->Enter(); |
| 306 |
break; |
| 307 |
case RSPV_LINE: |
| 308 |
g_LinePluginList->FindAvailable()->SetPreview(); |
| 309 |
g_LineSelectMode->Enter(); |
| 310 |
break; |
| 311 |
case RSPV_POLE: |
| 312 |
g_PolePluginList->FindAvailable()->SetPreview(); |
| 313 |
g_PoleSelectMode->Enter(); |
| 314 |
break; |
| 315 |
case RSPV_TRAIN: |
| 316 |
g_TrainPluginList->FindAvailable()->SetPreview(); |
| 317 |
g_TrainEditMode->Enter(); |
| 318 |
break; |
| 319 |
case RSPV_STATION: |
| 320 |
g_StationPluginList->FindAvailable()->SetPreview(); |
| 321 |
g_StationSelectMode->Enter(); |
| 322 |
break; |
| 323 |
case RSPV_STRUCT: |
| 324 |
g_StructPluginList->FindAvailable()->SetPreview(); |
| 325 |
g_StructSelectMode->Enter(); |
| 326 |
break; |
| 327 |
case RSPV_SURFACE: |
| 328 |
g_SurfacePluginList->FindAvailable()->SetPreview(); |
| 329 |
g_SceneEditMode->Enter(); |
| 330 |
break; |
| 331 |
case RSPV_ENV: |
| 332 |
g_EnvPluginList->FindAvailable()->SetPreview(); |
| 333 |
g_EnvEditMode->Enter(); |
| 334 |
break; |
| 335 |
case RSPV_SKIN: |
| 336 |
g_SkinPluginList->FindAvailable()->SetPreview(); |
| 337 |
g_SkinSelectMode->Enter(); |
| 338 |
break; |
| 339 |
default: |
| 340 |
g_NeutralMode->Enter(); |
| 341 |
break; |
| 342 |
} |
| 343 |
InitMenu(); |
| 344 |
while(ms_ActiveMode) ms_ActiveMode->Spin(); |
| 345 |
bool RSNCloseSession(); |
| 346 |
RSNCloseSession(); |
| 347 |
int i; |
| 348 |
for(i = 0; i<MODE_NUM; i++) DELETE_A(ms_MenuIcon[i]); |
| 349 |
if(!g_RSPV) g_ConfigMode->Save(); |
| 350 |
ReleaseCaptureRS(); |
| 351 |
CPluginMode::FreeMenu(); |
| 352 |
DELETE_V(g_NeutralMode); |
| 353 |
DELETE_V(g_RailSelectMode); |
| 354 |
DELETE_V(g_TieSelectMode); |
| 355 |
DELETE_V(g_GirderSelectMode); |
| 356 |
DELETE_V(g_PierSelectMode); |
| 357 |
DELETE_V(g_LineSelectMode); |
| 358 |
DELETE_V(g_PoleSelectMode); |
| 359 |
DELETE_V(g_RailBuildMode); |
| 360 |
DELETE_V(g_RailEditMode); |
| 361 |
DELETE_V(g_TrainEditMode); |
| 362 |
DELETE_V(g_DiaEditMode); |
| 363 |
DELETE_V(g_TrainSetMode); |
| 364 |
DELETE_V(g_TrainViewMode); |
| 365 |
DELETE_V(g_StructSelectMode); |
| 366 |
DELETE_V(g_StructBuildMode); |
| 367 |
DELETE_V(g_StructEditMode); |
| 368 |
DELETE_V(g_StationSelectMode); |
| 369 |
DELETE_V(g_StationBuildMode); |
| 370 |
DELETE_V(g_StationEditMode); |
| 371 |
DELETE_V(g_SceneEditMode); |
| 372 |
DELETE_V(g_EnvEditMode); |
| 373 |
DELETE_V(g_SimulationMode); |
| 374 |
DELETE_V(g_FileMode); |
| 375 |
DELETE_V(g_ConfigMode); |
| 376 |
DELETE_V(g_SkinSelectMode); |
| 377 |
DELETE_V(g_VideoMode); |
| 378 |
DELETE_V(g_ExitMode); |
| 379 |
} |
| 380 |
|
| 381 |
/* |
| 382 |
* [static] |
| 383 |
* ���������� |
| 384 |
*/ |
| 385 |
void CGameMode::LoadModeSettings(){ |
| 386 |
char *str = g_ConfigScript, *eee; |
| 387 |
try{ |
| 388 |
if(!(str = g_NeutralMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 389 |
if(!(str = g_RailSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 390 |
if(!(str = g_TieSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 391 |
if(!(str = g_GirderSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 392 |
if(!(str = g_PierSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 393 |
if(!(str = g_LineSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 394 |
if(!(str = g_PoleSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 395 |
if(!(str = g_RailBuildMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 396 |
if(!(str = g_RailEditMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 397 |
if(!(str = g_TrainEditMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 398 |
if(!(str = g_TrainSetMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 399 |
if(!(str = g_TrainViewMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 400 |
if(!(str = g_StructSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 401 |
if(!(str = g_StructBuildMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 402 |
if(!(str = g_StructEditMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 403 |
if(!(str = g_StationSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 404 |
if(!(str = g_StationBuildMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 405 |
if(!(str = g_StationEditMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 406 |
if(!(str = g_SceneEditMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 407 |
if(!(str = g_EnvEditMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 408 |
if(!(str = g_SimulationMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 409 |
if(!(str = g_FileMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 410 |
if(!(str = g_ConfigMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 411 |
if(!(str = g_SkinSelectMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 412 |
if(!(str = g_VideoMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 413 |
if(!(str = g_ExitMode->LoadSetting(eee = str)) && g_ConfigBuffer) throw CSynErr(eee); |
| 414 |
if(g_ConfigBuffer && *(eee = str)) throw CSynErr(eee); |
| 415 |
} |
| 416 |
catch(CSynErr err){ |
| 417 |
err.Handle("\"Config.txt\"", g_ConfigBuffer); |
| 418 |
} |
| 419 |
DELETE_A(g_ConfigBuffer); |
| 420 |
} |
| 421 |
|
| 422 |
/* |
| 423 |
* [static] |
| 424 |
* ���������� |
| 425 |
*/ |
| 426 |
void CGameMode::SaveModeSettings( |
| 427 |
FILE *file // �t�@�C�� |
| 428 |
){ |
| 429 |
g_NeutralMode->SaveSetting(file); |
| 430 |
g_RailSelectMode->SaveSetting(file); |
| 431 |
g_TieSelectMode->SaveSetting(file); |
| 432 |
g_GirderSelectMode->SaveSetting(file); |
| 433 |
g_PierSelectMode->SaveSetting(file); |
| 434 |
g_LineSelectMode->SaveSetting(file); |
| 435 |
g_PoleSelectMode->SaveSetting(file); |
| 436 |
g_RailBuildMode->SaveSetting(file); |
| 437 |
g_RailEditMode->SaveSetting(file); |
| 438 |
g_TrainEditMode->SaveSetting(file); |
| 439 |
g_TrainSetMode->SaveSetting(file); |
| 440 |
g_TrainViewMode->SaveSetting(file); |
| 441 |
g_StructSelectMode->SaveSetting(file); |
| 442 |
g_StructBuildMode->SaveSetting(file); |
| 443 |
g_StructEditMode->SaveSetting(file); |
| 444 |
g_StationSelectMode->SaveSetting(file); |
| 445 |
g_StationBuildMode->SaveSetting(file); |
| 446 |
g_StationEditMode->SaveSetting(file); |
| 447 |
g_SceneEditMode->SaveSetting(file); |
| 448 |
g_EnvEditMode->SaveSetting(file); |
| 449 |
g_SimulationMode->SaveSetting(file); |
| 450 |
g_FileMode->SaveSetting(file); |
| 451 |
g_ConfigMode->SaveSetting(file); |
| 452 |
g_SkinSelectMode->SaveSetting(file); |
| 453 |
g_VideoMode->SaveSetting(file); |
| 454 |
g_ExitMode->SaveSetting(file); |
| 455 |
} |
| 456 |
|
| 457 |
/* |
| 458 |
* [static] |
| 459 |
* �j���[�g�������[�h�����s |
| 460 |
*/ |
| 461 |
void CGameMode::SetNeutral(){ |
| 462 |
int i, j; |
| 463 |
bool sw = false; |
| 464 |
for(i = 0; i<MODE_NUM; i++){ |
| 465 |
for(j = 1; j<=MODE_SUB[i]; j++){ |
| 466 |
if(ms_MenuIcon[i][j].GetCheck()){ |
| 467 |
sw = true; |
| 468 |
ms_MenuIcon[i][j].SetCheck(true); |
| 469 |
} |
| 470 |
} |
| 471 |
} |
| 472 |
if(!sw) g_NeutralMode->Enter(); |
| 473 |
ms_TopPanelTime = PANEL_HIDE_FRAME*3; |
| 474 |
ms_RightPanelTime = PANEL_HIDE_FRAME*3; |
| 475 |
} |
| 476 |
|
| 477 |
/* |
| 478 |
* �t���[�������`�F�b�N |
| 479 |
*/ |
| 480 |
bool CGameMode::ScanInputFrame( |
| 481 |
int option // 2: photomode |
| 482 |
){ |
| 483 |
if(g_RSPV) return false; |
| 484 |
bool enmouse = option&2 ? false : true; |
| 485 |
int i, j; |
| 486 |
POINT pos = g_Cursor.GetPos(); |
| 487 |
if(!g_ConfigMode->GetHideTopPanel() |
| 488 |
|| ms_TopPanelTime<PANEL_HIDE_FRAME |
| 489 |
&& pos.y<TILE_UNIT*(ms_TopPanelTime ? 3 : 2)) |
| 490 |
ms_TopPanelTime = PANEL_HIDE_FRAME; |
| 491 |
if(!g_ConfigMode->GetHideRightPanel() |
| 492 |
|| ms_RightPanelTime<PANEL_HIDE_FRAME |
| 493 |
&& pos.x>=g_DispWidth-TILE_UNIT*(ms_RightPanelTime ? 5 : 4)) |
| 494 |
ms_RightPanelTime = PANEL_HIDE_FRAME; |
| 495 |
for(i = 0; i<MODE_NUM; i++){ |
| 496 |
int sub = MODE_SUB[i]; |
| 497 |
if(ms_MenuIcon[i][0].ScanInput(!CEditBox::IsActive(), enmouse)){ |
| 498 |
ms_RightPanelTime = PANEL_HIDE_FRAME*3; |
| 499 |
return true; |
| 500 |
} |
| 501 |
if(ms_MenuIcon[i][0].GetCheck()){ |
| 502 |
for(j = 1; j<=sub; j++){ |
| 503 |
if(ms_MenuIcon[i][j].ScanInput(!CEditBox::IsActive(), enmouse)){ |
| 504 |
ms_RightPanelTime = PANEL_HIDE_FRAME*3; |
| 505 |
return true; |
| 506 |
} |
| 507 |
} |
| 508 |
}else{ |
| 509 |
for(j = 1; j<=sub; j++){ |
| 510 |
if(ms_MenuIcon[i][j].GetCheck() |
| 511 |
&& ms_MenuIcon[i][j].ScanInput(false, enmouse)){ |
| 512 |
ms_RightPanelTime = PANEL_HIDE_FRAME*3; |
| 513 |
return true; |
| 514 |
} |
| 515 |
} |
| 516 |
} |
| 517 |
} |
| 518 |
return false; |
| 519 |
} |
| 520 |
|
| 521 |
/* |
| 522 |
* �t���[���`�� |
| 523 |
*/ |
| 524 |
void CGameMode::RenderFrame( |
| 525 |
int option // 1: speedinfo, 2: photomode |
| 526 |
){ |
| 527 |
TIMER_RAII("CGameMode::RenderFrame"); |
| 528 |
int i, j, top1, top2, right1, right2; |
| 529 |
if(g_RSPV && g_RSPV!=RSPV_SKIN) option = 2; |
| 530 |
if(option&2){ |
| 531 |
top1 = 0; |
| 532 |
g_StrTex->RenderLeft(TILE_QUAD, FontY(TILE_UNIT), |
| 533 |
0xffffffff, 0xff000000, FlashIn("%.1f FPS", GetFPS())); |
| 534 |
if(!g_RSPV){ |
| 535 |
g_StrTex->RenderCenter(g_DispWidth/2, FontY(TILE_UNIT), |
| 536 |
0xffffffff, 0xff000000, g_Scene->GetNumberedName()); |
| 537 |
g_StrTex->RenderRight(g_DispWidth-TILE_QUAD, FontY(TILE_UNIT), |
| 538 |
0xffffffff, 0xff000000, g_SaveFile->GetTimeText()); |
| 539 |
} |
| 540 |
}else{ |
| 541 |
if(g_ModalDialog || g_RSPV){ |
| 542 |
ms_TopPanelTime = PANEL_HIDE_FRAME; |
| 543 |
ms_RightPanelTime = PANEL_HIDE_FRAME; |
| 544 |
} |
| 545 |
if(ms_TopPanelTime){ |
| 546 |
ms_TopPanelShow = PANEL_SHOW_RATIO |
| 547 |
+ms_TopPanelShow*(1.0f-PANEL_SHOW_RATIO); |
| 548 |
ms_TopPanelTime--; |
| 549 |
}else{ |
| 550 |
ms_TopPanelShow = -0.1f*PANEL_HIDE_RATIO |
| 551 |
+ms_TopPanelShow*(1.0f-PANEL_HIDE_RATIO); |
| 552 |
} |
| 553 |
top2 = Round(ms_TopPanelShow*TILE_UNIT*2); |
| 554 |
top1 = top2-TILE_UNIT*2; |
| 555 |
if(ms_RightPanelTime){ |
| 556 |
ms_RightPanelShow = PANEL_SHOW_RATIO |
| 557 |
+ms_RightPanelShow*(1.0f-PANEL_SHOW_RATIO); |
| 558 |
ms_RightPanelTime--; |
| 559 |
}else{ |
| 560 |
ms_RightPanelShow = -1.1f*PANEL_HIDE_RATIO |
| 561 |
+ms_RightPanelShow*(1.0f-PANEL_HIDE_RATIO); |
| 562 |
} |
| 563 |
right1 = g_DispWidth-Round(ms_RightPanelShow*TILE_UNIT*2); |
| 564 |
right2 = right1+TILE_UNIT*2; |
| 565 |
g_Skin->SetFrameTexture(); |
| 566 |
SetUVMap(0.0f, 0.0f, 0.375f, 0.125f); |
| 567 |
TexMap2DRect(0, top1, TILE_UNIT*6, top2, 0xffffffff); |
| 568 |
SetUVMap(0.375f, 0.0f, 0.5f, 0.125f); |
| 569 |
TexMap2DRect(TILE_UNIT*6, top1, |
| 570 |
TILE_UNIT*6+MODE_LABEL_WIDTH, top2, 0xffffffff); |
| 571 |
SetUVMap(0.5f, 0.0f, 0.75f, 0.125f); |
| 572 |
TexMap2DRect(TILE_UNIT*6+MODE_LABEL_WIDTH, top1, |
| 573 |
TILE_UNIT*10+MODE_LABEL_WIDTH, top2, 0xffffffff); |
| 574 |
SetUVMap(0.75f, 0.0f, 0.875f, 0.125f); |
| 575 |
TexMap2DRect(TILE_UNIT*10+MODE_LABEL_WIDTH, top1, right1, top2, 0xffffffff); |
| 576 |
if(right1<g_DispWidth){ |
| 577 |
SetUVMap(0.875f, 0.0f, 1.0f, 0.125f); |
| 578 |
TexMap2DRect(right1, top1, right2, top2, 0xffffffff); |
| 579 |
SetUVMap(0.875f, 0.375f, 1.0f, 0.5f); |
| 580 |
TexMap2DRect(right1, top2, right2, TILE_UNIT*2, 0xffffffff); |
| 581 |
} |
| 582 |
int ty = TILE_UNIT*2; |
| 583 |
bool ishow = right1<g_DispWidth+TILE_UNIT*2; |
| 584 |
for(i = 0; i<MODE_NUM; i++){ |
| 585 |
int sub = MODE_SUB[i]; |
| 586 |
ms_MenuIcon[i][0].SetSlidePos(right1, ty); |
| 587 |
int sy = ms_MenuIcon[i][0].GetPosY(); |
| 588 |
if(!ms_MenuIcon[i][0].GetCheck()){ |
| 589 |
if(ishow){ |
| 590 |
int tf = 0; |
| 591 |
for(j = 1; j<=sub; j++) if(ms_MenuIcon[i][j].GetCheck()) tf = j; |
| 592 |
if(tf){ |
| 593 |
ms_MenuIcon[i][0].Render(0.875f, 0.5f); |
| 594 |
ms_MenuIcon[i][tf].SetPos(right1-TILE_UNIT*2, sy); |
| 595 |
ms_MenuIcon[i][tf].Render(0.75f, 0.5f); |
| 596 |
}else{ |
| 597 |
ms_MenuIcon[i][0].Render(); |
| 598 |
} |
| 599 |
} |
| 600 |
ty += TILE_UNIT*2; |
| 601 |
continue; |
| 602 |
} |
| 603 |
if(ishow){ |
| 604 |
ms_MenuIcon[i][0].Render(); |
| 605 |
for(j = 1; j<=sub; j++){ |
| 606 |
ms_MenuIcon[i][j].SetPos(right1-TILE_UNIT*2, sy+(j-1)*TILE_UNIT*2); |
| 607 |
ms_MenuIcon[i][j].Render(); |
| 608 |
} |
| 609 |
} |
| 610 |
ty += sub*TILE_UNIT*2; |
| 611 |
} |
| 612 |
g_Skin->SetFrameTexture(); |
| 613 |
for(i = 0; i<MODE_NUM; i++){ |
| 614 |
int y1 = (i ? ms_MenuIcon[i-1][0].GetPosY() : 0)+TILE_UNIT*2; |
| 615 |
int y2 = ms_MenuIcon[i][0].GetPosY(); |
| 616 |
if(y2-y1<=0) continue; |
| 617 |
SetUVMap(0.875f, 0.375f, 1.0f, 0.5f); |
| 618 |
TexMap2DRect(right1, y1, right2, y2, 0xffffffff); |
| 619 |
} |
| 620 |
ty = ms_MenuIcon[MODE_NUM-1][0].GetPosY()+TILE_UNIT*2; |
| 621 |
SetUVMap(0.875f, 0.375f, 1.0f, 0.5f); |
| 622 |
TexMap2DRect(right1, ty, right2, g_DispHeight, 0xffffffff); |
| 623 |
CToggleIcon::RenderPopupText(); |
| 624 |
if(top2<=0) return; |
| 625 |
g_StrTex->RenderCenter(TILE_UNIT*6+MODE_LABEL_WIDTH/2, top1+TILE_UNIT/4+FontY(TILE_UNIT), |
| 626 |
g_Skin->m_FrameData.m_LabelFontColor, 0, ms_ModeLabel.c_str()); |
| 627 |
g_StrTex->RenderLeft(TILE_UNIT*10+MODE_LABEL_WIDTH, top1+FontY(TILE_UNIT), |
| 628 |
g_Skin->m_FrameData.m_InfoFontColor, 0, FlashIn("%.1f FPS", GetFPS())); |
| 629 |
if(!g_RSPV){ |
| 630 |
g_StrTex->RenderCenter(TILE_UNIT*8+TILE_HALF+MODE_LABEL_WIDTH |
| 631 |
+(g_DispWidth-TILE_UNIT*12-TILE_HALF-MODE_LABEL_WIDTH)/2, top1+FontY(TILE_UNIT), |
| 632 |
g_Skin->m_FrameData.m_InfoFontColor, 0, g_Scene->GetNumberedName()); |
| 633 |
g_StrTex->RenderRight(g_DispWidth-TILE_UNIT*2, top1+FontY(TILE_UNIT), |
| 634 |
g_Skin->m_FrameData.m_InfoFontColor, 0, g_SaveFile->GetTimeText()); |
| 635 |
} |
| 636 |
} |
| 637 |
if(option&1){ |
| 638 |
int speed = GetEffectSpeed(); |
| 639 |
if(speed!=1) g_StrTex->RenderCenter(g_DispWidth/2, top1+TILE_UNIT*2+TILE_QUAD, |
| 640 |
ScaleColor(0xffffffff, g_BlinkAlpha), ScaleColor(0xff000000, g_BlinkAlpha), |
| 641 |
speed ? FlashIn("%d %s", speed, lang(XSpeed)) : lang(Paused)); |
| 642 |
} |
| 643 |
} |
| 644 |
|
| 645 |
/* |
| 646 |
* �R���p�X�`�� |
| 647 |
*/ |
| 648 |
void CGameMode::RenderCompass(){ |
| 649 |
if(!g_ConfigMode->GetCompass()) return; |
| 650 |
VEC3 dir = GetVDir(), cpos = GetVPos()+14.5f*dir-4.5f*GetVUp()*g_FovRatio; |
| 651 |
VEC3 cdir(dir.x, 0.0f, dir.z); |
| 652 |
g_Skin->ScaleCompass(g_FovRatio); |
| 653 |
g_CompassObject[0].SetPos(cpos); |
| 654 |
g_CompassObject[0].SetDir(cdir, V3UP); |
| 655 |
g_CompassObject[0].Render(); |
| 656 |
g_CompassObject[1].SetPos(cpos); |
| 657 |
g_CompassObject[1].Render(); |
| 658 |
if(g_RSPV || !g_ConfigMode->GetWindMeter() || !g_ConfigMode->GetWind()) return; |
| 659 |
const float itv = 0.6f, range = 0.9f, windmax = SYMMETRIC_ROTATION_MAX*itv; |
| 660 |
float windspeed = V3Len(&g_WindDir); |
| 661 |
if(!g_ModalDialog) ms_WindDirTemp += |
| 662 |
windmax*(1.0f-expf(-0.2f*GetEffectSpeed()*windspeed/windmax)); |
| 663 |
ValueCircular(&ms_WindDirTemp, -0.5f*itv, 0.5f*itv); |
| 664 |
float z, tz; |
| 665 |
for(z = -range; z<range+0.1f; z += itv){ |
| 666 |
tz = z+ms_WindDirTemp; |
| 667 |
float alpha = (range-fabsf(tz))/range; |
| 668 |
if(alpha<=0.0f) continue; |
| 669 |
g_WindDirObject.SetPos(g_CompassObject[1].GetPos()+g_FovRatio*tz*g_WindDirNorm); |
| 670 |
g_WindDirObject.SetDir(g_WindDirNorm, V3UP); |
| 671 |
g_WindDirObject.RenderA(alpha); |
| 672 |
} |
| 673 |
devResetMatrix(); |
| 674 |
if(ms_ActiveMode!=g_NeutralMode || !g_ConfigMode->IsWindowDiv()){ |
| 675 |
int vp_w = g_DispWidth, vp_h = g_DispHeight; |
| 676 |
g_StrTex->RenderRight(vp_w*45/100, vp_h-TILE_UNIT, |
| 677 |
0xffffffff, 0xff000000, FlashIn("%s: %.1f [m/s]", lang(WindSpeed), MAXFPS*windspeed)); |
| 678 |
} |
| 679 |
} |
| 680 |
|
| 681 |
/* |
| 682 |
* [static] |
| 683 |
* �_�C�A���O�`�� |
| 684 |
*/ |
| 685 |
bool CGameMode::RenderDialog(){ |
| 686 |
if(!g_ModalDialog) return false; |
| 687 |
devSetTexture(0, NULL); |
| 688 |
Fill2DRect(0, 0, g_DispWidth, g_DispHeight, 0x80808080); |
| 689 |
g_ModalDialog->Render(); |
| 690 |
return true; |
| 691 |
} |
| 692 |
|
| 693 |
/* |
| 694 |
* �R���X�g���N�^ |
| 695 |
*/ |
| 696 |
CGameMode::CGameMode(){ |
| 697 |
CInterface::ResetTabHead(); |
| 698 |
m_Interface.Init(0, 0, 0, 0, "", NULL); |
| 699 |
} |
| 700 |
|
| 701 |
/* |
| 702 |
* ���[�h���L���� |
| 703 |
*/ |
| 704 |
void CGameMode::Enter(){ |
| 705 |
SetViewport(0, 0, sv3.width, sv3.height); |
| 706 |
ms_TopPanelTime = PANEL_HIDE_FRAME*3; |
| 707 |
ModelPluginFreeInst(); |
| 708 |
CPopMenu::ResetCurrentMenu(); |
| 709 |
CEditBox::Disable(); |
| 710 |
Randomize(); |
| 711 |
g_SystemSwitch[SYS_SW_SHADOW].SetValue(g_ConfigMode->GetShadow()); |
| 712 |
g_SystemSwitch[SYS_SW_ENVMAP].SetValue(g_ConfigMode->GetEnvMap()); |
| 713 |
void ResetShowRailSelect(); |
| 714 |
ResetShowRailSelect(); |
| 715 |
EnterGame(); |
| 716 |
ms_ActiveMode = this; |
| 717 |
} |
| 718 |
|
| 719 |
/* |
| 720 |
* ���[�h���[�v |
| 721 |
*/ |
| 722 |
void CGameMode::Spin(){ |
| 723 |
SetMasterVolume(); |
| 724 |
while(PeekAllMessage()){ |
| 725 |
if(IsActive()){ |
| 726 |
g_JobTimer.Start(); |
| 727 |
{ |
| 728 |
TIMER_RAII("All"); |
| 729 |
if(g_CursorLockable) g_Cursor.Clip(); |
| 730 |
//�J�[�\���`�����O�� |
| 731 |
//ScanInputDevice(); |
| 732 |
//g_Cursor.FixCursor(); |
| 733 |
g_BlinkCounter = (g_BlinkCounter+1)%MAXFPS; |
| 734 |
g_BlinkAlpha = 0.5f*(sinf(2.0f*D3DX_PI*g_BlinkCounter/MAXFPS)+1.0f); |
| 735 |
g_ConfigMode->SetSpecularLight(); |
| 736 |
g_ManualControl = !!g_SimulationMode->GetManualControl() || g_NetworkInitialized; |
| 737 |
g_IgnoreAcceleration = !!g_SimulationMode->GetIgnoreAcceleration(); |
| 738 |
void CheckNetworkState(); |
| 739 |
CheckNetworkState(); |
| 740 |
SpinGame(); |
| 741 |
if(CheckAlt() && GetKey(DIK_F4)==S_PUSH){ |
| 742 |
Exit(); |
| 743 |
break; |
| 744 |
} |
| 745 |
if(GetButton(DIM_LEFT)<=S_PULL){ |
| 746 |
CDragContainer::EndDrag(); |
| 747 |
} |
| 748 |
} |
| 749 |
{ |
| 750 |
TIMER_RAII("SyncFrame"); |
| 751 |
SyncFrame(); |
| 752 |
} |
| 753 |
g_JobTimer.Stop(); |
| 754 |
}else{ |
| 755 |
SetMasterVolume(); |
| 756 |
ClipCursor(NULL); |
| 757 |
if(g_NetworkInitialized){ |
| 758 |
g_SaveFile->Simulate(-1); |
| 759 |
SyncFrame(); |
| 760 |
}else{ |
| 761 |
WaitMessage(); |
| 762 |
} |
| 763 |
} |
| 764 |
if(ms_ActiveMode!=this) return; |
| 765 |
} |
| 766 |
Exit(); |
| 767 |
} |
| 768 |
|
| 769 |
/* |
| 770 |
* �T�E���h�������� |
| 771 |
*/ |
| 772 |
void CGameMode::SpinSound(){ |
| 773 |
LONGLONG t = HighTimer(); |
| 774 |
g_FrameDelta = (float)(t-g_SoundSync); |
| 775 |
g_SoundSync = t; |
| 776 |
SetListenerPos(GetVPos()); |
| 777 |
SetListenerDir(GetVDir(), GetVUp()); |
| 778 |
} |
| 779 |
|
| 780 |
/* |
| 781 |
* �����V�~�����[�V�������x���� |
| 782 |
*/ |
| 783 |
int CGameMode::GetEffectSpeed(){ |
| 784 |
return IsPaused() ? 0 : g_SimulationMode->GetSimSpeed(); |
| 785 |
} |