@@ -29,11 +29,23 @@ namespace MissionSkip {
2929 if (_strupr_s (cheatActivatedMapName, sizeof (cheatActivatedMapName)) != 0 )
3030 {
3131 GetLogger ()->Error (" Failed to convert map name to uppercase\n " );
32+ GetLogger ()->Informational (" Orbiton has been disabled\n " );
3233 return ;
3334 }
3435
36+ constexpr int missionValidationStringLength = sizeof (MissionValidationString) - 1 ;
37+ constexpr int missionNumberStringLength = 3 ;
38+
39+ // Validate if the string has the expected length
40+ if (strlen (cheatActivatedMapName) < missionValidationStringLength + missionNumberStringLength)
41+ {
42+ GetLogger ()->Warning (" Current map has an unexpected length, are you sure this is a mission?\n " );
43+ GetLogger ()->Informational (" Orbiton has been disabled\n " );
44+ return ;
45+ }
46+
3547 // Check if the current map is a mission
36- for (unsigned int i = 0 ; i < sizeof (MissionValidationString) - 1 ; ++i)
48+ for (unsigned int i = 0 ; i < missionValidationStringLength ; ++i)
3749 {
3850 if (MissionValidationString[i] != cheatActivatedMapName[i])
3951 {
@@ -42,17 +54,17 @@ namespace MissionSkip {
4254 return ;
4355 }
4456 }
45-
46- char missionNumberAsString[4 ] = { 0x00 , };
47- memcpy_s (missionNumberAsString, sizeof (missionNumberAsString), cheatActivatedMapName + strlen (MissionValidationString), 3 );
57+
58+ char missionNumberAsString[missionNumberStringLength + 1 ] = { 0x00 , };
59+ memcpy_s (missionNumberAsString, sizeof (missionNumberAsString), cheatActivatedMapName + missionValidationStringLength, missionNumberStringLength );
4860 int missionNumber = atoi (missionNumberAsString + 1 ); // Skip team
4961 if (missionNumber < 10 )
5062 missionNumber++;
5163
52- sprintf_s (missionNumberAsString + 1 , sizeof (missionNumberAsString), " %02d" , missionNumber);
53- memcpy_s (cheatActivatedMapName + strlen (MissionValidationString), 3 , missionNumberAsString, 3 );
64+ sprintf_s (missionNumberAsString + 1 , sizeof (missionNumberAsString) - 1 , " %02d" , missionNumber);
65+ memcpy_s (cheatActivatedMapName + missionValidationStringLength, missionNumberStringLength , missionNumberAsString, missionNumberStringLength );
5466
55- memcpy_s (OrbitonMissionPathPattern + sizeof (OrbitonMissionPathPattern) - 4 , 3 , missionNumberAsString, 3 );
67+ memcpy_s (OrbitonMissionPathPattern + ( sizeof (OrbitonMissionPathPattern) - 1 ) - missionNumberStringLength, missionNumberStringLength , missionNumberAsString, missionNumberStringLength );
5668
5769 GetLogger ()->Informational (" Next mission will be forced to: %s\n Exit to main menu and start a new campaign.\n " , cheatActivatedMapName);
5870
@@ -106,12 +118,18 @@ namespace MissionSkip {
106118
107119 __declspec (naked) void Implementation ()
108120 {
109- __asm cmp [OrbitonActivated], 0 ;
121+ __asm cmp [OrbitonActivated], 0x00 ;
110122 __asm je fullPathOrbitonDeactivated;
111123
124+ __asm cmp ecx, 0x01 ;
125+ __asm je disableOrbitonForTutorial;
126+
112127 __asm push offset [OrbitonMissionPathPattern];
113128 __asm jmp [JmpBackAddress];
114129
130+ disableOrbitonForTutorial:
131+ __asm mov [OrbitonActivated], 0x00 ;
132+
115133 fullPathOrbitonDeactivated:
116134 __asm push offset [DefaultMissionPathPattern];
117135 __asm jmp [JmpBackAddress];
@@ -127,11 +145,11 @@ namespace MissionSkip {
127145
128146 __declspec (naked) void Implementation ()
129147 {
130- __asm cmp [OrbitonActivated], 0 ;
148+ __asm cmp [OrbitonActivated], 0x00 ;
131149 __asm je fullPathOrbitonDeactivated;
132150
133151 __asm push offset [OrbitonMissionPathPattern + 0x02 ];
134- __asm mov [OrbitonActivated], 0 ;
152+ __asm mov [OrbitonActivated], 0x00 ;
135153 __asm jmp [JmpBackAddress];
136154
137155 fullPathOrbitonDeactivated:
0 commit comments