mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-04-19 16:51:53 +00:00
Fix merge conflits
This commit is contained in:
commit
2b8190bb0c
30 changed files with 230 additions and 175 deletions
|
@ -172,6 +172,11 @@ if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
|
|||
endif()
|
||||
endif()
|
||||
|
||||
if("${CMAKE_SYSTEM_NAME}" MATCHES "Haiku")
|
||||
target_compile_definitions(SRB2SDL2 PRIVATE -DNOEXECINFO)
|
||||
target_link_libraries(SRB2SDL2 PRIVATE network)
|
||||
endif()
|
||||
|
||||
if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin")
|
||||
target_compile_definitions(SRB2SDL2 PRIVATE -DMACOSX)
|
||||
endif()
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
# Previously featured:\
|
||||
PANDORA\
|
||||
HAIKU\
|
||||
DUMMY\
|
||||
DJGPPDOS\
|
||||
SOLARIS\
|
||||
|
@ -17,6 +16,7 @@ all_systems:=\
|
|||
UNIX\
|
||||
LINUX\
|
||||
FREEBSD\
|
||||
HAIKU\
|
||||
|
||||
# check for user specified system
|
||||
ifeq (,$(filter $(all_systems),$(.VARIABLES)))
|
||||
|
@ -35,6 +35,8 @@ system:=$(shell uname -s)
|
|||
|
||||
ifeq ($(system),Linux)
|
||||
new_system:=LINUX
|
||||
else ifeq ($(system),Haiku)
|
||||
new_system:=HAIKU
|
||||
else
|
||||
|
||||
$(error \
|
||||
|
|
71
src/Makefile.d/haiku.mk
Normal file
71
src/Makefile.d/haiku.mk
Normal file
|
@ -0,0 +1,71 @@
|
|||
#
|
||||
# Makefile options for Haiku
|
||||
#
|
||||
|
||||
opts+=-DUNIXCOMMON -DLUA_USE_POSIX
|
||||
|
||||
ifndef DEDICATED
|
||||
ifndef DUMMY
|
||||
SDL?=1
|
||||
DEDICATED?=0
|
||||
endif
|
||||
endif
|
||||
|
||||
NOEXECINFO=1
|
||||
|
||||
ifeq (${SDL},1)
|
||||
EXENAME?=srb2haiku
|
||||
else ifeq (${DEDICATED},1)
|
||||
EXENAME?=srb2haikud
|
||||
endif
|
||||
|
||||
ifndef NONET
|
||||
libs+=-lnetwork
|
||||
endif
|
||||
|
||||
define _set =
|
||||
$(1)_CFLAGS?=$($(1)_opts)
|
||||
$(1)_LDFLAGS?=$($(1)_libs)
|
||||
endef
|
||||
|
||||
lib:=../libs/gme
|
||||
LIBGME_opts:=-I$(lib)/include
|
||||
LIBGME_libs:=-l:libgme.so.0
|
||||
$(eval $(call _set,LIBGME))
|
||||
|
||||
lib:=../libs/libopenmpt
|
||||
LIBOPENMPT_opts:=-I$(lib)/inc
|
||||
LIBOPENMPT_libs:=-l:libopenmpt.so.0
|
||||
$(eval $(call _set,LIBOPENMPT))
|
||||
|
||||
ifdef SDL
|
||||
lib:=../libs/SDL2_mixer
|
||||
mixer_opts:=-I$(lib)/include
|
||||
mixer_libs:=-l:libSDL2_mixer-2.0.so.0
|
||||
|
||||
lib:=../libs/SDL2
|
||||
SDL_opts:=-I$(lib)/include $(mixer_opts)
|
||||
SDL_libs:=$(mixer_libs) -l:libSDL2-2.0.so.0
|
||||
$(eval $(call _set,SDL))
|
||||
endif
|
||||
|
||||
lib:=../libs/zlib
|
||||
ZLIB_opts:=-I$(lib)
|
||||
ZLIB_libs:=-l:libz.so.1
|
||||
$(eval $(call _set,ZLIB))
|
||||
|
||||
ifndef PNG_CONFIG
|
||||
PNG_opts:=
|
||||
PNG_libs:=-l:libpng16.so.16
|
||||
$(eval $(call _set,PNG))
|
||||
endif
|
||||
|
||||
lib:=../libs/curl
|
||||
CURL_opts:=-I$(lib)/include
|
||||
CURL_libs:=-l:libcurl.so.4
|
||||
$(eval $(call _set,CURL))
|
||||
|
||||
lib:=../libs/miniupnpc
|
||||
MINIUPNPC_opts:=-I$(lib)/include
|
||||
MINIUPNPC_libs:=-l:libminiupnpc.so.17
|
||||
$(eval $(call _set,MINIUPNPC))
|
|
@ -35,6 +35,10 @@ endif
|
|||
else ifdef FREEBSD
|
||||
UNIX=1
|
||||
platform=freebsd
|
||||
else ifdef HAIKU
|
||||
# Give Haiku its own configuration, since it
|
||||
# isn't actually UNIX.
|
||||
include Makefile.d/haiku.mk
|
||||
else ifdef SOLARIS # FIXME: UNTESTED
|
||||
UNIX=1
|
||||
platform=solaris
|
||||
|
|
|
@ -33,11 +33,13 @@ else
|
|||
opts+=-DHAVE_MIXER
|
||||
sources+=sdl/mixer_sound.c
|
||||
|
||||
ifdef HAVE_MIXERX
|
||||
opts+=-DHAVE_MIXERX
|
||||
libs+=-lSDL2_mixer_ext
|
||||
else
|
||||
libs+=-lSDL2_mixer
|
||||
ifndef HAIKU # Haiku has a special import path
|
||||
ifdef HAVE_MIXERX
|
||||
opts+=-DHAVE_MIXERX
|
||||
libs+=-lSDL2_mixer_ext
|
||||
else
|
||||
libs+=-lSDL2_mixer
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
|
@ -51,6 +51,8 @@ typedef struct thinker_s
|
|||
// killough 11/98: count of how many other objects reference
|
||||
// this one using pointers. Used for garbage collection.
|
||||
INT32 references;
|
||||
|
||||
boolean removing;
|
||||
boolean cachable;
|
||||
|
||||
#ifdef PARANOIA
|
||||
|
|
|
@ -3435,7 +3435,7 @@ void F_TitleScreenTicker(boolean run)
|
|||
{
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
|
|
@ -614,7 +614,7 @@ void G_ConsGhostTic(void)
|
|||
mobj = NULL;
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
mobj = (mobj_t *)th;
|
||||
if (mobj->type == (mobjtype_t)type && mobj->x == x && mobj->y == y && mobj->z == z)
|
||||
|
@ -2696,7 +2696,7 @@ void G_DoPlayMetal(void)
|
|||
// find metal sonic
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
|
|
@ -3072,7 +3072,7 @@ void G_ChangePlayerReferences(mobj_t *oldmo, mobj_t *newmo)
|
|||
// scan all thinkers
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
|
|
@ -254,11 +254,10 @@ static int lib_searchBlockmap(lua_State *L)
|
|||
}
|
||||
else // mobj and function only - search around mobj's radius by default
|
||||
{
|
||||
fixed_t radius = mobj->radius + MAXRADIUS;
|
||||
x1 = mobj->x - radius;
|
||||
x2 = mobj->x + radius;
|
||||
y1 = mobj->y - radius;
|
||||
y2 = mobj->y + radius;
|
||||
x1 = mobj->x - mobj->radius;
|
||||
x2 = mobj->x + mobj->radius;
|
||||
y1 = mobj->y - mobj->radius;
|
||||
y2 = mobj->y + mobj->radius;
|
||||
}
|
||||
lua_settop(L, 2); // pop everything except function, mobj
|
||||
|
||||
|
|
|
@ -1779,7 +1779,7 @@ void LUA_Archive(save_t *save_p)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
// archive function will determine when to skip mobjs,
|
||||
|
@ -1817,7 +1817,7 @@ void LUA_UnArchive(save_t *save_p)
|
|||
mobjnum = P_ReadUINT32(save_p); // read a mobjnum
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
if (((mobj_t *)th)->mobjnum != mobjnum) // find matching mobj
|
||||
continue;
|
||||
|
|
|
@ -562,7 +562,7 @@ void Command_Teleport_f(void)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -1072,7 +1072,7 @@ static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean c
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
|
|
@ -584,7 +584,7 @@ static void PS_CountThinkers(void)
|
|||
for (thinker = thlist[i].next; thinker != &thlist[i]; thinker = thinker->next)
|
||||
{
|
||||
ps_thinkercount.value.i++;
|
||||
if (thinker->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (thinker->removing)
|
||||
ps_removecount.value.i++;
|
||||
else if (i == THINK_POLYOBJ)
|
||||
ps_polythcount.value.i++;
|
||||
|
|
|
@ -1814,7 +1814,7 @@ INT16 Consistancy(void)
|
|||
{
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
|
|
@ -3744,7 +3744,7 @@ static void P_DoBossVictory(mobj_t *mo)
|
|||
// scan the remaining thinkers to see if all bosses are dead
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -6449,7 +6449,7 @@ void A_RingExplode(mobj_t *actor)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -8756,7 +8756,7 @@ void A_FindTarget(mobj_t *actor)
|
|||
// scan the thinkers
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -8820,7 +8820,7 @@ void A_FindTracer(mobj_t *actor)
|
|||
// scan the thinkers
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -9498,7 +9498,7 @@ void A_RemoteAction(mobj_t *actor)
|
|||
// scan the thinkers
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -9761,7 +9761,7 @@ void A_SetObjectTypeState(mobj_t *actor)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -10391,7 +10391,7 @@ void A_CheckThingCount(mobj_t *actor)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
|
|
@ -101,7 +101,7 @@ void P_ClearStarPost(INT32 postnum)
|
|||
// scan the thinkers
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -130,7 +130,7 @@ void P_ResetStarposts(void)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
post = (mobj_t *)th;
|
||||
|
@ -1003,7 +1003,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
// scan the thinkers to find the corresponding anchorpoint
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -1097,7 +1097,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
// scan the remaining thinkers
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -1147,7 +1147,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
// in from the paraloop. Isn't this just so efficient?
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -1522,7 +1522,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
// scan the remaining thinkers to find koopa
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -2020,7 +2020,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -2870,7 +2870,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
// scan the thinkers to make sure all the old pinch dummies are gone on death
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
|
|
@ -39,11 +39,6 @@
|
|||
// Convenience macro to fix issue with collision along bottom/left edges of blockmap -Red
|
||||
#define BMBOUNDFIX(xl, xh, yl, yh) {if (xl > xh) xl = 0; if (yl > yh) yl = 0;}
|
||||
|
||||
// MAXRADIUS is for precalculated sector block boxes
|
||||
// the spider demon is larger,
|
||||
// but we do not have any moving sectors nearby
|
||||
#define MAXRADIUS (32*FRACUNIT)
|
||||
|
||||
// max Z move up or down without jumping
|
||||
// above this, a height difference is considered as a 'dropoff'
|
||||
#define MAXSTEPMOVE (24*FRACUNIT)
|
||||
|
|
72
src/p_map.c
72
src/p_map.c
|
@ -36,6 +36,9 @@
|
|||
|
||||
#include "m_perfstats.h" // ps_checkposition_calls
|
||||
|
||||
// Formerly called MAXRADIUS
|
||||
#define MAXTRYMOVE (32*FRACUNIT)
|
||||
|
||||
fixed_t tmbbox[4];
|
||||
mobj_t *tmthing;
|
||||
static INT32 tmflags;
|
||||
|
@ -2165,15 +2168,10 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y)
|
|||
}
|
||||
}
|
||||
|
||||
// The bounding box is extended by MAXRADIUS
|
||||
// because mobj_ts are grouped into mapblocks
|
||||
// based on their origin point, and can overlap
|
||||
// into adjacent blocks by up to MAXRADIUS units.
|
||||
|
||||
xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yh = (unsigned)(tmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
|
||||
BMBOUNDFIX(xl, xh, yl, yh);
|
||||
|
||||
|
@ -2393,11 +2391,6 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam)
|
|||
}
|
||||
}
|
||||
|
||||
// The bounding box is extended by MAXRADIUS
|
||||
// because mobj_ts are grouped into mapblocks
|
||||
// based on their origin point, and can overlap
|
||||
// into adjacent blocks by up to MAXRADIUS units.
|
||||
|
||||
xl = (unsigned)(tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
|
@ -2528,16 +2521,16 @@ boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam)
|
|||
}
|
||||
|
||||
do {
|
||||
if (x-tryx > MAXRADIUS)
|
||||
tryx += MAXRADIUS;
|
||||
else if (x-tryx < -MAXRADIUS)
|
||||
tryx -= MAXRADIUS;
|
||||
if (x-tryx > MAXTRYMOVE)
|
||||
tryx += MAXTRYMOVE;
|
||||
else if (x-tryx < -MAXTRYMOVE)
|
||||
tryx -= MAXTRYMOVE;
|
||||
else
|
||||
tryx = x;
|
||||
if (y-tryy > MAXRADIUS)
|
||||
tryy += MAXRADIUS;
|
||||
else if (y-tryy < -MAXRADIUS)
|
||||
tryy -= MAXRADIUS;
|
||||
if (y-tryy > MAXTRYMOVE)
|
||||
tryy += MAXTRYMOVE;
|
||||
else if (y-tryy < -MAXTRYMOVE)
|
||||
tryy -= MAXTRYMOVE;
|
||||
else
|
||||
tryy = y;
|
||||
|
||||
|
@ -2683,7 +2676,7 @@ increment_move
|
|||
floatok = false;
|
||||
|
||||
// This makes sure that there are no freezes from computing extremely small movements.
|
||||
// Originally was MAXRADIUS/2, but that can cause some bad inconsistencies for small players.
|
||||
// Originally was MAXTRYMOVE/2, but that can cause some bad inconsistencies for small players.
|
||||
radius = max(radius, thing->scale);
|
||||
|
||||
// And we also have to prevent Big Large (tm) movements, as those can skip too far
|
||||
|
@ -2872,10 +2865,10 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
|||
{
|
||||
INT32 xl, xh, yl, yh;
|
||||
|
||||
yh = (unsigned)(thing->y + MAXRADIUS - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(thing->y - MAXRADIUS - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(thing->x + MAXRADIUS - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(thing->x - MAXRADIUS - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
yh = (unsigned)(thing->y + thing->radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(thing->y - thing->radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(thing->x + thing->radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(thing->x - thing->radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
|
||||
BMBOUNDFIX(xl, xh, yl, yh);
|
||||
|
||||
|
@ -2947,16 +2940,16 @@ boolean P_SceneryTryMove(mobj_t *thing, fixed_t x, fixed_t y)
|
|||
tryx = thing->x;
|
||||
tryy = thing->y;
|
||||
do {
|
||||
if (x-tryx > MAXRADIUS)
|
||||
tryx += MAXRADIUS;
|
||||
else if (x-tryx < -MAXRADIUS)
|
||||
tryx -= MAXRADIUS;
|
||||
if (x-tryx > MAXTRYMOVE)
|
||||
tryx += MAXTRYMOVE;
|
||||
else if (x-tryx < -MAXTRYMOVE)
|
||||
tryx -= MAXTRYMOVE;
|
||||
else
|
||||
tryx = x;
|
||||
if (y-tryy > MAXRADIUS)
|
||||
tryy += MAXRADIUS;
|
||||
else if (y-tryy < -MAXRADIUS)
|
||||
tryy -= MAXRADIUS;
|
||||
if (y-tryy > MAXTRYMOVE)
|
||||
tryy += MAXTRYMOVE;
|
||||
else if (y-tryy < -MAXTRYMOVE)
|
||||
tryy -= MAXTRYMOVE;
|
||||
else
|
||||
tryy = y;
|
||||
|
||||
|
@ -4215,7 +4208,8 @@ void P_RadiusAttack(mobj_t *spot, mobj_t *source, fixed_t damagedist, UINT8 dama
|
|||
INT32 xl, xh, yl, yh;
|
||||
fixed_t dist;
|
||||
|
||||
dist = FixedMul(damagedist, spot->scale) + MAXRADIUS;
|
||||
dist = FixedMul(damagedist, spot->scale);
|
||||
|
||||
yh = (unsigned)(spot->y + dist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(spot->y - dist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(spot->x + dist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
|
@ -4385,15 +4379,15 @@ static boolean P_CheckSectorPolyObjects(sector_t *sector, boolean realcrush, boo
|
|||
{
|
||||
mobj_t *mo;
|
||||
blocknode_t *block;
|
||||
blocknode_t *next = NULL;
|
||||
|
||||
if (x < 0 || y < 0 || x >= bmapwidth || y >= bmapheight)
|
||||
continue;
|
||||
|
||||
block = blocklinks[y * bmapwidth + x];
|
||||
|
||||
for (; block; block = block->mnext)
|
||||
for (block = blocklinks[y * bmapwidth + x]; block != NULL; block = next)
|
||||
{
|
||||
mo = block->mobj;
|
||||
next = block->mnext;
|
||||
|
||||
// Monster Iestyn: do we need to check if a mobj has already been checked? ...probably not I suspect
|
||||
if (!P_MobjInsidePolyobj(po, mo))
|
||||
|
|
|
@ -1052,7 +1052,6 @@ boolean P_BlockLinesIterator(INT32 x, INT32 y, boolean (*func)(line_t *))
|
|||
//
|
||||
boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *), mobj_t *thing)
|
||||
{
|
||||
mobj_t *bnext = NULL;
|
||||
blocknode_t *block, *next = NULL;
|
||||
|
||||
boolean checkthing = false;
|
||||
|
@ -1063,28 +1062,17 @@ boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *), mobj_
|
|||
return true;
|
||||
|
||||
// Check interaction with the objects in the blockmap.
|
||||
for (block = blocklinks[y*bmapwidth + x]; block; block = next)
|
||||
for (block = blocklinks[y*bmapwidth + x]; block != NULL; block = next)
|
||||
{
|
||||
next = block->mnext;
|
||||
if (next)
|
||||
P_SetTarget(&bnext, next->mobj); // We want to note our reference to bnext here in case it is MF_NOTHINK and gets removed!
|
||||
next = block->mnext; // We want to note our reference to mnext here!
|
||||
|
||||
if (!func(block->mobj))
|
||||
{
|
||||
P_SetTarget(&bnext, NULL);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((checkthing && P_MobjWasRemoved(thing)) // func just popped our tmthing, cannot continue.
|
||||
|| (bnext && P_MobjWasRemoved(bnext))) // func just broke blockmap chain, cannot continue.
|
||||
{
|
||||
P_SetTarget(&bnext, NULL);
|
||||
if (checkthing && P_MobjWasRemoved(tmthing)) // func just popped our tmthing, cannot continue.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
P_SetTarget(&bnext, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
29
src/p_mobj.c
29
src/p_mobj.c
|
@ -765,7 +765,7 @@ void P_EmeraldManager(void)
|
|||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
|
@ -3455,7 +3455,7 @@ void P_DestroyRobots(void)
|
|||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
|
@ -4254,7 +4254,7 @@ static void P_Boss3Thinker(mobj_t *mobj)
|
|||
// this can happen if the boss was hurt earlier than expected
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -5343,7 +5343,7 @@ static void P_Boss9Thinker(mobj_t *mobj)
|
|||
// Build a hoop linked list of 'em!
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -6045,7 +6045,7 @@ mobj_t *P_GetClosestAxis(mobj_t *source)
|
|||
// scan the thinkers to find the closest axis point
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -9337,10 +9337,10 @@ static void P_PointPushThink(mobj_t *mobj)
|
|||
radius = mobj->spawnpoint->args[0] << FRACBITS;
|
||||
|
||||
pushmobj = mobj;
|
||||
xl = (unsigned)(mobj->x - radius - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(mobj->x + radius - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(mobj->y - radius - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
yh = (unsigned)(mobj->y + radius - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT;
|
||||
xl = (unsigned)(mobj->x - radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
xh = (unsigned)(mobj->x + radius - bmaporgx)>>MAPBLOCKSHIFT;
|
||||
yl = (unsigned)(mobj->y - radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
yh = (unsigned)(mobj->y + radius - bmaporgy)>>MAPBLOCKSHIFT;
|
||||
|
||||
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_PushThing, pushmobj);
|
||||
}
|
||||
|
@ -11183,17 +11183,16 @@ tic_t itemrespawntime[ITEMQUESIZE];
|
|||
size_t iquehead, iquetail;
|
||||
|
||||
#ifdef PARANOIA
|
||||
#define SCRAMBLE_REMOVED // Force debug build to crash when Removed mobj is accessed
|
||||
#define SCRAMBLE_REMOVED // Force debug build to crash when a removed mobj is accessed
|
||||
#endif
|
||||
void P_RemoveMobj(mobj_t *mobj)
|
||||
{
|
||||
I_Assert(mobj != NULL);
|
||||
if (P_MobjWasRemoved(mobj))
|
||||
return; // something already removing this mobj.
|
||||
if (P_MobjWasRemoved(mobj) || mobj->thinker.removing)
|
||||
return; // Something already removed or is removing this mobj.
|
||||
|
||||
mobj->thinker.function.acp1 = (actionf_p1)P_RemoveThinkerDelayed; // shh. no recursing.
|
||||
mobj->thinker.removing = true; // Set earlier to avoid recursion.
|
||||
LUA_HookMobj(mobj, MOBJ_HOOK(MobjRemoved));
|
||||
mobj->thinker.function.acp1 = (actionf_p1)P_MobjThinker; // needed for P_UnsetThingPosition, etc. to work.
|
||||
|
||||
// Rings only, please!
|
||||
if (mobj->spawnpoint &&
|
||||
|
@ -12863,7 +12862,7 @@ static boolean P_MapAlreadyHasStarPost(mobj_t *mobj)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
|
|
@ -878,15 +878,15 @@ static void Polyobj_carryThings(polyobj_t *po, fixed_t dx, fixed_t dy)
|
|||
{
|
||||
mobj_t *mo;
|
||||
blocknode_t *block;
|
||||
blocknode_t *next = NULL;
|
||||
|
||||
if (x < 0 || y < 0 || x >= bmapwidth || y >= bmapheight)
|
||||
continue;
|
||||
|
||||
block = blocklinks[y * bmapwidth + x];
|
||||
|
||||
for (; block; block = block->mnext)
|
||||
for (block = blocklinks[y * bmapwidth + x]; block != NULL; block = next)
|
||||
{
|
||||
mo = block->mobj;
|
||||
next = block->mnext;
|
||||
|
||||
if (mo->lastlook == pomovecount)
|
||||
continue;
|
||||
|
@ -927,11 +927,11 @@ static INT32 Polyobj_clipThings(polyobj_t *po, line_t *line)
|
|||
if (!(po->flags & POF_SOLID))
|
||||
return hitflags;
|
||||
|
||||
// adjust linedef bounding box to blockmap, extend by MAXRADIUS
|
||||
linebox[BOXLEFT] = (unsigned)(line->bbox[BOXLEFT] - bmaporgx - MAXRADIUS) >> MAPBLOCKSHIFT;
|
||||
linebox[BOXRIGHT] = (unsigned)(line->bbox[BOXRIGHT] - bmaporgx + MAXRADIUS) >> MAPBLOCKSHIFT;
|
||||
linebox[BOXBOTTOM] = (unsigned)(line->bbox[BOXBOTTOM] - bmaporgy - MAXRADIUS) >> MAPBLOCKSHIFT;
|
||||
linebox[BOXTOP] = (unsigned)(line->bbox[BOXTOP] - bmaporgy + MAXRADIUS) >> MAPBLOCKSHIFT;
|
||||
// adjust linedef bounding box to blockmap
|
||||
linebox[BOXLEFT] = (unsigned)(line->bbox[BOXLEFT] - bmaporgx) >> MAPBLOCKSHIFT;
|
||||
linebox[BOXRIGHT] = (unsigned)(line->bbox[BOXRIGHT] - bmaporgx) >> MAPBLOCKSHIFT;
|
||||
linebox[BOXBOTTOM] = (unsigned)(line->bbox[BOXBOTTOM] - bmaporgy) >> MAPBLOCKSHIFT;
|
||||
linebox[BOXTOP] = (unsigned)(line->bbox[BOXTOP] - bmaporgy) >> MAPBLOCKSHIFT;
|
||||
|
||||
// check all mobj blockmap cells the line contacts
|
||||
for (y = linebox[BOXBOTTOM]; y <= linebox[BOXTOP]; ++y)
|
||||
|
@ -942,9 +942,11 @@ static INT32 Polyobj_clipThings(polyobj_t *po, line_t *line)
|
|||
{
|
||||
mobj_t *mo = NULL;
|
||||
blocknode_t *block = blocklinks[y * bmapwidth + x];
|
||||
blocknode_t *next = NULL;
|
||||
|
||||
for (; block; block = block->mnext)
|
||||
for (; block != NULL; block = next)
|
||||
{
|
||||
next = block->mnext;
|
||||
mo = block->mobj;
|
||||
|
||||
// Don't scroll objects that aren't affected by gravity
|
||||
|
@ -1115,15 +1117,15 @@ static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta,
|
|||
{
|
||||
mobj_t *mo;
|
||||
blocknode_t *block;
|
||||
blocknode_t *next = NULL;
|
||||
|
||||
if (x < 0 || y < 0 || x >= bmapwidth || y >= bmapheight)
|
||||
continue;
|
||||
|
||||
block = blocklinks[y * bmapwidth + x];
|
||||
|
||||
for (; block; block = block->mnext)
|
||||
for (block = blocklinks[y * bmapwidth + x]; block != NULL; block = next)
|
||||
{
|
||||
mo = block->mobj;
|
||||
next = block->mnext;
|
||||
|
||||
if (mo->lastlook == pomovecount)
|
||||
continue;
|
||||
|
@ -1316,7 +1318,7 @@ void Polyobj_InitLevel(void)
|
|||
// the mobj_t pointers on a queue for use below.
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
|
|
@ -2972,8 +2972,7 @@ static void P_NetArchiveThinkers(save_t *save_p)
|
|||
// save off the current thinkers
|
||||
for (th = thlist[i].next; th != &thlist[i]; th = th->next)
|
||||
{
|
||||
if (!(th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed
|
||||
|| th->function.acp1 == (actionf_p1)P_NullPrecipThinker))
|
||||
if (!(th->removing || th->function.acp1 == (actionf_p1)P_NullPrecipThinker))
|
||||
numsaved++;
|
||||
|
||||
if (th->function.acp1 == (actionf_p1)P_MobjThinker)
|
||||
|
@ -3186,7 +3185,7 @@ static void P_NetArchiveThinkers(save_t *save_p)
|
|||
}
|
||||
#ifdef PARANOIA
|
||||
else
|
||||
I_Assert(th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed); // wait garbage collection
|
||||
I_Assert(th->removing); // wait garbage collection
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -3207,7 +3206,7 @@ mobj_t *P_FindNewPosition(UINT32 oldposition)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mobj = (mobj_t *)th;
|
||||
|
@ -4528,7 +4527,7 @@ static inline void P_FinishMobjs(void)
|
|||
for (currentthinker = thlist[THINK_MOBJ].next; currentthinker != &thlist[THINK_MOBJ];
|
||||
currentthinker = currentthinker->next)
|
||||
{
|
||||
if (currentthinker->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (currentthinker->removing)
|
||||
continue;
|
||||
|
||||
mobj = (mobj_t *)currentthinker;
|
||||
|
@ -4546,7 +4545,7 @@ static void P_RelinkPointers(void)
|
|||
for (currentthinker = thlist[THINK_MOBJ].next; currentthinker != &thlist[THINK_MOBJ];
|
||||
currentthinker = currentthinker->next)
|
||||
{
|
||||
if (currentthinker->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (currentthinker->removing)
|
||||
continue;
|
||||
|
||||
mobj = (mobj_t *)currentthinker;
|
||||
|
@ -5376,7 +5375,7 @@ void P_SaveNetGame(save_t *save_p, boolean resending)
|
|||
// Assign the mobjnumber for pointer tracking
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mobj = (mobj_t *)th;
|
||||
|
|
|
@ -692,7 +692,7 @@ void P_ReloadRings(void)
|
|||
// scan the thinkers to find rings/spheres/hoops to unset
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
@ -750,7 +750,7 @@ void P_SwitchSpheresBonusMode(boolean bonustime)
|
|||
// scan the thinkers to find spheres to switch
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)th;
|
||||
|
@ -7333,7 +7333,7 @@ void P_RespawnThings(void)
|
|||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
P_RemoveMobj((mobj_t *)think);
|
||||
}
|
||||
|
|
|
@ -3642,7 +3642,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
|||
if (mo2->type != MT_EGGTRAP)
|
||||
continue;
|
||||
|
||||
if (mo2->thinker.function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (mo2->thinker.removing)
|
||||
continue;
|
||||
|
||||
P_KillMobj(mo2, NULL, mo, 0);
|
||||
|
@ -3854,7 +3854,7 @@ void P_SetupSignExit(player_t *player)
|
|||
// spin all signposts in the level then.
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
|
||||
thing = (mobj_t *)think;
|
||||
|
@ -3892,7 +3892,7 @@ boolean P_IsFlagAtBase(mobjtype_t flag)
|
|||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
|
@ -4395,7 +4395,7 @@ static void P_ProcessEggCapsule(player_t *player, sector_t *sector)
|
|||
// The chimps are my friends.. heeheeheheehehee..... - LouisJM
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
mo2 = (mobj_t *)th;
|
||||
if (mo2->type != MT_EGGTRAP)
|
||||
|
|
|
@ -162,7 +162,7 @@ void Command_CountMobjs_f(void)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
if (((mobj_t *)th)->type == i)
|
||||
|
@ -182,7 +182,7 @@ void Command_CountMobjs_f(void)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
if (((mobj_t *)th)->type == i)
|
||||
|
@ -348,6 +348,7 @@ void P_RemoveThinkerDelayed(thinker_t *thinker)
|
|||
void P_RemoveThinker(thinker_t *thinker)
|
||||
{
|
||||
LUA_InvalidateUserdata(thinker);
|
||||
thinker->removing = true;
|
||||
thinker->function.acp1 = (actionf_p1)P_RemoveThinkerDelayed;
|
||||
}
|
||||
|
||||
|
|
38
src/p_user.c
38
src/p_user.c
|
@ -435,7 +435,7 @@ UINT8 P_FindLowestMare(void)
|
|||
// to find the egg capsule with the lowest mare
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -488,7 +488,7 @@ boolean P_TransferToNextMare(player_t *player)
|
|||
// to find the closest axis point
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -539,7 +539,7 @@ static mobj_t *P_FindAxis(INT32 mare, INT32 axisnum)
|
|||
// to find the closest axis point
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -574,7 +574,7 @@ static mobj_t *P_FindAxisTransfer(INT32 mare, INT32 axisnum, mobjtype_t type)
|
|||
// to find the closest axis point
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -615,7 +615,7 @@ void P_TransferToAxis(player_t *player, INT32 axisnum)
|
|||
// to find the closest axis point
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -716,7 +716,7 @@ static void P_DeNightserizePlayer(player_t *player)
|
|||
// Check to see if the player should be killed.
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -1899,7 +1899,7 @@ void P_SpawnShieldOrb(player_t *player)
|
|||
// blaze through the thinkers to see if an orb already exists!
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
shieldobj = (mobj_t *)th;
|
||||
|
@ -5112,7 +5112,7 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -6479,7 +6479,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad
|
|||
// Find next waypoint
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -6515,7 +6515,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad
|
|||
{
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -6544,7 +6544,7 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad
|
|||
{
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -7276,7 +7276,7 @@ static void P_NiGHTSMovement(player_t *player)
|
|||
// to find the closest axis point
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -8176,7 +8176,7 @@ void P_MovePlayer(player_t *player)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -9161,7 +9161,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
|
|||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
|
@ -9259,7 +9259,7 @@ mobj_t *P_LookForFocusTarget(player_t *player, mobj_t *exclude, SINT8 direction,
|
|||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
|
@ -9378,7 +9378,7 @@ mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet)
|
|||
|
||||
for (think = thlist[THINK_MOBJ].next; think != &thlist[THINK_MOBJ]; think = think->next)
|
||||
{
|
||||
if (think->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (think->removing)
|
||||
continue;
|
||||
|
||||
mo = (mobj_t *)think;
|
||||
|
@ -9524,7 +9524,7 @@ void P_FindEmerald(void)
|
|||
// to find all emeralds
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
@ -10925,7 +10925,7 @@ static mobj_t *P_GetAxis(INT32 num)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mobj = (mobj_t *)th;
|
||||
|
@ -12007,7 +12007,7 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
|
|
@ -2307,7 +2307,7 @@ void I_Sleep(UINT32 ms)
|
|||
|
||||
void I_SleepDuration(precise_t duration)
|
||||
{
|
||||
#if defined(__linux__) || defined(__FreeBSD__)
|
||||
#if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__)
|
||||
UINT64 precision = I_GetPrecisePrecision();
|
||||
struct timespec ts = {
|
||||
.tv_sec = duration / precision,
|
||||
|
|
|
@ -2655,7 +2655,7 @@ static boolean ST_doItemFinderIconsAndSound(void)
|
|||
// Scan thinkers to find emblem mobj with these ids
|
||||
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
|
||||
{
|
||||
if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed)
|
||||
if (th->removing)
|
||||
continue;
|
||||
|
||||
mo2 = (mobj_t *)th;
|
||||
|
|
21
src/w_wad.c
21
src/w_wad.c
|
@ -1358,17 +1358,6 @@ UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump)
|
|||
return i;
|
||||
}
|
||||
|
||||
// Returns 0 if the folder is not empty, 1 if it is empty, -1 if it doesn't exist
|
||||
INT32 W_IsFolderEmpty(const char *name, UINT16 wad)
|
||||
{
|
||||
UINT16 start = W_CheckNumForFolderStartPK3(name, wad, 0);
|
||||
if (start == INT16_MAX)
|
||||
return -1;
|
||||
|
||||
// Unlike W_CheckNumForFolderStartPK3, W_CheckNumForFolderEndPK3 doesn't return INT16_MAX.
|
||||
return W_CheckNumForFolderEndPK3(name, wad, start) <= start;
|
||||
}
|
||||
|
||||
char *W_GetLumpFolderPathPK3(UINT16 wad, UINT16 lump)
|
||||
{
|
||||
const char *fullname = wadfiles[wad]->lumpinfo[lump].fullname;
|
||||
|
@ -1733,10 +1722,14 @@ static UINT16 W_CheckNumForPatchNamePwad(const char *name, UINT16 wad, boolean l
|
|||
// TODO: cache namespace lump IDs
|
||||
if (W_FileHasFolders(wadfiles[wad]))
|
||||
{
|
||||
if (!W_IsFolderEmpty("Flats/", wad))
|
||||
start = W_CheckNumForFolderStartPK3("Flats/", wad, 0);
|
||||
end = W_CheckNumForFolderEndPK3("Flats/", wad, start);
|
||||
|
||||
// if the start and end is the same, the folder is empty
|
||||
if (end <= start)
|
||||
{
|
||||
start = W_CheckNumForFolderStartPK3("Flats/", wad, 0);
|
||||
end = W_CheckNumForFolderEndPK3("Flats/", wad, start);
|
||||
start = INT16_MAX;
|
||||
end = INT16_MAX;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -180,7 +180,6 @@ UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlu
|
|||
UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump);
|
||||
UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump);
|
||||
UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump);
|
||||
INT32 W_IsFolderEmpty(const char *name, UINT16 wad);
|
||||
char *W_GetLumpFolderPathPK3(UINT16 wad, UINT16 lump);
|
||||
char *W_GetLumpFolderNamePK3(UINT16 wad, UINT16 lump);
|
||||
|
||||
|
|
Loading…
Reference in a new issue