mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-22 04:01:31 +00:00
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:
commit
4deeb8d8ae
50 changed files with 823 additions and 574 deletions
28
.gitignore
vendored
Normal file
28
.gitignore
vendored
Normal 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
|
|
@ -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_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." )
|
||||
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}")
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
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" )
|
||||
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_library( bz2
|
||||
|
|
|
@ -11,9 +11,9 @@ endif( NOT CMAKE_BUILD_TYPE MATCHES "Release" )
|
|||
|
||||
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" )
|
||||
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 )
|
||||
if( NOT ITOA_EXISTS )
|
||||
|
@ -101,6 +101,6 @@ add_library( dumb
|
|||
src/it/xmeffect.c )
|
||||
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 )
|
||||
endif( CMAKE_COMPILER_IS_GNUCXX )
|
||||
endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
|
||||
|
|
|
@ -6,7 +6,7 @@ if( NOT CMAKE_BUILD_TYPE MATCHES "Release" )
|
|||
set( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
||||
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" )
|
||||
if( NOT PROFILE )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer" )
|
||||
|
@ -15,7 +15,7 @@ if( CMAKE_COMPILER_IS_GNUCXX )
|
|||
if( HAVE_NO_ARRAY_BOUNDS )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-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
|
||||
gme/Blip_Buffer.cpp
|
||||
|
|
|
@ -8,9 +8,9 @@ if( MSVC )
|
|||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4554 /wd4102" )
|
||||
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" )
|
||||
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} )
|
||||
add_definitions( -DINFNAN_CHECK -DMULTIPLE_THREADS )
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
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" )
|
||||
endif( CMAKE_COMPILER_IS_GNUC )
|
||||
endif( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
|
||||
|
||||
add_library( jpeg
|
||||
jcomapi.c
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
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" )
|
||||
endif( CMAKE_COMPILER_IS_GNUC )
|
||||
endif( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
|
||||
|
||||
set( LZMA_FILES
|
||||
C/Archive/7z/7zDecode.c
|
||||
|
|
|
@ -113,14 +113,14 @@ conversation // Starts a dialog.
|
|||
|
||||
// The amount of an item needed to successfully pick this option.
|
||||
// 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
|
||||
{
|
||||
item = <integer>; // Item that is required for this option.
|
||||
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.
|
||||
// If no cost is specified this should
|
||||
// be ignored.
|
||||
|
|
|
@ -10,14 +10,14 @@ include( CheckCXXCompilerFlag )
|
|||
include( FindPkgConfig )
|
||||
|
||||
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" )
|
||||
# At least some versions of Xcode fail if you strip with the linker
|
||||
# instead of the separate strip utility.
|
||||
if( APPLE )
|
||||
set( NO_STRIP ON )
|
||||
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" )
|
||||
|
||||
|
@ -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"
|
||||
"15" "14" "13" "12" "11" "10" "09" "08" "07" "06" "05" "04" "03"
|
||||
"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" )
|
||||
foreach( majver ${MAJOR_VERSIONS} )
|
||||
foreach( minver ${MINOR_VERSIONS} )
|
||||
|
@ -391,7 +391,7 @@ endif( SSE_MATTERS )
|
|||
|
||||
# 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 )
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_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_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -s" )
|
||||
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.
|
||||
|
||||
|
@ -483,12 +483,12 @@ if( BACKPATCH )
|
|||
add_definitions( -DBACKPATCH )
|
||||
endif( BACKPATCH )
|
||||
|
||||
# Update svnrevision.h
|
||||
# Update gitinfo.h
|
||||
|
||||
get_target_property( UPDATEREVISION_EXE updaterevision LOCATION )
|
||||
|
||||
add_custom_target( revision_check ALL
|
||||
COMMAND ${UPDATEREVISION_EXE} . src/svnrevision.h
|
||||
COMMAND ${UPDATEREVISION_EXE} src/gitinfo.h
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
DEPENDS updaterevision )
|
||||
|
||||
|
@ -529,15 +529,15 @@ if( WIN32 )
|
|||
win32/i_system.cpp
|
||||
win32/st_start.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. :(
|
||||
add_custom_command( OUTPUT zdoom-rc.o
|
||||
COMMAND windres -o zdoom-rc.o -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zdoom.rc
|
||||
DEPENDS win32/zdoom.rc )
|
||||
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 )
|
||||
endif( CMAKE_COMPILER_IS_GNUCXX )
|
||||
endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
|
||||
else( WIN32 )
|
||||
set( SYSTEM_SOURCES_DIR sdl )
|
||||
set( SYSTEM_SOURCES
|
||||
|
@ -688,6 +688,7 @@ add_executable( zdoom WIN32
|
|||
g_skill.cpp
|
||||
gameconfigfile.cpp
|
||||
gi.cpp
|
||||
gitinfo.cpp
|
||||
hu_scores.cpp
|
||||
i_net.cpp
|
||||
info.cpp
|
||||
|
@ -993,7 +994,7 @@ if( NOT WIN32 )
|
|||
COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/link-make
|
||||
COMMAND /bin/sh -c ${CMAKE_CURRENT_BINARY_DIR}/link-make )
|
||||
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
|
||||
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 )
|
||||
set_source_files_properties( x86.cpp PROPERTIES COMPILE_FLAGS "-msse2 -mmmx" )
|
||||
endif( SSE_MATTERS )
|
||||
endif( CMAKE_COMPILER_IS_GNUCXX )
|
||||
endif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
|
||||
|
||||
if( MSVC )
|
||||
set_target_properties(zdoom PROPERTIES LINK_FLAGS "/MANIFEST:NO")
|
||||
|
|
|
@ -267,8 +267,8 @@ enum
|
|||
|
||||
// --- mobj.flags5 ---
|
||||
|
||||
MF5_INSTATECALL = 0x00000001, // This actor is being run through CallStateChain
|
||||
/* = 0x00000002, */
|
||||
MF5_DONTDRAIN = 0x00000001, // cannot be drained health from.
|
||||
MF5_INSTATECALL = 0x00000002, // This actor is being run through CallStateChain
|
||||
MF5_NODROPOFF = 0x00000004, // cannot drop off under any circumstances.
|
||||
/* = 0x00000008, */
|
||||
MF5_COUNTSECRET = 0x00000010, // From Doom 64: actor acts like a secret
|
||||
|
|
|
@ -393,7 +393,7 @@ CCMD (take)
|
|||
|
||||
CCMD (gameversion)
|
||||
{
|
||||
Printf ("%s : " __DATE__ "\n", DOTVERSIONSTR);
|
||||
Printf ("%s @ %s\nCommit %s", GetVersionString(), GetGitTime(), GetGitHash());
|
||||
}
|
||||
|
||||
CCMD (print)
|
||||
|
|
|
@ -1167,9 +1167,9 @@ void C_DrawConsole (bool hw2d)
|
|||
if (ConBottom >= 12)
|
||||
{
|
||||
screen->DrawText (ConFont, CR_ORANGE, SCREENWIDTH - 8 -
|
||||
ConFont->StringWidth ("v" DOTVERSIONSTR),
|
||||
ConFont->StringWidth (GetVersionString()),
|
||||
ConBottom - ConFont->GetHeight() - 4,
|
||||
"v" DOTVERSIONSTR, TAG_DONE);
|
||||
GetVersionString(), TAG_DONE);
|
||||
if (TickerMax)
|
||||
{
|
||||
char tickstr[256];
|
||||
|
|
|
@ -80,6 +80,7 @@ enum
|
|||
CP_SETACTIVATION,
|
||||
CP_SECTORFLOOROFFSET,
|
||||
CP_SETWALLYSCALE,
|
||||
CP_SETTHINGZ,
|
||||
};
|
||||
|
||||
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||
|
@ -89,6 +90,7 @@ enum
|
|||
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||
|
||||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||
extern TArray<FMapThing> MapThingsConverted;
|
||||
|
||||
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||
|
||||
|
@ -294,6 +296,15 @@ void ParseCompatibility()
|
|||
sc.MustGetFloat();
|
||||
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
|
||||
{
|
||||
sc.UnGet();
|
||||
|
@ -497,6 +508,16 @@ void SetCompatibilityParams()
|
|||
i += 5;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2334,6 +2334,28 @@ int D_LoadDehLumps()
|
|||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -134,12 +134,12 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_BrainSpit)
|
|||
// spawn brain missile
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
|
||||
spit->target = targ;
|
||||
spit->master = self;
|
||||
// [RH] Do this correctly for any trajectory. Doom would divide by 0
|
||||
|
|
|
@ -132,6 +132,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Saw)
|
|||
angle_t slope;
|
||||
player_t *player;
|
||||
AActor *linetarget;
|
||||
int actualdamage;
|
||||
|
||||
if (NULL == (player = self->player))
|
||||
{
|
||||
|
@ -165,7 +166,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Saw)
|
|||
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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
|
|
@ -827,9 +827,16 @@ void G_AddViewAngle (int yaw)
|
|||
|
||||
CVAR (Bool, bot_allowspy, false, 0)
|
||||
|
||||
|
||||
enum {
|
||||
SPY_CANCEL = 0,
|
||||
SPY_NEXT,
|
||||
SPY_PREV,
|
||||
};
|
||||
|
||||
// [RH] Spy mode has been separated into two console commands.
|
||||
// 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 (gamestate != GS_LEVEL)
|
||||
|
@ -855,20 +862,24 @@ static void ChangeSpy (bool forward)
|
|||
|
||||
// Otherwise, cycle to the next player.
|
||||
bool checkTeam = !demoplayback && deathmatch;
|
||||
int pnum = int(players[consoleplayer].camera->player - players);
|
||||
int step = forward ? 1 : -1;
|
||||
|
||||
do
|
||||
int pnum = consoleplayer;
|
||||
if (changespy != SPY_CANCEL)
|
||||
{
|
||||
pnum += step;
|
||||
pnum &= MAXPLAYERS-1;
|
||||
if (playeringame[pnum] &&
|
||||
(!checkTeam || players[pnum].mo->IsTeammate (players[consoleplayer].mo) ||
|
||||
(bot_allowspy && players[pnum].isbot)))
|
||||
pnum = int(players[consoleplayer].camera->player - players);
|
||||
int step = (changespy == SPY_NEXT) ? 1 : -1;
|
||||
|
||||
do
|
||||
{
|
||||
break;
|
||||
}
|
||||
} while (pnum != consoleplayer);
|
||||
pnum += step;
|
||||
pnum &= MAXPLAYERS-1;
|
||||
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;
|
||||
S_UpdateSounds(players[consoleplayer].camera);
|
||||
|
@ -882,15 +893,20 @@ static void ChangeSpy (bool forward)
|
|||
CCMD (spynext)
|
||||
{
|
||||
// allow spy mode changes even during the demo
|
||||
ChangeSpy (true);
|
||||
ChangeSpy (SPY_NEXT);
|
||||
}
|
||||
|
||||
CCMD (spyprev)
|
||||
{
|
||||
// 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
|
||||
|
@ -2061,6 +2077,8 @@ static void PutSavePic (FILE *file, int width, int height)
|
|||
|
||||
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
|
||||
// a demo finishes playback.)
|
||||
if (lines == NULL || sectors == NULL)
|
||||
|
@ -2087,7 +2105,8 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio
|
|||
|
||||
SaveVersion = SAVEVER;
|
||||
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, "ZDoom Save Version", SAVESIG);
|
||||
M_AppendPNGText (stdfile, "Title", description);
|
||||
|
|
|
@ -259,6 +259,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GauntletAttack)
|
|||
player_t *player;
|
||||
PClassActor *pufftype;
|
||||
AActor *linetarget;
|
||||
int actualdamage = 0;
|
||||
|
||||
if (NULL == (player = self->player))
|
||||
{
|
||||
|
@ -291,7 +292,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GauntletAttack)
|
|||
pufftype = PClass::FindActor("GauntletPuff1");
|
||||
}
|
||||
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 (pr_gatk() > 64)
|
||||
|
@ -316,7 +317,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GauntletAttack)
|
|||
}
|
||||
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);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -225,7 +225,7 @@ FGameConfigFile::~FGameConfigFile ()
|
|||
|
||||
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)
|
||||
|
|
18
src/gi.cpp
18
src/gi.cpp
|
@ -96,10 +96,10 @@ const char* GameInfoBorders[] =
|
|||
strcpy(gameinfo.key, sc.String); \
|
||||
}
|
||||
|
||||
#define GAMEINFOKEY_STRINGARRAY(key, variable, length) \
|
||||
#define GAMEINFOKEY_STRINGARRAY(key, variable, length, clear) \
|
||||
else if(nextKey.CompareNoCase(variable) == 0) \
|
||||
{ \
|
||||
gameinfo.key.Clear(); \
|
||||
if (clear) gameinfo.key.Clear(); \
|
||||
do \
|
||||
{ \
|
||||
sc.MustGetToken(TK_StringConst); \
|
||||
|
@ -282,8 +282,10 @@ void FMapInfoParser::ParseGameInfo()
|
|||
}
|
||||
// Insert valid keys here.
|
||||
GAMEINFOKEY_CSTRING(titlePage, "titlePage", 8)
|
||||
GAMEINFOKEY_STRINGARRAY(creditPages, "creditPage", 8)
|
||||
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "playerclasses", 0)
|
||||
GAMEINFOKEY_STRINGARRAY(creditPages, "addcreditPage", 8, false)
|
||||
GAMEINFOKEY_STRINGARRAY(creditPages, "CreditPage", 8, true)
|
||||
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "addplayerclasses", 0, false)
|
||||
GAMEINFOKEY_STRINGARRAY(PlayerClasses, "playerclasses", 0, true)
|
||||
GAMEINFOKEY_STRING(titleMusic, "titleMusic")
|
||||
GAMEINFOKEY_FLOAT(titleTime, "titleTime")
|
||||
GAMEINFOKEY_FLOAT(advisoryTime, "advisoryTime")
|
||||
|
@ -291,8 +293,9 @@ void FMapInfoParser::ParseGameInfo()
|
|||
GAMEINFOKEY_STRING(chatSound, "chatSound")
|
||||
GAMEINFOKEY_STRING(finaleMusic, "finaleMusic")
|
||||
GAMEINFOKEY_CSTRING(finaleFlat, "finaleFlat", 8)
|
||||
GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8)
|
||||
GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8)
|
||||
GAMEINFOKEY_STRINGARRAY(finalePages, "finalePage", 8, true)
|
||||
GAMEINFOKEY_STRINGARRAY(infoPages, "addinfoPage", 8, false)
|
||||
GAMEINFOKEY_STRINGARRAY(infoPages, "infoPage", 8, true)
|
||||
GAMEINFOKEY_CSTRING(PauseSign, "pausesign", 8)
|
||||
GAMEINFOKEY_STRING(quitSound, "quitSound")
|
||||
GAMEINFOKEY_CSTRING(borderFlat, "borderFlat", 8)
|
||||
|
@ -321,7 +324,8 @@ void FMapInfoParser::ParseGameInfo()
|
|||
GAMEINFOKEY_INT(defaultdropstyle, "defaultdropstyle")
|
||||
GAMEINFOKEY_CSTRING(Endoom, "endoom", 8)
|
||||
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(mFontColor, "menufontcolor_label")
|
||||
GAMEINFOKEY_STRING(mFontColorValue, "menufontcolor_value")
|
||||
|
|
65
src/gitinfo.cpp
Normal file
65
src/gitinfo.cpp
Normal 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;
|
||||
}
|
||||
}
|
|
@ -632,8 +632,10 @@ void WritePCXfile (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)
|
||||
{
|
||||
char software[100];
|
||||
mysnprintf(software, countof(software), GAMENAME " %s", GetVersionString());
|
||||
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))
|
||||
{
|
||||
Printf ("Could not create screenshot.\n");
|
||||
|
|
|
@ -283,7 +283,6 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
|
|||
bool rtn;
|
||||
sector_t* sec;
|
||||
DFloor* floor;
|
||||
//bool manual = false; tag == 0 and manual == true constitutes the same evidence [fdari]
|
||||
fixed_t ceilingheight;
|
||||
fixed_t newheight;
|
||||
vertex_t *spot, *spot2;
|
||||
|
@ -296,7 +295,6 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
|
|||
if (!line || !(sec = line->backsector))
|
||||
return rtn;
|
||||
secnum = (int)(sec-sectors);
|
||||
//manual = true;
|
||||
goto manual_floor;
|
||||
}
|
||||
|
||||
|
@ -814,7 +812,6 @@ bool EV_DoDonut (int tag, line_t *line, fixed_t pillarspeed, fixed_t slimespeed)
|
|||
DFloor* floor;
|
||||
vertex_t* spot;
|
||||
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;
|
||||
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))
|
||||
return rtn;
|
||||
//manual = true;
|
||||
goto manual_donut;
|
||||
}
|
||||
|
||||
|
@ -1378,7 +1374,6 @@ bool EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset,
|
|||
sector_t *sector;
|
||||
DWaggleBase *waggle;
|
||||
bool retCode;
|
||||
//bool manual = false;
|
||||
|
||||
retCode = false;
|
||||
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))
|
||||
return retCode;
|
||||
//manual = true;
|
||||
goto manual_waggle;
|
||||
}
|
||||
|
||||
|
|
|
@ -1498,7 +1498,7 @@ void P_SetRenderSector()
|
|||
seg_t *seg = ss->firstline;
|
||||
|
||||
// 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;
|
||||
for(j=2; j<ss->numlines; j++)
|
||||
{
|
||||
|
|
|
@ -652,14 +652,13 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags)
|
|||
|
||||
|
||||
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 (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 (!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.
|
||||
// (most importantly, prevent barrels from passing on ice damage.)
|
||||
// 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))
|
||||
|
@ -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
|
||||
// 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)
|
||||
{
|
||||
|
@ -1273,6 +1272,10 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
|||
if (target->health <= 0)
|
||||
{ // Death
|
||||
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
|
||||
if (mod == NAME_Fire)
|
||||
{
|
||||
|
|
|
@ -464,8 +464,8 @@ enum // P_LineAttack flags
|
|||
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, 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, 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, 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, AActor *target, angle_t angle, int pitch);
|
||||
void P_TraceBleed (int damage, AActor *target, AActor *missile); // missile version
|
||||
|
|
|
@ -3496,7 +3496,7 @@ static ETraceStatus CheckForSpectral (FTraceResults &res, void *userdata)
|
|||
//==========================================================================
|
||||
|
||||
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;
|
||||
FTraceResults trace;
|
||||
|
@ -3514,6 +3514,10 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
|||
{
|
||||
*victim = NULL;
|
||||
}
|
||||
if (actualdamage != NULL)
|
||||
{
|
||||
*actualdamage = 0;
|
||||
}
|
||||
|
||||
angle >>= ANGLETOFINESHIFT;
|
||||
pitch = (angle_t)(pitch) >> ANGLETOFINESHIFT;
|
||||
|
@ -3684,6 +3688,10 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
|||
killPuff = true;
|
||||
}
|
||||
newdam = P_DamageMobj (trace.Actor, puff ? puff : t1, t1, damage, damageType, dmgflags);
|
||||
if (actualdamage != NULL)
|
||||
{
|
||||
*actualdamage = newdam;
|
||||
}
|
||||
}
|
||||
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,
|
||||
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);
|
||||
if (victim != NULL)
|
||||
|
@ -3754,7 +3762,7 @@ AActor *P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
|
|||
}
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -355,6 +355,10 @@ void AActor::Serialize (FArchive &arc)
|
|||
<< meleethreshold
|
||||
<< meleerange
|
||||
<< DamageType;
|
||||
if (SaveVersion >= 4501)
|
||||
{
|
||||
arc << DamageTypeReceived;
|
||||
}
|
||||
if (SaveVersion >= 3237)
|
||||
{
|
||||
arc
|
||||
|
|
|
@ -848,7 +848,7 @@ FPolyObj::FPolyObj()
|
|||
|
||||
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->args[0] = 0;
|
||||
IterFindPolySides(&polyobjs[index], sd);
|
||||
po->MirrorNum = sd->linedef->args[1];
|
||||
po->crush = (type != PO_SPAWN_TYPE) ? 3 : 0;
|
||||
po->bHurtOnTouch = (type == PO_SPAWNHURT_TYPE);
|
||||
po->tag = tag;
|
||||
|
@ -1647,10 +1648,7 @@ static void SpawnPolyobj (int index, int tag, int type)
|
|||
po->bHurtOnTouch = (type == PO_SPAWNHURT_TYPE);
|
||||
po->tag = tag;
|
||||
po->seqType = po->Sidedefs[0]->linedef->args[3];
|
||||
// Next, change the polyobj's first line to point to a mirror
|
||||
// if it exists
|
||||
po->Sidedefs[0]->linedef->args[1] =
|
||||
po->Sidedefs[0]->linedef->args[2];
|
||||
po->MirrorNum = po->Sidedefs[0]->linedef->args[2];
|
||||
}
|
||||
else
|
||||
I_Error ("SpawnPolyobj: Poly %d does not exist\n", tag);
|
||||
|
|
|
@ -54,6 +54,7 @@ struct FPolyObj
|
|||
FPolyVertex CenterSpot;
|
||||
FBoundingBox Bounds; // Bounds in map coordinates
|
||||
subsector_t *CenterSubsector;
|
||||
int MirrorNum;
|
||||
|
||||
angle_t angle;
|
||||
int tag; // reference tag assigned in HereticEd
|
||||
|
|
|
@ -263,7 +263,7 @@ void R_SetVisibility (float 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
|
||||
// divide by zero. This will be called again later, and the proper
|
||||
// values can be initialized then.
|
||||
|
|
|
@ -1988,7 +1988,6 @@ void R_DrawHeightPlanes(fixed_t height); // kg3D - fake planes
|
|||
|
||||
void R_DrawMasked (void)
|
||||
{
|
||||
DrewAVoxel = true; // TESTME
|
||||
R_SortVisSprites (DrewAVoxel ? sv_compare2d : sv_compare, firstvissprite - vissprites);
|
||||
|
||||
if (height_top == NULL)
|
||||
|
|
|
@ -1,276 +1,276 @@
|
|||
/*
|
||||
** i_main.cpp
|
||||
** System-specific startup code. Eventually calls D_DoomMain.
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 1998-2007 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.
|
||||
**---------------------------------------------------------------------------
|
||||
**
|
||||
*/
|
||||
|
||||
// HEADER FILES ------------------------------------------------------------
|
||||
|
||||
#include <SDL.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <new>
|
||||
#include <sys/param.h>
|
||||
#ifndef NO_GTK
|
||||
#include <gtk/gtk.h>
|
||||
#endif
|
||||
#include <locale.h>
|
||||
#if defined(__MACH__) && !defined(NOASM)
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#include "doomerrors.h"
|
||||
#include "m_argv.h"
|
||||
#include "d_main.h"
|
||||
#include "i_system.h"
|
||||
#include "i_video.h"
|
||||
#include "c_console.h"
|
||||
#include "errors.h"
|
||||
#include "version.h"
|
||||
#include "w_wad.h"
|
||||
#include "g_level.h"
|
||||
#include "r_state.h"
|
||||
#include "cmdlib.h"
|
||||
/*
|
||||
** i_main.cpp
|
||||
** System-specific startup code. Eventually calls D_DoomMain.
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 1998-2007 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.
|
||||
**---------------------------------------------------------------------------
|
||||
**
|
||||
*/
|
||||
|
||||
// HEADER FILES ------------------------------------------------------------
|
||||
|
||||
#include <SDL.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <new>
|
||||
#include <sys/param.h>
|
||||
#ifndef NO_GTK
|
||||
#include <gtk/gtk.h>
|
||||
#endif
|
||||
#include <locale.h>
|
||||
#if defined(__MACH__) && !defined(NOASM)
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#include "doomerrors.h"
|
||||
#include "m_argv.h"
|
||||
#include "d_main.h"
|
||||
#include "i_system.h"
|
||||
#include "i_video.h"
|
||||
#include "c_console.h"
|
||||
#include "errors.h"
|
||||
#include "version.h"
|
||||
#include "w_wad.h"
|
||||
#include "g_level.h"
|
||||
#include "r_state.h"
|
||||
#include "cmdlib.h"
|
||||
#include "r_utility.h"
|
||||
#include "doomstat.h"
|
||||
|
||||
// MACROS ------------------------------------------------------------------
|
||||
|
||||
// The maximum number of functions that can be registered with atterm.
|
||||
#define MAX_TERMS 64
|
||||
|
||||
// TYPES -------------------------------------------------------------------
|
||||
|
||||
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||
|
||||
#include "doomstat.h"
|
||||
|
||||
// MACROS ------------------------------------------------------------------
|
||||
|
||||
// The maximum number of functions that can be registered with atterm.
|
||||
#define MAX_TERMS 64
|
||||
|
||||
// TYPES -------------------------------------------------------------------
|
||||
|
||||
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||
|
||||
extern "C" int cc_install_handlers(int, char**, int, int*, const char*, int(*)(char*, char*));
|
||||
|
||||
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||
|
||||
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||
|
||||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||
|
||||
|
||||
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||
|
||||
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||
|
||||
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
||||
|
||||
#ifdef USE_XCURSOR
|
||||
extern bool UseXCursor;
|
||||
#endif
|
||||
|
||||
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||
|
||||
#ifndef NO_GTK
|
||||
bool GtkAvailable;
|
||||
#endif
|
||||
|
||||
// The command line arguments.
|
||||
DArgs *Args;
|
||||
|
||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||
|
||||
static void (*TermFuncs[MAX_TERMS]) ();
|
||||
static const char *TermNames[MAX_TERMS];
|
||||
static int NumTerms;
|
||||
|
||||
// CODE --------------------------------------------------------------------
|
||||
|
||||
void addterm (void (*func) (), const char *name)
|
||||
{
|
||||
// Make sure this function wasn't already registered.
|
||||
for (int i = 0; i < NumTerms; ++i)
|
||||
{
|
||||
if (TermFuncs[i] == func)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (NumTerms == MAX_TERMS)
|
||||
{
|
||||
func ();
|
||||
I_FatalError (
|
||||
"Too many exit functions registered.\n"
|
||||
"Increase MAX_TERMS in i_main.cpp");
|
||||
}
|
||||
TermNames[NumTerms] = name;
|
||||
TermFuncs[NumTerms++] = func;
|
||||
}
|
||||
|
||||
void popterm ()
|
||||
{
|
||||
if (NumTerms)
|
||||
NumTerms--;
|
||||
}
|
||||
|
||||
void STACK_ARGS call_terms ()
|
||||
{
|
||||
while (NumTerms > 0)
|
||||
{
|
||||
// printf ("term %d - %s\n", NumTerms, TermNames[NumTerms-1]);
|
||||
TermFuncs[--NumTerms] ();
|
||||
}
|
||||
}
|
||||
|
||||
static void STACK_ARGS NewFailure ()
|
||||
{
|
||||
I_FatalError ("Failed to allocate memory from system heap");
|
||||
}
|
||||
|
||||
static int DoomSpecificInfo (char *buffer, char *end)
|
||||
{
|
||||
const char *arg;
|
||||
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||
|
||||
#ifndef NO_GTK
|
||||
bool GtkAvailable;
|
||||
#endif
|
||||
|
||||
// The command line arguments.
|
||||
DArgs *Args;
|
||||
|
||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||
|
||||
static void (*TermFuncs[MAX_TERMS]) ();
|
||||
static const char *TermNames[MAX_TERMS];
|
||||
static int NumTerms;
|
||||
|
||||
// CODE --------------------------------------------------------------------
|
||||
|
||||
void addterm (void (*func) (), const char *name)
|
||||
{
|
||||
// Make sure this function wasn't already registered.
|
||||
for (int i = 0; i < NumTerms; ++i)
|
||||
{
|
||||
if (TermFuncs[i] == func)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (NumTerms == MAX_TERMS)
|
||||
{
|
||||
func ();
|
||||
I_FatalError (
|
||||
"Too many exit functions registered.\n"
|
||||
"Increase MAX_TERMS in i_main.cpp");
|
||||
}
|
||||
TermNames[NumTerms] = name;
|
||||
TermFuncs[NumTerms++] = func;
|
||||
}
|
||||
|
||||
void popterm ()
|
||||
{
|
||||
if (NumTerms)
|
||||
NumTerms--;
|
||||
}
|
||||
|
||||
void STACK_ARGS call_terms ()
|
||||
{
|
||||
while (NumTerms > 0)
|
||||
{
|
||||
// printf ("term %d - %s\n", NumTerms, TermNames[NumTerms-1]);
|
||||
TermFuncs[--NumTerms] ();
|
||||
}
|
||||
}
|
||||
|
||||
static void STACK_ARGS NewFailure ()
|
||||
{
|
||||
I_FatalError ("Failed to allocate memory from system heap");
|
||||
}
|
||||
|
||||
static int DoomSpecificInfo (char *buffer, char *end)
|
||||
{
|
||||
const char *arg;
|
||||
int size = end-buffer-2;
|
||||
int i, p;
|
||||
|
||||
p = 0;
|
||||
p += snprintf (buffer+p, size-p, GAMENAME" version " DOTVERSIONSTR " (" __DATE__ ")\n");
|
||||
int i, p;
|
||||
|
||||
p = 0;
|
||||
p += snprintf (buffer+p, size-p, GAMENAME" version %s (%s)\n", GetVersionString(), GetGitHash());
|
||||
#ifdef __VERSION__
|
||||
p += snprintf (buffer+p, size-p, "Compiler version: %s\n", __VERSION__);
|
||||
#endif
|
||||
p += snprintf (buffer+p, size-p, "\nCommand line:");
|
||||
for (i = 0; i < Args->NumArgs(); ++i)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, " %s", Args->GetArg(i));
|
||||
}
|
||||
p += snprintf (buffer+p, size-p, "\n");
|
||||
|
||||
for (i = 0; (arg = Wads.GetWadName (i)) != NULL; ++i)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, "\nWad %d: %s", i, arg);
|
||||
}
|
||||
|
||||
if (gamestate != GS_LEVEL && gamestate != GS_TITLELEVEL)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, "\n\nNot in a level.");
|
||||
}
|
||||
else
|
||||
{
|
||||
char name[9];
|
||||
|
||||
strncpy (name, level.mapname, 8);
|
||||
name[8] = 0;
|
||||
p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", name);
|
||||
|
||||
if (!viewactive)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, "\n\nView not active.");
|
||||
}
|
||||
else
|
||||
{
|
||||
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, "\nviewz = %d", (int)viewz);
|
||||
p += snprintf (buffer+p, size-p, "\nviewangle = %x", (unsigned int)viewangle);
|
||||
}
|
||||
}
|
||||
buffer[p++] = '\n';
|
||||
buffer[p++] = '\0';
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
#if defined(__MACH__) && !defined(NOASM)
|
||||
// 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
|
||||
// matter.
|
||||
extern "C"
|
||||
{
|
||||
extern void *rtext_a_start, *rtext_a_end;
|
||||
extern void *rtext_tmap_start, *rtext_tmap_end;
|
||||
extern void *rtext_tmap2_start, *rtext_tmap2_end;
|
||||
extern void *rtext_tmap3_start, *rtext_tmap3_end;
|
||||
};
|
||||
|
||||
static void unprotect_pages(long pagesize, void *start, void *end)
|
||||
{
|
||||
char *page = (char *)((intptr_t)start & ~(pagesize - 1));
|
||||
size_t len = (char *)end - (char *)start;
|
||||
if (mprotect(page, len, PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
|
||||
{
|
||||
fprintf(stderr, "mprotect failed\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void unprotect_rtext()
|
||||
{
|
||||
static void *const pages[] =
|
||||
{
|
||||
rtext_a_start, rtext_a_end,
|
||||
rtext_tmap_start, rtext_tmap_end,
|
||||
rtext_tmap2_start, rtext_tmap2_end,
|
||||
rtext_tmap3_start, rtext_tmap3_end
|
||||
};
|
||||
long pagesize = sysconf(_SC_PAGESIZE);
|
||||
for (void *const *p = pages; p < &pages[countof(pages)]; p += 2)
|
||||
{
|
||||
unprotect_pages(pagesize, p[0], p[1]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
p += snprintf (buffer+p, size-p, "\nCommand line:");
|
||||
for (i = 0; i < Args->NumArgs(); ++i)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, " %s", Args->GetArg(i));
|
||||
}
|
||||
p += snprintf (buffer+p, size-p, "\n");
|
||||
|
||||
for (i = 0; (arg = Wads.GetWadName (i)) != NULL; ++i)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, "\nWad %d: %s", i, arg);
|
||||
}
|
||||
|
||||
if (gamestate != GS_LEVEL && gamestate != GS_TITLELEVEL)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, "\n\nNot in a level.");
|
||||
}
|
||||
else
|
||||
{
|
||||
char name[9];
|
||||
|
||||
strncpy (name, level.mapname, 8);
|
||||
name[8] = 0;
|
||||
p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", name);
|
||||
|
||||
if (!viewactive)
|
||||
{
|
||||
p += snprintf (buffer+p, size-p, "\n\nView not active.");
|
||||
}
|
||||
else
|
||||
{
|
||||
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, "\nviewz = %d", (int)viewz);
|
||||
p += snprintf (buffer+p, size-p, "\nviewangle = %x", (unsigned int)viewangle);
|
||||
}
|
||||
}
|
||||
buffer[p++] = '\n';
|
||||
buffer[p++] = '\0';
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
#if defined(__MACH__) && !defined(NOASM)
|
||||
// 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
|
||||
// matter.
|
||||
extern "C"
|
||||
{
|
||||
extern void *rtext_a_start, *rtext_a_end;
|
||||
extern void *rtext_tmap_start, *rtext_tmap_end;
|
||||
extern void *rtext_tmap2_start, *rtext_tmap2_end;
|
||||
extern void *rtext_tmap3_start, *rtext_tmap3_end;
|
||||
};
|
||||
|
||||
static void unprotect_pages(long pagesize, void *start, void *end)
|
||||
{
|
||||
char *page = (char *)((intptr_t)start & ~(pagesize - 1));
|
||||
size_t len = (char *)end - (char *)start;
|
||||
if (mprotect(page, len, PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
|
||||
{
|
||||
fprintf(stderr, "mprotect failed\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void unprotect_rtext()
|
||||
{
|
||||
static void *const pages[] =
|
||||
{
|
||||
rtext_a_start, rtext_a_end,
|
||||
rtext_tmap_start, rtext_tmap_end,
|
||||
rtext_tmap2_start, rtext_tmap2_end,
|
||||
rtext_tmap3_start, rtext_tmap3_end
|
||||
};
|
||||
long pagesize = sysconf(_SC_PAGESIZE);
|
||||
for (void *const *p = pages; p < &pages[countof(pages)]; p += 2)
|
||||
{
|
||||
unprotect_pages(pagesize, p[0], p[1]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void I_StartupJoysticks();
|
||||
void I_ShutdownJoysticks();
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
#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);
|
||||
}
|
||||
}
|
||||
#endif // !__APPLE__
|
||||
|
||||
printf(GAMENAME" v%s - SVN revision %s - SDL version\nCompiled on %s\n",
|
||||
DOTVERSIONSTR_NOREV,SVN_REVISION_STRING,__DATE__);
|
||||
|
||||
seteuid (getuid ());
|
||||
std::set_new_handler (NewFailure);
|
||||
|
||||
#if defined(__MACH__) && !defined(NOASM)
|
||||
unprotect_rtext();
|
||||
#endif
|
||||
|
||||
#ifndef NO_GTK
|
||||
GtkAvailable = gtk_init_check (&argc, &argv);
|
||||
#endif
|
||||
|
||||
setlocale (LC_ALL, "C");
|
||||
|
||||
printf(GAMENAME" %s - %s - SDL version\nCompiled on %s\n",
|
||||
GetVersionString(), GetGitTime(), __DATE__);
|
||||
|
||||
seteuid (getuid ());
|
||||
std::set_new_handler (NewFailure);
|
||||
|
||||
#if defined(__MACH__) && !defined(NOASM)
|
||||
unprotect_rtext();
|
||||
#endif
|
||||
|
||||
#ifndef NO_GTK
|
||||
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)
|
||||
{
|
||||
fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError());
|
||||
return -1;
|
||||
}
|
||||
atterm (SDL_Quit);
|
||||
|
||||
{
|
||||
fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError());
|
||||
return -1;
|
||||
}
|
||||
atterm (SDL_Quit);
|
||||
|
||||
{
|
||||
char viddriver[80];
|
||||
|
||||
|
@ -284,10 +284,12 @@ int main (int argc, char **argv)
|
|||
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__
|
||||
|
||||
|
||||
const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo();
|
||||
if ( NULL != videoInfo )
|
||||
{
|
||||
|
@ -306,59 +308,59 @@ int main (int argc, char **argv)
|
|||
|
||||
#endif // __APPLE__
|
||||
|
||||
try
|
||||
{
|
||||
Args = new DArgs(argc, argv);
|
||||
|
||||
/*
|
||||
killough 1/98:
|
||||
|
||||
This fixes some problems with exit handling
|
||||
during abnormal situations.
|
||||
|
||||
The old code called I_Quit() to end program,
|
||||
while now I_Quit() is installed as an exit
|
||||
handler and exit() is called to exit, either
|
||||
normally or abnormally. Seg faults are caught
|
||||
and the error handler is used, to prevent
|
||||
being left in graphics mode or having very
|
||||
loud SFX noise because the sound card is
|
||||
left in an unstable state.
|
||||
*/
|
||||
|
||||
atexit (call_terms);
|
||||
atterm (I_Quit);
|
||||
|
||||
// Should we even be doing anything with progdir on Unix systems?
|
||||
char program[PATH_MAX];
|
||||
if (realpath (argv[0], program) == NULL)
|
||||
strcpy (program, argv[0]);
|
||||
char *slash = strrchr (program, '/');
|
||||
if (slash != NULL)
|
||||
{
|
||||
*(slash + 1) = '\0';
|
||||
progdir = program;
|
||||
}
|
||||
else
|
||||
{
|
||||
progdir = "./";
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Args = new DArgs(argc, argv);
|
||||
|
||||
/*
|
||||
killough 1/98:
|
||||
|
||||
This fixes some problems with exit handling
|
||||
during abnormal situations.
|
||||
|
||||
The old code called I_Quit() to end program,
|
||||
while now I_Quit() is installed as an exit
|
||||
handler and exit() is called to exit, either
|
||||
normally or abnormally. Seg faults are caught
|
||||
and the error handler is used, to prevent
|
||||
being left in graphics mode or having very
|
||||
loud SFX noise because the sound card is
|
||||
left in an unstable state.
|
||||
*/
|
||||
|
||||
atexit (call_terms);
|
||||
atterm (I_Quit);
|
||||
|
||||
// Should we even be doing anything with progdir on Unix systems?
|
||||
char program[PATH_MAX];
|
||||
if (realpath (argv[0], program) == NULL)
|
||||
strcpy (program, argv[0]);
|
||||
char *slash = strrchr (program, '/');
|
||||
if (slash != NULL)
|
||||
{
|
||||
*(slash + 1) = '\0';
|
||||
progdir = program;
|
||||
}
|
||||
else
|
||||
{
|
||||
progdir = "./";
|
||||
}
|
||||
|
||||
I_StartupJoysticks();
|
||||
C_InitConsole (80*8, 25*8, false);
|
||||
D_DoomMain ();
|
||||
}
|
||||
catch (class CDoomError &error)
|
||||
{
|
||||
C_InitConsole (80*8, 25*8, false);
|
||||
D_DoomMain ();
|
||||
}
|
||||
catch (class CDoomError &error)
|
||||
{
|
||||
I_ShutdownJoysticks();
|
||||
if (error.GetMessage ())
|
||||
fprintf (stderr, "%s\n", error.GetMessage ());
|
||||
exit (-1);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
call_terms ();
|
||||
throw;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (error.GetMessage ())
|
||||
fprintf (stderr, "%s\n", error.GetMessage ());
|
||||
exit (-1);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
call_terms ();
|
||||
throw;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -483,10 +483,12 @@ int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad)
|
|||
GtkTreeIter iter, defiter;
|
||||
int close_style = 0;
|
||||
int i;
|
||||
char caption[100];
|
||||
|
||||
// Create the dialog window.
|
||||
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_container_set_border_width (GTK_CONTAINER(window), 10);
|
||||
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;
|
||||
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"
|
||||
"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)
|
||||
{
|
||||
|
|
|
@ -198,7 +198,9 @@ static const FEnumList SpeakerModeNames[] =
|
|||
{ "Surround", FMOD_SPEAKERMODE_SURROUND },
|
||||
{ "5.1", FMOD_SPEAKERMODE_5POINT1 },
|
||||
{ "7.1", FMOD_SPEAKERMODE_7POINT1 },
|
||||
#if FMOD_VERSION < 0x44400
|
||||
{ "Prologic", FMOD_SPEAKERMODE_PROLOGIC },
|
||||
#endif
|
||||
{ "1", FMOD_SPEAKERMODE_MONO },
|
||||
{ "2", FMOD_SPEAKERMODE_STEREO },
|
||||
{ "4", FMOD_SPEAKERMODE_QUAD },
|
||||
|
|
|
@ -208,8 +208,6 @@ static cheatseq_t HereticCheats[] =
|
|||
{ CheatPonce, 0, 0, 0, {CHT_HEALTH,0}, Cht_Generic },
|
||||
{ CheatSkel, 0, 0, 0, {CHT_KEYS,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 },
|
||||
{ CheatEngage, 0, 1, 0, {0,0}, Cht_ChangeLevel },
|
||||
{ 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[9], 0, 0, 0, {CHT_GIMMIEJ,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[] =
|
||||
|
@ -270,7 +270,6 @@ static cheatseq_t StrifeCheats[] =
|
|||
|
||||
static cheatseq_t ChexCheats[] =
|
||||
{
|
||||
{ CheatMus, 0, 1, 0, {0,0}, Cht_Music },
|
||||
{ CheatKimHyers, 0, 1, 0, {0,0}, Cht_MyPos },
|
||||
{ CheatShrrill, 0, 0, 0, {0,0}, Cht_AutoMap },
|
||||
{ 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 },
|
||||
{ CheatJoshuaStorms, 0, 0, 0, {CHT_BEHOLDL,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[] =
|
||||
|
@ -342,8 +342,8 @@ bool ST_Responder (event_t *ev)
|
|||
else
|
||||
{
|
||||
static cheatseq_t *cheatlists[] = { DoomCheats, HereticCheats, HexenCheats, StrifeCheats, ChexCheats, SpecialCheats };
|
||||
static int counts[] = { countof(DoomCheats), countof(HereticCheats), countof(HexenCheats),
|
||||
countof(StrifeCheats), countof(ChexCheats), countof(SpecialCheats) };
|
||||
static int counts[] = { countof(DoomCheats), countof(HereticCheats)-2, countof(HexenCheats),
|
||||
countof(StrifeCheats), countof(ChexCheats)-1, countof(SpecialCheats) };
|
||||
|
||||
for (size_t i=0; i<countof(cheatlists); i++)
|
||||
{
|
||||
|
|
|
@ -1495,6 +1495,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomPunch)
|
|||
angle_t angle;
|
||||
int pitch;
|
||||
AActor * linetarget;
|
||||
int actualdamage;
|
||||
|
||||
if (!norandom)
|
||||
damage *= pr_cwpunch() % 8 + 1;
|
||||
|
@ -1515,13 +1516,13 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomPunch)
|
|||
pufftype = PClass::FindActor(NAME_BulletPuff);
|
||||
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
|
||||
if (linetarget)
|
||||
{
|
||||
if (lifesteal)
|
||||
P_GiveBody (self, (damage * lifesteal) >> FRACBITS);
|
||||
if (lifesteal && !(linetarget->flags5 & MF5_DONTDRAIN))
|
||||
P_GiveBody (self, (actualdamage * lifesteal) >> FRACBITS);
|
||||
|
||||
if (weapon != NULL)
|
||||
{
|
||||
|
@ -2681,6 +2682,69 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CheckSightOrRange)
|
|||
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;
|
||||
}
|
||||
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
|
|
|
@ -182,6 +182,7 @@ static FFlagDef ActorFlags[]=
|
|||
DEFINE_FLAG(MF4, NOSKIN, AActor, flags4),
|
||||
DEFINE_FLAG(MF4, BOSSDEATH, AActor, flags4),
|
||||
|
||||
DEFINE_FLAG(MF5, DONTDRAIN, AActor, flags5),
|
||||
DEFINE_FLAG(MF5, NODROPOFF, AActor, flags5),
|
||||
DEFINE_FLAG(MF5, COUNTSECRET, AActor, flags5),
|
||||
DEFINE_FLAG(MF5, NODAMAGE, AActor, flags5),
|
||||
|
|
|
@ -34,27 +34,24 @@
|
|||
#ifndef __VERSION_H__
|
||||
#define __VERSION_H__
|
||||
|
||||
// The svnrevision.h is automatically updated to grab the revision of
|
||||
// of the current source tree so that it can be included with version numbers.
|
||||
#include "svnrevision.h"
|
||||
const char *GetGitDescription();
|
||||
const char *GetGitHash();
|
||||
const char *GetGitTime();
|
||||
const char *GetVersionString();
|
||||
|
||||
/** Lots of different version numbers **/
|
||||
|
||||
#define DOTVERSIONSTR_NOREV "2.6.999"
|
||||
|
||||
// The version string the user actually sees.
|
||||
#define DOTVERSIONSTR DOTVERSIONSTR_NOREV " (r" SVN_REVISION_STRING ")"
|
||||
#define VERSIONSTR "2.8pre"
|
||||
|
||||
// The version as seen in the Windows resource
|
||||
#define RC_FILEVERSION 2,6,999,SVN_REVISION_NUMBER
|
||||
#define RC_PRODUCTVERSION 2,6,999,0
|
||||
#define RC_FILEVERSION2 DOTVERSIONSTR
|
||||
#define RC_PRODUCTVERSION2 "2.6"
|
||||
#define RC_FILEVERSION 2,7,9999,0
|
||||
#define RC_PRODUCTVERSION 2,7,9999,0
|
||||
#define RC_PRODUCTVERSION2 "2.8pre"
|
||||
|
||||
// Version identifier for network games.
|
||||
// Bump it every time you do a release unless you're certain you
|
||||
// didn't change anything that will affect sync.
|
||||
#define NETGAMEVERSION 228
|
||||
#define NETGAMEVERSION 229
|
||||
|
||||
// Version stored in the ini's [LastRun] section.
|
||||
// Bump it if you made some configuration change that you want to
|
||||
|
@ -75,36 +72,15 @@
|
|||
// SAVESIG should match SAVEVER.
|
||||
|
||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||
#define MINSAVEVER 3100
|
||||
#define MINSAVEVER 3100
|
||||
|
||||
#if SVN_REVISION_NUMBER < MINSAVEVER
|
||||
// If we don't know the current revision write something very high to ensure that
|
||||
// the reesulting executable can read its own savegames but no regular engine can.
|
||||
#define SAVEVER 999999
|
||||
#define SAVESIG MakeSaveSig()
|
||||
static inline const char *MakeSaveSig()
|
||||
{
|
||||
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
|
||||
// Use 4500 as the base git save version, since it's higher than the
|
||||
// SVN revision ever got.
|
||||
#define SAVEVER 4501
|
||||
|
||||
#define SAVEVERSTRINGIFY2(x) #x
|
||||
#define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)
|
||||
#define SAVESIG "ZDOOMSAVE" SAVEVERSTRINGIFY(SAVEVER)
|
||||
|
||||
// This is so that derivates can use the same savegame versions without worrying about engine compatibility
|
||||
#define GAMESIG "ZDOOM"
|
||||
|
|
|
@ -128,7 +128,7 @@ RtlVirtualUnwind (
|
|||
// If you are working on your own modified version of ZDoom, change
|
||||
// the last part of the UPLOAD_AGENT (between parentheses) to your
|
||||
// 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.
|
||||
#define TIMEOUT 60000
|
||||
|
|
|
@ -95,8 +95,6 @@
|
|||
#define X64 ""
|
||||
#endif
|
||||
|
||||
#define WINDOW_TITLE GAMESIG " " DOTVERSIONSTR X64 " (" __DATE__ ")"
|
||||
|
||||
// The maximum number of functions that can be registered with atterm.
|
||||
#define MAX_TERMS 64
|
||||
|
||||
|
@ -714,7 +712,9 @@ void ShowErrorPane(const char *text)
|
|||
}
|
||||
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);
|
||||
if (ErrorIcon != NULL)
|
||||
{
|
||||
|
@ -945,10 +945,12 @@ void DoMain (HINSTANCE hInstance)
|
|||
I_FatalError ("Could not register window class");
|
||||
|
||||
/* create window */
|
||||
char caption[100];
|
||||
mysnprintf(caption, countof(caption), ""GAMESIG" %s "X64" (%s)", GetVersionString(), GetGitTime());
|
||||
Window = CreateWindowEx(
|
||||
WS_EX_APPWINDOW,
|
||||
(LPCTSTR)WinClassName,
|
||||
(LPCTSTR)WINDOW_TITLE,
|
||||
(LPCTSTR)caption,
|
||||
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
|
||||
x, y, width, height,
|
||||
(HWND) NULL,
|
||||
|
@ -1045,7 +1047,7 @@ void DoomSpecificInfo (char *buffer, size_t bufflen)
|
|||
char *const buffend = buffer + bufflen - 2; // -2 for CRLF at end
|
||||
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());
|
||||
|
||||
for (i = 0; (arg = Wads.GetWadName (i)) != NULL; ++i)
|
||||
|
|
|
@ -1095,7 +1095,7 @@ BOOL CALLBACK IWADBoxCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa
|
|||
FString newlabel;
|
||||
|
||||
GetWindowText(hDlg, label, countof(label));
|
||||
newlabel.Format(GAMESIG " " DOTVERSIONSTR_NOREV ": %s", label);
|
||||
newlabel.Format(GAMESIG " %s: %s", GetVersionString(), label);
|
||||
SetWindowText(hDlg, newlabel.GetChars());
|
||||
}
|
||||
// Populate the list with all the IWADs found
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
#include "../version.h"
|
||||
#include "../version.h"
|
||||
#include "../gitinfo.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
@ -36,7 +37,8 @@ END
|
|||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"#include ""../version.h""\r\0"
|
||||
"#include ""../version.h""\r\r\n"
|
||||
"#include ""../gitinfo.h""\r\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
|
@ -49,6 +51,7 @@ BEGIN
|
|||
"//\r\n"
|
||||
"// Version\r\n"
|
||||
"//\r\n"
|
||||
"#define RC_FILEVERSION2 GIT_DESCRIPTION\r\n"
|
||||
"\r\n"
|
||||
"VS_VERSION_INFO VERSIONINFO\r\n"
|
||||
" FILEVERSION RC_FILEVERSION\r\n"
|
||||
|
@ -72,8 +75,8 @@ BEGIN
|
|||
" VALUE ""FileDescription"", ""ZDoom""\r\n"
|
||||
" VALUE ""FileVersion"", RC_FILEVERSION2\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 ""LegalTrademarks"", ""Doom® is a Registered Trademark of id Software, Inc.""\r\n"
|
||||
" VALUE ""LegalCopyright"", ""Copyright \\u00A9 1993-1996 id Software, 1998-2010 Randy Heit, 2002-2010 Christoph Oelckers, et al.""\r\n"
|
||||
" VALUE ""LegalTrademarks"", ""DoomR is a Registered Trademark of id Software, Inc.""\r\n"
|
||||
" VALUE ""OriginalFilename"", ""zdoom.exe""\r\n"
|
||||
" VALUE ""ProductName"", ""ZDoom""\r\n"
|
||||
" VALUE ""ProductVersion"", RC_PRODUCTVERSION2\r\n"
|
||||
|
@ -83,7 +86,7 @@ BEGIN
|
|||
" BEGIN\r\n"
|
||||
" VALUE ""Translation"", 0x409, 1200\r\n"
|
||||
" END\r\n"
|
||||
"END\0"
|
||||
"EN\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
@ -468,6 +471,7 @@ IDB_DEADGUY BITMAP "deadguy.bmp"
|
|||
//
|
||||
// Version
|
||||
//
|
||||
#define RC_FILEVERSION2 GIT_DESCRIPTION
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION RC_FILEVERSION
|
||||
|
@ -491,8 +495,8 @@ BEGIN
|
|||
VALUE "FileDescription", "ZDoom"
|
||||
VALUE "FileVersion", RC_FILEVERSION2
|
||||
VALUE "InternalName", "ZDoom"
|
||||
VALUE "LegalCopyright", "Copyright © 1993-1996 id Software, 1998-2010 Randy Heit"
|
||||
VALUE "LegalTrademarks", "Doom® is a Registered Trademark of id Software, Inc."
|
||||
VALUE "LegalCopyright", "Copyright \u00A9 1993-1996 id Software, 1998-2010 Randy Heit, 2002-2010 Christoph Oelckers, et al."
|
||||
VALUE "LegalTrademarks", "DoomR is a Registered Trademark of id Software, Inc."
|
||||
VALUE "OriginalFilename", "zdoom.exe"
|
||||
VALUE "ProductName", "ZDoom"
|
||||
VALUE "ProductVersion", RC_PRODUCTVERSION2
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
cmake_minimum_required( VERSION 2.4 )
|
||||
|
||||
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
|
||||
COMMAND windres -o ${CMAKE_CURRENT_BINARY_DIR}/trustinfo.o -i ${CMAKE_CURRENT_SOURCE_DIR}/trustinfo.rc
|
||||
DEPENDS trustinfo.rc )
|
||||
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 )
|
||||
# VC 8+ adds a manifest automatically to the executable. We need to
|
||||
# merge ours with it.
|
||||
|
@ -14,7 +14,7 @@ if( WIN32 )
|
|||
else( MSVC_VERSION GREATER 1399 )
|
||||
set( TRUSTINFO trustinfo.rc )
|
||||
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 )
|
||||
|
||||
add_executable( updaterevision updaterevision.c ${TRUSTINFO} )
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
/* updaterevision.c
|
||||
*
|
||||
* Public domain. This program uses the svnversion command to get the
|
||||
* repository revision for a particular directory and writes it into
|
||||
* a header file so that it can be used as a project's build number.
|
||||
* Public domain. This program uses git commands command to get
|
||||
* various bits of repository status for a particular directory
|
||||
* and writes it into a header file so that it can be used for a
|
||||
* project's versioning.
|
||||
*/
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
@ -13,69 +14,78 @@
|
|||
#include <ctype.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)
|
||||
{
|
||||
char *name;
|
||||
char currev[64], lastrev[64], run[256], *rev;
|
||||
unsigned long urev;
|
||||
char vertag[64], lastlog[64], lasthash[64], *hash = NULL;
|
||||
FILE *stream = NULL;
|
||||
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;
|
||||
}
|
||||
|
||||
// Use svnversion to get the revision number. If that fails, pretend it's
|
||||
// revision 0. Note that this requires you have the command-line svn tools installed.
|
||||
sprintf (run, "svnversion -cn %s", argv[1]);
|
||||
if ((name = tempnam(NULL, "svnout")) != NULL)
|
||||
// Use git describe --tags to get a version string. If we are sitting directly
|
||||
// on a tag, it returns that tag. Otherwise it returns <most recent tag>-<number of
|
||||
// commits since the tag>-<short hash>.
|
||||
// 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__
|
||||
// tempnam will return errno of 2 even though it is successful for our purposes.
|
||||
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')))
|
||||
if (fgets(vertag, sizeof vertag, stream) == vertag &&
|
||||
fgets(lastlog, sizeof lastlog, stream) == lastlog)
|
||||
{
|
||||
stripnl(vertag);
|
||||
stripnl(lastlog);
|
||||
gotrev = 1;
|
||||
}
|
||||
}
|
||||
if (stream != NULL)
|
||||
{
|
||||
fclose (stream);
|
||||
remove (name);
|
||||
}
|
||||
if (name != NULL)
|
||||
{
|
||||
free (name);
|
||||
|
||||
pclose(stream);
|
||||
}
|
||||
|
||||
if (!gotrev)
|
||||
if (gotrev)
|
||||
{
|
||||
fprintf (stderr, "Failed to get current revision: %s\n", strerror(errno));
|
||||
strcpy (currev, "0");
|
||||
rev = currev;
|
||||
hash = strchr(lastlog, '*');
|
||||
if (hash != NULL)
|
||||
{
|
||||
*hash = '\0';
|
||||
hash++;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (hash == NULL)
|
||||
{
|
||||
rev = strchr (currev, ':');
|
||||
if (rev == NULL)
|
||||
{
|
||||
rev = currev;
|
||||
}
|
||||
else
|
||||
{
|
||||
rev += 1;
|
||||
}
|
||||
fprintf(stderr, "Failed to get commit info: %s\n", strerror(errno));
|
||||
strcpy(vertag, "<unknown version>");
|
||||
lastlog[0] = '\0';
|
||||
lastlog[1] = '0';
|
||||
lastlog[2] = '\0';
|
||||
hash = lastlog + 1;
|
||||
}
|
||||
|
||||
stream = fopen (argv[2], "r");
|
||||
stream = fopen (argv[1], "r");
|
||||
if (stream != NULL)
|
||||
{
|
||||
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
|
||||
// what we've got, then we don't need to modify it and can avoid rebuilding
|
||||
// dependant files.
|
||||
if (fgets(lastrev, sizeof lastrev, stream) == lastrev)
|
||||
if (fgets(lasthash, sizeof lasthash, stream) == lasthash)
|
||||
{
|
||||
if (lastrev[0] != '\0')
|
||||
{ // Strip trailing \n
|
||||
lastrev[strlen(lastrev) - 1] = '\0';
|
||||
}
|
||||
if (strcmp(rev, lastrev + 3) == 0)
|
||||
stripnl(lasthash);
|
||||
if (strcmp(hash, lasthash + 3) == 0)
|
||||
{
|
||||
needupdate = 0;
|
||||
}
|
||||
|
@ -102,27 +109,27 @@ int main(int argc, char **argv)
|
|||
|
||||
if (needupdate)
|
||||
{
|
||||
stream = fopen (argv[2], "w");
|
||||
stream = fopen (argv[1], "w");
|
||||
if (stream == NULL)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
urev = strtoul(rev, NULL, 10);
|
||||
fprintf (stream,
|
||||
fprintf(stream,
|
||||
"// %s\n"
|
||||
"//\n"
|
||||
"// This file was automatically generated by the\n"
|
||||
"// updaterevision tool. Do not edit by hand.\n"
|
||||
"\n"
|
||||
"#define SVN_REVISION_STRING \"%s\"\n"
|
||||
"#define SVN_REVISION_NUMBER %lu\n",
|
||||
rev, rev, urev);
|
||||
fclose (stream);
|
||||
fprintf (stderr, "%s updated to revision %s.\n", argv[2], rev);
|
||||
"#define GIT_DESCRIPTION \"%s\"\n"
|
||||
"#define GIT_HASH \"%s\"\n"
|
||||
"#define GIT_TIME \"%s\"\n",
|
||||
hash, vertag, hash, lastlog);
|
||||
fclose(stream);
|
||||
fprintf(stderr, "%s updated to commit %s.\n", argv[1], vertag);
|
||||
}
|
||||
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;
|
||||
|
|
|
@ -302,6 +302,7 @@ ACTOR Actor native //: Thinker
|
|||
action native A_SetDamageType(name damagetype);
|
||||
|
||||
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_TransferPointer(int ptr_source, int ptr_recepient, int sourcefield, int recepientfield=AAPTR_DEFAULT, int flags=0);
|
||||
|
|
|
@ -233,6 +233,7 @@ ACTOR GoldWandPuff2 : GoldWandFX1
|
|||
Skip_Super
|
||||
+NOBLOCKMAP
|
||||
+NOGRAVITY
|
||||
+PUFFONACTORS
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
|
|
|
@ -1,5 +1,31 @@
|
|||
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
|
||||
}
|
||||
|
||||
|
@ -306,37 +332,24 @@ F481922F4881F74760F3C0437FD5EDD0 // map03
|
|||
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
|
||||
{
|
||||
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
|
||||
}
|
||||
|
|
22
zdoom.vcproj
22
zdoom.vcproj
|
@ -28,8 +28,8 @@
|
|||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
Description="Checking svnrevision.h..."
|
||||
CommandLine=""$(OutDir)\updaterevision.exe" src src/svnrevision.h"
|
||||
Description="Checking gitinfo.h..."
|
||||
CommandLine=""$(OutDir)\updaterevision.exe" src/gitinfo.h"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
|
@ -151,7 +151,8 @@
|
|||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h"
|
||||
Description="Checking gitinfo.h..."
|
||||
CommandLine=""$(OutDir)\updaterevision.exe" src/gitinfo.h"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
|
@ -263,8 +264,8 @@
|
|||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
Description="Checking svnrevision.h..."
|
||||
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h"
|
||||
Description="Checking gitinfo.h..."
|
||||
CommandLine=""$(OutDir)\updaterevision.exe" src/gitinfo.h"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
|
@ -370,7 +371,8 @@
|
|||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
CommandLine="$(OutDir)\updaterevision.exe src src/svnrevision.h"
|
||||
Description="Checking gitinfo.h..."
|
||||
CommandLine=""$(OutDir)\updaterevision.exe" src/gitinfo.h"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
|
@ -652,6 +654,10 @@
|
|||
RelativePath=".\src\gi.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\gitinfo.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\hu_scores.cpp"
|
||||
>
|
||||
|
@ -1161,10 +1167,6 @@
|
|||
RelativePath=".\src\d_dehacked.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\d_dehackedactions.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\src\d_event.h"
|
||||
>
|
||||
|
|
Loading…
Reference in a new issue