Merge branch 'scripting' of github.com:rheit/zdoom into scripting

This commit is contained in:
Randy Heit 2013-08-14 22:15:28 -05:00
commit 5fe5fe7c51
44 changed files with 825 additions and 360 deletions

View file

@ -186,6 +186,7 @@ Note: All <bool> fields default to false unless mentioned otherwise.
soundsequence = <string>; // The sound sequence to play when this sector moves. Placing a soundsequence = <string>; // The sound sequence to play when this sector moves. Placing a
// sound sequence thing in the sector will override this property. // sound sequence thing in the sector will override this property.
hidden = <bool>; // if true this sector will not be drawn on the textured automap. hidden = <bool>; // if true this sector will not be drawn on the textured automap.
waterzone = <bool>; // Sector is under water and swimmable
* Note about dropactors * Note about dropactors
@ -328,6 +329,9 @@ Added back locknumber property.
1.20 25.02.2012 1.20 25.02.2012
Added arg0str thing property. Added arg0str thing property.
1.21 09.08.2013
Added waterzone sector property.
=============================================================================== ===============================================================================
EOF EOF
=============================================================================== ===============================================================================

File diff suppressed because it is too large Load diff

View file

@ -505,7 +505,7 @@ bool FCajunMaster::LoadBots ()
bool gotteam = false; bool gotteam = false;
bglobal.ForgetBots (); bglobal.ForgetBots ();
#ifndef unix #ifndef __unix__
tmp = progdir; tmp = progdir;
tmp += "zcajun/" BOTFILENAME; tmp += "zcajun/" BOTFILENAME;
if (!FileExists (tmp)) if (!FileExists (tmp))

View file

@ -49,6 +49,7 @@
#include "i_system.h" #include "i_system.h"
#include "doomerrors.h"
#include "doomstat.h" #include "doomstat.h"
#include "gstrings.h" #include "gstrings.h"
#include "s_sound.h" #include "s_sound.h"
@ -340,6 +341,8 @@ CCMD (changemap)
} }
if (argv.argc() > 1) if (argv.argc() > 1)
{
try
{ {
if (!P_CheckMapData(argv[1])) if (!P_CheckMapData(argv[1]))
{ {
@ -359,6 +362,12 @@ CCMD (changemap)
Net_WriteString (argv[1]); Net_WriteString (argv[1]);
} }
} }
catch(CRecoverableError &error)
{
if (error.GetMessage())
Printf("%s", error.GetMessage());
}
}
else else
{ {
Printf ("Usage: changemap <map name> [position]\n"); Printf ("Usage: changemap <map name> [position]\n");

View file

@ -1742,7 +1742,7 @@ static bool C_HandleKey (event_t *ev, BYTE *buffer, int len)
} }
break; break;
#ifdef unix #ifdef __unix__
case EV_GUI_MButtonDown: case EV_GUI_MButtonDown:
C_PasteText(I_GetFromClipboard(true), buffer, len); C_PasteText(I_GetFromClipboard(true), buffer, len);
break; break;
@ -2121,7 +2121,20 @@ static bool C_TabCompleteList ()
Printf (TEXTCOLOR_BLUE "Completions for %s:\n", CmdLine+2); Printf (TEXTCOLOR_BLUE "Completions for %s:\n", CmdLine+2);
for (i = TabPos; nummatches > 0; ++i, --nummatches) for (i = TabPos; nummatches > 0; ++i, --nummatches)
{ {
Printf ("%-*s", int(maxwidth), TabCommands[i].TabName.GetChars()); // [Dusk] Print console commands blue, CVars green, aliases red.
const char* colorcode = "";
FConsoleCommand* ccmd;
if (FindCVar (TabCommands[i].TabName, NULL))
colorcode = TEXTCOLOR_GREEN;
else if ((ccmd = FConsoleCommand::FindByName (TabCommands[i].TabName)) != NULL)
{
if (ccmd->IsAlias())
colorcode = TEXTCOLOR_RED;
else
colorcode = TEXTCOLOR_LIGHTBLUE;
}
Printf ("%s%-*s", colorcode, int(maxwidth), TabCommands[i].TabName.GetChars());
x += maxwidth; x += maxwidth;
if (x > ConCols - maxwidth) if (x > ConCols - maxwidth)
{ {

View file

@ -955,6 +955,11 @@ bool FConsoleCommand::AddToHash (FConsoleCommand **table)
return true; return true;
} }
FConsoleCommand* FConsoleCommand::FindByName (const char* name)
{
return FindNameInHashTable (Commands, name, strlen (name));
}
FConsoleCommand::FConsoleCommand (const char *name, CCmdRun runFunc) FConsoleCommand::FConsoleCommand (const char *name, CCmdRun runFunc)
: m_RunFunc (runFunc) : m_RunFunc (runFunc)
{ {
@ -1501,7 +1506,7 @@ CCMD (pullin)
{ {
const char *lastSlash; const char *lastSlash;
#ifdef unix #ifdef __unix__
lastSlash = strrchr (PullinFile, '/'); lastSlash = strrchr (PullinFile, '/');
#else #else
const char *lastSlash1, *lastSlash2; const char *lastSlash1, *lastSlash2;

View file

@ -93,6 +93,7 @@ public:
void PrintCommand () { Printf ("%s\n", m_Name); } void PrintCommand () { Printf ("%s\n", m_Name); }
virtual void Run (FCommandLine &args, APlayerPawn *instigator, int key); virtual void Run (FCommandLine &args, APlayerPawn *instigator, int key);
static FConsoleCommand* FindByName (const char* name);
FConsoleCommand *m_Next, **m_Prev; FConsoleCommand *m_Next, **m_Prev;
char *m_Name; char *m_Name;

View file

@ -169,7 +169,7 @@ bool CT_Responder (event_t *ev)
} }
return true; return true;
} }
#ifdef unix #ifdef __unix__
else if (ev->subtype == EV_GUI_MButtonDown) else if (ev->subtype == EV_GUI_MButtonDown)
{ {
CT_PasteChat(I_GetFromClipboard(true)); CT_PasteChat(I_GetFromClipboard(true));

View file

@ -1813,21 +1813,21 @@ static int PatchCheats (int dummy)
static int PatchMisc (int dummy) static int PatchMisc (int dummy)
{ {
static const struct Key keys[] = { static const struct Key keys[] = {
{ "Initial Health", myoffsetof(struct DehInfo,StartHealth) }, { "Initial Health", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,StartHealth)) },
{ "Initial Bullets", myoffsetof(struct DehInfo,StartBullets) }, { "Initial Bullets", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,StartBullets)) },
{ "Max Health", myoffsetof(struct DehInfo,MaxHealth) }, { "Max Health", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,MaxHealth)) },
{ "Max Armor", myoffsetof(struct DehInfo,MaxArmor) }, { "Max Armor", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,MaxArmor)) },
{ "Green Armor Class", myoffsetof(struct DehInfo,GreenAC) }, { "Green Armor Class", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,GreenAC)) },
{ "Blue Armor Class", myoffsetof(struct DehInfo,BlueAC) }, { "Blue Armor Class", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,BlueAC)) },
{ "Max Soulsphere", myoffsetof(struct DehInfo,MaxSoulsphere) }, { "Max Soulsphere", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,MaxSoulsphere)) },
{ "Soulsphere Health", myoffsetof(struct DehInfo,SoulsphereHealth) }, { "Soulsphere Health", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,SoulsphereHealth)) },
{ "Megasphere Health", myoffsetof(struct DehInfo,MegasphereHealth) }, { "Megasphere Health", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,MegasphereHealth)) },
{ "God Mode Health", myoffsetof(struct DehInfo,GodHealth) }, { "God Mode Health", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,GodHealth)) },
{ "IDFA Armor", myoffsetof(struct DehInfo,FAArmor) }, { "IDFA Armor", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,FAArmor)) },
{ "IDFA Armor Class", myoffsetof(struct DehInfo,FAAC) }, { "IDFA Armor Class", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,FAAC)) },
{ "IDKFA Armor", myoffsetof(struct DehInfo,KFAArmor) }, { "IDKFA Armor", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,KFAArmor)) },
{ "IDKFA Armor Class", myoffsetof(struct DehInfo,KFAAC) }, { "IDKFA Armor Class", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,KFAAC)) },
{ "No Autofreeze", myoffsetof(struct DehInfo,NoAutofreeze) }, { "No Autofreeze", static_cast<ptrdiff_t>(myoffsetof(struct DehInfo,NoAutofreeze)) },
{ NULL, 0 } { NULL, 0 }
}; };
int result; int result;
@ -2383,6 +2383,18 @@ static int DoInclude (int dummy)
return GetLine(); return GetLine();
} }
CVAR(Int, dehload, 0, CVAR_ARCHIVE) // Autoloading of .DEH lumps is disabled by default.
// checks if lump is a .deh or .bex file. Only lumps in the root directory are considered valid.
static bool isDehFile(int lumpnum)
{
const char* const fullName = Wads.GetLumpFullName(lumpnum);
const char* const extension = strrchr(fullName, '.');
return NULL != extension && strchr(fullName, '/') == NULL
&& (0 == stricmp(extension, ".deh") || 0 == stricmp(extension, ".bex"));
}
int D_LoadDehLumps() int D_LoadDehLumps()
{ {
int lastlump = 0, lumpnum, count = 0; int lastlump = 0, lumpnum, count = 0;
@ -2392,26 +2404,32 @@ int D_LoadDehLumps()
count += D_LoadDehLump(lumpnum); count += D_LoadDehLump(lumpnum);
} }
if (0 == PatchSize) if (0 == PatchSize && dehload > 0)
{ {
// No DEH/BEX patch is loaded yet, try to find lump(s) with specific extensions // No DEH/BEX patch is loaded yet, try to find lump(s) with specific extensions
for (lumpnum = 0, lastlump = Wads.GetNumLumps(); if (dehload == 1) // load all .DEH lumps that are found.
lumpnum < lastlump;
++lumpnum)
{ {
const char* const fullName = Wads.GetLumpFullName(lumpnum); for (lumpnum = 0, lastlump = Wads.GetNumLumps(); lumpnum < lastlump; ++lumpnum)
const char* const extension = strrchr(fullName, '.'); {
if (isDehFile(lumpnum))
const bool isDehOrBex = NULL != extension
&& (0 == stricmp(extension, ".deh") || 0 == stricmp(extension, ".bex"));
if (isDehOrBex)
{ {
count += D_LoadDehLump(lumpnum); count += D_LoadDehLump(lumpnum);
} }
} }
} }
else // only load the last .DEH lump that is found.
{
for (lumpnum = Wads.GetNumLumps()-1; lumpnum >=0; --lumpnum)
{
if (isDehFile(lumpnum))
{
count += D_LoadDehLump(lumpnum);
break;
}
}
}
}
return count; return count;
} }
@ -2962,7 +2980,7 @@ void FinishDehPatch ()
PClassActor *subclass = static_cast<PClassActor *>(RUNTIME_CLASS(ADehackedPickup)-> PClassActor *subclass = static_cast<PClassActor *>(RUNTIME_CLASS(ADehackedPickup)->
CreateDerivedClass(typeNameBuilder, sizeof(ADehackedPickup))); CreateDerivedClass(typeNameBuilder, sizeof(ADehackedPickup)));
AActor *defaults2 = GetDefaultByType (subclass); AActor *defaults2 = GetDefaultByType (subclass);
memcpy (defaults2, defaults1, sizeof(AActor)); memcpy ((void *)defaults2, (void *)defaults1, sizeof(AActor));
// Make a copy of the replaced class's state labels // Make a copy of the replaced class's state labels
FStateDefinitions statedef; FStateDefinitions statedef;

View file

@ -38,7 +38,7 @@
#endif #endif
#include <float.h> #include <float.h>
#if defined(unix) || defined(__APPLE__) #if defined(__unix__) || defined(__APPLE__)
#include <unistd.h> #include <unistd.h>
#endif #endif
@ -2029,7 +2029,7 @@ static void AddAutoloadFiles(const char *gamesection)
D_AddFile (allwads, wad); D_AddFile (allwads, wad);
// [RH] Add any .wad files in the skins directory // [RH] Add any .wad files in the skins directory
#ifdef unix #ifdef __unix__
file = SHARE_DIR; file = SHARE_DIR;
#else #else
file = progdir; file = progdir;
@ -2037,7 +2037,7 @@ static void AddAutoloadFiles(const char *gamesection)
file += "skins"; file += "skins";
D_AddDirectory (allwads, file); D_AddDirectory (allwads, file);
#ifdef unix #ifdef __unix__
file = NicePath("~/" GAME_DIR "/skins"); file = NicePath("~/" GAME_DIR "/skins");
D_AddDirectory (allwads, file); D_AddDirectory (allwads, file);
#endif #endif
@ -2157,7 +2157,7 @@ static void CheckCmdLine()
Printf ("%s", GStrings("D_DEVSTR")); Printf ("%s", GStrings("D_DEVSTR"));
} }
#if !defined(unix) && !defined(__APPLE__) #if !defined(__unix__) && !defined(__APPLE__)
// We do not need to support -cdrom under Unix, because all the files // We do not need to support -cdrom under Unix, because all the files
// that would go to c:\\zdoomdat are already stored in .zdoom inside // that would go to c:\\zdoomdat are already stored in .zdoom inside
// the user's home directory. // the user's home directory.

View file

@ -161,8 +161,10 @@ public:
FNameNoInit MorphWeapon; FNameNoInit MorphWeapon;
fixed_t AttackZOffset; // attack height, relative to player center fixed_t AttackZOffset; // attack height, relative to player center
fixed_t UseRange; // [NS] Distance at which player can +use fixed_t UseRange; // [NS] Distance at which player can +use
fixed_t AirCapacity; // Multiplier for air supply underwater.
PClassActor *FlechetteType; PClassActor *FlechetteType;
// [CW] Fades for when you are being damaged. // [CW] Fades for when you are being damaged.
PalEntry DamageFade; PalEntry DamageFade;

View file

@ -452,7 +452,7 @@ void FDecalLib::ParseDecal (FScanner &sc)
decalNum = GetDecalID (sc); decalNum = GetDecalID (sc);
sc.MustGetStringName ("{"); sc.MustGetStringName ("{");
memset (&newdecal, 0, sizeof(newdecal)); memset ((void *)&newdecal, 0, sizeof(newdecal));
newdecal.PicNum.SetInvalid(); newdecal.PicNum.SetInvalid();
newdecal.ScaleX = newdecal.ScaleY = FRACUNIT; newdecal.ScaleX = newdecal.ScaleY = FRACUNIT;
newdecal.RenderFlags = RF_WALLSPRITE; newdecal.RenderFlags = RF_WALLSPRITE;

View file

@ -110,6 +110,10 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileTarget)
// //
// A_VileAttack // A_VileAttack
// //
// A_VileAttack flags
#define VAF_DMGTYPEAPPLYTODIRECT 1
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack) DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack)
{ {
PARAM_ACTION_PROLOGUE; PARAM_ACTION_PROLOGUE;
@ -119,6 +123,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack)
PARAM_INT_OPT (blastrad) { blastrad = 70; } PARAM_INT_OPT (blastrad) { blastrad = 70; }
PARAM_FIXED_OPT (thrust) { thrust = FRACUNIT; } PARAM_FIXED_OPT (thrust) { thrust = FRACUNIT; }
PARAM_NAME_OPT (dmgtype) { dmgtype = NAME_Fire; } PARAM_NAME_OPT (dmgtype) { dmgtype = NAME_Fire; }
PARAM_INT_OPT (flags) { flags = 0; }
AActor *fire, *target; AActor *fire, *target;
angle_t an; angle_t an;
@ -132,7 +137,15 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack)
return 0; return 0;
S_Sound (self, CHAN_WEAPON, snd, 1, ATTN_NORM); S_Sound (self, CHAN_WEAPON, snd, 1, ATTN_NORM);
int newdam = P_DamageMobj (target, self, self, dmg, NAME_None);
int newdam;
if (flags & VAF_DMGTYPEAPPLYTODIRECT)
newdam = P_DamageMobj (target, self, self, dmg, dmgtype);
else
newdam = P_DamageMobj (target, self, self, dmg, NAME_None);
P_TraceBleed (newdam > 0 ? newdam : dmg, target); P_TraceBleed (newdam > 0 ? newdam : dmg, target);
an = self->angle >> ANGLETOFINESHIFT; an = self->angle >> ANGLETOFINESHIFT;

View file

@ -865,7 +865,10 @@ static void ChangeSpy (int changespy)
int pnum = consoleplayer; int pnum = consoleplayer;
if (changespy != SPY_CANCEL) if (changespy != SPY_CANCEL)
{ {
pnum = int(players[consoleplayer].camera->player - players); player_t *player = players[consoleplayer].camera->player;
// only use the camera as starting index if it's a valid player.
if (player != NULL) pnum = int(players[consoleplayer].camera->player - players);
int step = (changespy == SPY_NEXT) ? 1 : -1; int step = (changespy == SPY_NEXT) ? 1 : -1;
do do
@ -1919,7 +1922,7 @@ FString G_BuildSaveName (const char *prefix, int slot)
leader = Args->CheckValue ("-savedir"); leader = Args->CheckValue ("-savedir");
if (leader.IsEmpty()) if (leader.IsEmpty())
{ {
#if !defined(unix) && !defined(__APPLE__) #if !defined(__unix__) && !defined(__APPLE__)
if (Args->CheckParm ("-cdrom")) if (Args->CheckParm ("-cdrom"))
{ {
leader = CDROM_DIR "/"; leader = CDROM_DIR "/";
@ -1931,7 +1934,7 @@ FString G_BuildSaveName (const char *prefix, int slot)
} }
if (leader.IsEmpty()) if (leader.IsEmpty())
{ {
#ifdef unix #ifdef __unix__
leader = "~/" GAME_DIR; leader = "~/" GAME_DIR;
#elif defined(__APPLE__) #elif defined(__APPLE__)
char cpath[PATH_MAX]; char cpath[PATH_MAX];

View file

@ -40,6 +40,7 @@
#include "s_sound.h" #include "s_sound.h"
#include "d_event.h" #include "d_event.h"
#include "m_random.h" #include "m_random.h"
#include "doomerrors.h"
#include "doomstat.h" #include "doomstat.h"
#include "wi_stuff.h" #include "wi_stuff.h"
#include "w_wad.h" #include "w_wad.h"
@ -169,6 +170,8 @@ CCMD (map)
return; return;
} }
if (argv.argc() > 1) if (argv.argc() > 1)
{
try
{ {
if (!P_CheckMapData(argv[1])) if (!P_CheckMapData(argv[1]))
{ {
@ -179,6 +182,12 @@ CCMD (map)
G_DeferedInitNew (argv[1]); G_DeferedInitNew (argv[1]);
} }
} }
catch(CRecoverableError &error)
{
if (error.GetMessage())
Printf("%s", error.GetMessage());
}
}
else else
{ {
Printf ("Usage: map <map name>\n"); Printf ("Usage: map <map name>\n");

View file

@ -101,6 +101,7 @@ struct FMapInfoParser
void ParseIntermissionAction(FIntermissionDescriptor *Desc); void ParseIntermissionAction(FIntermissionDescriptor *Desc);
void ParseIntermission(); void ParseIntermission();
void ParseAMColors(bool);
FName CheckEndSequence(); FName CheckEndSequence();
FName ParseEndGame(); FName ParseEndGame();
}; };

View file

@ -1842,6 +1842,18 @@ void FMapInfoParser::ParseMapInfo (int lump, level_info_t &gamedefaults, level_i
sc.ScriptError("intermission definitions not supported with old MAPINFO syntax"); sc.ScriptError("intermission definitions not supported with old MAPINFO syntax");
} }
} }
else if (sc.Compare("automap") || sc.Compare("automap_overlay"))
{
if (format_type != FMT_Old)
{
format_type = FMT_New;
ParseAMColors(sc.Compare("automap_overlay"));
}
else
{
sc.ScriptError("automap colorset definitions not supported with old MAPINFO syntax");
}
}
else else
{ {
sc.ScriptError("%s: Unknown top level keyword", sc.String); sc.ScriptError("%s: Unknown top level keyword", sc.String);

View file

@ -53,6 +53,7 @@
#include "d_player.h" #include "d_player.h"
#include "farchive.h" #include "farchive.h"
#include "a_hexenglobal.h" #include "a_hexenglobal.h"
#include "gstrings.h"
#include "../version.h" #include "../version.h"
@ -1375,8 +1376,8 @@ void DBaseStatusBar::Draw (EHudState state)
// Draw monster count // Draw monster count
if (am_showmonsters) if (am_showmonsters)
{ {
mysnprintf (line, countof(line), "MONSTERS:" TEXTCOLOR_GREY " %d/%d", mysnprintf (line, countof(line), "%s" TEXTCOLOR_GREY " %d/%d",
level.killed_monsters, level.total_monsters); GStrings("AM_MONSTERS"), level.killed_monsters, level.total_monsters);
screen->DrawText (SmallFont, highlight, 8, y, line, screen->DrawText (SmallFont, highlight, 8, y, line,
DTA_CleanNoMove, true, TAG_DONE); DTA_CleanNoMove, true, TAG_DONE);
y += height; y += height;
@ -1385,8 +1386,8 @@ void DBaseStatusBar::Draw (EHudState state)
// Draw secret count // Draw secret count
if (am_showsecrets) if (am_showsecrets)
{ {
mysnprintf (line, countof(line), "SECRETS:" TEXTCOLOR_GREY " %d/%d", mysnprintf (line, countof(line), "%s" TEXTCOLOR_GREY " %d/%d",
level.found_secrets, level.total_secrets); GStrings("AM_SECRETS"), level.found_secrets, level.total_secrets);
screen->DrawText (SmallFont, highlight, 8, y, line, screen->DrawText (SmallFont, highlight, 8, y, line,
DTA_CleanNoMove, true, TAG_DONE); DTA_CleanNoMove, true, TAG_DONE);
y += height; y += height;
@ -1395,8 +1396,8 @@ void DBaseStatusBar::Draw (EHudState state)
// Draw item count // Draw item count
if (am_showitems) if (am_showitems)
{ {
mysnprintf (line, countof(line), "ITEMS:" TEXTCOLOR_GREY " %d/%d", mysnprintf (line, countof(line), "%s" TEXTCOLOR_GREY " %d/%d",
level.found_items, level.total_items); GStrings("AM_ITEMS"), level.found_items, level.total_items);
screen->DrawText (SmallFont, highlight, 8, y, line, screen->DrawText (SmallFont, highlight, 8, y, line,
DTA_CleanNoMove, true, TAG_DONE); DTA_CleanNoMove, true, TAG_DONE);
} }

View file

@ -135,7 +135,7 @@ FGameConfigFile::FGameConfigFile ()
local_app_support << cpath << "/" GAME_DIR; local_app_support << cpath << "/" GAME_DIR;
SetValueForKey("Path", local_app_support, true); SetValueForKey("Path", local_app_support, true);
} }
#elif !defined(unix) #elif !defined(__unix__)
SetValueForKey ("Path", "$HOME", true); SetValueForKey ("Path", "$HOME", true);
SetValueForKey ("Path", "$PROGDIR", true); SetValueForKey ("Path", "$PROGDIR", true);
#else #else
@ -153,7 +153,7 @@ FGameConfigFile::FGameConfigFile ()
SetValueForKey ("Path", user_app_support, true); SetValueForKey ("Path", user_app_support, true);
SetValueForKey ("Path", "$PROGDIR", true); SetValueForKey ("Path", "$PROGDIR", true);
SetValueForKey ("Path", local_app_support, true); SetValueForKey ("Path", local_app_support, true);
#elif !defined(unix) #elif !defined(__unix__)
SetValueForKey ("Path", "$PROGDIR", true); SetValueForKey ("Path", "$PROGDIR", true);
#else #else
SetValueForKey ("Path", "~/" GAME_DIR, true); SetValueForKey ("Path", "~/" GAME_DIR, true);
@ -683,7 +683,7 @@ void FGameConfigFile::CreateStandardAutoExec(const char *section, bool start)
{ {
path << cpath << "/" GAME_DIR "/autoexec.cfg"; path << cpath << "/" GAME_DIR "/autoexec.cfg";
} }
#elif !defined(unix) #elif !defined(__unix__)
path = "$PROGDIR/autoexec.cfg"; path = "$PROGDIR/autoexec.cfg";
#else #else
path = GetUserFile ("autoexec.cfg"); path = GetUserFile ("autoexec.cfg");

View file

@ -333,7 +333,7 @@ static long ParseCommandLine (const char *args, int *argc, char **argv)
} }
#if defined(unix) #if defined(__unix__)
FString GetUserFile (const char *file) FString GetUserFile (const char *file)
{ {
FString path; FString path;
@ -698,7 +698,7 @@ void M_ScreenShot (const char *filename)
// find a file name to save it to // find a file name to save it to
if (filename == NULL || filename[0] == '\0') if (filename == NULL || filename[0] == '\0')
{ {
#if !defined(unix) && !defined(__APPLE__) #if !defined(__unix__) && !defined(__APPLE__)
if (Args->CheckParm ("-cdrom")) if (Args->CheckParm ("-cdrom"))
{ {
autoname = CDROM_DIR "\\"; autoname = CDROM_DIR "\\";
@ -715,7 +715,7 @@ void M_ScreenShot (const char *filename)
dirlen = autoname.Len(); dirlen = autoname.Len();
if (dirlen == 0) if (dirlen == 0)
{ {
#ifdef unix #ifdef __unix__
autoname = "~/" GAME_DIR "/screenshots/"; autoname = "~/" GAME_DIR "/screenshots/";
#elif defined(__APPLE__) #elif defined(__APPLE__)
char cpath[PATH_MAX]; char cpath[PATH_MAX];

View file

@ -131,6 +131,7 @@ void ClearSaveGames()
{ {
for(unsigned i=0;i<DLoadSaveMenu::SaveGames.Size(); i++) for(unsigned i=0;i<DLoadSaveMenu::SaveGames.Size(); i++)
{ {
if(!DLoadSaveMenu::SaveGames[i]->bNoDelete)
delete DLoadSaveMenu::SaveGames[i]; delete DLoadSaveMenu::SaveGames[i];
} }
DLoadSaveMenu::SaveGames.Clear(); DLoadSaveMenu::SaveGames.Clear();
@ -344,7 +345,7 @@ void DLoadSaveMenu::NotifyNewSave (const char *file, const char *title, bool okF
for (unsigned i=0; i<SaveGames.Size(); i++) for (unsigned i=0; i<SaveGames.Size(); i++)
{ {
FSaveGameNode *node = SaveGames[i]; FSaveGameNode *node = SaveGames[i];
#ifdef unix #ifdef __unix__
if (node->Filename.Compare (file) == 0) if (node->Filename.Compare (file) == 0)
#else #else
if (node->Filename.CompareNoCase (file) == 0) if (node->Filename.CompareNoCase (file) == 0)

View file

@ -158,7 +158,7 @@ static bool CheckSkipOptionBlock(FScanner &sc)
} }
else if (sc.Compare("unix")) else if (sc.Compare("unix"))
{ {
#ifdef unix #ifdef __unix__
filter = true; filter = true;
#endif #endif
} }

View file

@ -444,6 +444,7 @@ xx(Alphafloor)
xx(Alphaceiling) xx(Alphaceiling)
xx(Renderstylefloor) xx(Renderstylefloor)
xx(Renderstyleceiling) xx(Renderstyleceiling)
xx(Waterzone)
xx(offsetx_top) xx(offsetx_top)
xx(offsety_top) xx(offsety_top)

View file

@ -3511,6 +3511,8 @@ enum
APROP_Radius = 36, APROP_Radius = 36,
APROP_ReactionTime = 37, APROP_ReactionTime = 37,
APROP_MeleeRange = 38, APROP_MeleeRange = 38,
APROP_ViewHeight = 39,
APROP_AttackZOffset = 40
}; };
// These are needed for ACS's APROP_RenderStyle // These are needed for ACS's APROP_RenderStyle
@ -3726,6 +3728,16 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value)
actor->reactiontime = value; actor->reactiontime = value;
break; break;
case APROP_ViewHeight:
if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn)))
static_cast<APlayerPawn *>(actor)->ViewHeight = value;
break;
case APROP_AttackZOffset:
if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn)))
static_cast<APlayerPawn *>(actor)->AttackZOffset = value;
break;
default: default:
// do nothing. // do nothing.
break; break;
@ -3798,6 +3810,23 @@ int DLevelScript::GetActorProperty (int tid, int property, const SDWORD *stack,
case APROP_Radius: return actor->radius; case APROP_Radius: return actor->radius;
case APROP_ReactionTime:return actor->reactiontime; case APROP_ReactionTime:return actor->reactiontime;
case APROP_MeleeRange: return actor->meleerange; case APROP_MeleeRange: return actor->meleerange;
case APROP_ViewHeight: if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn)))
{
return static_cast<APlayerPawn *>(actor)->ViewHeight;
}
else
{
return 0;
}
case APROP_AttackZOffset:
if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn)))
{
return static_cast<APlayerPawn *>(actor)->AttackZOffset;
}
else
{
return 0;
}
case APROP_SeeSound: return GlobalACSStrings.AddString(actor->SeeSound, stack, stackdepth); case APROP_SeeSound: return GlobalACSStrings.AddString(actor->SeeSound, stack, stackdepth);
case APROP_AttackSound: return GlobalACSStrings.AddString(actor->AttackSound, stack, stackdepth); case APROP_AttackSound: return GlobalACSStrings.AddString(actor->AttackSound, stack, stackdepth);
@ -3850,6 +3879,8 @@ int DLevelScript::CheckActorProperty (int tid, int property, int value)
case APROP_Radius: case APROP_Radius:
case APROP_ReactionTime: case APROP_ReactionTime:
case APROP_MeleeRange: case APROP_MeleeRange:
case APROP_ViewHeight:
case APROP_AttackZOffset:
return (GetActorProperty(tid, property, NULL, 0) == value); return (GetActorProperty(tid, property, NULL, 0) == value);
// Boolean values need to compare to a binary version of value // Boolean values need to compare to a binary version of value

View file

@ -1152,7 +1152,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang
break; break;
} }
} }
if (jump) if (jump && CurNode->ItemCheckNode > 0)
{ {
int root = pc->player->ConversationNPC->ConversationRoot; int root = pc->player->ConversationNPC->ConversationRoot;
CurNode = StrifeDialogues[root + CurNode->ItemCheckNode - 1]; CurNode = StrifeDialogues[root + CurNode->ItemCheckNode - 1];

View file

@ -739,10 +739,13 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
{ {
SetState (diestate); SetState (diestate);
if (tics > 1)
{
tics -= pr_killmobj() & 3; tics -= pr_killmobj() & 3;
if (tics < 1) if (tics < 1)
tics = 1; tics = 1;
} }
}
else else
{ {
Destroy(); Destroy();

View file

@ -329,7 +329,15 @@ MapData *P_OpenMapData(const char * mapname)
// Since levels must be stored in WADs they can't really have full // Since levels must be stored in WADs they can't really have full
// names and for any valid level lump this always returns the short name. // names and for any valid level lump this always returns the short name.
const char * lumpname = Wads.GetLumpFullName(lump_name + i); const char * lumpname = Wads.GetLumpFullName(lump_name + i);
index = GetMapIndex(mapname, index, lumpname, i != 1 || Wads.LumpLength(lump_name + i) == 0); try
{
index = GetMapIndex(mapname, index, lumpname, true);
}
catch(...)
{
delete map;
throw;
}
if (index == ML_BEHAVIOR) map->HasBehavior = true; if (index == ML_BEHAVIOR) map->HasBehavior = true;
// The next lump is not part of this map anymore // The next lump is not part of this map anymore
@ -460,8 +468,16 @@ MapData *P_OpenMapData(const char * mapname)
} }
if (i>0) if (i>0)
{
try
{ {
index = GetMapIndex(maplabel, index, lumpname, true); index = GetMapIndex(maplabel, index, lumpname, true);
}
catch(...)
{
delete map;
throw;
}
if (index == ML_BEHAVIOR) map->HasBehavior = true; if (index == ML_BEHAVIOR) map->HasBehavior = true;
// The next lump is not part of this map anymore // The next lump is not part of this map anymore

View file

@ -1326,7 +1326,11 @@ public:
continue; continue;
case NAME_hidden: case NAME_hidden:
sec->MoreFlags |= SECF_HIDDEN; Flag(sec->MoreFlags, SECF_HIDDEN, key);
break;
case NAME_Waterzone:
Flag(sec->MoreFlags, SECF_UNDERWATER, key);
break; break;
default: default:

View file

@ -284,6 +284,7 @@ class USDFParser : public UDMFParserBase
//node->ItemCheckCount[0] = node->ItemCheckCount[1] = node->ItemCheckCount[2] = -1; //node->ItemCheckCount[0] = node->ItemCheckCount[1] = node->ItemCheckCount[2] = -1;
node->ThisNodeNum = StrifeDialogues.Push(node); node->ThisNodeNum = StrifeDialogues.Push(node);
node->ItemCheckNode = -1;
FString SpeakerName; FString SpeakerName;
FString Dialogue; FString Dialogue;

View file

@ -560,6 +560,10 @@ void APlayerPawn::Serialize (FArchive &arc)
{ {
arc << UseRange; arc << UseRange;
} }
if (SaveVersion >= 4503)
{
arc << AirCapacity;
}
} }
//=========================================================================== //===========================================================================
@ -1149,7 +1153,7 @@ bool APlayerPawn::ResetAirSupply (bool playgasp)
{ {
S_Sound (this, CHAN_VOICE, "*gasp", 1, ATTN_NORM); S_Sound (this, CHAN_VOICE, "*gasp", 1, ATTN_NORM);
} }
if (level.airsupply> 0) player->air_finished = level.time + level.airsupply; if (level.airsupply> 0 && player->mo->AirCapacity > 0) player->air_finished = level.time + FixedMul(level.airsupply, player->mo->AirCapacity);
else player->air_finished = INT_MAX; else player->air_finished = INT_MAX;
return wasdrowning; return wasdrowning;
} }

View file

@ -259,6 +259,13 @@ bool FZipFile::Open(bool quiet)
lump_p->CompressedSize = LittleLong(zip_fh->CompressedSize); lump_p->CompressedSize = LittleLong(zip_fh->CompressedSize);
lump_p->Position = LittleLong(zip_fh->LocalHeaderOffset); lump_p->Position = LittleLong(zip_fh->LocalHeaderOffset);
lump_p->CheckEmbedded(); lump_p->CheckEmbedded();
// Ignore some very specific names
if (0 == stricmp("dehacked.exe", name))
{
memset(lump_p->Name, 0, sizeof(lump_p->Name));
}
lump_p++; lump_p++;
} }
// Resize the lump record array to its actual size // Resize the lump record array to its actual size

View file

@ -749,6 +749,8 @@ int I_FindClose (void *handle)
findstate_t *state = (findstate_t *)handle; findstate_t *state = (findstate_t *)handle;
if (handle != (void*)-1 && state->count > 0) if (handle != (void*)-1 && state->count > 0)
{ {
for(int i = 0;i < state->count;++i)
free (state->namelist[i]);
state->count = 0; state->count = 0;
free (state->namelist); free (state->namelist);
state->namelist = NULL; state->namelist = NULL;

View file

@ -816,7 +816,7 @@ bool FMODSoundRenderer::Init()
} }
result = Sys->getNumDrivers(&driver); result = Sys->getNumDrivers(&driver);
#ifdef unix #ifdef __unix__
if (result == FMOD_OK) if (result == FMOD_OK)
{ {
// On Linux, FMOD defaults to OSS. If OSS is not present, it doesn't // On Linux, FMOD defaults to OSS. If OSS is not present, it doesn't

View file

@ -295,7 +295,7 @@ FluidSynthMIDIDevice::FluidSynthMIDIDevice()
fluid_chorus_speed, fluid_chorus_depth, fluid_chorus_type); fluid_chorus_speed, fluid_chorus_depth, fluid_chorus_type);
if (0 == LoadPatchSets(fluid_patchset)) if (0 == LoadPatchSets(fluid_patchset))
{ {
#ifdef unix #ifdef __unix__
// This is the standard location on Ubuntu. // This is the standard location on Ubuntu.
if (0 == LoadPatchSets("/usr/share/sounds/sf2/FluidR3_GS.sf2:/usr/share/sounds/sf2/FluidR3_GM.sf2")) if (0 == LoadPatchSets("/usr/share/sounds/sf2/FluidR3_GS.sf2:/usr/share/sounds/sf2/FluidR3_GM.sf2"))
{ {
@ -322,7 +322,7 @@ FluidSynthMIDIDevice::FluidSynthMIDIDevice()
} }
} }
#endif #endif
#ifdef unix #ifdef __unix__
} }
#endif #endif
} }

View file

@ -127,7 +127,7 @@ void FTextureManager::DeleteAll()
{ {
if (mAnimatedDoors[i].TextureFrames != NULL) if (mAnimatedDoors[i].TextureFrames != NULL)
{ {
delete mAnimatedDoors[i].TextureFrames; delete[] mAnimatedDoors[i].TextureFrames;
mAnimatedDoors[i].TextureFrames = NULL; mAnimatedDoors[i].TextureFrames = NULL;
} }
} }

View file

@ -332,11 +332,11 @@ int MatchString (const char *in, const char **strings);
#define DEFINE_MEMBER_VARIABLE(name, cls) \ #define DEFINE_MEMBER_VARIABLE(name, cls) \
static FVariableInfo GlobalDef__##name = { #name, myoffsetof(cls, name), &RUNTIME_CLASS_CASTLESS(cls) }; \ static FVariableInfo GlobalDef__##name = { #name, static_cast<intptr_t>(myoffsetof(cls, name)), &RUNTIME_CLASS_CASTLESS(cls) }; \
MSVC_MSEG FVariableInfo *infoptr_GlobalDef__##name GCC_MSEG = &GlobalDef__##name; MSVC_MSEG FVariableInfo *infoptr_GlobalDef__##name GCC_MSEG = &GlobalDef__##name;
#define DEFINE_MEMBER_VARIABLE_ALIAS(name, alias, cls) \ #define DEFINE_MEMBER_VARIABLE_ALIAS(name, alias, cls) \
static FVariableInfo GlobalDef__##name = { #name, myoffsetof(cls, alias), &RUNTIME_CLASS_CASTLESS(cls) }; \ static FVariableInfo GlobalDef__##name = { #name, static_cast<intptr_t>(myoffsetof(cls, alias)), &RUNTIME_CLASS_CASTLESS(cls) }; \
MSVC_MSEG FVariableInfo *infoptr_GlobalDef__##name GCC_MSEG = &GlobalDef__##name; MSVC_MSEG FVariableInfo *infoptr_GlobalDef__##name GCC_MSEG = &GlobalDef__##name;

View file

@ -447,7 +447,7 @@ DEFINE_PROPERTY(skip_super, 0, Actor)
return; return;
} }
memcpy (defaults, GetDefault<AActor>(), sizeof(AActor)); memcpy ((void *)defaults, (void *)GetDefault<AActor>(), sizeof(AActor));
ResetBaggage (&bag, RUNTIME_CLASS(AActor)); ResetBaggage (&bag, RUNTIME_CLASS(AActor));
} }
@ -2471,6 +2471,15 @@ DEFINE_CLASS_PROPERTY_PREFIX(player, userange, F, PlayerPawn)
defaults->UseRange = z; defaults->UseRange = z;
} }
//==========================================================================
//
//==========================================================================
DEFINE_CLASS_PROPERTY_PREFIX(player, aircapacity, F, PlayerPawn)
{
PROP_FIXED_PARM(z, 0);
defaults->AirCapacity = z;
}
//========================================================================== //==========================================================================
// //
//========================================================================== //==========================================================================

View file

@ -166,7 +166,7 @@ static Instrument *load_instrument(Renderer *song, const char *name, int percuss
tmp += ".pat"; tmp += ".pat";
if ((fp = open_filereader(tmp, openmode, NULL)) == NULL) if ((fp = open_filereader(tmp, openmode, NULL)) == NULL)
{ {
#ifdef unix // Windows isn't case-sensitive. #ifdef __unix__ // Windows isn't case-sensitive.
tmp.ToUpper(); tmp.ToUpper();
if ((fp = open_filereader(tmp, openmode, NULL)) == NULL) if ((fp = open_filereader(tmp, openmode, NULL)) == NULL)
#endif #endif

View file

@ -76,7 +76,7 @@ const char *GetVersionString();
// Use 4500 as the base git save version, since it's higher than the // Use 4500 as the base git save version, since it's higher than the
// SVN revision ever got. // SVN revision ever got.
#define SAVEVER 4502 #define SAVEVER 4503
#define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY2(x) #x
#define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x) #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)
@ -91,7 +91,7 @@ const char *GetVersionString();
#define FORUM_URL "http://forum.zdoom.org" #define FORUM_URL "http://forum.zdoom.org"
#define BUGS_FORUM_URL "http://forum.zdoom.org/index.php?c=3" #define BUGS_FORUM_URL "http://forum.zdoom.org/index.php?c=3"
#ifdef unix #ifdef __unix__
#define GAME_DIR ".config/zdoom" #define GAME_DIR ".config/zdoom"
#elif defined(__APPLE__) #elif defined(__APPLE__)
#define GAME_DIR GAMENAME #define GAME_DIR GAMENAME

View file

@ -84,7 +84,7 @@ ACTOR Actor native //: Thinker
action native A_VileChase(); action native A_VileChase();
action native A_VileStart(); action native A_VileStart();
action native A_VileTarget(class<Actor> fire = "ArchvileFire"); action native A_VileTarget(class<Actor> fire = "ArchvileFire");
action native A_VileAttack(sound snd = "vile/stop", int initialdmg = 20, int blastdmg = 70, int blastradius = 70, float thrustfac = 1.0, name damagetype = "Fire"); action native A_VileAttack(sound snd = "vile/stop", int initialdmg = 20, int blastdmg = 70, int blastradius = 70, float thrustfac = 1.0, name damagetype = "Fire", int flags = 0);
action native A_StartFire(); action native A_StartFire();
action native A_Fire(float spawnheight = 0); action native A_Fire(float spawnheight = 0);
action native A_FireCrackle(); action native A_FireCrackle();

View file

@ -4,6 +4,9 @@ const int PAF_NOSKULLATTACK = 1;
const int PAF_AIMFACING = 2; const int PAF_AIMFACING = 2;
const int PAF_NOTARGET = 4; const int PAF_NOTARGET = 4;
// Flags for A_VileAttack
const int VAF_DMGTYPEAPPLYTODIRECT = 1;
// Flags for A_Saw // Flags for A_Saw
const int SF_NORANDOM = 1; const int SF_NORANDOM = 1;
const int SF_RANDOMLIGHTMISS = 2; const int SF_RANDOMLIGHTMISS = 2;

View file

@ -32,6 +32,7 @@ Actor PlayerPawn : Actor native
Player.DamageScreenColor "ff 00 00" Player.DamageScreenColor "ff 00 00"
Player.MugShotMaxHealth 0 Player.MugShotMaxHealth 0
Player.FlechetteType "ArtiPoisonBag3" Player.FlechetteType "ArtiPoisonBag3"
Player.AirCapacity 1
Obituary "$OB_MPDEFAULT" Obituary "$OB_MPDEFAULT"
} }

View file

@ -1615,6 +1615,10 @@ MNU_EPISODE = "Select Episode";
WI_FINISHED = "finished"; WI_FINISHED = "finished";
WI_ENTERING = "Now entering:"; WI_ENTERING = "Now entering:";
AM_MONSTERS = "Monsters:";
AM_SECRETS = "Secrets:";
AM_ITEMS = "Items:";
// Bloodbath announcer // Bloodbath announcer
BBA_BONED = "%k boned %o like a fish"; BBA_BONED = "%k boned %o like a fish";

View file

@ -850,6 +850,13 @@ OptionValue Autosave
2, "Never" 2, "Never"
} }
OptionValue dehopt
{
0, "Never"
1, "All"
2, "Only last one"
}
OptionMenu "MiscOptions" OptionMenu "MiscOptions"
{ {
Title "Miscellaneous Options" Title "Miscellaneous Options"
@ -864,6 +871,7 @@ OptionMenu "MiscOptions"
Option "Enable cheats from all games", "allcheats", "OnOff" Option "Enable cheats from all games", "allcheats", "OnOff"
Option "Enable autosaves", "disableautosave", "Autosave" Option "Enable autosaves", "disableautosave", "Autosave"
Slider "Number of autosaves", "autosavecount", 1, 20, 1, 0 Slider "Number of autosaves", "autosavecount", 1, 20, 1, 0
Option "Load *.deh/*.bex lumps", "dehload", "dehopt"
StaticText " " StaticText " "
Option "Cache nodes", "gl_cachenodes", "OnOff" Option "Cache nodes", "gl_cachenodes", "OnOff"
Slider "Time threshold for node caching", "gl_cachetime", 0.0, 2.0, 0.1 Slider "Time threshold for node caching", "gl_cachetime", 0.0, 2.0, 0.1
@ -920,10 +928,18 @@ OptionValue STSTypes
3, "Rotated" 3, "Rotated"
} }
OptionValue MapBackTypes
{
0, "Off"
1, "On"
2, "Map defined colors only"
}
OptionMenu AutomapOptions OptionMenu AutomapOptions
{ {
Title "AUTOMAP OPTIONS" Title "AUTOMAP OPTIONS"
Option "Map color set", "am_colorset", "MapColorTypes" Option "Map color set", "am_colorset", "MapColorTypes"
Option "Allow map defined colors", "am_customcolors", "YesNo"
Submenu "Set custom colors", "MapColorMenu" Submenu "Set custom colors", "MapColorMenu"
Submenu "Customize map controls", "MapControlsMenu" Submenu "Customize map controls", "MapControlsMenu"
StaticText " " StaticText " "
@ -939,7 +955,7 @@ OptionMenu AutomapOptions
Option "Show total time elapsed", "am_showtotaltime", "OnOff" Option "Show total time elapsed", "am_showtotaltime", "OnOff"
Option "Show secrets on map", "am_map_secrets", "SecretTypes" Option "Show secrets on map", "am_map_secrets", "SecretTypes"
Option "Show map label", "am_showmaplabel", "MaplabelTypes" Option "Show map label", "am_showmaplabel", "MaplabelTypes"
Option "Draw map background", "am_drawmapback", "OnOff" Option "Draw map background", "am_drawmapback", "MapBackTypes"
Option "Show keys (cheat)", "am_showkeys", "OnOff" Option "Show keys (cheat)", "am_showkeys", "OnOff"
Option "Show trigger lines", "am_showtriggerlines", "OnOff" Option "Show trigger lines", "am_showtriggerlines", "OnOff"
Option "Show things as sprites", "am_showthingsprites", "STSTypes" Option "Show things as sprites", "am_showthingsprites", "STSTypes"
@ -1010,13 +1026,19 @@ OptionMenu MapColorMenu
StaticText "Overlay Mode", 1 StaticText "Overlay Mode", 1
ColorPicker "You", "am_ovyourcolor" ColorPicker "You", "am_ovyourcolor"
ColorPicker "1-sided walls", "am_ovwallcolor" ColorPicker "1-sided walls", "am_ovwallcolor"
ColorPicker "2-sided walls", "am_ovotherwallscolor" ColorPicker "2-sided walls with different floors", "am_ovfdwallcolor"
ColorPicker "2-sided walls with different ceilings", "am_ovcdwallcolor"
ColorPicker "2-sided walls with 3D floors", "am_ovefwallcolor"
ColorPicker "Not-yet-seen walls", "am_ovunseencolor" ColorPicker "Not-yet-seen walls", "am_ovunseencolor"
ColorPicker "Teleporter", "am_ovtelecolor" ColorPicker "Locked doors", "am_ovlockedcolor"
ColorPicker "Teleporter to the same map", "am_ovtelecolor"
ColorPicker "Teleporter to a different map", "am_ovinterlevelcolor"
ColorPicker "Secret sector", "am_ovsecretsectorcolor" ColorPicker "Secret sector", "am_ovsecretsectorcolor"
ColorPicker "Special trigger lines", "am_ovspecialwallcolor" ColorPicker "Special trigger lines", "am_ovspecialwallcolor"
StaticText " " StaticText " "
StaticText "Overlay Cheat Mode", 1 StaticText "Overlay Cheat Mode", 1
ColorPicker "Invisible 2-sided walls", "am_ovotherwallscolor"
ColorPicker "Secret walls", "am_ovsecretwallcolor"
ColorPicker "Actors", "am_ovthingcolor" ColorPicker "Actors", "am_ovthingcolor"
ColorPicker "Monsters", "am_ovthingcolor_monster" ColorPicker "Monsters", "am_ovthingcolor_monster"
ColorPicker "Friends", "am_ovthingcolor_friend" ColorPicker "Friends", "am_ovthingcolor_friend"