mirror of
https://github.com/halpz/re3.git
synced 2025-07-10 16:58:58 +00:00
mission replay
This commit is contained in:
@ -127,7 +127,97 @@ static const char* nonMissionScripts[] = {
|
||||
"rc4",
|
||||
"hj",
|
||||
"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;
|
||||
@ -143,6 +233,11 @@ bool gbTryingPorn4Again;
|
||||
int IsInAmmunation;
|
||||
int MissionSkipLevel;
|
||||
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
bool UsingMobileScript;
|
||||
bool AlreadySavedGame;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#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";
|
||||
PrintToLog(init_msg);
|
||||
CFileMgr::SetDir("");
|
||||
#endif
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
UsingMobileScript = false;
|
||||
AlreadySavedGame = false;
|
||||
#endif
|
||||
return retval;
|
||||
}
|
||||
@ -2779,6 +2878,7 @@ void CTheScripts::Process()
|
||||
|
||||
#ifdef MISSION_REPLAY
|
||||
static uint32 TimeToWaitTill;
|
||||
static bool AlreadyResetHealth;
|
||||
switch (AllowMissionReplay) {
|
||||
case 2:
|
||||
AllowMissionReplay = 3;
|
||||
@ -2794,9 +2894,19 @@ void CTheScripts::Process()
|
||||
break;
|
||||
case 6:
|
||||
AllowMissionReplay = 7;
|
||||
AlreadyResetHealth = false;
|
||||
TimeToWaitTill = CTimer::GetTimeInMilliseconds() + 500;
|
||||
break;
|
||||
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()) {
|
||||
AllowMissionReplay = 0;
|
||||
return;
|
||||
@ -3028,11 +3138,11 @@ int8 CRunningScript::ProcessOneCommand()
|
||||
}
|
||||
}
|
||||
#elif defined USE_BASIC_SCRIPT_DEBUG_OUTPUT
|
||||
if (m_bMissionFlag) {
|
||||
char tmp[128];
|
||||
sprintf(tmp, "Comm %d Cmp %d", command, m_bCondResult);
|
||||
CDebug::DebugAddText(tmp);
|
||||
}
|
||||
if (m_bMissionFlag) {
|
||||
char tmp[128];
|
||||
sprintf(tmp, "Comm %d Cmp %d", command, m_bCondResult);
|
||||
CDebug::DebugAddText(tmp);
|
||||
}
|
||||
#endif
|
||||
return retval;
|
||||
}
|
||||
@ -4447,14 +4557,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0));
|
||||
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);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_SET_CAR_DRIVING_STYLE:
|
||||
@ -4529,8 +4632,12 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
||||
{
|
||||
wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp);
|
||||
#ifdef MISSION_REPLAY
|
||||
if (strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "M_FAIL") == 0 && CanAllowMissionReplay())
|
||||
AllowMissionReplay = 1;
|
||||
if (strcmp((char*)&CTheScripts::ScriptSpace[m_nIp - KEY_LENGTH_IN_SCRIPT], "M_FAIL") == 0) {
|
||||
if (AllowMissionReplay == 7)
|
||||
AllowMissionReplay = 0;
|
||||
if (CanAllowMissionReplay())
|
||||
AllowMissionReplay = 1;
|
||||
}
|
||||
#endif
|
||||
CollectParameters(&m_nIp, 2);
|
||||
CMessages::AddBigMessage(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1);
|
||||
@ -5199,21 +5306,15 @@ bool CRunningScript::CanAllowMissionReplay()
|
||||
{
|
||||
if (AllowMissionReplay)
|
||||
return false;
|
||||
if (CStats::LastMissionPassedName[0] == '\0')
|
||||
return false;
|
||||
for (int i = 0; i < ARRAY_SIZE(nonMissionScripts); i++) {
|
||||
if (strcmp(m_abScriptName, nonMissionScripts[i]) == 0)
|
||||
return false;
|
||||
for (int i = 0; i < ARRAY_SIZE(MissionScripts); i++) {
|
||||
if (!CGeneral::faststricmp(m_abScriptName, MissionScripts[i]))
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 AddExtraDeathDelay()
|
||||
{
|
||||
if (missionRetryScriptIndex == 63)
|
||||
return 7000;
|
||||
if (missionRetryScriptIndex == 64)
|
||||
return 4000;
|
||||
return 1000;
|
||||
}
|
||||
|
||||
@ -5221,7 +5322,7 @@ void RetryMission(int type, int unk)
|
||||
{
|
||||
if (type == 0) {
|
||||
doingMissionRetry = true;
|
||||
FrontEndMenuManager.m_nCurrScreen = 57; // MENUPAGE_MISSION_RETRY
|
||||
FrontEndMenuManager.m_nCurrScreen = MENUPAGE_MISSION_RETRY;
|
||||
FrontEndMenuManager.RequestFrontEndStartUp();
|
||||
}
|
||||
else if (type == 2) {
|
||||
@ -5259,8 +5360,11 @@ CTheScripts::SwitchToMission(int32 mission)
|
||||
|
||||
#ifdef MISSION_REPLAY
|
||||
missionRetryScriptIndex = mission;
|
||||
if (missionRetryScriptIndex == 19)
|
||||
CStats::LastMissionPassedName[0] = '\0';
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
if (CTheScripts::MissionSupportsMissionReplay(missionRetryScriptIndex)) {
|
||||
SaveGameForPause(4);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
CTimer::Suspend();
|
||||
int offset = CTheScripts::MultiScriptArray[mission] + 8;
|
||||
|
@ -653,6 +653,12 @@ public:
|
||||
static void SetObjectiveForAllPedsInCollective(int, eObjective);
|
||||
#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; }
|
||||
|
||||
};
|
||||
@ -665,7 +671,6 @@ VALIDATE_SIZE(uStackReturnValue, 4);
|
||||
extern int scriptToLoad;
|
||||
#endif
|
||||
#ifdef MISSION_REPLAY
|
||||
static_assert(false, "Mission replay is not supported");
|
||||
extern int AllowMissionReplay;
|
||||
extern uint32 WaitForMissionActivate;
|
||||
extern uint32 WaitForSave;
|
||||
@ -676,6 +681,11 @@ extern bool gbTryingPorn4Again;
|
||||
extern int IsInAmmunation;
|
||||
extern int MissionSkipLevel;
|
||||
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
extern bool UsingMobileScript;
|
||||
extern bool AlreadySavedGame;
|
||||
#endif
|
||||
|
||||
uint32 AddExtraDeathDelay();
|
||||
void RetryMission(int, int);
|
||||
#endif
|
||||
|
@ -1383,8 +1383,10 @@ void CRunningScript::DoDeatharrestCheck()
|
||||
if (!pPlayer->IsRestartingAfterDeath() && !pPlayer->IsRestartingAfterArrest())
|
||||
return;
|
||||
#ifdef MISSION_REPLAY
|
||||
if (AllowMissionReplay != 0)
|
||||
if (AllowMissionReplay != 7 && AllowMissionReplay != 0)
|
||||
return;
|
||||
if (AllowMissionReplay == 7)
|
||||
AllowMissionReplay = 0;
|
||||
if (CanAllowMissionReplay())
|
||||
AllowMissionReplay = 1;
|
||||
#endif
|
||||
|
@ -125,10 +125,6 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
|
||||
case COMMAND_MAKE_PLAYER_SAFE_FOR_CUTSCENE:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
#ifdef MISSION_REPLAY
|
||||
AllowMissionReplay = 0;
|
||||
SaveGameForPause(3);
|
||||
#endif
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[GET_INTEGER_PARAM(0)];
|
||||
CPad::GetPad(GET_INTEGER_PARAM(0))->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE);
|
||||
pPlayerInfo->MakePlayerSafe(true);
|
||||
@ -372,6 +368,9 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
|
||||
return 0;
|
||||
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);
|
||||
|
||||
if (CTheScripts::NumberOfExclusiveMissionScripts > 0) {
|
||||
@ -381,8 +380,19 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
|
||||
}
|
||||
#ifdef MISSION_REPLAY
|
||||
missionRetryScriptIndex = GET_INTEGER_PARAM(0);
|
||||
if (missionRetryScriptIndex == 19)
|
||||
CStats::LastMissionPassedName[0] = '\0';
|
||||
#ifdef USE_MISSION_REPLAY_OVERRIDE_FOR_NON_MOBILE_SCRIPT
|
||||
if (!UsingMobileScript && CTheScripts::MissionSupportsMissionReplay(missionRetryScriptIndex)){
|
||||
if (!AlreadySavedGame) {
|
||||
m_nIp = oldIp - 2;
|
||||
SaveGameForPause(4);
|
||||
AlreadySavedGame = true;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
AlreadySavedGame = false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
CTimer::Suspend();
|
||||
int offset = CTheScripts::MultiScriptArray[GET_INTEGER_PARAM(0)] + 8;
|
||||
@ -1094,6 +1104,9 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command)
|
||||
}
|
||||
case COMMAND_FAIL_CURRENT_MISSION:
|
||||
CTheScripts::FailCurrentMission = 2;
|
||||
#ifdef MISSION_REPLAY
|
||||
MissionSkipLevel = 0;
|
||||
#endif
|
||||
return 0;
|
||||
case COMMAND_GET_CLOSEST_OBJECT_OF_TYPE:
|
||||
{
|
||||
|
Reference in New Issue
Block a user