ref: 6d773dce144d7037ae207d16ef98dab794b5cf3c
parent: 9eae89d3eb668df2ea218f3944d12996e3364000
author: James Canete <SmileTheory@gmail.com>
date: Mon Oct 14 00:03:03 EDT 2019
Detect v1.0/v1.1 IWADs.
--- a/src/d_mode.h
+++ b/src/d_mode.h
@@ -56,7 +56,8 @@
typedef enum
{
- exe_doom_1_2, // Doom 1.2: shareware and registered
+ exe_doom_1_1, // Doom 1.0/1.1: shareware and registered
+ exe_doom_1_2, // Doom 1.2: "
exe_doom_1_666, // Doom 1.666: for shareware, registered and commercial
exe_doom_1_7, // Doom 1.7/1.7a: "
exe_doom_1_8, // Doom 1.8: "
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -959,6 +959,8 @@
const char *cmdline;
GameVersion_t version;
} gameversions[] = {
+ {"Doom 1.0/1.1", "1.1", exe_doom_1_1},
+ {"Doom 1.2", "1.2", exe_doom_1_2},
{"Doom 1.666", "1.666", exe_doom_1_666},
{"Doom 1.7/1.7a", "1.7", exe_doom_1_7},
{"Doom 1.8", "1.8", exe_doom_1_8},
@@ -986,9 +988,9 @@
// @arg <version>
// @category compat
//
- // Emulate a specific version of Doom. Valid values are "1.666",
- // "1.7", "1.8", "1.9", "ultimate", "final", "final2", "hacx" and
- // "chex".
+ // Emulate a specific version of Doom. Valid values are "1.1", "1.2",
+ // "1.666", "1.7", "1.8", "1.9", "ultimate", "final", "final2", "hacx"
+ // and "chex".
//
p = M_CheckParmWithArgs("-gameversion", 1);
@@ -1079,6 +1081,12 @@
break;
}
}
+ }
+
+ // detect v1.0/v1.1 from missing D_INTROA
+ if (gameversion == exe_doom_1_2 && W_CheckNumForName("D_INTROA") < 0)
+ {
+ gameversion = exe_doom_1_1;
}
}
else if (gamemode == retail)
--- a/src/doom/g_game.c
+++ b/src/doom/g_game.c
@@ -2052,6 +2052,8 @@
{
switch (gameversion)
{
+ case exe_doom_1_1:
+ return 101;
case exe_doom_1_2:
return 102;
case exe_doom_1_666:
@@ -2088,7 +2090,7 @@
{
*demo_p++ = DOOM_191_VERSION;
}
- else if (gameversion != exe_doom_1_2)
+ else if (gameversion > exe_doom_1_2)
{
*demo_p++ = G_VanillaVersionCode();
}
@@ -2096,7 +2098,7 @@
*demo_p++ = gameskill;
*demo_p++ = gameepisode;
*demo_p++ = gamemap;
- if (longtics || gameversion != exe_doom_1_2)
+ if (longtics || gameversion > exe_doom_1_2)
{
*demo_p++ = deathmatch;
*demo_p++ = respawnparm;
@@ -2130,6 +2132,10 @@
switch (version)
{
+ case 101:
+ return "v1.0/v1.1";
+ case 102:
+ return "v1.2";
case 104:
return "v1.4";
case 105:
@@ -2151,7 +2157,7 @@
// Unknown version. Perhaps this is a pre-v1.4 IWAD? If the version
// byte is in the range 0-4 then it can be a v1.0-v1.2 demo.
- if (version == 102 || (version >= 0 && version <= 4))
+ if (version >= 0 && version <= 4)
{
return "v1.0/v1.1/v1.2";
}
@@ -2176,9 +2182,11 @@
demoversion = *demo_p++;
- if (demoversion < 102)
+ if (demoversion >= 0 && demoversion <= 4)
{
- demoversion = 102;
+ if (gameversion <= exe_doom_1_2)
+ demoversion = G_VanillaVersionCode();
+
demo_p--;
}
@@ -2209,7 +2217,7 @@
skill = *demo_p++;
episode = *demo_p++;
map = *demo_p++;
- if (demoversion != 102)
+ if (demoversion > 102)
{
deathmatch = *demo_p++;
respawnparm = *demo_p++;
--- a/src/doom/p_enemy.c
+++ b/src/doom/p_enemy.c
@@ -176,7 +176,7 @@
pl = actor->target;
dist = P_AproxDistance (pl->x-actor->x, pl->y-actor->y);
- if (gameversion == exe_doom_1_2)
+ if (gameversion <= exe_doom_1_2)
range = MELEERANGE;
else
range = MELEERANGE-20*FRACUNIT+pl->info->radius;
@@ -672,7 +672,7 @@
// modify target threshold
if (actor->threshold)
{
- if (gameversion != exe_doom_1_2 &&
+ if (gameversion > exe_doom_1_2 &&
(!actor->target || actor->target->health <= 0))
{
actor->threshold = 0;
@@ -933,7 +933,7 @@
A_FaceTarget (actor);
- if (gameversion != exe_doom_1_2)
+ if (gameversion > exe_doom_1_2)
{
if (!P_CheckMeleeRange (actor))
return;
@@ -941,7 +941,7 @@
damage = ((P_Random()%10)+1)*4;
- if (gameversion == exe_doom_1_2)
+ if (gameversion <= exe_doom_1_2)
P_LineAttack(actor, actor->angle, MELEERANGE, 0, damage);
else
P_DamageMobj (actor->target, actor, actor, damage);
--- a/src/doom/p_floor.c
+++ b/src/doom/p_floor.c
@@ -303,7 +303,7 @@
floor->speed = FLOORSPEED * 4;
floor->floordestheight =
P_FindHighestFloorSurrounding(sec);
- if (gameversion == exe_doom_1_2 ||
+ if (gameversion <= exe_doom_1_2 ||
floor->floordestheight != sec->floorheight)
floor->floordestheight += 8*FRACUNIT;
break;
--- a/src/doom/p_inter.c
+++ b/src/doom/p_inter.c
@@ -382,7 +382,7 @@
case SPR_BON2:
player->armorpoints++; // can go over 100%
- if (player->armorpoints > deh_max_armor && gameversion != exe_doom_1_2)
+ if (player->armorpoints > deh_max_armor && gameversion > exe_doom_1_2)
player->armorpoints = deh_max_armor;
// deh_green_armor_class only applies to the green armor shirt;
// for the armor helmets, armortype 1 is always used.
@@ -907,7 +907,7 @@
target->reactiontime = 0; // we're awake now...
if ( (!target->threshold || target->type == MT_VILE)
- && source && (source != target || gameversion == exe_doom_1_2)
+ && source && (source != target || gameversion <= exe_doom_1_2)
&& source->type != MT_VILE)
{
// if not intent on another player,
--- a/src/doom/p_map.c
+++ b/src/doom/p_map.c
@@ -1317,7 +1317,7 @@
{
P_SetMobjState (thing, S_GIBS);
- if (gameversion != exe_doom_1_2)
+ if (gameversion > exe_doom_1_2)
thing->flags &= ~MF_SOLID;
thing->height = 0;
thing->radius = 0;
--- a/src/doom/p_sight.c
+++ b/src/doom/p_sight.c
@@ -375,7 +375,7 @@
topslope = (t2->z+t2->height) - sightzstart;
bottomslope = (t2->z) - sightzstart;
- if (gameversion == exe_doom_1_2)
+ if (gameversion <= exe_doom_1_2)
{
return P_PathTraverse(t1->x, t1->y, t2->x, t2->y,
PT_EARLYOUT | PT_ADDLINES, PTR_SightTraverse);
--- a/src/doom/p_spec.c
+++ b/src/doom/p_spec.c
@@ -509,7 +509,7 @@
line = &lines[linenum];
- if (gameversion == exe_doom_1_2)
+ if (gameversion <= exe_doom_1_2)
{
if (line->special > 98 && line->special != 104)
{
--- a/src/doom/s_sound.c
+++ b/src/doom/s_sound.c
@@ -446,7 +446,7 @@
}
// substitute missing sounds in Doom 1.2
- if (gameversion == exe_doom_1_2)
+ if (gameversion <= exe_doom_1_2)
{
switch(sfx_id)
{
@@ -696,7 +696,7 @@
if (musicnum == mus_intro && (snd_musicdevice == SNDDEVICE_ADLIB
|| snd_musicdevice == SNDDEVICE_SB)
- && W_CheckNumForName("D_INTROA") > 0)
+ && gameversion >= exe_doom_1_2)
{
musicnum = mus_introa;
}
--- a/src/doom/st_stuff.c
+++ b/src/doom/st_stuff.c
@@ -1149,7 +1149,7 @@
callback(namebuf, &faceback);
// status bar background bits
- if (W_CheckNumForName(DEH_String("STBAR")) > 0)
+ if (gameversion >= exe_doom_1_2)
{
callback(DEH_String("STBAR"), &sbar);
sbarr = NULL;