1
0
Fork 0
mirror of https://github.com/halpz/re3.git synced 2024-10-18 22:11:05 +00:00

mission replay

This commit is contained in:
Nikolay Korolev 2021-08-01 12:54:05 +03:00
parent 747705d430
commit c69edce800
13 changed files with 256 additions and 43 deletions

View file

@ -127,7 +127,97 @@ static const char* nonMissionScripts[] = {
"rc4", "rc4",
"hj", "hj",
"usj", "usj",
"mayhem" "mayhem",
"range",
"race",
"pizza",
"rcheli",
"rcplne1",
"rcrace1",
"cokerun",
"buypro1",
"carbuy1",
"buypro2",
"icecut",
"icecre1",
"buypro3",
"buypro4",
"buypro5",
"buypro6",
"buypro7",
"buypro8",
"buypro9",
"buypro10",
"buypro11",
"ovalrng",
"mm",
"kickst",
"heli1sc",
"heli2sc",
"heli3sc",
"heli4sc",
"carpark_1",
"bmx_1",
"bmx_2"
};
static const char* MissionScripts[] = {
"LAWYER1",
"LAWYER2",
"LAWYER3",
"LAWYER4",
"GENERL1",
"COL2",
"GENERL3",
"COL_4",
"COL_5",
"baron1",
"baron2",
"baron3",
"baron4",
"kent1",
"baron5",
"serg1",
"serg2",
"serg3",
"bankjo1",
"bankjo2",
"bankjo3",
"bankjo4",
"phil1",
"phil2",
"porno1",
"porno2",
"porno3",
"porno4",
"protec1",
"protec2",
"protec3",
"count1",
"count2",
"CAP_1",
"FIN_1",
"bike1",
"bike2",
"bike3",
"rockb1",
"rockb2",
"rockb3",
"cuban1",
"cuban2",
"cuban3",
"cuban4",
"hait1",
"hait2",
"hait3",
"assin1",
"assin2",
"assin3",
"assin4",
"assin5",
"taxwar1",
"taxwar2",
"taxwar3"
}; };
int AllowMissionReplay; int AllowMissionReplay;
@ -143,6 +233,11 @@ bool gbTryingPorn4Again;
int IsInAmmunation; int IsInAmmunation;
int MissionSkipLevel; int MissionSkipLevel;
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
bool UsingMobileScript;
bool AlreadySavedGame;
#endif
#endif #endif
#ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
@ -2702,6 +2797,10 @@ bool CTheScripts::Init(bool loaddata)
static const char* init_msg = "Starting debug script log\n\n"; static const char* init_msg = "Starting debug script log\n\n";
PrintToLog(init_msg); PrintToLog(init_msg);
CFileMgr::SetDir(""); CFileMgr::SetDir("");
#endif
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
UsingMobileScript = false;
AlreadySavedGame = false;
#endif #endif
return retval; return retval;
} }
@ -2779,6 +2878,7 @@ void CTheScripts::Process()
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
static uint32 TimeToWaitTill; static uint32 TimeToWaitTill;
static bool AlreadyResetHealth;
switch (AllowMissionReplay) { switch (AllowMissionReplay) {
case 2: case 2:
AllowMissionReplay = 3; AllowMissionReplay = 3;
@ -2794,9 +2894,19 @@ void CTheScripts::Process()
break; break;
case 6: case 6:
AllowMissionReplay = 7; AllowMissionReplay = 7;
AlreadyResetHealth = false;
TimeToWaitTill = CTimer::GetTimeInMilliseconds() + 500; TimeToWaitTill = CTimer::GetTimeInMilliseconds() + 500;
break; break;
case 7: case 7:
if (!AlreadyResetHealth) {
AlreadyResetHealth = true;
CPlayerPed* pPlayerPed = FindPlayerPed();
if (pPlayerPed) {
CPlayerInfo* pPlayerInfo = pPlayerPed->GetPlayerInfoForThisPlayerPed();
if (pPlayerInfo)
pPlayerPed->m_fHealth = pPlayerInfo->m_nMaxHealth;
}
}
if (TimeToWaitTill < CTimer::GetTimeInMilliseconds()) { if (TimeToWaitTill < CTimer::GetTimeInMilliseconds()) {
AllowMissionReplay = 0; AllowMissionReplay = 0;
return; return;
@ -4447,14 +4557,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
script_assert(car); script_assert(car);
#if defined MISSION_REPLAY && defined SIMPLIER_MISSIONS
car->AutoPilot.m_nCruiseSpeed = GET_FLOAT_PARAM(1);
if (missionRetryScriptIndex == 40 && car->GetModelIndex() == MI_CHEETAH) // Turismo
car->AutoPilot.m_nCruiseSpeed = 8 * car->AutoPilot.m_nCruiseSpeed / 10;
car->AutoPilot.m_nCruiseSpeed = Min(car->AutoPilot.m_nCruiseSpeed, 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity);
#else
car->AutoPilot.m_nCruiseSpeed = Min(GET_FLOAT_PARAM(1), 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity); car->AutoPilot.m_nCruiseSpeed = Min(GET_FLOAT_PARAM(1), 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity);
#endif
return 0; return 0;
} }
case COMMAND_SET_CAR_DRIVING_STYLE: case COMMAND_SET_CAR_DRIVING_STYLE:
@ -4529,8 +4632,12 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
{ {
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
if (strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "M_FAIL") == 0 && CanAllowMissionReplay()) if (strcmp((char*)&CTheScripts::ScriptSpace[m_nIp - KEY_LENGTH_IN_SCRIPT], "M_FAIL") == 0) {
if (AllowMissionReplay == 7)
AllowMissionReplay = 0;
if (CanAllowMissionReplay())
AllowMissionReplay = 1; AllowMissionReplay = 1;
}
#endif #endif
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
CMessages::AddBigMessage(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1); CMessages::AddBigMessage(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1);
@ -5199,21 +5306,15 @@ bool CRunningScript::CanAllowMissionReplay()
{ {
if (AllowMissionReplay) if (AllowMissionReplay)
return false; return false;
if (CStats::LastMissionPassedName[0] == '\0') for (int i = 0; i < ARRAY_SIZE(MissionScripts); i++) {
return false; if (!CGeneral::faststricmp(m_abScriptName, MissionScripts[i]))
for (int i = 0; i < ARRAY_SIZE(nonMissionScripts); i++) {
if (strcmp(m_abScriptName, nonMissionScripts[i]) == 0)
return false;
}
return true; return true;
} }
return false;
}
uint32 AddExtraDeathDelay() uint32 AddExtraDeathDelay()
{ {
if (missionRetryScriptIndex == 63)
return 7000;
if (missionRetryScriptIndex == 64)
return 4000;
return 1000; return 1000;
} }
@ -5221,7 +5322,7 @@ void RetryMission(int type, int unk)
{ {
if (type == 0) { if (type == 0) {
doingMissionRetry = true; doingMissionRetry = true;
FrontEndMenuManager.m_nCurrScreen = 57; // MENUPAGE_MISSION_RETRY FrontEndMenuManager.m_nCurrScreen = MENUPAGE_MISSION_RETRY;
FrontEndMenuManager.RequestFrontEndStartUp(); FrontEndMenuManager.RequestFrontEndStartUp();
} }
else if (type == 2) { else if (type == 2) {
@ -5259,8 +5360,11 @@ CTheScripts::SwitchToMission(int32 mission)
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
missionRetryScriptIndex = mission; missionRetryScriptIndex = mission;
if (missionRetryScriptIndex == 19) #ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
CStats::LastMissionPassedName[0] = '\0'; if (CTheScripts::MissionSupportsMissionReplay(missionRetryScriptIndex)) {
SaveGameForPause(4);
}
#endif
#endif #endif
CTimer::Suspend(); CTimer::Suspend();
int offset = CTheScripts::MultiScriptArray[mission] + 8; int offset = CTheScripts::MultiScriptArray[mission] + 8;

View file

@ -653,6 +653,12 @@ public:
static void SetObjectiveForAllPedsInCollective(int, eObjective); static void SetObjectiveForAllPedsInCollective(int, eObjective);
#endif #endif
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
static bool MissionSupportsMissionReplay(int index)
{
return index >= 3 && index <= 35 || index >= 51 && index <= 65 || index >= 67 && index <= 74 || index >= 83 && index <= 87;
}
#endif
static bool IsFortStauntonDestroyed() { return FSDestroyedFlag && *(int32*)&ScriptSpace[FSDestroyedFlag] == 1; } static bool IsFortStauntonDestroyed() { return FSDestroyedFlag && *(int32*)&ScriptSpace[FSDestroyedFlag] == 1; }
}; };
@ -665,7 +671,6 @@ VALIDATE_SIZE(uStackReturnValue, 4);
extern int scriptToLoad; extern int scriptToLoad;
#endif #endif
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
static_assert(false, "Mission replay is not supported");
extern int AllowMissionReplay; extern int AllowMissionReplay;
extern uint32 WaitForMissionActivate; extern uint32 WaitForMissionActivate;
extern uint32 WaitForSave; extern uint32 WaitForSave;
@ -676,6 +681,11 @@ extern bool gbTryingPorn4Again;
extern int IsInAmmunation; extern int IsInAmmunation;
extern int MissionSkipLevel; extern int MissionSkipLevel;
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
extern bool UsingMobileScript;
extern bool AlreadySavedGame;
#endif
uint32 AddExtraDeathDelay(); uint32 AddExtraDeathDelay();
void RetryMission(int, int); void RetryMission(int, int);
#endif #endif

View file

@ -1383,8 +1383,10 @@ void CRunningScript::DoDeatharrestCheck()
if (!pPlayer->IsRestartingAfterDeath() && !pPlayer->IsRestartingAfterArrest()) if (!pPlayer->IsRestartingAfterDeath() && !pPlayer->IsRestartingAfterArrest())
return; return;
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
if (AllowMissionReplay != 0) if (AllowMissionReplay != 7 && AllowMissionReplay != 0)
return; return;
if (AllowMissionReplay == 7)
AllowMissionReplay = 0;
if (CanAllowMissionReplay()) if (CanAllowMissionReplay())
AllowMissionReplay = 1; AllowMissionReplay = 1;
#endif #endif

View file

@ -125,10 +125,6 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
case COMMAND_MAKE_PLAYER_SAFE_FOR_CUTSCENE: case COMMAND_MAKE_PLAYER_SAFE_FOR_CUTSCENE:
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
#ifdef MISSION_REPLAY
AllowMissionReplay = 0;
SaveGameForPause(3);
#endif
CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)]; CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)];
CPad::GetPad(GET_INTEGER_PARAM(0))->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE); CPad::GetPad(GET_INTEGER_PARAM(0))->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE);
pPlayerInfo->MakePlayerSafe(true); pPlayerInfo->MakePlayerSafe(true);
@ -372,6 +368,9 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
return 0; return 0;
case COMMAND_LOAD_AND_LAUNCH_MISSION_INTERNAL: case COMMAND_LOAD_AND_LAUNCH_MISSION_INTERNAL:
{ {
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
uint32 oldIp = m_nIp;
#endif
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
if (CTheScripts::NumberOfExclusiveMissionScripts > 0) { if (CTheScripts::NumberOfExclusiveMissionScripts > 0) {
@ -381,8 +380,19 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
} }
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
missionRetryScriptIndex = GET_INTEGER_PARAM(0); missionRetryScriptIndex = GET_INTEGER_PARAM(0);
if (missionRetryScriptIndex == 19) #ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
CStats::LastMissionPassedName[0] = '\0'; if (!UsingMobileScript && CTheScripts::MissionSupportsMissionReplay(missionRetryScriptIndex)){
if (!AlreadySavedGame) {
m_nIp = oldIp - 2;
SaveGameForPause(4);
AlreadySavedGame = true;
return 0;
}
else {
AlreadySavedGame = false;
}
}
#endif
#endif #endif
CTimer::Suspend(); CTimer::Suspend();
int offset = CTheScripts::MultiScriptArray[GET_INTEGER_PARAM(0)] + 8; int offset = CTheScripts::MultiScriptArray[GET_INTEGER_PARAM(0)] + 8;
@ -1094,6 +1104,9 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
} }
case COMMAND_FAIL_CURRENT_MISSION: case COMMAND_FAIL_CURRENT_MISSION:
CTheScripts::FailCurrentMission = 2; CTheScripts::FailCurrentMission = 2;
#ifdef MISSION_REPLAY
MissionSkipLevel = 0;
#endif
return 0; return 0;
case COMMAND_GET_CLOSEST_OBJECT_OF_TYPE: case COMMAND_GET_CLOSEST_OBJECT_OF_TYPE:
{ {

View file

@ -585,7 +585,11 @@ CMenuManager::Initialise(void)
m_fMapCenterX = MENU_X_LEFT_ALIGNED(320.0f); m_fMapCenterX = MENU_X_LEFT_ALIGNED(320.0f);
m_fMapCenterY = MENU_Y(225.0f); m_fMapCenterY = MENU_Y(225.0f);
CPad::StopPadsShaking(); CPad::StopPadsShaking();
#ifdef MISSION_REPLAY
if (!m_OnlySaveMenu && m_nCurrScreen != MENUPAGE_MISSION_RETRY)
#else
if (!m_OnlySaveMenu) if (!m_OnlySaveMenu)
#endif
m_nCurrScreen = MENUPAGE_NONE; m_nCurrScreen = MENUPAGE_NONE;
DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND); DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0); DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0);
@ -4728,6 +4732,18 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u
OutputDebugString("STARTED PLAYING FRONTEND AUDIO TRACK"); OutputDebugString("STARTED PLAYING FRONTEND AUDIO TRACK");
} }
break; break;
#ifdef MISSION_REPLAY
case MENUACTION_REJECT_RETRY:
doingMissionRetry = false;
AllowMissionReplay = 0;
RequestFrontEndShutDown();
break;
case MENUACTION_UNK114:
doingMissionRetry = false;
RequestFrontEndShutDown();
RetryMission(2, 0);
return;
#endif
case MENUACTION_SAVEGAME: case MENUACTION_SAVEGAME:
{ {
int saveSlot = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_SaveSlot; int saveSlot = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_SaveSlot;
@ -5373,6 +5389,19 @@ CMenuManager::ProcessFileActions()
{ {
switch (m_nCurrScreen) { switch (m_nCurrScreen) {
case MENUPAGE_LOADING_IN_PROGRESS: case MENUPAGE_LOADING_IN_PROGRESS:
#ifdef MISSION_REPLAY
if (MissionSkipLevel) {
if (gGameState != GS_PLAYING_GAME)
DoSettingsBeforeStartingAGame();
RequestFrontEndShutDown();
break;
}
if (doingMissionRetry) {
RetryMission(2, 0);
m_nCurrSaveSlot = SLOT_COUNT;
doingMissionRetry = false;
}
#endif
if (CheckSlotDataValid(m_nCurrSaveSlot)) { if (CheckSlotDataValid(m_nCurrSaveSlot)) {
#ifdef USE_DEBUG_SCRIPT_LOADER #ifdef USE_DEBUG_SCRIPT_LOADER
scriptToLoad = 0; scriptToLoad = 0;

View file

@ -218,8 +218,11 @@ enum eMenuScreen
#ifdef DETECT_JOYSTICK_MENU #ifdef DETECT_JOYSTICK_MENU
MENUPAGE_DETECT_JOYSTICK, MENUPAGE_DETECT_JOYSTICK,
#endif #endif
#endif #endif
#ifdef MISSION_REPLAY
MENUPAGE_MISSION_RETRY,
#endif
MENUPAGE_OUTRO, // Originally 34, but CFO needs last screen to be empty to count number of menu pages MENUPAGE_OUTRO, // Originally 34, but CFO needs last screen to be empty to count number of menu pages
MENUPAGES MENUPAGES
}; };
@ -288,6 +291,10 @@ enum eMenuAction
MENUACTION_CTRLVIBRATION, MENUACTION_CTRLVIBRATION,
MENUACTION_CTRLCONFIG, MENUACTION_CTRLCONFIG,
#endif #endif
#ifdef MISSION_REPLAY
MENUACTION_REJECT_RETRY,
MENUACTION_UNK114
#endif
}; };
enum eCheckHover enum eCheckHover

View file

@ -329,6 +329,16 @@ CMenuScreen aScreens[] = {
}, },
#endif #endif
#ifdef MISSION_REPLAY
// MENUPAGE_MISSION_RETRY = 57 on mobile
{ "M_FAIL", MENUPAGE_DISABLED, 0,
MENUACTION_LABEL, "FESZ_RM", SAVESLOT_NONE, MENUPAGE_NONE, 0, 0, 0,
MENUACTION_CHANGEMENU, "FEM_YES", SAVESLOT_NONE, MENUPAGE_LOADING_IN_PROGRESS, 320, 200, MENUALIGN_CENTER,
MENUACTION_REJECT_RETRY, "FEM_NO", SAVESLOT_NONE, MENUPAGE_NONE, 320, 225, MENUALIGN_CENTER,
},
#endif
// MENUPAGE_OUTRO - Originally 34 // MENUPAGE_OUTRO - Originally 34
{ "", 0, 0, }, { "", 0, 0, },
}; };

View file

@ -756,6 +756,17 @@ CMenuScreenCustom aScreens[] = {
}, },
#endif #endif
#ifdef MISSION_REPLAY
// MENUPAGE_MISSION_RETRY = 57 on mobile
{ "M_FAIL", MENUPAGE_DISABLED, nil, nil,
MENUACTION_LABEL, "FESZ_RM", { nil, SAVESLOT_NONE, MENUPAGE_NONE }, 0, 0, 0,
MENUACTION_CHANGEMENU, "FEM_YES", { nil, SAVESLOT_NONE, MENUPAGE_LOADING_IN_PROGRESS }, 320, 200, MENUALIGN_CENTER,
MENUACTION_REJECT_RETRY, "FEM_NO", { nil, SAVESLOT_NONE, MENUPAGE_NONE }, 320, 225, MENUALIGN_CENTER,
},
#endif
// MENUPAGE_OUTRO = 34 // MENUPAGE_OUTRO = 34
{ "", 0, nil, nil, }, { "", 0, nil, nil, },
}; };

View file

@ -269,7 +269,7 @@ INITSAVEBUF
if (pVehicle->IsBoat() && (pVehicle->VehicleCreatedBy == MISSION_VEHICLE || bForceSaving)) if (pVehicle->IsBoat() && (pVehicle->VehicleCreatedBy == MISSION_VEHICLE || bForceSaving))
++nNumBoats; ++nNumBoats;
if (pVehicle->IsBike() && (pVehicle->VehicleCreatedBy == MISSION_VEHICLE || bForceSaving)) if (pVehicle->IsBike() && (pVehicle->VehicleCreatedBy == MISSION_VEHICLE || bForceSaving))
++nNumBoats; ++nNumBikes;
#else #else
if (!pVehicle->pDriver && !bHasPassenger) { if (!pVehicle->pDriver && !bHasPassenger) {
if (pVehicle->IsCar() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE) if (pVehicle->IsCar() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE)
@ -277,7 +277,7 @@ INITSAVEBUF
if (pVehicle->IsBoat() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE) if (pVehicle->IsBoat() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE)
++nNumBoats; ++nNumBoats;
if (pVehicle->IsBike() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE) if (pVehicle->IsBike() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE)
++nNumBoats; ++nNumBikes;
#endif #endif
} }
} }

View file

@ -187,6 +187,9 @@ enum Config {
# define PC_MENU # define PC_MENU
# define PC_WATER # define PC_WATER
#elif defined GTA_XBOX #elif defined GTA_XBOX
#elif defined GTA_MOBILE
# define MISSION_REPLAY
# define SIMPLER_MISSIONS
#endif #endif
// This is enabled for all released games. // This is enabled for all released games.
@ -392,8 +395,9 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
#endif #endif
#ifdef PC_MENU #ifdef PC_MENU
//#define MISSION_REPLAY // mobile feature //#define MISSION_REPLAY // mobile feature
//#define SIMPLER_MISSIONS // apply simplifications from mobile
//#define USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
#endif #endif
//#define SIMPLIER_MISSIONS // apply simplifications from mobile
#define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
#define SCRIPT_LOG_FILE_LEVEL 1 // 0 == no log, 1 == overwrite every frame, 2 == full log #define SCRIPT_LOG_FILE_LEVEL 1 // 0 == no log, 1 == overwrite every frame, 2 == full log
@ -410,6 +414,10 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
#undef USE_BASIC_SCRIPT_DEBUG_OUTPUT #undef USE_BASIC_SCRIPT_DEBUG_OUTPUT
#endif #endif
#ifndef MISSION_REPLAY
#undef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
#endif
// Replay // Replay
//#define DONT_FIX_REPLAY_BUGS // keeps various bugs in CReplay, some of which are fairly cool! //#define DONT_FIX_REPLAY_BUGS // keeps various bugs in CReplay, some of which are fairly cool!
//#define USE_BETA_REPLAY_MODE // adds another replay mode, a few seconds slomo (caution: buggy!) //#define USE_BETA_REPLAY_MODE // adds another replay mode, a few seconds slomo (caution: buggy!)

View file

@ -1176,13 +1176,20 @@ void DisplaySaveResult(int unk, char* name)
bool SaveGameForPause(int type) bool SaveGameForPause(int type)
{ {
if (AllowMissionReplay != 0 || type != 3 && WaitForSave > CTimer::GetTimeInMilliseconds()) if (AllowMissionReplay != 0 && AllowMissionReplay != 7) {
debug("SaveGameForPause failed during AllowMissionReplay %d", AllowMissionReplay);
return false; return false;
}
if (type != 3 && WaitForSave > CTimer::GetTimeInMilliseconds()) {
debug("SaveGameForPause failed WaitForSave");
return false;
}
WaitForSave = 0; WaitForSave = 0;
if (gGameState != GS_PLAYING_GAME || CTheScripts::IsPlayerOnAMission() || CStats::LastMissionPassedName[0] == '\0') { if (gGameState != GS_PLAYING_GAME || (CTheScripts::bAlreadyRunningAMissionScript && type != 5)) {
DisplaySaveResult(3, CStats::LastMissionPassedName); DisplaySaveResult(3, CStats::LastMissionPassedName);
return false; return false;
} }
debug("SaveGameForPause ******************************** %s doSave %d", CStats::LastMissionPassedName, !CTheScripts::bAlreadyRunningAMissionScript);
IsQuickSave = type; IsQuickSave = type;
MissionStartTime = 0; MissionStartTime = 0;
int res = PcSaveHelper.SaveSlot(PAUSE_SAVE_SLOT); int res = PcSaveHelper.SaveSlot(PAUSE_SAVE_SLOT);

View file

@ -102,7 +102,11 @@ CExplosion::GetExplosionPosition(uint8 id)
} }
bool bool
#ifdef SIMPLER_MISSIONS
CExplosion::AddExplosion(CEntity* explodingEntity, CEntity* culprit, eExplosionType type, const CVector& pos, uint32 lifetime, bool makeSound, float radius)
#else
CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool makeSound) CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool makeSound)
#endif
{ {
CVector pPosn; CVector pPosn;
CVector posGround; CVector posGround;
@ -150,7 +154,11 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT
switch (type) switch (type)
{ {
case EXPLOSION_GRENADE: case EXPLOSION_GRENADE:
#ifdef SIMPLER_MISSIONS
explosion.m_fRadius = (radius == -1.0f ? 9.0f : radius);
#else
explosion.m_fRadius = 9.0f; explosion.m_fRadius = 9.0f;
#endif
explosion.m_fPower = 300.0f; explosion.m_fPower = 300.0f;
explosion.m_fStopTime = lifetime + CTimer::GetTimeInMilliseconds() + 750; explosion.m_fStopTime = lifetime + CTimer::GetTimeInMilliseconds() + 750;
explosion.m_fPropagationRate = 0.5f; explosion.m_fPropagationRate = 0.5f;

View file

@ -37,7 +37,11 @@ class CExplosion
float m_fPower; float m_fPower;
float m_fZshift; float m_fZshift;
public: public:
static bool AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool makeSound = true); //done(new parametr in android ver is fix for one mission) #ifdef SIMPLER_MISSIONS
static bool AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool makeSound = true, float radius = -1.0f);
#else
static bool AddExplosion(CEntity* explodingEntity, CEntity* culprit, eExplosionType type, const CVector& pos, uint32 lifetime, bool makeSound = true);
#endif
static void ClearAllExplosions(); //done static void ClearAllExplosions(); //done
static bool DoesExplosionMakeSound(uint8 id); //done static bool DoesExplosionMakeSound(uint8 id); //done
static int8 GetExplosionActiveCounter(uint8 id); //done static int8 GetExplosionActiveCounter(uint8 id); //done