commit 2471097d1b5d9c44349c0a6f18196178f53be25f
Author: Fabian Greffrath <fabian@greffrath.com>
AuthorDate: Mon Mar 27 11:38:52 2023 +0200
Commit: Fabian Greffrath <fabian@greffrath.com>
CommitDate: Mon Mar 27 11:45:57 2023 +0200
check if drag-n-dropped .lmp files could be demo lumps
and pass them to the -playdemo parameter if appropriate.
@JNechaevsky @Dasperal @rfomin
---
src/m_argv.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 89 insertions(+), 6 deletions(-)
diff --git a/src/m_argv.c b/src/m_argv.c
index 193910f0..fb953d5f 100644
--- a/src/m_argv.c
+++ b/src/m_argv.c
@@ -291,14 +291,76 @@ enum
FILETYPE_IWAD = 0x2,
FILETYPE_PWAD = 0x4,
FILETYPE_DEH = 0x8,
+ FILETYPE_DEMO = 0x10,
};
+static boolean FileIsDemoLump(const char *filename)
+{
+ FILE *handle;
+ int count, ver;
+ byte buf[12], *p = buf;
+
+ handle = M_fopen(filename, "rb");
+
+ if (handle == NULL)
+ {
+ return false;
+ }
+
+ count = fread(buf, 1, sizeof(buf), handle);
+ fclose(handle);
+
+ if (count != sizeof(buf))
+ {
+ return false;
+ }
+
+ ver = *p++;
+
+ if (ver >= 0 && ver <= 4) // v1.0/v1.1/v1.2
+ {
+ p--;
+ }
+ else
+ {
+ switch (ver)
+ {
+ case 104: // v1.4
+ case 105: // v1.5
+ case 106: // v1.6/v1.666
+ case 107: // v1.7/v1.7a
+ case 108: // v1.8
+ case 109: // v1.9
+ case 111: // v1.91 hack
+ break;
+ default:
+ return false;
+ break;
+ }
+ }
+
+ if (*p++ > 5) // skill
+ {
+ return false;
+ }
+ if (*p++ > 9) // episode
+ {
+ return false;
+ }
+ if (*p++ > 99) // map
+ {
+ return false;
+ }
+
+ return true;
+}
+
static int GuessFileType(const char *name)
{
int ret = FILETYPE_UNKNOWN;
const char *base;
char *lower;
- static boolean iwad_found = false;
+ static boolean iwad_found = false, demo_found = false;
base = M_BaseName(name);
lower = M_StringDuplicate(base);
@@ -311,11 +373,24 @@ static int GuessFileType(const char *name)
ret = FILETYPE_IWAD;
iwad_found = true;
}
- else if (M_StringEndsWith(lower, ".wad") ||
- M_StringEndsWith(lower, ".lmp"))
+ else if (M_StringEndsWith(lower, ".wad"))
{
ret = FILETYPE_PWAD;
}
+ else if (M_StringEndsWith(lower, ".lmp"))
+ {
+ // only ever add one argument to the -playdemo parameter
+
+ if (demo_found == false && FileIsDemoLump(name))
+ {
+ ret = FILETYPE_DEMO;
+ demo_found = true;
+ }
+ else
+ {
+ ret = FILETYPE_PWAD;
+ }
+ }
else if (M_StringEndsWith(lower, ".deh") ||
// M_StringEndsWith(lower, ".bex") ||
M_StringEndsWith(lower, ".hhe") ||
@@ -356,10 +431,11 @@ void M_AddLooseFiles(void)
return;
}
- // allocate space for up to three additional regular parameters
+ // allocate space for up to four additional regular parameters
+ // (-iwad, -merge, -deh, -playdemo)
- arguments = malloc((myargc + 3) * sizeof(*arguments));
- memset(arguments, 0, (myargc + 3) * sizeof(*arguments));
+ arguments = malloc((myargc + 4) * sizeof(*arguments));
+ memset(arguments, 0, (myargc + 4) * sizeof(*arguments));
// check the command line and make sure it does not already
// contain any regular parameters or response files
@@ -409,6 +485,12 @@ void M_AddLooseFiles(void)
arguments[myargc].type = FILETYPE_DEH - 1;
myargc++;
}
+ if (types & FILETYPE_DEMO)
+ {
+ arguments[myargc].str = M_StringDuplicate("-playdemo");
+ arguments[myargc].type = FILETYPE_DEMO - 1;
+ myargc++;
+ }
newargv = malloc(myargc * sizeof(*newargv));
@@ -426,6 +508,7 @@ void M_AddLooseFiles(void)
free(arguments);
+ free(myargv);
myargv = newargv;
}
#endif