2009-02-08 23:01:13 +00:00
|
|
|
/*
|
|
|
|
** compatibility.cpp
|
|
|
|
** Handles compatibility flags for maps that are unlikely to be updated.
|
|
|
|
**
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
** Copyright 2009 Randy Heit
|
|
|
|
** All rights reserved.
|
|
|
|
**
|
|
|
|
** Redistribution and use in source and binary forms, with or without
|
|
|
|
** modification, are permitted provided that the following conditions
|
|
|
|
** are met:
|
|
|
|
**
|
|
|
|
** 1. Redistributions of source code must retain the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer.
|
|
|
|
** 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer in the
|
|
|
|
** documentation and/or other materials provided with the distribution.
|
|
|
|
** 3. The name of the author may not be used to endorse or promote products
|
|
|
|
** derived from this software without specific prior written permission.
|
|
|
|
**
|
|
|
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
**
|
|
|
|
** This file is for maps that have been rendered broken by bug fixes or other
|
|
|
|
** changes that seemed minor at the time, and it is unlikely that the maps
|
|
|
|
** will be changed. If you are making a map and you know it needs a
|
|
|
|
** compatibility option to play properly, you are advised to specify so with
|
|
|
|
** a MAPINFO.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// HEADER FILES ------------------------------------------------------------
|
|
|
|
|
|
|
|
#include "compatibility.h"
|
|
|
|
#include "sc_man.h"
|
|
|
|
#include "cmdlib.h"
|
|
|
|
#include "doomdef.h"
|
|
|
|
#include "doomstat.h"
|
|
|
|
#include "c_dispatch.h"
|
|
|
|
#include "gi.h"
|
|
|
|
#include "g_level.h"
|
|
|
|
|
|
|
|
// MACROS ------------------------------------------------------------------
|
|
|
|
|
|
|
|
// TYPES -------------------------------------------------------------------
|
|
|
|
|
|
|
|
struct FCompatOption
|
|
|
|
{
|
|
|
|
const char *Name;
|
|
|
|
int CompatFlags;
|
|
|
|
int BCompatFlags;
|
|
|
|
};
|
|
|
|
|
|
|
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
|
|
|
|
|
|
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
|
|
|
|
|
|
|
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
|
|
|
|
|
|
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
|
|
|
|
|
|
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
|
|
|
|
|
|
|
TMap<FMD5Holder, FCompatValues, FMD5HashTraits> BCompatMap;
|
|
|
|
|
|
|
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
|
|
|
|
|
|
|
static FCompatOption Options[] =
|
|
|
|
{
|
|
|
|
{ "setslopeoverflow", 0, BCOMPATF_SETSLOPEOVERFLOW },
|
|
|
|
{ "resetplayerspeed", 0, BCOMPATF_RESETPLAYERSPEED },
|
|
|
|
{ "spechitoverflow", 0, BCOMPATF_SPECHITOVERFLOW },
|
2009-09-15 06:19:39 +00:00
|
|
|
{ "vileghosts", 0, BCOMPATF_VILEGHOSTS },
|
2009-02-08 23:01:13 +00:00
|
|
|
|
|
|
|
// list copied from g_mapinfo.cpp
|
|
|
|
{ "shorttex", COMPATF_SHORTTEX, 0 },
|
|
|
|
{ "stairs", COMPATF_STAIRINDEX, 0 },
|
|
|
|
{ "limitpain", COMPATF_LIMITPAIN, 0 },
|
|
|
|
{ "nopassover", COMPATF_NO_PASSMOBJ, 0 },
|
|
|
|
{ "notossdrops", COMPATF_NOTOSSDROPS, 0 },
|
|
|
|
{ "useblocking", COMPATF_USEBLOCKING, 0 },
|
|
|
|
{ "nodoorlight", COMPATF_NODOORLIGHT, 0 },
|
|
|
|
{ "ravenscroll", COMPATF_RAVENSCROLL, 0 },
|
|
|
|
{ "soundtarget", COMPATF_SOUNDTARGET, 0 },
|
|
|
|
{ "dehhealth", COMPATF_DEHHEALTH, 0 },
|
|
|
|
{ "trace", COMPATF_TRACE, 0 },
|
|
|
|
{ "dropoff", COMPATF_DROPOFF, 0 },
|
|
|
|
{ "boomscroll", COMPATF_BOOMSCROLL, 0 },
|
|
|
|
{ "invisibility", COMPATF_INVISIBILITY, 0 },
|
|
|
|
{ "silentinstantfloors", COMPATF_SILENT_INSTANT_FLOORS, 0 },
|
|
|
|
{ "sectorsounds", COMPATF_SECTORSOUNDS, 0 },
|
|
|
|
{ "missileclip", COMPATF_MISSILECLIP, 0 },
|
|
|
|
{ "crossdropoff", COMPATF_CROSSDROPOFF, 0 },
|
Update to ZDoom r1585:
- Added ACS GetChar function.
- Added Gez's submission for polyobjects being able to crush corpses but made
it an explicit MAPINFO option only.
- Changed APlayerPawn::DamageFade to a PalEntry from 3 floats.
- Removed #pragma warnings from cmdlib.h and fixed the places where they were
still triggered.
These #pragmas were responsible for >90% of the GCC warnings that were not
listed in VC++.
- Fixed one bug in the process: DSeqNode::m_Atten was never adjusted when the
parameter handling of the sound functions for attenuation was changed.
Changed m_Atten to a float and fixed the SNDSEQ parser to set proper values.
Also added the option to specify attenuation with direct values in addition
to the predefined names.
- fixed a few Heretic actors:
* The pod generator's attacksound was wrong
* The teleglitter generators need different flags if they are supposed to work
with z-aware spawning of the glitter.
* The knight's axes need the THRUGHOST flag.
- Fixed non-POD passing in G_BuildSaveName() and other things GCC warned
about.
- Added support for imploded zips.
- Fixed: Some missile spawning functions ignored the FastSpeed setting.
- Fixed: P_CheckSwitchRange tried to access a line's backsector without
checking if it is valid.
- Fixed: Fast projectile could not be frozen by the Time freezer.
- Added several new ACS functions: GetActorMomX/Y/Z, GetActorViewHeight,
SetActivator, SetActivatorToTarget.
- Added Species property for actors and separated Hexen's Demon1 and Demon2
into different species.
- Added handling for UDMF user keys.
- Added support for ACS functions that can be defined without recompiling ACC.
- Fixed: The short lump name for embedded files must be cleared so that they
are not found by a normal lump search.
- Added AProp_Notarget actor property.
- Fixed: TraceBleed was missing a NULL pointer check,
- Fixed: P_RandomChaseDir could crash for friendly monsters that belong to
a player which left the game.
- Changed A_PodGrow so that it plays the generator's attack sound instead of
"misc/podgrow".
- Added transference of a select few flags from PowerProtection to its owner.
- Added actor type parameters to A_PodPain() and A_MakePod().
- The savegame path is now passed through NicePath(), since it's user-
specifiable.
- Added save_dir cvar. When non-empty, it controls where savegames go.
- SBARINFO update:
* Added the ability to center things with fullscreenoffsets enabled. Due
to some limitations the syntax is [-]<integer> [+ center].
* Fixed: the translucent flag on drawinventorybar didn't work quite right.
* Fixed: Extremely minor inaccuracy in the Doom SBarInfo code. The
fullscreen inventory bar wasn't scaled correctly.
- fixed: The CHECKSWITCHRANGE line flag was ignored for one sided lines.
- Added more compatibility settings, submitted by Gez.
- Fixed: Doom's fullscreen HUD was limited to 6 keys.
- Made 'next endgame' work again for cases where it is supposed to be
the same as 'next endgame4'.
- GCC nitpick fix: Classes being used as template parameters may not be
defined locally in a function. Fixed FWadFile::SetNamespace for that.
- Improved error reporting for incorrect textures in maps.
- Fixed: When music was stopped this was not set in the global music state.
- Fixed: Friendly monsters did not target enemy players in deathmatch.
- Fixed: Completely empty patches (8 0-bytes) could not be handled by the
texture manager. They now get assigned a new FEmptyTexture object
that is just a 1x1 pixel transparent texture.
- Fixed: Multiple namespace markers of the same type were no longer detected.
- Fixed sprite renaming.
- Maps defined with Hexen-style MAPINFOs now run their scripts in the proper
order.
- Fixed: FWadCollection::CheckNumForName() read the lump each iteration before
checking for the end marker. On 32-bit systems, this is -1, but on 64-bit
systems, it is a very large integer that is highly unlikely to be in mapped
memory.
git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@325 b0f79afe-0144-0410-b225-9a4edf0717df
2009-05-15 18:02:01 +00:00
|
|
|
{ "wallrun", COMPATF_WALLRUN, 0 }, // [GZ] Added for CC MAP29
|
|
|
|
{ "anybossdeath", COMPATF_ANYBOSSDEATH, 0}, // [GZ] Added for UAC_DEAD
|
Update to ZDoom r1747:
- Added A_Mushroom compatibility option for Dehacked.
- Added Gez's submission for interhubamount DECORATE property.
- Fixed: The big endian version of PalEntry did not add the DWORD d field.
- Fixed: TObjPtr did not use a union to map its 2 pointers together.
- Added a compatibility mode for A_Mushroom. For DECORATE it is an additional
parameter but to force it for Dehacked mods some minor hacks using the
Misc1 variable were needed.
- Moved the terget->velz assignment to the end of A_VileAttack to remove the
influence of vertical thrust from the radius attack, since ZDoom does
explosions in three dimensions, but Doom only did it in two.
- Fixed: The last three parameters to A_VileAttack had their references off
by one. Most notably as a result, the blast radius was used as the thrust,
so it sent you flying far faster than it should have.
- Restored the reactiontime countdown for A_SpawnFly, since some Dehacked
mod could conceivable rely on it. The deadline is now kept in special2
and used in preference as long as it is non-zero.
- Removed -fno-strict-aliasing from the GCC flags for ZDoom and fixed the
issues that caused its inclusion. Is an optimized GCC build any faster
for being able to use strict aliasing rules? I dunno. It's still slower
than a VC++ build.
I did run into two cases where TAutoSegIterator caused intractable problems
with breaking strict aliasing rules, so I removed the templating from it,
and the caller is now responsible for casting the probe value from void *.
- Removed #include "autosegs.h" from several files that did not need it
(in particular, dobject.h when not compiling with VC++).
- gdtoa now performs all type aliasing through unions. -Wall has been added
to the GCC flags for the library to help verify this.
- Changed A_SpawnFly to do nothing if reactiontime is 0. Reactiontime was
originally a counter, so if it started at 0, A_SpawnFly would effectively
never spawn anything. Fixes Dehacked patches that use A_SpawnSound to
play a sound without shooting boss cubes, since it also calls A_SpawnFly.
- Joystick devices now send key up events for any buttons that are held
down when they are destroyed.
- Changed the joystick enable-y menu items to be nonrepeatable so that you
can't create several device scans per second. Changing them with a
controller is also disabled so that you can't, for example, toggle XInput
support using an XInput controller and have things go haywire when the
game receives an infinite number of key down events when the controller
is reinitialized with the other input system.
- Changed menu input to use a consolidated set of buttons, so most menus
can be navigated with a controller as well as a keyboard.
- Changed the way that X/Y analog axes are converted to digital axes.
Previously, this was done by checking if each axis was outside its deadzone.
Now they are checked together based on their angle, so straight up/down/
left/right are much easier to achieve.
git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@406 b0f79afe-0144-0410-b225-9a4edf0717df
2009-08-02 17:00:19 +00:00
|
|
|
{ "mushroom", COMPATF_MUSHROOM, 0},
|
2009-09-15 06:19:39 +00:00
|
|
|
{ "mbfmonstermove", COMPATF_MBFMONSTERMOVE, 0 },
|
|
|
|
{ "corpsegibs", COMPATF_CORPSEGIBS, 0 },
|
|
|
|
{ "noblockfriends", COMPATF_NOBLOCKFRIENDS, 0 },
|
2009-02-08 23:01:13 +00:00
|
|
|
{ NULL, 0, 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
// CODE --------------------------------------------------------------------
|
|
|
|
|
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// ParseCompatibility
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
|
|
|
void ParseCompatibility()
|
|
|
|
{
|
|
|
|
TArray<FMD5Holder> md5array;
|
|
|
|
FMD5Holder md5;
|
|
|
|
FCompatValues flags;
|
|
|
|
int i, x;
|
|
|
|
unsigned int j;
|
|
|
|
|
|
|
|
// The contents of this file are not cumulative, as it should not
|
|
|
|
// be present in user-distributed maps.
|
|
|
|
FScanner sc(Wads.GetNumForFullName("compatibility.txt"));
|
|
|
|
|
|
|
|
while (sc.GetString()) // Get MD5 signature
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if (strlen(sc.String) != 32)
|
|
|
|
{
|
|
|
|
sc.ScriptError("MD5 signature must be exactly 32 characters long");
|
|
|
|
}
|
|
|
|
for (i = 0; i < 32; ++i)
|
|
|
|
{
|
|
|
|
if (sc.String[i] >= '0' && sc.String[i] <= '9')
|
|
|
|
{
|
|
|
|
x = sc.String[i] - '0';
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sc.String[i] |= 'a' ^ 'A';
|
|
|
|
if (sc.String[i] >= 'a' && sc.String[i] <= 'f')
|
|
|
|
{
|
|
|
|
x = sc.String[i] - 'a' + 10;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-03-12 20:59:09 +00:00
|
|
|
x = 0;
|
2009-02-08 23:01:13 +00:00
|
|
|
sc.ScriptError("MD5 signature must be a hexadecimal value");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!(i & 1))
|
|
|
|
{
|
|
|
|
md5.Bytes[i / 2] = x << 4;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
md5.Bytes[i / 2] |= x;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
md5array.Push(md5);
|
|
|
|
sc.MustGetString();
|
|
|
|
} while (!sc.Compare("{"));
|
|
|
|
flags.CompatFlags = 0;
|
|
|
|
flags.BCompatFlags = 0;
|
|
|
|
while (sc.MustGetString(), (i = sc.MatchString(&Options[0].Name, sizeof(*Options))) >= 0)
|
|
|
|
{
|
|
|
|
flags.CompatFlags |= Options[i].CompatFlags;
|
|
|
|
flags.BCompatFlags |= Options[i].BCompatFlags;
|
|
|
|
}
|
|
|
|
sc.UnGet();
|
|
|
|
sc.MustGetStringName("}");
|
|
|
|
for (j = 0; j < md5array.Size(); ++j)
|
|
|
|
{
|
|
|
|
BCompatMap[md5array[j]] = flags;
|
|
|
|
}
|
|
|
|
md5array.Clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// CheckCompatibility
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
|
|
|
void CheckCompatibility(MapData *map)
|
|
|
|
{
|
|
|
|
FMD5Holder md5;
|
|
|
|
FCompatValues *flags;
|
|
|
|
|
|
|
|
// When playing Doom IWAD levels force COMPAT_SHORTTEX.
|
|
|
|
if (Wads.GetLumpFile(map->lumpnum) == 1 && gameinfo.gametype == GAME_Doom && !(level.flags & LEVEL_HEXENFORMAT))
|
|
|
|
{
|
|
|
|
ii_compatflags = COMPATF_SHORTTEX;
|
|
|
|
ib_compatflags = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
map->GetChecksum(md5.Bytes);
|
|
|
|
|
|
|
|
flags = BCompatMap.CheckKey(md5);
|
|
|
|
|
|
|
|
if (developer)
|
|
|
|
{
|
|
|
|
Printf("MD5 = ");
|
|
|
|
for (size_t j = 0; j < sizeof(md5.Bytes); ++j)
|
|
|
|
{
|
|
|
|
Printf("%02X", md5.Bytes[j]);
|
|
|
|
}
|
|
|
|
if (flags != NULL) Printf(", cflags = %08x, bflags = %08x\n", flags->CompatFlags, flags->BCompatFlags);
|
|
|
|
else Printf("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flags != NULL)
|
|
|
|
{
|
|
|
|
ii_compatflags = flags->CompatFlags;
|
|
|
|
ib_compatflags = flags->BCompatFlags;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ii_compatflags = 0;
|
|
|
|
ib_compatflags = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Reset i_compatflags
|
|
|
|
compatflags.Callback();
|
|
|
|
}
|
|
|
|
|
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// CCMD mapchecksum
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
|
|
|
CCMD (mapchecksum)
|
|
|
|
{
|
|
|
|
MapData *map;
|
|
|
|
BYTE cksum[16];
|
|
|
|
|
|
|
|
if (argv.argc() < 2)
|
|
|
|
{
|
|
|
|
Printf("Usage: mapchecksum <map> ...\n");
|
|
|
|
}
|
|
|
|
for (int i = 1; i < argv.argc(); ++i)
|
|
|
|
{
|
|
|
|
map = P_OpenMapData(argv[i]);
|
|
|
|
if (map == NULL)
|
|
|
|
{
|
|
|
|
Printf("Cannot load %s as a map\n", argv[i]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
map->GetChecksum(cksum);
|
|
|
|
delete map;
|
|
|
|
for (size_t j = 0; j < sizeof(cksum); ++j)
|
|
|
|
{
|
|
|
|
Printf("%02X", cksum[j]);
|
|
|
|
}
|
|
|
|
Printf(" // %s\n", argv[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//==========================================================================
|
|
|
|
//
|
|
|
|
// CCMD hiddencompatflags
|
|
|
|
//
|
|
|
|
//==========================================================================
|
|
|
|
|
|
|
|
CCMD (hiddencompatflags)
|
|
|
|
{
|
|
|
|
Printf("%08x %08x\n", ii_compatflags, ib_compatflags);
|
|
|
|
}
|