Merge branch 'master' into scripting

Conflicts:
	src/actor.h
	src/g_doom/a_doomweaps.cpp
	src/p_local.h
	src/p_map.cpp
	src/sdl/i_main.cpp
	src/thingdef/thingdef_codeptr.cpp
This commit is contained in:
Randy Heit 2013-06-25 19:23:01 -05:00
commit 4deeb8d8ae
50 changed files with 823 additions and 574 deletions

28
.gitignore vendored Normal file
View file

@ -0,0 +1,28 @@
/Debug
*.ncb
*.suo
*.pdb
*.ilk
*.aps
/Release
/wadsrc_wad
*.user
/debug
/release
*/debug
*/release
/release_gcc
/dumb/vc6/dumb_static/release
/dumb/vc6/dumb_static/debug
/DOOMSTATS.TXT
/src/gitinfo.h
/src/sc_man_scanner.h
/src/xlat/xlat_parser.c
/src/xlat/xlat_parser.h
/src/xlat/xlat_parser.out
/tools/*/debug
/tools/*/release
/tools/*/*.exe
/tools/lemon/build
/tools/re2c/build
/wadsrc/*.pk3

View file

@ -10,9 +10,9 @@ ENDIF( NOT CMAKE_BUILD_TYPE )
set( ZDOOM_OUTPUT_DIR ${CMAKE_BINARY_DIR} CACHE PATH "Directory where zdoom.pk3 and the executable will be created." ) set( ZDOOM_OUTPUT_DIR ${CMAKE_BINARY_DIR} CACHE PATH "Directory where zdoom.pk3 and the executable will be created." )
set( ZDOOM_EXE_NAME "zdoom" CACHE FILEPATH "Name of the executable to create." ) set( ZDOOM_EXE_NAME "zdoom" CACHE FILEPATH "Name of the executable to create." )
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
set( PROFILE 0 CACHE BOOL "Enable profiling with gprof for Debug and RelWithDebInfo build types." ) set( PROFILE 0 CACHE BOOL "Enable profiling with gprof for Debug and RelWithDebInfo build types." )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}") set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")

View file

@ -1,8 +1,8 @@
cmake_minimum_required( VERSION 2.4 ) cmake_minimum_required( VERSION 2.4 )
if( CMAKE_COMPILER_IS_GNUC ) if( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fomit-frame-pointer" ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fomit-frame-pointer" )
endif( CMAKE_COMPILER_IS_GNUC ) endif( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
add_definitions( -DBZ_NO_STDIO ) add_definitions( -DBZ_NO_STDIO )
add_library( bz2 add_library( bz2

View file

@ -11,9 +11,9 @@ endif( NOT CMAKE_BUILD_TYPE MATCHES "Release" )
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -DDEBUGMODE=1" ) set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -DDEBUGMODE=1" )
if( CMAKE_COMPILER_IS_GNUC ) if( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-pointer-sign -Wno-uninitialized" ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-pointer-sign -Wno-uninitialized" )
endif( CMAKE_COMPILER_IS_GNUC ) endif( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
CHECK_FUNCTION_EXISTS( itoa ITOA_EXISTS ) CHECK_FUNCTION_EXISTS( itoa ITOA_EXISTS )
if( NOT ITOA_EXISTS ) if( NOT ITOA_EXISTS )
@ -101,6 +101,6 @@ add_library( dumb
src/it/xmeffect.c ) src/it/xmeffect.c )
target_link_libraries( dumb ) target_link_libraries( dumb )
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
set_source_files_properties( src/it/filter.cpp PROPERTIES COMPILE_FLAGS -msse ) set_source_files_properties( src/it/filter.cpp PROPERTIES COMPILE_FLAGS -msse )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )

View file

@ -6,7 +6,7 @@ if( NOT CMAKE_BUILD_TYPE MATCHES "Release" )
set( CMAKE_BUILD_TYPE "RelWithDebInfo" ) set( CMAKE_BUILD_TYPE "RelWithDebInfo" )
endif( NOT CMAKE_BUILD_TYPE MATCHES "Release" ) endif( NOT CMAKE_BUILD_TYPE MATCHES "Release" )
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra" )
if( NOT PROFILE ) if( NOT PROFILE )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer" )
@ -15,7 +15,7 @@ if( CMAKE_COMPILER_IS_GNUCXX )
if( HAVE_NO_ARRAY_BOUNDS ) if( HAVE_NO_ARRAY_BOUNDS )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-array-bounds" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-array-bounds" )
endif( HAVE_NO_ARRAY_BOUNDS ) endif( HAVE_NO_ARRAY_BOUNDS )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
add_library( gme add_library( gme
gme/Blip_Buffer.cpp gme/Blip_Buffer.cpp

View file

@ -8,9 +8,9 @@ if( MSVC )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4554 /wd4102" ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4554 /wd4102" )
endif( MSVC ) endif( MSVC )
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra" )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
add_definitions( -DINFNAN_CHECK -DMULTIPLE_THREADS ) add_definitions( -DINFNAN_CHECK -DMULTIPLE_THREADS )

View file

@ -1,8 +1,8 @@
cmake_minimum_required( VERSION 2.4 ) cmake_minimum_required( VERSION 2.4 )
if( CMAKE_COMPILER_IS_GNUC ) if( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fomit-frame-pointer" ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fomit-frame-pointer" )
endif( CMAKE_COMPILER_IS_GNUC ) endif( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
add_library( jpeg add_library( jpeg
jcomapi.c jcomapi.c

View file

@ -1,8 +1,8 @@
cmake_minimum_required( VERSION 2.4 ) cmake_minimum_required( VERSION 2.4 )
if( CMAKE_COMPILER_IS_GNUC ) if( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fomit-frame-pointer" ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fomit-frame-pointer" )
endif( CMAKE_COMPILER_IS_GNUC ) endif( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
set( LZMA_FILES set( LZMA_FILES
C/Archive/7z/7zDecode.c C/Archive/7z/7zDecode.c

View file

@ -113,14 +113,14 @@ conversation // Starts a dialog.
// The amount of an item needed to successfully pick this option. // The amount of an item needed to successfully pick this option.
// This can be repeated, but only the first will be shown (provided // This can be repeated, but only the first will be shown (provided
// diaplaycost is true). All costs must be satisfied for success. // displaycost is true). All costs must be satisfied for success.
cost cost
{ {
item = <integer>; // Item that is required for this option. item = <integer>; // Item that is required for this option.
amount = <integer>; // Minimum amount of the item needed. amount = <integer>; // Minimum amount of the item needed.
} }
displaycost = <bool>; // Weather the cost should be displaycost = <bool>; // Whether the cost should be
// displayed with the option. // displayed with the option.
// If no cost is specified this should // If no cost is specified this should
// be ignored. // be ignored.

View file

@ -10,14 +10,14 @@ include( CheckCXXCompilerFlag )
include( FindPkgConfig ) include( FindPkgConfig )
option( NO_ASM "Disable assembly code" ) option( NO_ASM "Disable assembly code" )
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
option( NO_STRIP "Do not strip Release or MinSizeRel builds" ) option( NO_STRIP "Do not strip Release or MinSizeRel builds" )
# At least some versions of Xcode fail if you strip with the linker # At least some versions of Xcode fail if you strip with the linker
# instead of the separate strip utility. # instead of the separate strip utility.
if( APPLE ) if( APPLE )
set( NO_STRIP ON ) set( NO_STRIP ON )
endif( APPLE ) endif( APPLE )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
option( DYN_FLUIDSYNTH "Dynamically load fluidsynth" ) option( DYN_FLUIDSYNTH "Dynamically load fluidsynth" )
@ -44,7 +44,7 @@ set( MINOR_VERSIONS "50" "49" "48" "47" "46" "45" "44" "43" "42" "41"
"27" "26" "25" "24" "23" "22" "21" "20" "21" "19" "18" "17" "16" "27" "26" "25" "24" "23" "22" "21" "20" "21" "19" "18" "17" "16"
"15" "14" "13" "12" "11" "10" "09" "08" "07" "06" "05" "04" "03" "15" "14" "13" "12" "11" "10" "09" "08" "07" "06" "05" "04" "03"
"02" "01" "00" ) "02" "01" "00" )
set( MAJOR_VERSIONS "34" "28" "26" "24" "22" "20" ) set( MAJOR_VERSIONS "44" "34" "28" "26" "24" "22" "20" )
set( FMOD_DIR_VERSIONS ${FMOD_DIR_VERSIONS} "../fmod" ) set( FMOD_DIR_VERSIONS ${FMOD_DIR_VERSIONS} "../fmod" )
foreach( majver ${MAJOR_VERSIONS} ) foreach( majver ${MAJOR_VERSIONS} )
foreach( minver ${MINOR_VERSIONS} ) foreach( minver ${MINOR_VERSIONS} )
@ -391,7 +391,7 @@ endif( SSE_MATTERS )
# Set up flags for GCC # Set up flags for GCC
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
if( PROFILE ) if( PROFILE )
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -pg" ) set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -pg" )
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg" ) set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg" )
@ -420,7 +420,7 @@ if( CMAKE_COMPILER_IS_GNUCXX )
set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s" ) set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s" )
set (CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -s" ) set (CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -s" )
endif( NOT NO_STRIP ) endif( NOT NO_STRIP )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
# Check for functions that may or may not exist. # Check for functions that may or may not exist.
@ -483,12 +483,12 @@ if( BACKPATCH )
add_definitions( -DBACKPATCH ) add_definitions( -DBACKPATCH )
endif( BACKPATCH ) endif( BACKPATCH )
# Update svnrevision.h # Update gitinfo.h
get_target_property( UPDATEREVISION_EXE updaterevision LOCATION ) get_target_property( UPDATEREVISION_EXE updaterevision LOCATION )
add_custom_target( revision_check ALL add_custom_target( revision_check ALL
COMMAND ${UPDATEREVISION_EXE} . src/svnrevision.h COMMAND ${UPDATEREVISION_EXE} src/gitinfo.h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
DEPENDS updaterevision ) DEPENDS updaterevision )
@ -529,15 +529,15 @@ if( WIN32 )
win32/i_system.cpp win32/i_system.cpp
win32/st_start.cpp win32/st_start.cpp
win32/win32video.cpp ) win32/win32video.cpp )
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
# CMake is not set up to compile and link rc files with GCC. :( # CMake is not set up to compile and link rc files with GCC. :(
add_custom_command( OUTPUT zdoom-rc.o add_custom_command( OUTPUT zdoom-rc.o
COMMAND windres -o zdoom-rc.o -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zdoom.rc COMMAND windres -o zdoom-rc.o -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zdoom.rc
DEPENDS win32/zdoom.rc ) DEPENDS win32/zdoom.rc )
set( SYSTEM_SOURCES ${SYSTEM_SOURCES} zdoom-rc.o ) set( SYSTEM_SOURCES ${SYSTEM_SOURCES} zdoom-rc.o )
else( CMAKE_COMPILER_IS_GNUCXX ) else( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
set( SYSTEM_SOURCES ${SYSTEM_SOURCES} win32/zdoom.rc ) set( SYSTEM_SOURCES ${SYSTEM_SOURCES} win32/zdoom.rc )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
else( WIN32 ) else( WIN32 )
set( SYSTEM_SOURCES_DIR sdl ) set( SYSTEM_SOURCES_DIR sdl )
set( SYSTEM_SOURCES set( SYSTEM_SOURCES
@ -688,6 +688,7 @@ add_executable( zdoom WIN32
g_skill.cpp g_skill.cpp
gameconfigfile.cpp gameconfigfile.cpp
gi.cpp gi.cpp
gitinfo.cpp
hu_scores.cpp hu_scores.cpp
i_net.cpp i_net.cpp
info.cpp info.cpp
@ -993,7 +994,7 @@ if( NOT WIN32 )
COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/link-make COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/link-make
COMMAND /bin/sh -c ${CMAKE_CURRENT_BINARY_DIR}/link-make ) COMMAND /bin/sh -c ${CMAKE_CURRENT_BINARY_DIR}/link-make )
endif( NOT WIN32 ) endif( NOT WIN32 )
if( CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
# GCC misoptimizes this file # GCC misoptimizes this file
set_source_files_properties( oplsynth/fmopl.cpp PROPERTIES COMPILE_FLAGS "-fno-tree-dominator-opts -fno-tree-fre" ) set_source_files_properties( oplsynth/fmopl.cpp PROPERTIES COMPILE_FLAGS "-fno-tree-dominator-opts -fno-tree-fre" )
@ -1001,7 +1002,7 @@ if( CMAKE_COMPILER_IS_GNUCXX )
if( SSE_MATTERS ) if( SSE_MATTERS )
set_source_files_properties( x86.cpp PROPERTIES COMPILE_FLAGS "-msse2 -mmmx" ) set_source_files_properties( x86.cpp PROPERTIES COMPILE_FLAGS "-msse2 -mmmx" )
endif( SSE_MATTERS ) endif( SSE_MATTERS )
endif( CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
if( MSVC ) if( MSVC )
set_target_properties(zdoom PROPERTIES LINK_FLAGS "/MANIFEST:NO") set_target_properties(zdoom PROPERTIES LINK_FLAGS "/MANIFEST:NO")

View file

@ -267,8 +267,8 @@ enum
// --- mobj.flags5 --- // --- mobj.flags5 ---
MF5_INSTATECALL = 0x00000001, // This actor is being run through CallStateChain MF5_DONTDRAIN = 0x00000001, // cannot be drained health from.
/* = 0x00000002, */ MF5_INSTATECALL = 0x00000002, // This actor is being run through CallStateChain
MF5_NODROPOFF = 0x00000004, // cannot drop off under any circumstances. MF5_NODROPOFF = 0x00000004, // cannot drop off under any circumstances.
/* = 0x00000008, */ /* = 0x00000008, */
MF5_COUNTSECRET = 0x00000010, // From Doom 64: actor acts like a secret MF5_COUNTSECRET = 0x00000010, // From Doom 64: actor acts like a secret

View file

@ -393,7 +393,7 @@ CCMD (take)
CCMD (gameversion) CCMD (gameversion)
{ {
Printf ("%s : " __DATE__ "\n", DOTVERSIONSTR); Printf ("%s @ %s\nCommit %s", GetVersionString(), GetGitTime(), GetGitHash());
} }
CCMD (print) CCMD (print)

View file

@ -1167,9 +1167,9 @@ void C_DrawConsole (bool hw2d)
if (ConBottom >= 12) if (ConBottom >= 12)
{ {
screen->DrawText (ConFont, CR_ORANGE, SCREENWIDTH - 8 - screen->DrawText (ConFont, CR_ORANGE, SCREENWIDTH - 8 -
ConFont->StringWidth ("v" DOTVERSIONSTR), ConFont->StringWidth (GetVersionString()),
ConBottom - ConFont->GetHeight() - 4, ConBottom - ConFont->GetHeight() - 4,
"v" DOTVERSIONSTR, TAG_DONE); GetVersionString(), TAG_DONE);
if (TickerMax) if (TickerMax)
{ {
char tickstr[256]; char tickstr[256];

View file

@ -80,6 +80,7 @@ enum
CP_SETACTIVATION, CP_SETACTIVATION,
CP_SECTORFLOOROFFSET, CP_SECTORFLOOROFFSET,
CP_SETWALLYSCALE, CP_SETWALLYSCALE,
CP_SETTHINGZ,
}; };
// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
@ -89,6 +90,7 @@ enum
// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
// EXTERNAL DATA DECLARATIONS ---------------------------------------------- // EXTERNAL DATA DECLARATIONS ----------------------------------------------
extern TArray<FMapThing> MapThingsConverted;
// PUBLIC DATA DEFINITIONS ------------------------------------------------- // PUBLIC DATA DEFINITIONS -------------------------------------------------
@ -294,6 +296,15 @@ void ParseCompatibility()
sc.MustGetFloat(); sc.MustGetFloat();
CompatParams.Push(FLOAT2FIXED(sc.Float)); CompatParams.Push(FLOAT2FIXED(sc.Float));
} }
else if (sc.Compare("setthingz"))
{
if (flags.ExtCommandIndex == ~0u) flags.ExtCommandIndex = CompatParams.Size();
CompatParams.Push(CP_SETTHINGZ);
sc.MustGetNumber();
CompatParams.Push(sc.Number);
sc.MustGetFloat();
CompatParams.Push(FLOAT2FIXED(sc.Float));
}
else else
{ {
sc.UnGet(); sc.UnGet();
@ -497,6 +508,16 @@ void SetCompatibilityParams()
i += 5; i += 5;
break; break;
} }
case CP_SETTHINGZ:
{
// When this is called, the things haven't been spawned yet so we can alter the position inside the MapThings array.
if ((unsigned)CompatParams[i+1] < MapThingsConverted.Size())
{
MapThingsConverted[CompatParams[i+1]].z = CompatParams[i+2];
}
i += 3;
break;
}
} }
} }
} }

View file

@ -2334,6 +2334,28 @@ int D_LoadDehLumps()
{ {
count += D_LoadDehLump(lumpnum); count += D_LoadDehLump(lumpnum);
} }
if (0 == PatchSize)
{
// No DEH/BEX patch is loaded yet, try to find lump(s) with specific extensions
for (lumpnum = 0, lastlump = Wads.GetNumLumps();
lumpnum < lastlump;
++lumpnum)
{
const char* const fullName = Wads.GetLumpFullName(lumpnum);
const char* const extension = strrchr(fullName, '.');
const bool isDehOrBex = NULL != extension
&& (0 == stricmp(extension, ".deh") || 0 == stricmp(extension, ".bex"));
if (isDehOrBex)
{
count += D_LoadDehLump(lumpnum);
}
}
}
return count; return count;
} }

View file

@ -134,12 +134,12 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BrainSpit)
// spawn brain missile // spawn brain missile
spit = P_SpawnMissile (self, targ, spawntype); spit = P_SpawnMissile (self, targ, spawntype);
// Boss cubes should move freely to their destination so it's
// probably best to disable all collision detection for them.
if (spit != NULL) if (spit != NULL)
{ {
// Boss cubes should move freely to their destination so it's
// probably best to disable all collision detection for them.
if (spit->flags & MF_NOCLIP) spit->flags5 |= MF5_NOINTERACTION; if (spit->flags & MF_NOCLIP) spit->flags5 |= MF5_NOINTERACTION;
spit->target = targ; spit->target = targ;
spit->master = self; spit->master = self;
// [RH] Do this correctly for any trajectory. Doom would divide by 0 // [RH] Do this correctly for any trajectory. Doom would divide by 0

View file

@ -132,6 +132,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Saw)
angle_t slope; angle_t slope;
player_t *player; player_t *player;
AActor *linetarget; AActor *linetarget;
int actualdamage;
if (NULL == (player = self->player)) if (NULL == (player = self->player))
{ {
@ -165,7 +166,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Saw)
return 0; return 0;
} }
P_LineAttack (self, angle, range, slope, damage, NAME_Melee, pufftype, false, &linetarget); P_LineAttack (self, angle, range, slope, damage, NAME_Melee, pufftype, false, &linetarget, &actualdamage);
if (!linetarget) if (!linetarget)
{ {
@ -194,9 +195,9 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Saw)
} }
} }
if (lifesteal) if (lifesteal && !(linetarget->flags5 & MF5_DONTDRAIN))
{ {
P_GiveBody (self, (damage * lifesteal) >> FRACBITS); P_GiveBody (self, (actualdamage * lifesteal) >> FRACBITS);
} }
S_Sound (self, CHAN_WEAPON, hitsound, 1, ATTN_NORM); S_Sound (self, CHAN_WEAPON, hitsound, 1, ATTN_NORM);

View file

@ -827,9 +827,16 @@ void G_AddViewAngle (int yaw)
CVAR (Bool, bot_allowspy, false, 0) CVAR (Bool, bot_allowspy, false, 0)
enum {
SPY_CANCEL = 0,
SPY_NEXT,
SPY_PREV,
};
// [RH] Spy mode has been separated into two console commands. // [RH] Spy mode has been separated into two console commands.
// One goes forward; the other goes backward. // One goes forward; the other goes backward.
static void ChangeSpy (bool forward) static void ChangeSpy (int changespy)
{ {
// If you're not in a level, then you can't spy. // If you're not in a level, then you can't spy.
if (gamestate != GS_LEVEL) if (gamestate != GS_LEVEL)
@ -855,20 +862,24 @@ static void ChangeSpy (bool forward)
// Otherwise, cycle to the next player. // Otherwise, cycle to the next player.
bool checkTeam = !demoplayback && deathmatch; bool checkTeam = !demoplayback && deathmatch;
int pnum = int(players[consoleplayer].camera->player - players); int pnum = consoleplayer;
int step = forward ? 1 : -1; if (changespy != SPY_CANCEL)
do
{ {
pnum += step; pnum = int(players[consoleplayer].camera->player - players);
pnum &= MAXPLAYERS-1; int step = (changespy == SPY_NEXT) ? 1 : -1;
if (playeringame[pnum] &&
(!checkTeam || players[pnum].mo->IsTeammate (players[consoleplayer].mo) || do
(bot_allowspy && players[pnum].isbot)))
{ {
break; pnum += step;
} pnum &= MAXPLAYERS-1;
} while (pnum != consoleplayer); if (playeringame[pnum] &&
(!checkTeam || players[pnum].mo->IsTeammate (players[consoleplayer].mo) ||
(bot_allowspy && players[pnum].isbot)))
{
break;
}
} while (pnum != consoleplayer);
}
players[consoleplayer].camera = players[pnum].mo; players[consoleplayer].camera = players[pnum].mo;
S_UpdateSounds(players[consoleplayer].camera); S_UpdateSounds(players[consoleplayer].camera);
@ -882,15 +893,20 @@ static void ChangeSpy (bool forward)
CCMD (spynext) CCMD (spynext)
{ {
// allow spy mode changes even during the demo // allow spy mode changes even during the demo
ChangeSpy (true); ChangeSpy (SPY_NEXT);
} }
CCMD (spyprev) CCMD (spyprev)
{ {
// allow spy mode changes even during the demo // allow spy mode changes even during the demo
ChangeSpy (false); ChangeSpy (SPY_PREV);
} }
CCMD (spycancel)
{
// allow spy mode changes even during the demo
ChangeSpy (SPY_CANCEL);
}
// //
// G_Responder // G_Responder
@ -2061,6 +2077,8 @@ static void PutSavePic (FILE *file, int width, int height)
void G_DoSaveGame (bool okForQuicksave, FString filename, const char *description) void G_DoSaveGame (bool okForQuicksave, FString filename, const char *description)
{ {
char buf[100];
// Do not even try, if we're not in a level. (Can happen after // Do not even try, if we're not in a level. (Can happen after
// a demo finishes playback.) // a demo finishes playback.)
if (lines == NULL || sectors == NULL) if (lines == NULL || sectors == NULL)
@ -2087,7 +2105,8 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio
SaveVersion = SAVEVER; SaveVersion = SAVEVER;
PutSavePic (stdfile, SAVEPICWIDTH, SAVEPICHEIGHT); PutSavePic (stdfile, SAVEPICWIDTH, SAVEPICHEIGHT);
M_AppendPNGText (stdfile, "Software", "ZDoom " DOTVERSIONSTR); mysnprintf(buf, countof(buf), GAMENAME " %s", GetVersionString());
M_AppendPNGText (stdfile, "Software", buf);
M_AppendPNGText (stdfile, "Engine", GAMESIG); M_AppendPNGText (stdfile, "Engine", GAMESIG);
M_AppendPNGText (stdfile, "ZDoom Save Version", SAVESIG); M_AppendPNGText (stdfile, "ZDoom Save Version", SAVESIG);
M_AppendPNGText (stdfile, "Title", description); M_AppendPNGText (stdfile, "Title", description);

View file

@ -259,6 +259,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GauntletAttack)
player_t *player; player_t *player;
PClassActor *pufftype; PClassActor *pufftype;
AActor *linetarget; AActor *linetarget;
int actualdamage = 0;
if (NULL == (player = self->player)) if (NULL == (player = self->player))
{ {
@ -291,7 +292,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GauntletAttack)
pufftype = PClass::FindActor("GauntletPuff1"); pufftype = PClass::FindActor("GauntletPuff1");
} }
slope = P_AimLineAttack (self, angle, dist, &linetarget); slope = P_AimLineAttack (self, angle, dist, &linetarget);
P_LineAttack (self, angle, dist, slope, damage, NAME_Melee, pufftype, false, &linetarget); P_LineAttack (self, angle, dist, slope, damage, NAME_Melee, pufftype, false, &linetarget, &actualdamage);
if (!linetarget) if (!linetarget)
{ {
if (pr_gatk() > 64) if (pr_gatk() > 64)
@ -316,7 +317,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GauntletAttack)
} }
if (power) if (power)
{ {
P_GiveBody (self, damage>>1); if (!(linetarget->flags5 & MF5_DONTDRAIN)) P_GiveBody (self, actualdamage>>1);
S_Sound (self, CHAN_AUTO, "weapons/gauntletspowhit", 1, ATTN_NORM); S_Sound (self, CHAN_AUTO, "weapons/gauntletspowhit", 1, ATTN_NORM);
} }
else else

View file

@ -225,7 +225,7 @@ FGameConfigFile::~FGameConfigFile ()
void FGameConfigFile::WriteCommentHeader (FILE *file) const void FGameConfigFile::WriteCommentHeader (FILE *file) const
{ {
fprintf (file, "# This file was generated by " GAMENAME " " DOTVERSIONSTR " on %s\n", myasctime()); fprintf (file, "# This file was generated by " GAMENAME " %s on %s\n", GetVersionString(), myasctime());
} }
void FGameConfigFile::MigrateStub (const char *pathname, FConfigFile *config, void *userdata) void FGameConfigFile::MigrateStub (const char *pathname, FConfigFile *config, void *userdata)

View file

@ -96,10 +96,10 @@ const char* GameInfoBorders[] =
strcpy(gameinfo.key, sc.String); \ strcpy(gameinfo.key, sc.String); \
} }
#define GAMEINFOKEY_STRINGARRAY(key, variable, length) \ #define GAMEINFOKEY_STRINGARRAY(key, variable, length, clear) \
else if(nextKey.CompareNoCase(variable) == 0) \ else if(nextKey.CompareNoCase(variable) == 0) \
{ \ { \
gameinfo.key.Clear(); \ if (clear) gameinfo.key.Clear(); \
do \ do \
{ \ { \
sc.MustGetToken(TK_StringConst); \ sc.MustGetToken(TK_StringConst); \
@ -282,8 +282,10 @@ void FMapInfoParser::ParseGameInfo()
} }
// Insert valid keys here. // Insert valid keys here.
GAMEINFOKEY_CSTRING(titlePage, "titlePage", 8) GAMEINFOKEY_CSTRING(titlePage, "titlePage", 8)
GAMEINFOKEY_STRINGARRAY(creditPages, "creditPage", 8) GAMEINFOKEY_STRINGARRAY(creditPages, "addcreditPage", 8, false)
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "playerclasses", 0) GAMEINFOKEY_STRINGARRAY(creditPages, "CreditPage", 8, true)
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "addplayerclasses", 0, false)
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "playerclasses", 0, true)
GAMEINFOKEY_STRING(titleMusic, "titleMusic") GAMEINFOKEY_STRING(titleMusic, "titleMusic")
GAMEINFOKEY_FLOAT(titleTime, "titleTime") GAMEINFOKEY_FLOAT(titleTime, "titleTime")
GAMEINFOKEY_FLOAT(advisoryTime, "advisoryTime") GAMEINFOKEY_FLOAT(advisoryTime, "advisoryTime")
@ -291,8 +293,9 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_STRING(chatSound, "chatSound") GAMEINFOKEY_STRING(chatSound, "chatSound")
GAMEINFOKEY_STRING(finaleMusic, "finaleMusic") GAMEINFOKEY_STRING(finaleMusic, "finaleMusic")
GAMEINFOKEY_CSTRING(finaleFlat, "finaleFlat", 8) GAMEINFOKEY_CSTRING(finaleFlat, "finaleFlat", 8)
GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8) GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8, true)
GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8) GAMEINFOKEY_STRINGARRAY(infoPages, "addinfoPage", 8, false)
GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8, true)
GAMEINFOKEY_CSTRING(PauseSign, "pausesign", 8) GAMEINFOKEY_CSTRING(PauseSign, "pausesign", 8)
GAMEINFOKEY_STRING(quitSound, "quitSound") GAMEINFOKEY_STRING(quitSound, "quitSound")
GAMEINFOKEY_CSTRING(borderFlat, "borderFlat", 8) GAMEINFOKEY_CSTRING(borderFlat, "borderFlat", 8)
@ -321,7 +324,8 @@ void FMapInfoParser::ParseGameInfo()
GAMEINFOKEY_INT(defaultdropstyle, "defaultdropstyle") GAMEINFOKEY_INT(defaultdropstyle, "defaultdropstyle")
GAMEINFOKEY_CSTRING(Endoom, "endoom", 8) GAMEINFOKEY_CSTRING(Endoom, "endoom", 8)
GAMEINFOKEY_INT(player5start, "player5start") GAMEINFOKEY_INT(player5start, "player5start")
GAMEINFOKEY_STRINGARRAY(quitmessages, "quitmessages", 0) GAMEINFOKEY_STRINGARRAY(quitmessages, "addquitmessages", 0, false)
GAMEINFOKEY_STRINGARRAY(quitmessages, "quitmessages", 0, true)
GAMEINFOKEY_STRING(mTitleColor, "menufontcolor_title") GAMEINFOKEY_STRING(mTitleColor, "menufontcolor_title")
GAMEINFOKEY_STRING(mFontColor, "menufontcolor_label") GAMEINFOKEY_STRING(mFontColor, "menufontcolor_label")
GAMEINFOKEY_STRING(mFontColorValue, "menufontcolor_value") GAMEINFOKEY_STRING(mFontColorValue, "menufontcolor_value")

65
src/gitinfo.cpp Normal file
View file

@ -0,0 +1,65 @@
/*
** gitinfo.cpp
** Returns strings from gitinfo.h.
**
**---------------------------------------------------------------------------
** Copyright 2013 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 just here so that when gitinfo.h changes, only one source
** file needs to be recompiled.
*/
#include "gitinfo.h"
#include "version.h"
const char *GetGitDescription()
{
return GIT_DESCRIPTION;
}
const char *GetGitHash()
{
return GIT_HASH;
}
const char *GetGitTime()
{
return GIT_TIME;
}
const char *GetVersionString()
{
if (GetGitDescription()[0] == '\0')
{
return VERSIONSTR;
}
else
{
return GIT_DESCRIPTION;
}
}

View file

@ -632,8 +632,10 @@ void WritePCXfile (FILE *file, const BYTE *buffer, const PalEntry *palette,
void WritePNGfile (FILE *file, const BYTE *buffer, const PalEntry *palette, void WritePNGfile (FILE *file, const BYTE *buffer, const PalEntry *palette,
ESSType color_type, int width, int height, int pitch) ESSType color_type, int width, int height, int pitch)
{ {
char software[100];
mysnprintf(software, countof(software), GAMENAME " %s", GetVersionString());
if (!M_CreatePNG (file, buffer, palette, color_type, width, height, pitch) || if (!M_CreatePNG (file, buffer, palette, color_type, width, height, pitch) ||
!M_AppendPNGText (file, "Software", GAMENAME DOTVERSIONSTR) || !M_AppendPNGText (file, "Software", software) ||
!M_FinishPNG (file)) !M_FinishPNG (file))
{ {
Printf ("Could not create screenshot.\n"); Printf ("Could not create screenshot.\n");

View file

@ -283,7 +283,6 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
bool rtn; bool rtn;
sector_t* sec; sector_t* sec;
DFloor* floor; DFloor* floor;
//bool manual = false; tag == 0 and manual == true constitutes the same evidence [fdari]
fixed_t ceilingheight; fixed_t ceilingheight;
fixed_t newheight; fixed_t newheight;
vertex_t *spot, *spot2; vertex_t *spot, *spot2;
@ -296,7 +295,6 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
if (!line || !(sec = line->backsector)) if (!line || !(sec = line->backsector))
return rtn; return rtn;
secnum = (int)(sec-sectors); secnum = (int)(sec-sectors);
//manual = true;
goto manual_floor; goto manual_floor;
} }
@ -814,7 +812,6 @@ bool EV_DoDonut (int tag, line_t *line, fixed_t pillarspeed, fixed_t slimespeed)
DFloor* floor; DFloor* floor;
vertex_t* spot; vertex_t* spot;
fixed_t height; fixed_t height;
// bool manual = false; Instead of breaking when manual is true, fail to (re)enter loop when tag is false (0).
secnum = -1; secnum = -1;
rtn = false; rtn = false;
@ -823,7 +820,6 @@ bool EV_DoDonut (int tag, line_t *line, fixed_t pillarspeed, fixed_t slimespeed)
{ {
if (!line || !(s1 = line->backsector)) if (!line || !(s1 = line->backsector))
return rtn; return rtn;
//manual = true;
goto manual_donut; goto manual_donut;
} }
@ -1378,7 +1374,6 @@ bool EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset,
sector_t *sector; sector_t *sector;
DWaggleBase *waggle; DWaggleBase *waggle;
bool retCode; bool retCode;
//bool manual = false;
retCode = false; retCode = false;
sectorIndex = -1; sectorIndex = -1;
@ -1387,7 +1382,6 @@ bool EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset,
{ {
if (!line || !(sector = line->backsector)) if (!line || !(sector = line->backsector))
return retCode; return retCode;
//manual = true;
goto manual_waggle; goto manual_waggle;
} }

View file

@ -1498,7 +1498,7 @@ void P_SetRenderSector()
seg_t *seg = ss->firstline; seg_t *seg = ss->firstline;
// Check for one-dimensional subsectors. These should be ignored when // Check for one-dimensional subsectors. These should be ignored when
// being processed for automap drawinng etc. // being processed for automap drawing etc.
ss->flags |= SSECF_DEGENERATE; ss->flags |= SSECF_DEGENERATE;
for(j=2; j<ss->numlines; j++) for(j=2; j<ss->numlines; j++)
{ {

View file

@ -652,14 +652,13 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
FState *diestate = NULL; FState *diestate = NULL;
FName damagetype = (inflictor && inflictor->DeathType != NAME_None) ? inflictor->DeathType : DamageType;
if (damagetype != NAME_None) if (DamageType != NAME_None)
{ {
diestate = FindState (NAME_Death, damagetype, true); diestate = FindState (NAME_Death, DamageType, true);
if (diestate == NULL) if (diestate == NULL)
{ {
if (damagetype == NAME_Ice) if (DamageType == NAME_Ice)
{ // If an actor doesn't have an ice death, we can still give them a generic one. { // If an actor doesn't have an ice death, we can still give them a generic one.
if (!deh.NoAutofreeze && !(flags4 & MF4_NOICEDEATH) && (player || (flags3 & MF3_ISMONSTER))) if (!deh.NoAutofreeze && !(flags4 & MF4_NOICEDEATH) && (player || (flags3 & MF3_ISMONSTER)))
@ -678,9 +677,9 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
// Don't pass on a damage type this actor cannot handle. // Don't pass on a damage type this actor cannot handle.
// (most importantly, prevent barrels from passing on ice damage.) // (most importantly, prevent barrels from passing on ice damage.)
// Massacre must be preserved though. // Massacre must be preserved though.
if (damagetype != NAME_Massacre) if (DamageType != NAME_Massacre)
{ {
damagetype = NAME_None; DamageType = NAME_None;
} }
if ((health < gibhealth || flags4 & MF4_EXTREMEDEATH) && !(flags4 & MF4_NOEXTREMEDEATH)) if ((health < gibhealth || flags4 & MF4_EXTREMEDEATH) && !(flags4 & MF4_NOEXTREMEDEATH))
@ -1258,7 +1257,7 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
// If the damaging player has the power of drain, give the player 50% of the damage // If the damaging player has the power of drain, give the player 50% of the damage
// done in health. // done in health.
if ( source && source->player && source->player->cheats & CF_DRAIN) if ( source && source->player && source->player->cheats & CF_DRAIN && !(target->flags5 & MF5_DONTDRAIN))
{ {
if (!target->player || target->player != source->player) if (!target->player || target->player != source->player)
{ {
@ -1273,6 +1272,10 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
if (target->health <= 0) if (target->health <= 0)
{ // Death { // Death
target->special1 = damage; target->special1 = damage;
// use inflictor's death type if it got one.
if (inflictor && inflictor->DeathType != NAME_None) mod = inflictor->DeathType;
// check for special fire damage or ice damage deaths // check for special fire damage or ice damage deaths
if (mod == NAME_Fire) if (mod == NAME_Fire)
{ {

View file

@ -464,8 +464,8 @@ enum // P_LineAttack flags
LAF_NORANDOMPUFFZ = 2 LAF_NORANDOMPUFFZ = 2
}; };
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, PClassActor *pufftype, int flags = 0, AActor **victim = NULL); AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, PClassActor *pufftype, int flags = 0, AActor **victim = NULL, int *actualdamage = NULL);
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, FName pufftype, int flags = 0, AActor **victim = NULL); AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, int pitch, int damage, FName damageType, FName pufftype, int flags = 0, AActor **victim = NULL, int *actualdamage = NULL);
void P_TraceBleed (int damage, fixed_t x, fixed_t y, fixed_t z, AActor *target, angle_t angle, int pitch); void P_TraceBleed (int damage, fixed_t x, fixed_t y, fixed_t z, AActor *target, angle_t angle, int pitch);
void P_TraceBleed (int damage, AActor *target, angle_t angle, int pitch); void P_TraceBleed (int damage, AActor *target, angle_t angle, int pitch);
void P_TraceBleed (int damage, AActor *target, AActor *missile); // missile version void P_TraceBleed (int damage, AActor *target, AActor *missile); // missile version

View file

@ -3496,7 +3496,7 @@ static ETraceStatus CheckForSpectral (FTraceResults &res, void *userdata)
//========================================================================== //==========================================================================
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
int pitch, int damage, FName damageType, PClassActor *pufftype, int flags, AActor **victim) int pitch, int damage, FName damageType, PClassActor *pufftype, int flags, AActor **victim, int *actualdamage)
{ {
fixed_t vx, vy, vz, shootz; fixed_t vx, vy, vz, shootz;
FTraceResults trace; FTraceResults trace;
@ -3514,6 +3514,10 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
{ {
*victim = NULL; *victim = NULL;
} }
if (actualdamage != NULL)
{
*actualdamage = 0;
}
angle >>= ANGLETOFINESHIFT; angle >>= ANGLETOFINESHIFT;
pitch = (angle_t)(pitch) >> ANGLETOFINESHIFT; pitch = (angle_t)(pitch) >> ANGLETOFINESHIFT;
@ -3684,6 +3688,10 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
killPuff = true; killPuff = true;
} }
newdam = P_DamageMobj (trace.Actor, puff ? puff : t1, t1, damage, damageType, dmgflags); newdam = P_DamageMobj (trace.Actor, puff ? puff : t1, t1, damage, damageType, dmgflags);
if (actualdamage != NULL)
{
*actualdamage = newdam;
}
} }
if (!(puffDefaults != NULL && puffDefaults->flags3&MF3_BLOODLESSIMPACT)) if (!(puffDefaults != NULL && puffDefaults->flags3&MF3_BLOODLESSIMPACT))
{ {
@ -3741,7 +3749,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
} }
AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance, AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
int pitch, int damage, FName damageType, FName pufftype, int flags, AActor **victim) int pitch, int damage, FName damageType, FName pufftype, int flags, AActor **victim, int *actualdamage)
{ {
PClassActor *type = PClass::FindActor(pufftype); PClassActor *type = PClass::FindActor(pufftype);
if (victim != NULL) if (victim != NULL)
@ -3754,7 +3762,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
} }
else else
{ {
return P_LineAttack(t1, angle, distance, pitch, damage, damageType, type, flags, victim); return P_LineAttack(t1, angle, distance, pitch, damage, damageType, type, flags, victim, actualdamage);
} }
return NULL; return NULL;
} }

View file

@ -355,6 +355,10 @@ void AActor::Serialize (FArchive &arc)
<< meleethreshold << meleethreshold
<< meleerange << meleerange
<< DamageType; << DamageType;
if (SaveVersion >= 4501)
{
arc << DamageTypeReceived;
}
if (SaveVersion >= 3237) if (SaveVersion >= 3237)
{ {
arc arc

View file

@ -848,7 +848,7 @@ FPolyObj::FPolyObj()
int FPolyObj::GetMirror() int FPolyObj::GetMirror()
{ {
return Linedefs[0]->args[1]; return MirrorNum;
} }
//========================================================================== //==========================================================================
@ -1572,6 +1572,7 @@ static void SpawnPolyobj (int index, int tag, int type)
sd->linedef->special = 0; sd->linedef->special = 0;
sd->linedef->args[0] = 0; sd->linedef->args[0] = 0;
IterFindPolySides(&polyobjs[index], sd); IterFindPolySides(&polyobjs[index], sd);
po->MirrorNum = sd->linedef->args[1];
po->crush = (type != PO_SPAWN_TYPE) ? 3 : 0; po->crush = (type != PO_SPAWN_TYPE) ? 3 : 0;
po->bHurtOnTouch = (type == PO_SPAWNHURT_TYPE); po->bHurtOnTouch = (type == PO_SPAWNHURT_TYPE);
po->tag = tag; po->tag = tag;
@ -1647,10 +1648,7 @@ static void SpawnPolyobj (int index, int tag, int type)
po->bHurtOnTouch = (type == PO_SPAWNHURT_TYPE); po->bHurtOnTouch = (type == PO_SPAWNHURT_TYPE);
po->tag = tag; po->tag = tag;
po->seqType = po->Sidedefs[0]->linedef->args[3]; po->seqType = po->Sidedefs[0]->linedef->args[3];
// Next, change the polyobj's first line to point to a mirror po->MirrorNum = po->Sidedefs[0]->linedef->args[2];
// if it exists
po->Sidedefs[0]->linedef->args[1] =
po->Sidedefs[0]->linedef->args[2];
} }
else else
I_Error ("SpawnPolyobj: Poly %d does not exist\n", tag); I_Error ("SpawnPolyobj: Poly %d does not exist\n", tag);

View file

@ -54,6 +54,7 @@ struct FPolyObj
FPolyVertex CenterSpot; FPolyVertex CenterSpot;
FBoundingBox Bounds; // Bounds in map coordinates FBoundingBox Bounds; // Bounds in map coordinates
subsector_t *CenterSubsector; subsector_t *CenterSubsector;
int MirrorNum;
angle_t angle; angle_t angle;
int tag; // reference tag assigned in HereticEd int tag; // reference tag assigned in HereticEd

View file

@ -263,7 +263,7 @@ void R_SetVisibility (float vis)
CurrentVisibility = vis; CurrentVisibility = vis;
if (FocalTangent == 0) if (FocalTangent == 0 || FocalLengthY == 0)
{ // If r_visibility is called before the renderer is all set up, don't { // If r_visibility is called before the renderer is all set up, don't
// divide by zero. This will be called again later, and the proper // divide by zero. This will be called again later, and the proper
// values can be initialized then. // values can be initialized then.

View file

@ -1988,7 +1988,6 @@ void R_DrawHeightPlanes(fixed_t height); // kg3D - fake planes
void R_DrawMasked (void) void R_DrawMasked (void)
{ {
DrewAVoxel = true; // TESTME
R_SortVisSprites (DrewAVoxel ? sv_compare2d : sv_compare, firstvissprite - vissprites); R_SortVisSprites (DrewAVoxel ? sv_compare2d : sv_compare, firstvissprite - vissprites);
if (height_top == NULL) if (height_top == NULL)

View file

@ -1,276 +1,276 @@
/* /*
** i_main.cpp ** i_main.cpp
** System-specific startup code. Eventually calls D_DoomMain. ** System-specific startup code. Eventually calls D_DoomMain.
** **
**--------------------------------------------------------------------------- **---------------------------------------------------------------------------
** Copyright 1998-2007 Randy Heit ** Copyright 1998-2007 Randy Heit
** All rights reserved. ** All rights reserved.
** **
** Redistribution and use in source and binary forms, with or without ** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions ** modification, are permitted provided that the following conditions
** are met: ** are met:
** **
** 1. Redistributions of source code must retain the above copyright ** 1. Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer. ** notice, this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright ** 2. Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in the ** notice, this list of conditions and the following disclaimer in the
** documentation and/or other materials provided with the distribution. ** documentation and/or other materials provided with the distribution.
** 3. The name of the author may not be used to endorse or promote products ** 3. The name of the author may not be used to endorse or promote products
** derived from this software without specific prior written permission. ** derived from this software without specific prior written permission.
** **
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** (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 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**--------------------------------------------------------------------------- **---------------------------------------------------------------------------
** **
*/ */
// HEADER FILES ------------------------------------------------------------ // HEADER FILES ------------------------------------------------------------
#include <SDL.h> #include <SDL.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>
#include <new> #include <new>
#include <sys/param.h> #include <sys/param.h>
#ifndef NO_GTK #ifndef NO_GTK
#include <gtk/gtk.h> #include <gtk/gtk.h>
#endif #endif
#include <locale.h> #include <locale.h>
#if defined(__MACH__) && !defined(NOASM) #if defined(__MACH__) && !defined(NOASM)
#include <sys/types.h> #include <sys/types.h>
#include <sys/mman.h> #include <sys/mman.h>
#endif #endif
#include "doomerrors.h" #include "doomerrors.h"
#include "m_argv.h" #include "m_argv.h"
#include "d_main.h" #include "d_main.h"
#include "i_system.h" #include "i_system.h"
#include "i_video.h" #include "i_video.h"
#include "c_console.h" #include "c_console.h"
#include "errors.h" #include "errors.h"
#include "version.h" #include "version.h"
#include "w_wad.h" #include "w_wad.h"
#include "g_level.h" #include "g_level.h"
#include "r_state.h" #include "r_state.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "r_utility.h" #include "r_utility.h"
#include "doomstat.h" #include "doomstat.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
// The maximum number of functions that can be registered with atterm. // The maximum number of functions that can be registered with atterm.
#define MAX_TERMS 64 #define MAX_TERMS 64
// TYPES ------------------------------------------------------------------- // TYPES -------------------------------------------------------------------
// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
extern "C" int cc_install_handlers(int, char**, int, int*, const char*, int(*)(char*, char*)); extern "C" int cc_install_handlers(int, char**, int, int*, const char*, int(*)(char*, char*));
// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
// EXTERNAL DATA DECLARATIONS ---------------------------------------------- // EXTERNAL DATA DECLARATIONS ----------------------------------------------
#ifdef USE_XCURSOR #ifdef USE_XCURSOR
extern bool UseXCursor; extern bool UseXCursor;
#endif #endif
// PUBLIC DATA DEFINITIONS ------------------------------------------------- // PUBLIC DATA DEFINITIONS -------------------------------------------------
#ifndef NO_GTK #ifndef NO_GTK
bool GtkAvailable; bool GtkAvailable;
#endif #endif
// The command line arguments. // The command line arguments.
DArgs *Args; DArgs *Args;
// PRIVATE DATA DEFINITIONS ------------------------------------------------ // PRIVATE DATA DEFINITIONS ------------------------------------------------
static void (*TermFuncs[MAX_TERMS]) (); static void (*TermFuncs[MAX_TERMS]) ();
static const char *TermNames[MAX_TERMS]; static const char *TermNames[MAX_TERMS];
static int NumTerms; static int NumTerms;
// CODE -------------------------------------------------------------------- // CODE --------------------------------------------------------------------
void addterm (void (*func) (), const char *name) void addterm (void (*func) (), const char *name)
{ {
// Make sure this function wasn't already registered. // Make sure this function wasn't already registered.
for (int i = 0; i < NumTerms; ++i) for (int i = 0; i < NumTerms; ++i)
{ {
if (TermFuncs[i] == func) if (TermFuncs[i] == func)
{ {
return; return;
} }
} }
if (NumTerms == MAX_TERMS) if (NumTerms == MAX_TERMS)
{ {
func (); func ();
I_FatalError ( I_FatalError (
"Too many exit functions registered.\n" "Too many exit functions registered.\n"
"Increase MAX_TERMS in i_main.cpp"); "Increase MAX_TERMS in i_main.cpp");
} }
TermNames[NumTerms] = name; TermNames[NumTerms] = name;
TermFuncs[NumTerms++] = func; TermFuncs[NumTerms++] = func;
} }
void popterm () void popterm ()
{ {
if (NumTerms) if (NumTerms)
NumTerms--; NumTerms--;
} }
void STACK_ARGS call_terms () void STACK_ARGS call_terms ()
{ {
while (NumTerms > 0) while (NumTerms > 0)
{ {
// printf ("term %d - %s\n", NumTerms, TermNames[NumTerms-1]); // printf ("term %d - %s\n", NumTerms, TermNames[NumTerms-1]);
TermFuncs[--NumTerms] (); TermFuncs[--NumTerms] ();
} }
} }
static void STACK_ARGS NewFailure () static void STACK_ARGS NewFailure ()
{ {
I_FatalError ("Failed to allocate memory from system heap"); I_FatalError ("Failed to allocate memory from system heap");
} }
static int DoomSpecificInfo (char *buffer, char *end) static int DoomSpecificInfo (char *buffer, char *end)
{ {
const char *arg; const char *arg;
int size = end-buffer-2; int size = end-buffer-2;
int i, p; int i, p;
p = 0; p = 0;
p += snprintf (buffer+p, size-p, GAMENAME" version " DOTVERSIONSTR " (" __DATE__ ")\n"); p += snprintf (buffer+p, size-p, GAMENAME" version %s (%s)\n", GetVersionString(), GetGitHash());
#ifdef __VERSION__ #ifdef __VERSION__
p += snprintf (buffer+p, size-p, "Compiler version: %s\n", __VERSION__); p += snprintf (buffer+p, size-p, "Compiler version: %s\n", __VERSION__);
#endif #endif
p += snprintf (buffer+p, size-p, "\nCommand line:"); p += snprintf (buffer+p, size-p, "\nCommand line:");
for (i = 0; i < Args->NumArgs(); ++i) for (i = 0; i < Args->NumArgs(); ++i)
{ {
p += snprintf (buffer+p, size-p, " %s", Args->GetArg(i)); p += snprintf (buffer+p, size-p, " %s", Args->GetArg(i));
} }
p += snprintf (buffer+p, size-p, "\n"); p += snprintf (buffer+p, size-p, "\n");
for (i = 0; (arg = Wads.GetWadName (i)) != NULL; ++i) for (i = 0; (arg = Wads.GetWadName (i)) != NULL; ++i)
{ {
p += snprintf (buffer+p, size-p, "\nWad %d: %s", i, arg); p += snprintf (buffer+p, size-p, "\nWad %d: %s", i, arg);
} }
if (gamestate != GS_LEVEL && gamestate != GS_TITLELEVEL) if (gamestate != GS_LEVEL && gamestate != GS_TITLELEVEL)
{ {
p += snprintf (buffer+p, size-p, "\n\nNot in a level."); p += snprintf (buffer+p, size-p, "\n\nNot in a level.");
} }
else else
{ {
char name[9]; char name[9];
strncpy (name, level.mapname, 8); strncpy (name, level.mapname, 8);
name[8] = 0; name[8] = 0;
p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", name); p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", name);
if (!viewactive) if (!viewactive)
{ {
p += snprintf (buffer+p, size-p, "\n\nView not active."); p += snprintf (buffer+p, size-p, "\n\nView not active.");
} }
else else
{ {
p += snprintf (buffer+p, size-p, "\n\nviewx = %d", (int)viewx); p += snprintf (buffer+p, size-p, "\n\nviewx = %d", (int)viewx);
p += snprintf (buffer+p, size-p, "\nviewy = %d", (int)viewy); p += snprintf (buffer+p, size-p, "\nviewy = %d", (int)viewy);
p += snprintf (buffer+p, size-p, "\nviewz = %d", (int)viewz); p += snprintf (buffer+p, size-p, "\nviewz = %d", (int)viewz);
p += snprintf (buffer+p, size-p, "\nviewangle = %x", (unsigned int)viewangle); p += snprintf (buffer+p, size-p, "\nviewangle = %x", (unsigned int)viewangle);
} }
} }
buffer[p++] = '\n'; buffer[p++] = '\n';
buffer[p++] = '\0'; buffer[p++] = '\0';
return p; return p;
} }
#if defined(__MACH__) && !defined(NOASM) #if defined(__MACH__) && !defined(NOASM)
// NASM won't let us create custom sections for Mach-O. Whether that's a limitation of NASM // NASM won't let us create custom sections for Mach-O. Whether that's a limitation of NASM
// or of Mach-O, I don't know, but since we're using NASM for the assembly, it doesn't much // or of Mach-O, I don't know, but since we're using NASM for the assembly, it doesn't much
// matter. // matter.
extern "C" extern "C"
{ {
extern void *rtext_a_start, *rtext_a_end; extern void *rtext_a_start, *rtext_a_end;
extern void *rtext_tmap_start, *rtext_tmap_end; extern void *rtext_tmap_start, *rtext_tmap_end;
extern void *rtext_tmap2_start, *rtext_tmap2_end; extern void *rtext_tmap2_start, *rtext_tmap2_end;
extern void *rtext_tmap3_start, *rtext_tmap3_end; extern void *rtext_tmap3_start, *rtext_tmap3_end;
}; };
static void unprotect_pages(long pagesize, void *start, void *end) static void unprotect_pages(long pagesize, void *start, void *end)
{ {
char *page = (char *)((intptr_t)start & ~(pagesize - 1)); char *page = (char *)((intptr_t)start & ~(pagesize - 1));
size_t len = (char *)end - (char *)start; size_t len = (char *)end - (char *)start;
if (mprotect(page, len, PROT_READ|PROT_WRITE|PROT_EXEC) != 0) if (mprotect(page, len, PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
{ {
fprintf(stderr, "mprotect failed\n"); fprintf(stderr, "mprotect failed\n");
exit(1); exit(1);
} }
} }
static void unprotect_rtext() static void unprotect_rtext()
{ {
static void *const pages[] = static void *const pages[] =
{ {
rtext_a_start, rtext_a_end, rtext_a_start, rtext_a_end,
rtext_tmap_start, rtext_tmap_end, rtext_tmap_start, rtext_tmap_end,
rtext_tmap2_start, rtext_tmap2_end, rtext_tmap2_start, rtext_tmap2_end,
rtext_tmap3_start, rtext_tmap3_end rtext_tmap3_start, rtext_tmap3_end
}; };
long pagesize = sysconf(_SC_PAGESIZE); long pagesize = sysconf(_SC_PAGESIZE);
for (void *const *p = pages; p < &pages[countof(pages)]; p += 2) for (void *const *p = pages; p < &pages[countof(pages)]; p += 2)
{ {
unprotect_pages(pagesize, p[0], p[1]); unprotect_pages(pagesize, p[0], p[1]);
} }
} }
#endif #endif
void I_StartupJoysticks(); void I_StartupJoysticks();
void I_ShutdownJoysticks(); void I_ShutdownJoysticks();
int main (int argc, char **argv) int main (int argc, char **argv)
{ {
#if !defined (__APPLE__) #if !defined (__APPLE__)
{ {
int s[4] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS }; int s[4] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS };
cc_install_handlers(argc, argv, 4, s, "zdoom-crash.log", DoomSpecificInfo); cc_install_handlers(argc, argv, 4, s, "zdoom-crash.log", DoomSpecificInfo);
} }
#endif // !__APPLE__ #endif // !__APPLE__
printf(GAMENAME" v%s - SVN revision %s - SDL version\nCompiled on %s\n",
DOTVERSIONSTR_NOREV,SVN_REVISION_STRING,__DATE__);
seteuid (getuid ()); printf(GAMENAME" %s - %s - SDL version\nCompiled on %s\n",
std::set_new_handler (NewFailure); GetVersionString(), GetGitTime(), __DATE__);
#if defined(__MACH__) && !defined(NOASM) seteuid (getuid ());
unprotect_rtext(); std::set_new_handler (NewFailure);
#endif
#if defined(__MACH__) && !defined(NOASM)
#ifndef NO_GTK unprotect_rtext();
GtkAvailable = gtk_init_check (&argc, &argv); #endif
#endif
#ifndef NO_GTK
setlocale (LC_ALL, "C"); GtkAvailable = gtk_init_check (&argc, &argv);
#endif
setlocale (LC_ALL, "C");
if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE|SDL_INIT_JOYSTICK) == -1) if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE|SDL_INIT_JOYSTICK) == -1)
{ {
fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError());
return -1; return -1;
} }
atterm (SDL_Quit); atterm (SDL_Quit);
{ {
char viddriver[80]; char viddriver[80];
@ -284,10 +284,12 @@ int main (int argc, char **argv)
printf("\n"); printf("\n");
} }
SDL_WM_SetCaption (GAMESIG " " DOTVERSIONSTR " (" __DATE__ ")", NULL); char caption[100];
mysnprintf(caption, countof(caption), GAMESIG " %s (%s)", GetVersionString(), GetGitTime());
SDL_WM_SetCaption(caption, caption);
#ifdef __APPLE__ #ifdef __APPLE__
const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo(); const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo();
if ( NULL != videoInfo ) if ( NULL != videoInfo )
{ {
@ -306,59 +308,59 @@ int main (int argc, char **argv)
#endif // __APPLE__ #endif // __APPLE__
try try
{ {
Args = new DArgs(argc, argv); Args = new DArgs(argc, argv);
/* /*
killough 1/98: killough 1/98:
This fixes some problems with exit handling This fixes some problems with exit handling
during abnormal situations. during abnormal situations.
The old code called I_Quit() to end program, The old code called I_Quit() to end program,
while now I_Quit() is installed as an exit while now I_Quit() is installed as an exit
handler and exit() is called to exit, either handler and exit() is called to exit, either
normally or abnormally. Seg faults are caught normally or abnormally. Seg faults are caught
and the error handler is used, to prevent and the error handler is used, to prevent
being left in graphics mode or having very being left in graphics mode or having very
loud SFX noise because the sound card is loud SFX noise because the sound card is
left in an unstable state. left in an unstable state.
*/ */
atexit (call_terms); atexit (call_terms);
atterm (I_Quit); atterm (I_Quit);
// Should we even be doing anything with progdir on Unix systems? // Should we even be doing anything with progdir on Unix systems?
char program[PATH_MAX]; char program[PATH_MAX];
if (realpath (argv[0], program) == NULL) if (realpath (argv[0], program) == NULL)
strcpy (program, argv[0]); strcpy (program, argv[0]);
char *slash = strrchr (program, '/'); char *slash = strrchr (program, '/');
if (slash != NULL) if (slash != NULL)
{ {
*(slash + 1) = '\0'; *(slash + 1) = '\0';
progdir = program; progdir = program;
} }
else else
{ {
progdir = "./"; progdir = "./";
} }
I_StartupJoysticks(); I_StartupJoysticks();
C_InitConsole (80*8, 25*8, false); C_InitConsole (80*8, 25*8, false);
D_DoomMain (); D_DoomMain ();
} }
catch (class CDoomError &error) catch (class CDoomError &error)
{ {
I_ShutdownJoysticks(); I_ShutdownJoysticks();
if (error.GetMessage ()) if (error.GetMessage ())
fprintf (stderr, "%s\n", error.GetMessage ()); fprintf (stderr, "%s\n", error.GetMessage ());
exit (-1); exit (-1);
} }
catch (...) catch (...)
{ {
call_terms (); call_terms ();
throw; throw;
} }
return 0; return 0;
} }

View file

@ -483,10 +483,12 @@ int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad)
GtkTreeIter iter, defiter; GtkTreeIter iter, defiter;
int close_style = 0; int close_style = 0;
int i; int i;
char caption[100];
// Create the dialog window. // Create the dialog window.
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(window), GAMESIG " " DOTVERSIONSTR ": Select an IWAD to use"); mysnprintf(caption, countof(caption), GAMESIG " %s: Select an IWAD to use", GetVersionString());
gtk_window_set_title (GTK_WINDOW(window), caption);
gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_container_set_border_width (GTK_CONTAINER(window), 10); gtk_container_set_border_width (GTK_CONTAINER(window), 10);
g_signal_connect (window, "delete_event", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect (window, "delete_event", G_CALLBACK(gtk_main_quit), NULL);
@ -614,9 +616,10 @@ int I_PickIWad (WadStuff *wads, int numwads, bool showwin, int defaultiwad)
const char *str; const char *str;
if((str=getenv("KDE_FULL_SESSION")) && strcmp(str, "true") == 0) if((str=getenv("KDE_FULL_SESSION")) && strcmp(str, "true") == 0)
{ {
FString cmd("kdialog --title \""GAMESIG" "DOTVERSIONSTR": Select an IWAD to use\"" FString cmd("kdialog --title \""GAMESIG" ");
cmd << GetVersionString() << ": Select an IWAD to use\""
" --menu \"ZDoom found more than one IWAD\n" " --menu \"ZDoom found more than one IWAD\n"
"Select from the list below to determine which one to use:\""); "Select from the list below to determine which one to use:\"";
for(i = 0; i < numwads; ++i) for(i = 0; i < numwads; ++i)
{ {

View file

@ -198,7 +198,9 @@ static const FEnumList SpeakerModeNames[] =
{ "Surround", FMOD_SPEAKERMODE_SURROUND }, { "Surround", FMOD_SPEAKERMODE_SURROUND },
{ "5.1", FMOD_SPEAKERMODE_5POINT1 }, { "5.1", FMOD_SPEAKERMODE_5POINT1 },
{ "7.1", FMOD_SPEAKERMODE_7POINT1 }, { "7.1", FMOD_SPEAKERMODE_7POINT1 },
#if FMOD_VERSION < 0x44400
{ "Prologic", FMOD_SPEAKERMODE_PROLOGIC }, { "Prologic", FMOD_SPEAKERMODE_PROLOGIC },
#endif
{ "1", FMOD_SPEAKERMODE_MONO }, { "1", FMOD_SPEAKERMODE_MONO },
{ "2", FMOD_SPEAKERMODE_STEREO }, { "2", FMOD_SPEAKERMODE_STEREO },
{ "4", FMOD_SPEAKERMODE_QUAD }, { "4", FMOD_SPEAKERMODE_QUAD },

View file

@ -208,8 +208,6 @@ static cheatseq_t HereticCheats[] =
{ CheatPonce, 0, 0, 0, {CHT_HEALTH,0}, Cht_Generic }, { CheatPonce, 0, 0, 0, {CHT_HEALTH,0}, Cht_Generic },
{ CheatSkel, 0, 0, 0, {CHT_KEYS,0}, Cht_Generic }, { CheatSkel, 0, 0, 0, {CHT_KEYS,0}, Cht_Generic },
{ CheatChicken, 0, 0, 0, {CHT_MORPH,0}, Cht_Generic }, { CheatChicken, 0, 0, 0, {CHT_MORPH,0}, Cht_Generic },
{ CheatAmmo, 0, 0, 0, {CHT_TAKEWEAPS,0}, Cht_Generic },
{ CheatGod, 0, 0, 0, {CHT_NOWUDIE,0}, Cht_Generic },
{ CheatMassacre, 0, 0, 0, {CHT_MASSACRE,0}, Cht_Generic }, { CheatMassacre, 0, 0, 0, {CHT_MASSACRE,0}, Cht_Generic },
{ CheatEngage, 0, 1, 0, {0,0}, Cht_ChangeLevel }, { CheatEngage, 0, 1, 0, {0,0}, Cht_ChangeLevel },
{ CheatPowerup1[0], 0, 0, 0, {CHT_GIMMIEA,0}, Cht_Generic }, { CheatPowerup1[0], 0, 0, 0, {CHT_GIMMIEA,0}, Cht_Generic },
@ -223,6 +221,8 @@ static cheatseq_t HereticCheats[] =
{ CheatPowerup1[8], 0, 0, 0, {CHT_GIMMIEI,0}, Cht_Generic }, { CheatPowerup1[8], 0, 0, 0, {CHT_GIMMIEI,0}, Cht_Generic },
{ CheatPowerup1[9], 0, 0, 0, {CHT_GIMMIEJ,0}, Cht_Generic }, { CheatPowerup1[9], 0, 0, 0, {CHT_GIMMIEJ,0}, Cht_Generic },
{ CheatPowerup1[10], 0, 0, 0, {CHT_GIMMIEZ,0}, Cht_Generic }, { CheatPowerup1[10], 0, 0, 0, {CHT_GIMMIEZ,0}, Cht_Generic },
{ CheatAmmo, 0, 0, 0, {CHT_TAKEWEAPS,0}, Cht_Generic },
{ CheatGod, 0, 0, 0, {CHT_NOWUDIE,0}, Cht_Generic },
}; };
static cheatseq_t HexenCheats[] = static cheatseq_t HexenCheats[] =
@ -270,7 +270,6 @@ static cheatseq_t StrifeCheats[] =
static cheatseq_t ChexCheats[] = static cheatseq_t ChexCheats[] =
{ {
{ CheatMus, 0, 1, 0, {0,0}, Cht_Music },
{ CheatKimHyers, 0, 1, 0, {0,0}, Cht_MyPos }, { CheatKimHyers, 0, 1, 0, {0,0}, Cht_MyPos },
{ CheatShrrill, 0, 0, 0, {0,0}, Cht_AutoMap }, { CheatShrrill, 0, 0, 0, {0,0}, Cht_AutoMap },
{ CheatDavidBrus, 0, 0, 0, {CHT_IDDQD,0}, Cht_Generic }, { CheatDavidBrus, 0, 0, 0, {CHT_IDDQD,0}, Cht_Generic },
@ -284,7 +283,8 @@ static cheatseq_t ChexCheats[] =
{ CheatDigitalCafe, 0, 0, 0, {CHT_BEHOLDA,0}, Cht_Generic }, { CheatDigitalCafe, 0, 0, 0, {CHT_BEHOLDA,0}, Cht_Generic },
{ CheatJoshuaStorms, 0, 0, 0, {CHT_BEHOLDL,0}, Cht_Generic }, { CheatJoshuaStorms, 0, 0, 0, {CHT_BEHOLDL,0}, Cht_Generic },
{ CheatJoelKoenigs, 0, 0, 0, {CHT_CHAINSAW,0}, Cht_Generic }, { CheatJoelKoenigs, 0, 0, 0, {CHT_CHAINSAW,0}, Cht_Generic },
{ CheatLeeSnyder, 0, 1, 0, {0,0}, Cht_ChangeLevel } { CheatLeeSnyder, 0, 1, 0, {0,0}, Cht_ChangeLevel },
{ CheatMus, 0, 1, 0, {0,0}, Cht_Music },
}; };
static cheatseq_t SpecialCheats[] = static cheatseq_t SpecialCheats[] =
@ -342,8 +342,8 @@ bool ST_Responder (event_t *ev)
else else
{ {
static cheatseq_t *cheatlists[] = { DoomCheats, HereticCheats, HexenCheats, StrifeCheats, ChexCheats, SpecialCheats }; static cheatseq_t *cheatlists[] = { DoomCheats, HereticCheats, HexenCheats, StrifeCheats, ChexCheats, SpecialCheats };
static int counts[] = { countof(DoomCheats), countof(HereticCheats), countof(HexenCheats), static int counts[] = { countof(DoomCheats), countof(HereticCheats)-2, countof(HexenCheats),
countof(StrifeCheats), countof(ChexCheats), countof(SpecialCheats) }; countof(StrifeCheats), countof(ChexCheats)-1, countof(SpecialCheats) };
for (size_t i=0; i<countof(cheatlists); i++) for (size_t i=0; i<countof(cheatlists); i++)
{ {

View file

@ -1495,6 +1495,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomPunch)
angle_t angle; angle_t angle;
int pitch; int pitch;
AActor * linetarget; AActor * linetarget;
int actualdamage;
if (!norandom) if (!norandom)
damage *= pr_cwpunch() % 8 + 1; damage *= pr_cwpunch() % 8 + 1;
@ -1515,13 +1516,13 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomPunch)
pufftype = PClass::FindActor(NAME_BulletPuff); pufftype = PClass::FindActor(NAME_BulletPuff);
int puffFlags = LAF_ISMELEEATTACK | (flags & CPF_NORANDOMPUFFZ)? LAF_NORANDOMPUFFZ : 0; int puffFlags = LAF_ISMELEEATTACK | (flags & CPF_NORANDOMPUFFZ)? LAF_NORANDOMPUFFZ : 0;
P_LineAttack (self, angle, range, pitch, damage, NAME_Melee, pufftype, puffFlags, &linetarget); P_LineAttack (self, angle, range, pitch, damage, NAME_Melee, pufftype, puffFlags, &linetarget, &actualdamage);
// turn to face target // turn to face target
if (linetarget) if (linetarget)
{ {
if (lifesteal) if (lifesteal && !(linetarget->flags5 & MF5_DONTDRAIN))
P_GiveBody (self, (damage * lifesteal) >> FRACBITS); P_GiveBody (self, (actualdamage * lifesteal) >> FRACBITS);
if (weapon != NULL) if (weapon != NULL)
{ {
@ -2681,6 +2682,69 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CheckSightOrRange)
return numret; return numret;
} }
//===========================================================================
//
// A_CheckRange
// Jumps if this actor is out of range of all players.
//
//===========================================================================
static bool DoCheckRange(AActor *self, AActor *camera, double range)
{
if (camera == NULL)
{
return false;
}
// Check distance first, since it's cheaper than checking sight.
double dx = self->x - camera->x;
double dy = self->y - camera->y;
double dz;
fixed_t eyez = (camera->z + camera->height - (camera->height>>2)); // same eye height as P_CheckSight
if (eyez > self->z + self->height){
dz = self->z + self->height - eyez;
}
else if (eyez < self->z){
dz = self->z - eyez;
}
else{
dz = 0;
}
if ((dx*dx) + (dy*dy) + (dz*dz) <= range){
// Within range
return true;
}
return false;
}
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CheckRange)
{
PARAM_ACTION_PROLOGUE;
PARAM_FLOAT(range);
PARAM_STATE(jump);
ACTION_SET_RESULT(false); // Jumps should never set the result for inventory state chains!
range = range * range * (double(FRACUNIT) * FRACUNIT); // no need for square roots
for (int i = 0; i < MAXPLAYERS; ++i)
{
if (playeringame[i])
{
// Always check from each player.
if (DoCheckRange(self, players[i].mo, range))
{
return numret;
}
// If a player is viewing from a non-player, check that too.
if (players[i].camera != NULL && players[i].camera->player == NULL &&
DoCheckRange(self, players[i].camera, range))
{
return numret;
}
}
}
ACTION_JUMP(jump);
return numret;
}
//=========================================================================== //===========================================================================
// //

View file

@ -182,6 +182,7 @@ static FFlagDef ActorFlags[]=
DEFINE_FLAG(MF4, NOSKIN, AActor, flags4), DEFINE_FLAG(MF4, NOSKIN, AActor, flags4),
DEFINE_FLAG(MF4, BOSSDEATH, AActor, flags4), DEFINE_FLAG(MF4, BOSSDEATH, AActor, flags4),
DEFINE_FLAG(MF5, DONTDRAIN, AActor, flags5),
DEFINE_FLAG(MF5, NODROPOFF, AActor, flags5), DEFINE_FLAG(MF5, NODROPOFF, AActor, flags5),
DEFINE_FLAG(MF5, COUNTSECRET, AActor, flags5), DEFINE_FLAG(MF5, COUNTSECRET, AActor, flags5),
DEFINE_FLAG(MF5, NODAMAGE, AActor, flags5), DEFINE_FLAG(MF5, NODAMAGE, AActor, flags5),

View file

@ -34,27 +34,24 @@
#ifndef __VERSION_H__ #ifndef __VERSION_H__
#define __VERSION_H__ #define __VERSION_H__
// The svnrevision.h is automatically updated to grab the revision of const char *GetGitDescription();
// of the current source tree so that it can be included with version numbers. const char *GetGitHash();
#include "svnrevision.h" const char *GetGitTime();
const char *GetVersionString();
/** Lots of different version numbers **/ /** Lots of different version numbers **/
#define DOTVERSIONSTR_NOREV "2.6.999" #define VERSIONSTR "2.8pre"
// The version string the user actually sees.
#define DOTVERSIONSTR DOTVERSIONSTR_NOREV " (r" SVN_REVISION_STRING ")"
// The version as seen in the Windows resource // The version as seen in the Windows resource
#define RC_FILEVERSION 2,6,999,SVN_REVISION_NUMBER #define RC_FILEVERSION 2,7,9999,0
#define RC_PRODUCTVERSION 2,6,999,0 #define RC_PRODUCTVERSION 2,7,9999,0
#define RC_FILEVERSION2 DOTVERSIONSTR #define RC_PRODUCTVERSION2 "2.8pre"
#define RC_PRODUCTVERSION2 "2.6"
// Version identifier for network games. // Version identifier for network games.
// Bump it every time you do a release unless you're certain you // Bump it every time you do a release unless you're certain you
// didn't change anything that will affect sync. // didn't change anything that will affect sync.
#define NETGAMEVERSION 228 #define NETGAMEVERSION 229
// Version stored in the ini's [LastRun] section. // Version stored in the ini's [LastRun] section.
// Bump it if you made some configuration change that you want to // Bump it if you made some configuration change that you want to
@ -75,36 +72,15 @@
// SAVESIG should match SAVEVER. // SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded. // MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 3100 #define MINSAVEVER 3100
#if SVN_REVISION_NUMBER < MINSAVEVER // Use 4500 as the base git save version, since it's higher than the
// If we don't know the current revision write something very high to ensure that // SVN revision ever got.
// the reesulting executable can read its own savegames but no regular engine can. #define SAVEVER 4501
#define SAVEVER 999999
#define SAVESIG MakeSaveSig() #define SAVEVERSTRINGIFY2(x) #x
static inline const char *MakeSaveSig() #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)
{ #define SAVESIG "ZDOOMSAVE" SAVEVERSTRINGIFY(SAVEVER)
static char foo[] = { 'Z','D','O','O','M','S','A','V','E',
#if SAVEVER > 99999
'0' + (SAVEVER / 100000),
#endif
#if SAVEVER > 9999
'0' + ((SAVEVER / 10000) % 10),
#endif
#if SAVEVER > 999
'0' + ((SAVEVER / 1000) % 10),
#endif
'0' + ((SAVEVER / 100) % 10),
'0' + ((SAVEVER / 10) % 10),
'0' + (SAVEVER % 10),
'\0'
};
return foo;
}
#else
#define SAVEVER SVN_REVISION_NUMBER
#define SAVESIG "ZDOOMSAVE"SVN_REVISION_STRING
#endif
// This is so that derivates can use the same savegame versions without worrying about engine compatibility // This is so that derivates can use the same savegame versions without worrying about engine compatibility
#define GAMESIG "ZDOOM" #define GAMESIG "ZDOOM"

View file

@ -128,7 +128,7 @@ RtlVirtualUnwind (
// If you are working on your own modified version of ZDoom, change // If you are working on your own modified version of ZDoom, change
// the last part of the UPLOAD_AGENT (between parentheses) to your // the last part of the UPLOAD_AGENT (between parentheses) to your
// own program's name. e.g. (Skulltag) or (ZDaemon) or (ZDoomFu) // own program's name. e.g. (Skulltag) or (ZDaemon) or (ZDoomFu)
#define UPLOAD_AGENT "ZDoom/" DOTVERSIONSTR " (" GAMESIG ")" #define UPLOAD_AGENT "ZDoom/" VERSIONSTR " (" GAMESIG ")"
// Time, in milliseconds, to wait for a send() or recv() to complete. // Time, in milliseconds, to wait for a send() or recv() to complete.
#define TIMEOUT 60000 #define TIMEOUT 60000

View file

@ -95,8 +95,6 @@
#define X64 "" #define X64 ""
#endif #endif
#define WINDOW_TITLE GAMESIG " " DOTVERSIONSTR X64 " (" __DATE__ ")"
// The maximum number of functions that can be registered with atterm. // The maximum number of functions that can be registered with atterm.
#define MAX_TERMS 64 #define MAX_TERMS 64
@ -714,7 +712,9 @@ void ShowErrorPane(const char *text)
} }
if (text != NULL) if (text != NULL)
{ {
SetWindowText (Window, "Fatal Error - " WINDOW_TITLE); char caption[100];
mysnprintf(caption, countof(caption), "Fatal Error - "GAMESIG" %s "X64" (%s)", GetVersionString(), GetGitTime());
SetWindowText (Window, caption);
ErrorIcon = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, Window, NULL, g_hInst, NULL); ErrorIcon = CreateWindowEx (WS_EX_NOPARENTNOTIFY, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_OWNERDRAW, 0, 0, 0, 0, Window, NULL, g_hInst, NULL);
if (ErrorIcon != NULL) if (ErrorIcon != NULL)
{ {
@ -945,10 +945,12 @@ void DoMain (HINSTANCE hInstance)
I_FatalError ("Could not register window class"); I_FatalError ("Could not register window class");
/* create window */ /* create window */
char caption[100];
mysnprintf(caption, countof(caption), ""GAMESIG" %s "X64" (%s)", GetVersionString(), GetGitTime());
Window = CreateWindowEx( Window = CreateWindowEx(
WS_EX_APPWINDOW, WS_EX_APPWINDOW,
(LPCTSTR)WinClassName, (LPCTSTR)WinClassName,
(LPCTSTR)WINDOW_TITLE, (LPCTSTR)caption,
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
x, y, width, height, x, y, width, height,
(HWND) NULL, (HWND) NULL,
@ -1045,7 +1047,7 @@ void DoomSpecificInfo (char *buffer, size_t bufflen)
char *const buffend = buffer + bufflen - 2; // -2 for CRLF at end char *const buffend = buffer + bufflen - 2; // -2 for CRLF at end
int i; int i;
buffer += mysnprintf (buffer, buffend - buffer, "ZDoom version " DOTVERSIONSTR " (" __DATE__ ")\r\n"); buffer += mysnprintf (buffer, buffend - buffer, GAMENAME " version %s (%s)", GetVersionString(), GetGitHash());
buffer += mysnprintf (buffer, buffend - buffer, "\r\nCommand line: %s\r\n", GetCommandLine()); buffer += mysnprintf (buffer, buffend - buffer, "\r\nCommand line: %s\r\n", GetCommandLine());
for (i = 0; (arg = Wads.GetWadName (i)) != NULL; ++i) for (i = 0; (arg = Wads.GetWadName (i)) != NULL; ++i)

View file

@ -1095,7 +1095,7 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa
FString newlabel; FString newlabel;
GetWindowText(hDlg, label, countof(label)); GetWindowText(hDlg, label, countof(label));
newlabel.Format(GAMESIG " " DOTVERSIONSTR_NOREV ": %s", label); newlabel.Format(GAMESIG " %s: %s", GetVersionString(), label);
SetWindowText(hDlg, newlabel.GetChars()); SetWindowText(hDlg, newlabel.GetChars());
} }
// Populate the list with all the IWADs found // Populate the list with all the IWADs found

View file

@ -8,7 +8,8 @@
// Generated from the TEXTINCLUDE 2 resource. // Generated from the TEXTINCLUDE 2 resource.
// //
#include "afxres.h" #include "afxres.h"
#include "../version.h" #include "../version.h"
#include "../gitinfo.h"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
@ -36,7 +37,8 @@ END
2 TEXTINCLUDE 2 TEXTINCLUDE
BEGIN BEGIN
"#include ""afxres.h""\r\n" "#include ""afxres.h""\r\n"
"#include ""../version.h""\r\0" "#include ""../version.h""\r\r\n"
"#include ""../gitinfo.h""\r\0"
END END
3 TEXTINCLUDE 3 TEXTINCLUDE
@ -49,6 +51,7 @@ BEGIN
"//\r\n" "//\r\n"
"// Version\r\n" "// Version\r\n"
"//\r\n" "//\r\n"
"#define RC_FILEVERSION2 GIT_DESCRIPTION\r\n"
"\r\n" "\r\n"
"VS_VERSION_INFO VERSIONINFO\r\n" "VS_VERSION_INFO VERSIONINFO\r\n"
" FILEVERSION RC_FILEVERSION\r\n" " FILEVERSION RC_FILEVERSION\r\n"
@ -72,8 +75,8 @@ BEGIN
" VALUE ""FileDescription"", ""ZDoom""\r\n" " VALUE ""FileDescription"", ""ZDoom""\r\n"
" VALUE ""FileVersion"", RC_FILEVERSION2\r\n" " VALUE ""FileVersion"", RC_FILEVERSION2\r\n"
" VALUE ""InternalName"", ""ZDoom""\r\n" " VALUE ""InternalName"", ""ZDoom""\r\n"
" VALUE ""LegalCopyright"", ""Copyright \u00A9 1993-1996 id Software, 1998-2010 Randy Heit, 2002-2010 Christoph Oelckers, et al.""\r\n" " VALUE ""LegalCopyright"", ""Copyright \\u00A9 1993-1996 id Software, 1998-2010 Randy Heit, 2002-2010 Christoph Oelckers, et al.""\r\n"
" VALUE ""LegalTrademarks"", ""Doom® is a Registered Trademark of id Software, Inc.""\r\n" " VALUE ""LegalTrademarks"", ""DoomR is a Registered Trademark of id Software, Inc.""\r\n"
" VALUE ""OriginalFilename"", ""zdoom.exe""\r\n" " VALUE ""OriginalFilename"", ""zdoom.exe""\r\n"
" VALUE ""ProductName"", ""ZDoom""\r\n" " VALUE ""ProductName"", ""ZDoom""\r\n"
" VALUE ""ProductVersion"", RC_PRODUCTVERSION2\r\n" " VALUE ""ProductVersion"", RC_PRODUCTVERSION2\r\n"
@ -83,7 +86,7 @@ BEGIN
" BEGIN\r\n" " BEGIN\r\n"
" VALUE ""Translation"", 0x409, 1200\r\n" " VALUE ""Translation"", 0x409, 1200\r\n"
" END\r\n" " END\r\n"
"END\0" "EN\0"
END END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED
@ -468,6 +471,7 @@ IDB_DEADGUY BITMAP "deadguy.bmp"
// //
// Version // Version
// //
#define RC_FILEVERSION2 GIT_DESCRIPTION
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION RC_FILEVERSION FILEVERSION RC_FILEVERSION
@ -491,8 +495,8 @@ BEGIN
VALUE "FileDescription", "ZDoom" VALUE "FileDescription", "ZDoom"
VALUE "FileVersion", RC_FILEVERSION2 VALUE "FileVersion", RC_FILEVERSION2
VALUE "InternalName", "ZDoom" VALUE "InternalName", "ZDoom"
VALUE "LegalCopyright", "Copyright © 1993-1996 id Software, 1998-2010 Randy Heit" VALUE "LegalCopyright", "Copyright \u00A9 1993-1996 id Software, 1998-2010 Randy Heit, 2002-2010 Christoph Oelckers, et al."
VALUE "LegalTrademarks", "Doom® is a Registered Trademark of id Software, Inc." VALUE "LegalTrademarks", "DoomR is a Registered Trademark of id Software, Inc."
VALUE "OriginalFilename", "zdoom.exe" VALUE "OriginalFilename", "zdoom.exe"
VALUE "ProductName", "ZDoom" VALUE "ProductName", "ZDoom"
VALUE "ProductVersion", RC_PRODUCTVERSION2 VALUE "ProductVersion", RC_PRODUCTVERSION2

View file

@ -1,12 +1,12 @@
cmake_minimum_required( VERSION 2.4 ) cmake_minimum_required( VERSION 2.4 )
if( WIN32 ) if( WIN32 )
if( CMAKE_COMPILER_IS_GNUC OR CMAKE_COMPILER_IS_GNUCXX ) if( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/trustinfo.o add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/trustinfo.o
COMMAND windres -o ${CMAKE_CURRENT_BINARY_DIR}/trustinfo.o -i ${CMAKE_CURRENT_SOURCE_DIR}/trustinfo.rc COMMAND windres -o ${CMAKE_CURRENT_BINARY_DIR}/trustinfo.o -i ${CMAKE_CURRENT_SOURCE_DIR}/trustinfo.rc
DEPENDS trustinfo.rc ) DEPENDS trustinfo.rc )
set( TRUSTINFO trustinfo.o ) set( TRUSTINFO trustinfo.o )
else( CMAKE_COMPILER_IS_GNUC OR CMAKE_COMPILER_IS_GNUCXX ) else( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
if( MSVC_VERSION GREATER 1399 ) if( MSVC_VERSION GREATER 1399 )
# VC 8+ adds a manifest automatically to the executable. We need to # VC 8+ adds a manifest automatically to the executable. We need to
# merge ours with it. # merge ours with it.
@ -14,7 +14,7 @@ if( WIN32 )
else( MSVC_VERSION GREATER 1399 ) else( MSVC_VERSION GREATER 1399 )
set( TRUSTINFO trustinfo.rc ) set( TRUSTINFO trustinfo.rc )
endif( MSVC_VERSION GREATER 1399 ) endif( MSVC_VERSION GREATER 1399 )
endif( CMAKE_COMPILER_IS_GNUC OR CMAKE_COMPILER_IS_GNUCXX ) endif( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
endif( WIN32 ) endif( WIN32 )
add_executable( updaterevision updaterevision.c ${TRUSTINFO} ) add_executable( updaterevision updaterevision.c ${TRUSTINFO} )

View file

@ -1,8 +1,9 @@
/* updaterevision.c /* updaterevision.c
* *
* Public domain. This program uses the svnversion command to get the * Public domain. This program uses git commands command to get
* repository revision for a particular directory and writes it into * various bits of repository status for a particular directory
* a header file so that it can be used as a project's build number. * and writes it into a header file so that it can be used for a
* project's versioning.
*/ */
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
@ -13,69 +14,78 @@
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#ifdef _WIN32
#define popen _popen
#define pclose _pclose
#endif
// Used to strip newline characters from lines read by fgets.
void stripnl(char *str)
{
if (*str != '\0')
{
size_t len = strlen(str);
if (str[len - 1] == '\n')
{
str[len - 1] = '\0';
}
}
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char *name; char vertag[64], lastlog[64], lasthash[64], *hash = NULL;
char currev[64], lastrev[64], run[256], *rev;
unsigned long urev;
FILE *stream = NULL; FILE *stream = NULL;
int gotrev = 0, needupdate = 1; int gotrev = 0, needupdate = 1;
if (argc != 3) vertag[0] = '\0';
lastlog[0] = '\0';
if (argc != 2)
{ {
fprintf (stderr, "Usage: %s <repository directory> <path to svnrevision.h>\n", argv[0]); fprintf(stderr, "Usage: %s <path to gitinfo.h>\n", argv[0]);
return 1; return 1;
} }
// Use svnversion to get the revision number. If that fails, pretend it's // Use git describe --tags to get a version string. If we are sitting directly
// revision 0. Note that this requires you have the command-line svn tools installed. // on a tag, it returns that tag. Otherwise it returns <most recent tag>-<number of
sprintf (run, "svnversion -cn %s", argv[1]); // commits since the tag>-<short hash>.
if ((name = tempnam(NULL, "svnout")) != NULL) // Use git log to get the time of the latest commit in ISO 8601 format and its full hash.
stream = popen("git describe --tags && git log -1 --format=%ai*%H", "r");
if (NULL != stream)
{ {
#ifdef __APPLE__ if (fgets(vertag, sizeof vertag, stream) == vertag &&
// tempnam will return errno of 2 even though it is successful for our purposes. fgets(lastlog, sizeof lastlog, stream) == lastlog)
errno = 0;
#endif
if((stream = freopen(name, "w+b", stdout)) != NULL &&
system(run) == 0 &&
errno == 0 &&
fseek(stream, 0, SEEK_SET) == 0 &&
fgets(currev, sizeof currev, stream) == currev &&
(isdigit(currev[0]) || (currev[0] == '-' && currev[1] == '1')))
{ {
stripnl(vertag);
stripnl(lastlog);
gotrev = 1; gotrev = 1;
} }
}
if (stream != NULL) pclose(stream);
{
fclose (stream);
remove (name);
}
if (name != NULL)
{
free (name);
} }
if (!gotrev) if (gotrev)
{ {
fprintf (stderr, "Failed to get current revision: %s\n", strerror(errno)); hash = strchr(lastlog, '*');
strcpy (currev, "0"); if (hash != NULL)
rev = currev; {
*hash = '\0';
hash++;
}
} }
else if (hash == NULL)
{ {
rev = strchr (currev, ':'); fprintf(stderr, "Failed to get commit info: %s\n", strerror(errno));
if (rev == NULL) strcpy(vertag, "<unknown version>");
{ lastlog[0] = '\0';
rev = currev; lastlog[1] = '0';
} lastlog[2] = '\0';
else hash = lastlog + 1;
{
rev += 1;
}
} }
stream = fopen (argv[2], "r"); stream = fopen (argv[1], "r");
if (stream != NULL) if (stream != NULL)
{ {
if (!gotrev) if (!gotrev)
@ -86,13 +96,10 @@ int main(int argc, char **argv)
// Read the revision that's in this file already. If it's the same as // Read the revision that's in this file already. If it's the same as
// what we've got, then we don't need to modify it and can avoid rebuilding // what we've got, then we don't need to modify it and can avoid rebuilding
// dependant files. // dependant files.
if (fgets(lastrev, sizeof lastrev, stream) == lastrev) if (fgets(lasthash, sizeof lasthash, stream) == lasthash)
{ {
if (lastrev[0] != '\0') stripnl(lasthash);
{ // Strip trailing \n if (strcmp(hash, lasthash + 3) == 0)
lastrev[strlen(lastrev) - 1] = '\0';
}
if (strcmp(rev, lastrev + 3) == 0)
{ {
needupdate = 0; needupdate = 0;
} }
@ -102,27 +109,27 @@ int main(int argc, char **argv)
if (needupdate) if (needupdate)
{ {
stream = fopen (argv[2], "w"); stream = fopen (argv[1], "w");
if (stream == NULL) if (stream == NULL)
{ {
return 1; return 1;
} }
urev = strtoul(rev, NULL, 10); fprintf(stream,
fprintf (stream,
"// %s\n" "// %s\n"
"//\n" "//\n"
"// This file was automatically generated by the\n" "// This file was automatically generated by the\n"
"// updaterevision tool. Do not edit by hand.\n" "// updaterevision tool. Do not edit by hand.\n"
"\n" "\n"
"#define SVN_REVISION_STRING \"%s\"\n" "#define GIT_DESCRIPTION \"%s\"\n"
"#define SVN_REVISION_NUMBER %lu\n", "#define GIT_HASH \"%s\"\n"
rev, rev, urev); "#define GIT_TIME \"%s\"\n",
fclose (stream); hash, vertag, hash, lastlog);
fprintf (stderr, "%s updated to revision %s.\n", argv[2], rev); fclose(stream);
fprintf(stderr, "%s updated to commit %s.\n", argv[1], vertag);
} }
else else
{ {
fprintf (stderr, "%s is up to date at revision %s.\n", argv[2], rev); fprintf (stderr, "%s is up to date at commit %s.\n", argv[1], vertag);
} }
return 0; return 0;

View file

@ -302,6 +302,7 @@ ACTOR Actor native //: Thinker
action native A_SetDamageType(name damagetype); action native A_SetDamageType(name damagetype);
action native A_CheckSightOrRange(float distance, state label); action native A_CheckSightOrRange(float distance, state label);
action native A_CheckRange(float distance, state label);
action native A_RearrangePointers(int newtarget, int newmaster = AAPTR_DEFAULT, int newtracer = AAPTR_DEFAULT, int flags=0); action native A_RearrangePointers(int newtarget, int newmaster = AAPTR_DEFAULT, int newtracer = AAPTR_DEFAULT, int flags=0);
action native A_TransferPointer(int ptr_source, int ptr_recepient, int sourcefield, int recepientfield=AAPTR_DEFAULT, int flags=0); action native A_TransferPointer(int ptr_source, int ptr_recepient, int sourcefield, int recepientfield=AAPTR_DEFAULT, int flags=0);

View file

@ -233,6 +233,7 @@ ACTOR GoldWandPuff2 : GoldWandFX1
Skip_Super Skip_Super
+NOBLOCKMAP +NOBLOCKMAP
+NOGRAVITY +NOGRAVITY
+PUFFONACTORS
States States
{ {
Spawn: Spawn:

View file

@ -1,5 +1,31 @@
6DC9F6CCEAE7A91AEC48EBE506F22BC4 // void.wad MAP01 6DC9F6CCEAE7A91AEC48EBE506F22BC4 // void.wad MAP01
{ {
// Slightly squash the pillars in the starting room with "stimpacks"
// floating on them so that they can be obtained.
sectorflooroffset 62 -8
setwallyscale 286 front bot 1.090909
setwallyscale 287 front bot 1.090909
setwallyscale 288 front bot 1.090909
setwallyscale 289 front bot 1.090909
sectorflooroffset 63 -8
setwallyscale 290 front bot 1.090909
setwallyscale 291 front bot 1.090909
setwallyscale 292 front bot 1.090909
setwallyscale 293 front bot 1.090909
sectorflooroffset 118 -8
setwallyscale 710 front bot 1.090909
setwallyscale 711 front bot 1.090909
setwallyscale 712 front bot 1.090909
setwallyscale 713 front bot 1.090909
sectorflooroffset 119 -8
setwallyscale 714 front bot 1.090909
setwallyscale 715 front bot 1.090909
setwallyscale 716 front bot 1.090909
setwallyscale 717 front bot 1.090909
setslopeoverflow setslopeoverflow
} }
@ -306,37 +332,24 @@ F481922F4881F74760F3C0437FD5EDD0 // map03
setactivation 455 16 // SPAC_Push setactivation 455 16 // SPAC_Push
} }
6DC9F6CCEAE7A91AEC48EBE506F22BC4 // Void
{
// Slightly squash the pillars in the starting room with "stimpacks"
// floating on them so that they can be obtained.
sectorflooroffset 62 -8
setwallyscale 286 front bot 1.090909
setwallyscale 287 front bot 1.090909
setwallyscale 288 front bot 1.090909
setwallyscale 289 front bot 1.090909
sectorflooroffset 63 -8
setwallyscale 290 front bot 1.090909
setwallyscale 291 front bot 1.090909
setwallyscale 292 front bot 1.090909
setwallyscale 293 front bot 1.090909
sectorflooroffset 118 -8
setwallyscale 710 front bot 1.090909
setwallyscale 711 front bot 1.090909
setwallyscale 712 front bot 1.090909
setwallyscale 713 front bot 1.090909
sectorflooroffset 119 -8
setwallyscale 714 front bot 1.090909
setwallyscale 715 front bot 1.090909
setwallyscale 716 front bot 1.090909
setwallyscale 717 front bot 1.090909
}
65A1EB4C87386F290816660A52932FF1 // Master Levels, garrison.wad 65A1EB4C87386F290816660A52932FF1 // Master Levels, garrison.wad
{ {
rebuildnodes rebuildnodes
} }
1891E029994B023910CFE0B3209C3CDB // Ultimate Simplicity, map07
{
// It is possible to get stuck on skill 0 or 1 when no shots have been fired
// after sector 17 became accessible and before entering famous mancubus room.
// Monsters from the mentioned sector won't be alerted and so
// they won't teleport into the battle. ACS will wait forever for their deaths.
setlinespecial 397 NoiseAlert 0 0 0 0 0
setlinespecial 411 NoiseAlert 0 0 0 0 0
}
952CC8D03572E17BA550B01B366EFBB9 // Cheogsh map01
{
// make the blue key spawn above the 3D floor
setthingz 918 296
}

View file

@ -28,8 +28,8 @@
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
Description="Checking svnrevision.h..." Description="Checking gitinfo.h..."
CommandLine="&quot;$(OutDir)\updaterevision.exe&quot; src src/svnrevision.h" CommandLine="&quot;$(OutDir)\updaterevision.exe&quot; src/gitinfo.h"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
@ -151,7 +151,8 @@
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h" Description="Checking gitinfo.h..."
CommandLine="&quot;$(OutDir)\updaterevision.exe&quot; src/gitinfo.h"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
@ -263,8 +264,8 @@
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
Description="Checking svnrevision.h..." Description="Checking gitinfo.h..."
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h" CommandLine="&quot;$(OutDir)\updaterevision.exe&quot; src/gitinfo.h"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
@ -370,7 +371,8 @@
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h" Description="Checking gitinfo.h..."
CommandLine="&quot;$(OutDir)\updaterevision.exe&quot; src/gitinfo.h"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
@ -652,6 +654,10 @@
RelativePath=".\src\gi.cpp" RelativePath=".\src\gi.cpp"
> >
</File> </File>
<File
RelativePath=".\src\gitinfo.cpp"
>
</File>
<File <File
RelativePath=".\src\hu_scores.cpp" RelativePath=".\src\hu_scores.cpp"
> >
@ -1161,10 +1167,6 @@
RelativePath=".\src\d_dehacked.h" RelativePath=".\src\d_dehacked.h"
> >
</File> </File>
<File
RelativePath=".\src\d_dehackedactions.h"
>
</File>
<File <File
RelativePath=".\src\d_event.h" RelativePath=".\src\d_event.h"
> >