From d5d60afdc38a7b864cc6189928ea28906be8e397 Mon Sep 17 00:00:00 2001 From: NY00123 Date: Sun, 5 Jan 2020 21:20:33 +0200 Subject: [PATCH] PCExhumed: Improve the cheat code fixes in CheckKeys. - Replace direct calls to strtok with calls to a new wrapper function, safeStrtok. Whenever strtok returns a null pointer, safeStrtok returns an empty string instead. This should assist with replicating the behaviors with the DOS EXE, without leading to crashes. - This way, the "GOTO" and "CREATURE" codes are fixed. The code handling "LEVEL" is additionally simplified. - The code executed if nStringLen == 0 || pToken == NULL is now gone. As is the case under DOS, if you enter a non-empty string which isn't matched at all, sHollyStr will be emptified, but you'll otherwise still be able to enter a code, with no need to retype "HOLLY". --- source/exhumed/src/exhumed.cpp | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/source/exhumed/src/exhumed.cpp b/source/exhumed/src/exhumed.cpp index 77ef4dff8..e7ec2f3da 100644 --- a/source/exhumed/src/exhumed.cpp +++ b/source/exhumed/src/exhumed.cpp @@ -979,6 +979,13 @@ void mysetbrightness(char nBrightness) g_visibility = 2048 - (nBrightness << 9); } +// Replicate original DOS EXE behaviour when pointer is null +static const char *safeStrtok(char *s, const char *d) +{ + const char *r = strtok(s, d); + return r ? r : ""; +} + void CheckKeys() { if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen)) @@ -1074,21 +1081,16 @@ void CheckKeys() if (ch == asc_Enter) { - char *pToken = strtok(sHollyStr, " "); + const char *pToken = safeStrtok(sHollyStr, " "); - if (nStringLen == 0 || pToken == NULL) // bjd - added this check. watcom allows passing NULL to strcmp so the below checks will all fail OK on DOS but will cause a crash on Windows - { - bHolly = kFalse; - StatusMessage(1, " "); - } - else if (!strcmp(pToken, "GOTO")) + if (!strcmp(pToken, "GOTO")) { // move player to X, Y coordinates int nSprite = PlayerList[0].nSprite; - pToken = strtok(NULL, ","); + pToken = safeStrtok(NULL, ","); sprite[nSprite].x = atoi(pToken); - pToken = strtok(NULL, ","); + pToken = safeStrtok(NULL, ","); sprite[nSprite].y = atoi(pToken); setsprite(nSprite, &sprite[nSprite].pos); @@ -1096,13 +1098,8 @@ void CheckKeys() } else if (!strcmp(pToken, "LEVEL")) { - pToken = strtok(NULL, " "); - if (pToken) { - levelnew = atoi(pToken); - } - else { - levelnew = 0; // replicate original DOS EXE behaviour when no level number is specified. - } + pToken = safeStrtok(NULL, " "); + levelnew = atoi(pToken); } else if (!strcmp(pToken, "DOORS")) { @@ -1126,7 +1123,7 @@ void CheckKeys() // i = nNetPlayerCount; if (!nNetPlayerCount) { - pToken = strtok(NULL, " "); + pToken = safeStrtok(NULL, " "); switch (atoi(pToken)) { // TODO - enums?