Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 21-installer-nodd
  • 2210-pre1
  • 2210-pre2
  • 2210-rc1
  • 2210-rc2
  • 2210-rc3
  • 2211-pre1
  • 2211-pre2
  • 2211-rc1
  • 2212-pre1
  • 2212-pre2
  • 2212-pre3
  • 2212-rc1
  • 2213
  • 2214-pre1
  • 2214-pre2
  • 2214-pre3
  • 2214-pre4
  • 2_2_12
  • 64-gl-log
  • COM_ImmedExecute-lua
  • DJGPP
  • accel-momentum
  • acs
  • action-args
  • alpha-fixes
  • any-resolution
  • appveyor
  • better-distance-math
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • bustablesoundz
  • cleanup-opengl
  • cleanupmusic
  • clipmidtex
  • cmake-valgrind
  • crawlacommander-sprites
  • custom-map-names
  • custom-teams
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • delfile2
  • deprecate-lua-dedicated-server
  • dpl-2
  • dropshadows-spawning
  • dynabsp
  • emblem-drawing
  • exchndl-xp-fix
  • extra-textures
  • few-kart-lua-changes
  • ffloorclip
  • fix-167
  • fix-cvar-conflicts
  • fix-opengl-parameter-crash
  • fix-opengl-shear-roll
  • flipfuncpointers
  • fof-lightlist-fixes
  • font-FUCK
  • frictionrefactor
  • fuck-macros-1
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • gametype-refactor
  • gametype-refactor-1
  • gametype-refactor-player-spawns
  • ghost-networking
  • gif-splitting
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-maxconditionsets
  • increase-packet-tics
  • input-display
  • input-display-translucency
  • io
  • joystick-juggling-maz
  • just-in-case
  • keycodes-only
  • ksf-wadfiles
  • ld413-mp-fix
  • levelstruct
  • libpng-version-support
  • linedef-actions
  • lj-test
  • lol-states
  • loopedsounds
  • lower-unpegged-fix
  • lua-change-gametype
  • lua-command-netids
  • lua-gfx-2
  • lua-gfx-sprites
  • lua-local
  • makefile-auto-mingw-gcc
  • makefile-tinkering
  • SRB2_release_2.1
  • SRB2_release_2.1.1
  • SRB2_release_2.1.10
  • SRB2_release_2.1.11
  • SRB2_release_2.1.12
  • SRB2_release_2.1.14
  • SRB2_release_2.1.15
  • SRB2_release_2.1.16
  • SRB2_release_2.1.16a
  • SRB2_release_2.1.17
  • SRB2_release_2.1.18
  • SRB2_release_2.1.19
  • SRB2_release_2.1.2
  • SRB2_release_2.1.20
  • SRB2_release_2.1.21
  • SRB2_release_2.1.22
  • SRB2_release_2.1.23
  • SRB2_release_2.1.24
  • SRB2_release_2.1.25
  • SRB2_release_2.1.3
  • SRB2_release_2.1.4
  • SRB2_release_2.1.5
  • SRB2_release_2.1.6
  • SRB2_release_2.1.7
  • SRB2_release_2.1.8
  • SRB2_release_2.1.9
  • SRB2_release_2.2.0
  • SRB2_release_2.2.1
  • SRB2_release_2.2.10
  • SRB2_release_2.2.11
  • SRB2_release_2.2.12
  • SRB2_release_2.2.13
  • SRB2_release_2.2.15
  • SRB2_release_2.2.2
  • SRB2_release_2.2.3
  • SRB2_release_2.2.4
  • SRB2_release_2.2.5
  • SRB2_release_2.2.6
  • SRB2_release_2.2.7
  • SRB2_release_2.2.8
  • SRB2_release_2.2.9
  • td-release-v1.0.0
142 results

Target

Select target project
  • STJr/SRB2
  • Sryder/SRB2
  • wolfy852/SRB2
  • Alpha2244/SRB2
  • Inuyasha/SRB2
  • yoshibot/SRB2
  • TehRealSalt/SRB2
  • PrisimaTF/SRB2
  • Hatninja/SRB2
  • SteelT/SRB2
  • james/SRB2
  • ShaderWraith/SRB2
  • SinnamonLat/SRB2
  • mazmazz_/SRB2
  • filpAM/SRB2
  • chaoloveicemdboy/SRB2
  • Whooa21/SRB2
  • Machturne/SRB2
  • Golden/SRB2
  • Tatsuru/SRB2
  • Snu/SRB2
  • Zwip-Zwap_Zapony/SRB2
  • fickleheart/SRB2
  • alphaRexJames/SRB2
  • JJK/SRB2
  • diskpoppy/SRB2
  • Hannu_Hanhi/SRB2
  • ZipperQR/SRB2
  • kays/SRB2
  • spherallic/SRB2
  • Zippy_Zolton/SRB2
  • namiishere/SRB2
  • Ors/SRB2
  • SMS_Alfredo/SRB2
  • sonic_edge/SRB2
  • lavla/SRB2
  • ashi/SRB2
  • X.organic/SRB2
  • Fafabis/SRB2
  • Meziu/SRB2
  • v-rob/SRB2
  • tertu/SRB2
  • bitten2up/SRB2
  • flarn2006/SRB2
  • Krabs/SRB2
  • clairebun/SRB2
  • Lactozilla/SRB2
  • thehackstack/SRB2
  • Spice/SRB2
  • win8linux/SRB2
  • JohnFrostFox/SRB2
  • talktoneon726/SRB2
  • Wane/SRB2
  • Lamibe/SRB2
  • spectrumuk2/srb-2
  • nerdyminer18/srb-2
  • 256nil/SRB2
  • ARJr/SRB2
  • Alam/SRB2
  • Zenya/srb-2-marathon-demos
  • Acelite/srb-2-archivedmodifications
  • MIDIMan/SRB2
  • Lach/SRB2
  • Frostiikin/bounce-tweaks
  • Jaden/SRB2
  • Tyron/SRB2
  • Astronight/SRB2
  • Mari0shi06/SRB2
  • aiire/SRB2
  • Galactice/SRB2
  • srb2-ports/srb2-dreamcast
  • sdasdas/SRB2
  • chreas/srb-2-vr
  • StarManiaKG/the-story-of-sinically-rocketing-and-botching-the-2nd
  • LoganAir/SRB2
  • NepDisk/srb-2
  • alufolie91/SRB2
  • Felicia.iso/SRB2
  • twi/SRB2
  • BarrelsOFun/SRB2
  • Speed2411/SRB2
  • Leather_Realms/SRB2
  • Ayemar/SRB2
  • Acelite/SRB2
  • VladDoc/SRB2
  • kaldrum/model-features
  • strawberryfox417/SRB2
  • Lugent/SRB2
  • Rem/SRB2
  • Refrag/SRB2
  • Henry_3230/srb-3230
  • TehPuertoRicanSpartan2/tprs-srb2
  • Leminn/srb-2-marathon-stuff
  • chromaticpipe2/SRB2
  • MiguelGustavo15/SRB2
  • Maru/srb-2-tests
  • SilicDev/SRB2
  • UnmatchedBracket/SRB2
  • HybridDog/SRB2
  • xordspar0/SRB2
  • jsjhbewfhh/SRB2
  • Fancy2209/SRB2
  • Lorsoen/SRB2
  • shindoukin/SRB2
  • GamerOfDays/SRB2
  • Craftyawesome/SRB2
  • tenshi-tensai-tennoji/SRB2
  • Scarfdudebalder/SRB2
  • luigi-budd/srb-2-fix-interplag-lockon
  • mskluesner/SRB2
  • johnpetersa19/SRB2
  • Pheazant/SRB2
  • chromaticpipe2/srb2classic
  • romoney5/SRB2
  • PAS/SRB2Classic
  • BlueStaggo/SRB2
  • Jisk/srb-2-beef-jerky
  • voltybystorm/SRB2
  • ZenithNeko/srb-2-xp
  • Nep2Disk/SRB2
  • Cloudeon/SRB2
121 results
Select Git revision
  • 21-installer-nodd
  • 2210-pre1
  • 2210-pre2
  • 2210-rc1
  • 2210-rc2
  • 2210-rc3
  • 2211-pre1
  • 2211-pre2
  • 622-teamlives-hud
  • 64-gl-log
  • COM_ImmedExecute-lua
  • DJGPP
  • accel-momentum
  • add-arg-passing-alias
  • add-forth-interpreter
  • add-ipv6-indicator
  • add-namechange-lua-hook
  • add-server-pm-logging
  • add-textinput-hook
  • add-unblockable-console-key
  • alien-breed-3d
  • allow-non-important-files-dedicated
  • allow-percent-ipv6-address
  • appveyor
  • avoid-double-checkmobjtrigger-call
  • avoid-frame-cap-busywait
  • bbox
  • bbox-tweaks
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • botchanges
  • bustablemobjzfix
  • bustablesoundz
  • checksector-refactor
  • cleanup-opengl
  • cleanupmusic
  • close-connection-timeout
  • cmake-clang-tidy
  • cmake-enable-cxx
  • cmake-valgrind
  • compile-ffast-math
  • crawlacommander-sprites
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • deprecate-lua-dedicated-server
  • doomcom-global-refactor
  • dpl-2
  • dropshadows-spawning
  • emblem-drawing
  • ensure-ackpak-response
  • exchndl-xp-fix
  • few-kart-lua-changes
  • ffloorclip
  • fix-acknum-not-incrementing
  • fix-bot-2pai-desync
  • fix-compiler-error-touch
  • fix-cvar-conflicts
  • fix-dedicated-segfault
  • fix-move-mobj-reference
  • fix-netxcmd-integer-overflow
  • fix-opengl-shear-roll
  • fix-removemobj-seesound
  • fix-silver-segfault
  • fix-tty-not-resetting-properly
  • fix-unack-lockup
  • flipfuncpointers
  • floorsprite-and-shadow-fake-planes-fix
  • fof-lightlist-fixes
  • font-FUCK
  • font_drawer
  • forceverticalflipflag
  • forkmaster
  • frictionrefactor
  • fuck-macros-1
  • fullscreen-toggle
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • ghost-networking
  • gif-splitting
  • gitlab-ci
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-packet-tics
  • increase-unlockables
  • inline-mobjwasremoved
  • input-display
  • input-display-translucency
  • io
  • io-limit
  • ipv6
  • joystick-juggling-maz
  • keycodes-only
  • ksf-wadfiles
  • SRB2_release_2.1
  • SRB2_release_2.1.1
  • SRB2_release_2.1.10
  • SRB2_release_2.1.11
  • SRB2_release_2.1.12
  • SRB2_release_2.1.14
  • SRB2_release_2.1.15
  • SRB2_release_2.1.16
  • SRB2_release_2.1.16a
  • SRB2_release_2.1.17
  • SRB2_release_2.1.18
  • SRB2_release_2.1.19
  • SRB2_release_2.1.2
  • SRB2_release_2.1.20
  • SRB2_release_2.1.21
  • SRB2_release_2.1.22
  • SRB2_release_2.1.23
  • SRB2_release_2.1.24
  • SRB2_release_2.1.25
  • SRB2_release_2.1.3
  • SRB2_release_2.1.4
  • SRB2_release_2.1.5
  • SRB2_release_2.1.6
  • SRB2_release_2.1.7
  • SRB2_release_2.1.8
  • SRB2_release_2.1.9
  • SRB2_release_2.2.0
  • SRB2_release_2.2.1
  • SRB2_release_2.2.10
  • SRB2_release_2.2.2
  • SRB2_release_2.2.3
  • SRB2_release_2.2.4
  • SRB2_release_2.2.5
  • SRB2_release_2.2.6
  • SRB2_release_2.2.7
  • SRB2_release_2.2.8
  • SRB2_release_2.2.9
  • td-release-v1.0.0
138 results
Show changes
Showing with 1399 additions and 818 deletions
......@@ -60,7 +60,6 @@ extern netnode_t netnodes[MAXNETNODES];
extern boolean serverrunning;
INT32 Net_GetFreeAcks(boolean urgent);
void Net_AckTicker(void);
// If reliable return true if packet sent, 0 else
......
......@@ -320,7 +320,7 @@ consvar_t cv_overtime = CVAR_INIT ("overtime", "Yes", CV_SAVE|CV_NETVAR|CV_ALLOW
consvar_t cv_rollingdemos = CVAR_INIT ("rollingdemos", "On", CV_SAVE, CV_OnOff, NULL);
static CV_PossibleValue_t timetic_cons_t[] = {{0, "Classic"}, {1, "Centiseconds"}, {2, "Mania"}, {3, "Tics"}, {0, NULL}};
consvar_t cv_timetic = CVAR_INIT ("timerres", "Classic", CV_SAVE, timetic_cons_t, NULL);
consvar_t cv_timetic = CVAR_INIT ("timerres", "Mania", CV_SAVE, timetic_cons_t, NULL);
static CV_PossibleValue_t powerupdisplay_cons_t[] = {{0, "Never"}, {1, "First-person only"}, {2, "Always"}, {0, NULL}};
consvar_t cv_powerupdisplay = CVAR_INIT ("powerupdisplay", "First-person only", CV_SAVE, powerupdisplay_cons_t, NULL);
......@@ -372,10 +372,10 @@ static CV_PossibleValue_t cooplives_cons_t[] = {{0, "Infinite"}, {1, "Per-player
consvar_t cv_cooplives = CVAR_INIT ("cooplives", "Avoid Game Over", CV_SAVE|CV_NETVAR|CV_CALL|CV_CHEAT|CV_ALLOWLUA, cooplives_cons_t, CoopLives_OnChange);
static CV_PossibleValue_t advancemap_cons_t[] = {{0, "Off"}, {1, "Next"}, {2, "Random"}, {0, NULL}};
consvar_t cv_advancemap = CVAR_INIT ("advancemap", "Next", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, advancemap_cons_t, NULL);
consvar_t cv_advancemap = CVAR_INIT ("advancemap", "Random", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, advancemap_cons_t, NULL);
static CV_PossibleValue_t playersforexit_cons_t[] = {{0, "One"}, {1, "1/4"}, {2, "Half"}, {3, "3/4"}, {4, "All"}, {0, NULL}};
consvar_t cv_playersforexit = CVAR_INIT ("playersforexit", "All", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, playersforexit_cons_t, NULL);
consvar_t cv_playersforexit = CVAR_INIT ("playersforexit", "3/4", CV_SAVE|CV_NETVAR|CV_ALLOWLUA, playersforexit_cons_t, NULL);
consvar_t cv_exitmove = CVAR_INIT ("exitmove", "On", CV_SAVE|CV_NETVAR|CV_CALL|CV_ALLOWLUA, CV_OnOff, ExitMove_OnChange);
......@@ -1170,6 +1170,13 @@ static void SetPlayerName(INT32 playernum, char *newname)
{
if (strcasecmp(newname, player_names[playernum]) != 0)
{
if (!LUA_HookNameChange(&players[playernum], newname))
{
// Name change rejected by Lua
if (playernum == consoleplayer)
CV_StealthSet(&cv_playername, player_names[consoleplayer]);
return;
}
if (netgame)
HU_AddChatText(va("\x82*%s renamed to %s", player_names[playernum], newname), false);
......@@ -4253,9 +4260,9 @@ void D_GameTypeChanged(INT32 lastgametype)
case GT_TEAMMATCH:
if (!cv_timelimit.changed && !cv_pointlimit.changed) // user hasn't changed limits
{
// default settings for match: timelimit 10 mins, no pointlimit
// default settings for match: timelimit 7 mins, no pointlimit
CV_SetValue(&cv_pointlimit, 0);
CV_SetValue(&cv_timelimit, 10);
CV_SetValue(&cv_timelimit, 7);
}
if (!cv_itemrespawntime.changed)
CV_Set(&cv_itemrespawntime, cv_itemrespawntime.defaultvalue); // respawn normally
......@@ -4264,9 +4271,9 @@ void D_GameTypeChanged(INT32 lastgametype)
case GT_HIDEANDSEEK:
if (!cv_timelimit.changed && !cv_pointlimit.changed) // user hasn't changed limits
{
// default settings for tag: 5 mins, no pointlimit
// default settings for tag: 7 mins, no pointlimit
// Note that tag mode also uses an alternate timing mechanism in tandem with timelimit.
CV_SetValue(&cv_timelimit, 5);
CV_SetValue(&cv_timelimit, 7);
CV_SetValue(&cv_pointlimit, 0);
}
if (!cv_itemrespawntime.changed)
......@@ -4275,8 +4282,8 @@ void D_GameTypeChanged(INT32 lastgametype)
case GT_CTF:
if (!cv_timelimit.changed && !cv_pointlimit.changed) // user hasn't changed limits
{
// default settings for CTF: no timelimit, pointlimit 5
CV_SetValue(&cv_timelimit, 0);
// default settings for CTF: 15 mins, pointlimit 5
CV_SetValue(&cv_timelimit, 15);
CV_SetValue(&cv_pointlimit, 5);
}
if (!cv_itemrespawntime.changed)
......@@ -4399,7 +4406,7 @@ static void SoundTest_OnChange(void)
}
S_StopSounds();
S_StartSound(NULL, cv_soundtest.value);
S_StartSoundFromEverywhere(cv_soundtest.value);
}
static void AutoBalance_OnChange(void)
......@@ -4811,7 +4818,7 @@ static void Command_Archivetest_f(void)
// assign mobjnum
i = 1;
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
if (th->function.acp1 != (actionf_p1)P_RemoveThinkerDelayed)
if (th->function != (actionf_p1)P_RemoveThinkerDelayed)
((mobj_t *)th)->mobjnum = i++;
// allocate buffer
......
......@@ -112,6 +112,7 @@ static pauseddownload_t *pauseddownload = NULL;
file_download_t filedownload;
static CURL *http_handle;
static char curl_errbuf[CURL_ERROR_SIZE];
static CURLM *multi_handle;
static UINT32 curl_dlnow;
static UINT32 curl_dltotal;
......@@ -129,7 +130,7 @@ boolean waitingforluafilecommand = false;
char luafiledir[256 + 16] = "luafiles";
// max file size to send to a player (in kilobytes)
static CV_PossibleValue_t maxsend_cons_t[] = {{0, "MIN"}, {204800, "MAX"}, {0, NULL}};
static CV_PossibleValue_t maxsend_cons_t[] = {{-1, "MIN"}, {999999999, "MAX"}, {0, NULL}};
consvar_t cv_maxsend = CVAR_INIT ("maxsend", "4096", CV_SAVE|CV_NETVAR, maxsend_cons_t, NULL);
consvar_t cv_noticedownload = CVAR_INIT ("noticedownload", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL);
......@@ -206,10 +207,10 @@ UINT8 *PutFileNeeded(UINT16 firstfile)
// Store in the upper four bits
if (!cv_downloading.value)
filestatus += (WILLSEND_NO << 4); // Won't send
else if (wadfiles[i]->filesize <= (UINT32)cv_maxsend.value * 1024)
else if (cv_maxsend.value == -1 || wadfiles[i]->filesize <= (UINT32)cv_maxsend.value * 1024)
filestatus += (WILLSEND_YES << 4); // Will send if requested
// else
// filestatus += (0 << 4); -- Won't send, too big
else
filestatus += (WILLSEND_TOOLARGE << 4); // Won't send, too big
}
WRITEUINT8(p, filestatus);
......@@ -849,7 +850,7 @@ static boolean AddFileToSendQueue(INT32 node, UINT8 fileid)
strlcpy(p->id.filename, wadfiles[wadnum]->filename, MAX_WADPATH);
// Handle huge file requests (i.e. bigger than cv_maxsend.value KB)
if (wadfiles[wadnum]->filesize > (UINT32)cv_maxsend.value * 1024)
if (cv_maxsend.value != -1 && wadfiles[wadnum]->filesize > (UINT32)cv_maxsend.value * 1024)
{
// Too big
// Don't inform client (client sucks, man)
......@@ -1604,6 +1605,10 @@ static int curlprogress_callback(void *clientp, curl_off_t dltotal, curl_off_t d
boolean CURLPrepareFile(const char* url, int dfilenum)
{
HTTP_login *login;
CURLcode cc;
if (!I_can_thread())
return false;
#ifdef PARANOIA
if (M_CheckParm("-nodownload"))
......@@ -1612,13 +1617,32 @@ boolean CURLPrepareFile(const char* url, int dfilenum)
if (!multi_handle)
{
curl_global_init(CURL_GLOBAL_ALL);
cc = curl_global_init(CURL_GLOBAL_ALL);
if (cc < 0)
{
I_OutputMsg("libcurl: curl_global_init() returned %d\n", cc);
}
else
{
multi_handle = curl_multi_init();
}
if (!multi_handle)
{
I_OutputMsg("libcurl: curl_multi_init() failed\n");
curl_global_cleanup();
return false;
}
}
http_handle = curl_easy_init();
if (http_handle && multi_handle)
if (http_handle)
{
CURLMcode mc;
cc = curl_easy_setopt(http_handle, CURLOPT_ERRORBUFFER, curl_errbuf);
if (cc != CURLE_OK) I_OutputMsg("libcurl: CURLOPT_ERRORBUFFER failed\n");
curl_errbuf[0] = 0x00;
I_mkdir(downloaddir, 0755);
curl_curfile = &fileneeded[dfilenum];
......@@ -1632,50 +1656,76 @@ boolean CURLPrepareFile(const char* url, int dfilenum)
for (INT32 j = 0; j < 16; j++)
sprintf(&md5tmp[j*2], "%02x", curl_curfile->md5sum[j]);
curl_easy_setopt(http_handle, CURLOPT_URL, va("%s/%s?md5=%s", url, curl_realname, md5tmp));
cc = curl_easy_setopt(http_handle, CURLOPT_URL, va("%s/%s?md5=%s", url, curl_realname, md5tmp));
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
// Only allow HTTP and HTTPS
#if (LIBCURL_VERSION_MAJOR <= 7) && (LIBCURL_VERSION_MINOR < 85)
curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP|CURLPROTO_HTTPS);
cc = curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP|CURLPROTO_HTTPS);
#else
curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS_STR, "http,https");
cc = curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS_STR, "http,https");
#endif
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
// Set user agent, as some servers won't accept invalid user agents.
curl_easy_setopt(http_handle, CURLOPT_USERAGENT, va("Sonic Robo Blast 2/%s", VERSIONSTRING));
cc = curl_easy_setopt(http_handle, CURLOPT_USERAGENT, va("Sonic Robo Blast 2/%s", VERSIONSTRING));
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
// Authenticate if the user so wishes
login = CURLGetLogin(url, NULL);
if (login)
{
curl_easy_setopt(http_handle, CURLOPT_USERPWD, login->auth);
cc = curl_easy_setopt(http_handle, CURLOPT_USERPWD, login->auth);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
}
// Follow a redirect request, if sent by the server.
curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 1L);
cc = curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 1L);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
curl_easy_setopt(http_handle, CURLOPT_FAILONERROR, 1L);
cc = curl_easy_setopt(http_handle, CURLOPT_FAILONERROR, 1L);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
CONS_Printf("Downloading addon \"%s\" from %s\n", curl_realname, url);
strcatbf(curl_curfile->filename, downloaddir, "/");
curl_curfile->file = fopen(curl_curfile->filename, "wb");
curl_easy_setopt(http_handle, CURLOPT_WRITEDATA, curl_curfile->file);
curl_easy_setopt(http_handle, CURLOPT_WRITEFUNCTION, curlwrite_data);
curl_easy_setopt(http_handle, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(http_handle, CURLOPT_XFERINFOFUNCTION, curlprogress_callback);
cc = curl_easy_setopt(http_handle, CURLOPT_WRITEDATA, curl_curfile->file);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
cc = curl_easy_setopt(http_handle, CURLOPT_WRITEFUNCTION, curlwrite_data);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
cc = curl_easy_setopt(http_handle, CURLOPT_NOPROGRESS, 0L);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
cc = curl_easy_setopt(http_handle, CURLOPT_XFERINFOFUNCTION, curlprogress_callback);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
curl_curfile->status = FS_DOWNLOADING;
curl_multi_add_handle(multi_handle, http_handle);
curl_multi_perform(multi_handle, &curl_runninghandles);
mc = curl_multi_add_handle(multi_handle, http_handle);
if (mc != CURLM_OK) I_OutputMsg("libcurl: %s\n", curl_multi_strerror(mc));
mc = curl_multi_perform(multi_handle, &curl_runninghandles);
if (mc != CURLM_OK) I_OutputMsg("libcurl: %s\n", curl_multi_strerror(mc));
curl_starttime = time(NULL);
filedownload.current = dfilenum;
filedownload.http_running = true;
I_spawn_thread("http-download", (I_thread_fn)CURLGetFile, NULL);
if (!I_spawn_thread("http-download", (I_thread_fn)CURLGetFile, NULL))
{
mc = curl_multi_cleanup(multi_handle);
if (mc != CURLM_OK) I_OutputMsg("libcurl: %s\n", curl_multi_strerror(mc));
curl_global_cleanup();
multi_handle = NULL;
filedownload.http_running = false;
return false;
}
return true;
}
......@@ -1709,14 +1759,15 @@ void CURLGetFile(void)
{
if (curl_runninghandles)
{
curl_multi_perform(multi_handle, &curl_runninghandles);
mc = curl_multi_perform(multi_handle, &curl_runninghandles);
if (mc != CURLM_OK) I_OutputMsg("libcurl: %s\n", curl_multi_strerror(mc));
/* wait for activity, timeout or "nothing" */
mc = curl_multi_wait(multi_handle, NULL, 0, 1000, NULL);
if (mc != CURLM_OK)
{
CONS_Alert(CONS_WARNING, "curl_multi_wait() failed, code %d.\n", mc);
CONS_Alert(CONS_WARNING, "curl_multi_wait() failed: %s.\n", curl_multi_strerror(mc));
continue;
}
curl_curfile->currentsize = curl_dlnow;
......@@ -1740,7 +1791,10 @@ void CURLGetFile(void)
long response_code = 0;
if (easyres == CURLE_HTTP_RETURNED_ERROR)
curl_easy_getinfo(e, CURLINFO_RESPONSE_CODE, &response_code);
{
CURLcode cc = curl_easy_getinfo(e, CURLINFO_RESPONSE_CODE, &response_code);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", curl_errbuf);
}
if (response_code == 404)
curl_curfile->failed = FDOWNLOAD_FAIL_NOTFOUND;
......@@ -1781,7 +1835,8 @@ void CURLGetFile(void)
curl_curfile->file = NULL;
filedownload.remaining--;
curl_multi_remove_handle(multi_handle, e);
mc = curl_multi_remove_handle(multi_handle, e);
if (mc != CURLM_OK) I_OutputMsg("libcurl: %s\n", curl_multi_strerror(mc));
curl_easy_cleanup(e);
if (!filedownload.remaining)
......@@ -1792,7 +1847,8 @@ void CURLGetFile(void)
if (!filedownload.remaining || !filedownload.http_running)
{
curl_multi_cleanup(multi_handle);
mc = curl_multi_cleanup(multi_handle);
if (mc != CURLM_OK) I_OutputMsg("libcurl: %s\n", curl_multi_strerror(mc));
curl_global_cleanup();
multi_handle = NULL;
}
......
......@@ -95,6 +95,7 @@ typedef struct
INT32 remaining;
INT32 completednum;
UINT32 completedsize;
UINT64 totalsize;
boolean http_failed;
boolean http_running;
......
......@@ -63,12 +63,14 @@ consvar_t cv_masterserver_token = CVAR_INIT
static int hms_started;
static boolean hms_args_checked;
#ifndef NO_IPV6
static boolean hms_allow_ipv6;
#endif
static boolean hms_allow_ipv4;
static char *hms_api;
#ifdef HAVE_THREADS
static I_mutex hms_api_mutex;
#endif
static char *hms_server_token;
#ifndef NO_IPV6
......@@ -83,6 +85,7 @@ struct HMS_buffer
char *buffer;
int needle;
int end;
char *errbuf;
};
static void
......@@ -134,6 +137,18 @@ HMS_on_read (char *s, size_t _1, size_t n, void *userdata)
return n;
}
static void HMS_check_args_once(void)
{
if (hms_args_checked)
return;
#ifndef NO_IPV6
hms_allow_ipv6 = !M_CheckParm("-noipv6");
#endif
hms_allow_ipv4 = !M_CheckParm("-noipv4");
hms_args_checked = true;
}
FUNCDEBUG static struct HMS_buffer *
HMS_connect (int proto, const char *format, ...)
{
......@@ -144,6 +159,7 @@ HMS_connect (int proto, const char *format, ...)
size_t seek;
size_t token_length;
struct HMS_buffer *buffer;
CURLcode cc;
#ifdef NO_IPV6
if (proto == PROTO_V6)
......@@ -152,7 +168,6 @@ HMS_connect (int proto, const char *format, ...)
if (! hms_started)
{
hms_allow_ipv6 = !M_CheckParm("-noipv6");
if (curl_global_init(CURL_GLOBAL_ALL) != 0)
{
Contact_error();
......@@ -186,9 +201,7 @@ HMS_connect (int proto, const char *format, ...)
token_length = 0;
}
#ifdef HAVE_THREADS
I_lock_mutex(&hms_api_mutex);
#endif
init_user_agent_once();
......@@ -200,9 +213,7 @@ HMS_connect (int proto, const char *format, ...)
sprintf(url, "%s/", hms_api);
#ifdef HAVE_THREADS
I_unlock_mutex(hms_api_mutex);
#endif
va_start (ap, format);
seek += vsprintf(&url[seek], format, ap);
......@@ -218,33 +229,65 @@ HMS_connect (int proto, const char *format, ...)
buffer->end = DEFAULT_BUFFER_SIZE;
buffer->buffer = malloc(buffer->end);
buffer->needle = 0;
buffer->errbuf = malloc(CURL_ERROR_SIZE);
buffer->errbuf[0] = 0x00;
cc = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, buffer->errbuf);
if (cv_masterserver_debug.value)
{
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_STDERR, logstream);
cc = curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
cc = curl_easy_setopt(curl, CURLOPT_STDERR, logstream);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
}
cc = curl_easy_setopt(curl, CURLOPT_URL, url);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
cc = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
#ifndef NO_IPV6
if (proto == PROTO_V6 || (proto == PROTO_ANY && !hms_allow_ipv4))
{
cc = curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
if (M_CheckParm("-bindaddr6") && M_IsNextParm())
{
cc = curl_easy_setopt(curl, CURLOPT_INTERFACE, M_GetNextParm());
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
}
}
if (proto == PROTO_V4 || (proto == PROTO_ANY && !hms_allow_ipv6))
#endif
{
cc = curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
if (M_CheckParm("-bindaddr") && M_IsNextParm())
{
curl_easy_setopt(curl, CURLOPT_INTERFACE, M_GetNextParm());
cc = curl_easy_setopt(curl, CURLOPT_INTERFACE, M_GetNextParm());
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
}
}
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
cc = curl_easy_setopt(curl, CURLOPT_TIMEOUT, cv_masterserver_timeout.value);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
#ifndef NO_IPV6
if (proto == PROTO_V6)
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
if (proto == PROTO_V4)
#endif
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
cc = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 30L);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
cc = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HMS_on_read);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, cv_masterserver_timeout.value);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HMS_on_read);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
cc = curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
curl_easy_setopt(curl, CURLOPT_USERAGENT, hms_useragent);
cc = curl_easy_setopt(curl, CURLOPT_USERAGENT, hms_useragent);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
curl_free(quack_token);
free(url);
......@@ -266,15 +309,15 @@ HMS_do (struct HMS_buffer *buffer)
{
Contact_error();
Blame(
"From curl_easy_perform: %s\n",
curl_easy_strerror(cc)
"From curl_easy_perform: %s\n", buffer->errbuf
);
return 0;
}
buffer->buffer[buffer->needle] = '\0';
curl_easy_getinfo(buffer->curl, CURLINFO_RESPONSE_CODE, &status);
cc = curl_easy_getinfo(buffer->curl, CURLINFO_RESPONSE_CODE, &status);
if (cc != CURLE_OK) I_OutputMsg("libcurl: %s\n", buffer->errbuf);
if (status != 200)
{
......@@ -326,6 +369,8 @@ HMS_fetch_rooms (int joining, int query_id)
(void)query_id;
HMS_check_args_once();
hms = HMS_connect(PROTO_ANY, "rooms");
if (! hms)
......@@ -355,7 +400,6 @@ HMS_fetch_rooms (int joining, int query_id)
*/
if (joining || id_no != 0)
{
#ifdef HAVE_THREADS
I_lock_mutex(&ms_QueryId_mutex);
{
if (query_id != ms_QueryId)
......@@ -365,7 +409,6 @@ HMS_fetch_rooms (int joining, int query_id)
if (! doing_shit)
break;
#endif
room_list[i].header.buffer[0] = 1;
......@@ -389,9 +432,7 @@ HMS_fetch_rooms (int joining, int query_id)
if (doing_shit)
{
#ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex);
#endif
{
for (i = 0; room_list[i].header.buffer[0]; i++)
{
......@@ -403,9 +444,7 @@ HMS_fetch_rooms (int joining, int query_id)
}
}
}
#ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex);
#endif
}
}
else
......@@ -420,18 +459,15 @@ int
HMS_register (void)
{
struct HMS_buffer *hms;
int ok;
int ok = 0;
char post[256];
char *title;
hms = HMS_connect(PROTO_V4, "rooms/%d/register", cv_masterserver_room_id.value);
HMS_check_args_once();
if (! hms)
return 0;
title = curl_easy_escape(hms->curl, cv_servername.string, 0);
title = curl_easy_escape(NULL, cv_servername.string, 0);
snprintf(post, sizeof post,
"port=%d&"
......@@ -447,6 +483,13 @@ HMS_register (void)
curl_free(title);
if (hms_allow_ipv4)
{
hms = HMS_connect(PROTO_V4, "rooms/%d/register", cv_masterserver_room_id.value);
if (! hms)
return 0;
curl_easy_setopt(hms->curl, CURLOPT_POSTFIELDS, post);
ok = HMS_do(hms);
......@@ -457,6 +500,7 @@ HMS_register (void)
}
HMS_end(hms);
}
#ifndef NO_IPV6
if (!hms_allow_ipv6)
......@@ -488,7 +532,9 @@ HMS_unlist (void)
struct HMS_buffer *hms;
int ok = 0;
if (hms_server_token)
HMS_check_args_once();
if (hms_server_token && hms_allow_ipv4)
{
hms = HMS_connect(PROTO_V4, "servers/%s/unlist", hms_server_token);
......@@ -535,6 +581,7 @@ HMS_update (void)
char *title;
HMS_check_args_once();
title = curl_easy_escape(NULL, cv_servername.string, 0);
snprintf(post, sizeof post,
......@@ -544,7 +591,7 @@ HMS_update (void)
curl_free(title);
if (hms_server_token)
if (hms_server_token && hms_allow_ipv4)
{
hms = HMS_connect(PROTO_V4, "servers/%s/update", hms_server_token);
......@@ -583,6 +630,8 @@ HMS_list_servers (void)
char *list;
char *p;
HMS_check_args_once();
hms = HMS_connect(PROTO_ANY, "servers");
if (! hms)
......@@ -628,6 +677,8 @@ HMS_fetch_servers (msg_server_t *list, int room_number, int query_id)
int i;
HMS_check_args_once();
(void)query_id;
if (room_number > 0)
......@@ -674,7 +725,6 @@ HMS_fetch_servers (msg_server_t *list, int room_number, int query_id)
if (address && port && title && version)
{
#ifdef HAVE_THREADS
I_lock_mutex(&ms_QueryId_mutex);
{
if (query_id != ms_QueryId)
......@@ -684,7 +734,6 @@ HMS_fetch_servers (msg_server_t *list, int room_number, int query_id)
if (! doing_shit)
break;
#endif
if (strcmp(version, local_version) == 0)
{
......@@ -739,6 +788,8 @@ HMS_compare_mod_version (char *buffer, size_t buffer_size)
char *version;
char *version_name;
HMS_check_args_once();
hms = HMS_connect(PROTO_ANY, "versions/%d", MODID);
if (! hms)
......@@ -771,16 +822,12 @@ HMS_compare_mod_version (char *buffer, size_t buffer_size)
void
HMS_set_api (char *api)
{
#ifdef HAVE_THREADS
I_lock_mutex(&hms_api_mutex);
#endif
{
free(hms_api);
hms_api = api;
}
#ifdef HAVE_THREADS
I_unlock_mutex(hms_api_mutex);
#endif
}
#endif/*MASTERSERVER*/
......
......@@ -44,15 +44,6 @@ typedef struct
/// Number of bytes in doomdata to be sent
INT16 datalength;
/// Info common to all nodes.
/// Console is always node 0.
INT16 numnodes;
/// Flag: 1 = send a backup tic in every packet.
INT16 extratics;
/// Number of "slots": the highest player number in use plus one.
INT16 numslots;
/// The packet data to be sent.
char data[MAXPACKETLENGTH];
} ATTRPACK doomcom_t;
......@@ -61,6 +52,18 @@ typedef struct
#pragma pack()
#endif
/** \brief Number of connected nodes.
*/
extern INT16 numnetnodes;
/** \brief Number of "slots": the highest player number in use plus one.
*/
extern INT16 numslots;
/** \brief Flag: 1 = send a backup tic in every packet.
*/
extern INT16 extratics;
extern doomcom_t *doomcom;
/** \brief return packet in doomcom struct
......
// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
// Copyright (C) 1998-2000 by DooM Legacy Team.
// Copyright (C) 1999-2024 by Sonic Team Junior.
// Copyright (C) 1999-2025 by Sonic Team Junior.
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......@@ -274,9 +274,18 @@ static void init_upnpc_once(struct upnpdata *upnpdata);
static void I_InitUPnP(void)
{
if (!I_can_thread())
{
UPNP_support = false;
return;
}
upnpuser = malloc(sizeof *upnpuser);
upnpuser->upnpc_started = 0;
I_spawn_thread("init_upnpc_once", (I_thread_fn)init_upnpc_once, upnpuser);
if (!I_spawn_thread("init_upnpc_once", (I_thread_fn)init_upnpc_once, upnpuser))
{
UPNP_support = false;
free(upnpuser);
}
}
static void
......@@ -386,6 +395,7 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk)
int v6 = 0;
#endif
void *addr;
int e = 0; // save error code so it can't be modified later code and avoid calling WSAGetLastError() more then once
if(sk->any.sa_family == AF_INET)
addr = &sk->ip4.sin_addr;
......@@ -399,7 +409,10 @@ static const char *SOCK_AddrToStr(mysockaddr_t *sk)
if(addr == NULL)
sprintf(s, "No address");
else if(inet_ntop(sk->any.sa_family, addr, &s[v6], sizeof (s) - v6) == NULL)
sprintf(s, "Unknown family type, error #%u", errno);
{
e = errno;
sprintf(s, "Unknown family type, error #%u: %s", e, strerror(e));
}
#ifdef HAVE_IPV6
else if(sk->any.sa_family == AF_INET6)
{
......@@ -456,6 +469,8 @@ static boolean SOCK_cmpipv6(mysockaddr_t *a, mysockaddr_t *b, UINT8 mask)
{
UINT8 bitmask;
I_Assert(mask <= 128);
if (mask == 0)
mask = 128;
if (memcmp(&a->ip6.sin6_addr.s6_addr, &b->ip6.sin6_addr.s6_addr, mask / 8) != 0)
return false;
if (mask % 8 == 0)
......@@ -650,11 +665,12 @@ static inline ssize_t SOCK_SendToAddr(SOCKET_TYPE socket, mysockaddr_t *sockaddr
return sendto(socket, (char *)&doomcom->data, doomcom->datalength, 0, &sockaddr->any, d);
}
#define ALLOWEDERROR(x) ((x) == ECONNREFUSED || (x) == EWOULDBLOCK || (x) == EHOSTUNREACH || (x) == ENETUNREACH)
#define ALLOWEDERROR(x) ((x) == ECONNREFUSED || (x) == EWOULDBLOCK || (x) == EHOSTUNREACH || (x) == ENETUNREACH || (x) == EADDRNOTAVAIL)
static void SOCK_Send(void)
{
ssize_t c = ERRSOCKET;
int e = 0; // save error code so it can't be modified later code and avoid calling WSAGetLastError() more then once
if (!nodeconnected[doomcom->remotenode])
return;
......@@ -668,12 +684,16 @@ static void SOCK_Send(void)
if (myfamily[i] == broadcastaddress[j].any.sa_family)
{
c = SOCK_SendToAddr(mysockets[i], &broadcastaddress[j]);
if (c == ERRSOCKET && !ALLOWEDERROR(errno))
if (c == ERRSOCKET)
{
e = errno;
if (!ALLOWEDERROR(e))
break;
}
}
}
}
}
else if (nodesocket[doomcom->remotenode] == (SOCKET_TYPE)ERRSOCKET)
{
for (size_t i = 0; i < mysocketses; i++)
......@@ -681,21 +701,28 @@ static void SOCK_Send(void)
if (myfamily[i] == clientaddress[doomcom->remotenode].any.sa_family)
{
c = SOCK_SendToAddr(mysockets[i], &clientaddress[doomcom->remotenode]);
if (c == ERRSOCKET && !ALLOWEDERROR(errno))
if (c == ERRSOCKET)
{
e = errno;
if (!ALLOWEDERROR(e))
break;
}
}
}
}
else
{
c = SOCK_SendToAddr(nodesocket[doomcom->remotenode], &clientaddress[doomcom->remotenode]);
if (c == ERRSOCKET)
{
e = errno;
}
}
if (c == ERRSOCKET)
if (c == ERRSOCKET && e != 0) // 0 means no socket for the address family was found
{
int e = errno; // save error code so it can't be modified later
if (!ALLOWEDERROR(e))
I_Error("SOCK_Send, error sending to node %d (%s) #%u: %s", doomcom->remotenode,
I_Error("SOCK_Send, error sending to node %d (%s) #%u, %s", doomcom->remotenode,
SOCK_GetNodeAddress(doomcom->remotenode), e, strerror(e));
}
}
......@@ -726,6 +753,8 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
{
SOCKET_TYPE s = socket(family, SOCK_DGRAM, IPPROTO_UDP);
int opt;
int rc;
int e = 0; // save error code so it can't be modified later code and avoid calling WSAGetLastError() more then once
socklen_t opts;
#ifdef FIONBIO
unsigned long trueval = true;
......@@ -740,12 +769,17 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
#ifdef USE_WINSOCK2
DWORD dwBytesReturned = 0;
BOOL bfalse = FALSE;
WSAIoctl(s, SIO_UDP_CONNRESET, &bfalse, sizeof(bfalse),
rc = WSAIoctl(s, SIO_UDP_CONNRESET, &bfalse, sizeof(bfalse),
NULL, 0, &dwBytesReturned, NULL, NULL);
#else
unsigned long falseval = false;
ioctl(s, SIO_UDP_CONNRESET, &falseval);
rc = ioctl(s, SIO_UDP_CONNRESET, &falseval);
#endif
if (rc == -1)
{
e = errno;
I_OutputMsg("SIO_UDP_CONNRESET failed: #%u, %s\n", e, strerror(e));
}
}
#endif
......@@ -758,14 +792,22 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
{
opt = true;
opts = (socklen_t)sizeof(opt);
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, opts);
rc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, opts);
if (rc <= -1)
{
e = errno;
I_OutputMsg("setting SO_REUSEADDR failed: #%u, %s\n", e, strerror(e));
}
}
// make it broadcastable
opt = true;
opts = (socklen_t)sizeof(opt);
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&opt, opts))
rc = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&opt, opts);
if (rc <= -1)
{
e = errno;
CONS_Alert(CONS_WARNING, M_GetText("Could not get broadcast rights\n")); // I do not care anymore
I_OutputMsg("setting SO_BROADCAST failed: #%u, %s\n", e, strerror(e));
}
}
#ifdef HAVE_IPV6
......@@ -775,24 +817,34 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
{
opt = true;
opts = (socklen_t)sizeof(opt);
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, opts);
rc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, opts);
if (rc <= -1)
{
e = errno;
I_OutputMsg("setting SO_REUSEADDR failed: #%u, %s\n", e, strerror(e));
}
}
#ifdef IPV6_V6ONLY
// make it IPv6 ony
opt = true;
opts = (socklen_t)sizeof(opt);
if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&opt, opts))
rc = setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&opt, opts);
if (rc <= -1)
{
e = errno;
CONS_Alert(CONS_WARNING, M_GetText("Could not limit IPv6 bind\n")); // I do not care anymore
I_OutputMsg("setting IPV6_V6ONLY failed: #%u, %s\n", e, strerror(e));
}
#endif
}
#endif
if (bind(s, addr, addrlen) == ERRSOCKET)
rc = bind(s, addr, addrlen);
if (rc == ERRSOCKET)
{
e = errno;
close(s);
I_OutputMsg("Binding failed\n");
I_OutputMsg("Binding failed: #%u, %s\n", e, strerror(e));
return (SOCKET_TYPE)ERRSOCKET;
}
......@@ -806,9 +858,18 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
inet_pton(AF_INET6, IPV6_MULTICAST_ADDRESS, &maddr.ipv6mr_multiaddr);
maddr.ipv6mr_interface = 0;
if (setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP, (const char *)&maddr, sizeof(maddr)) != 0)
rc = setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP, (const char *)&maddr, sizeof(maddr));
if (rc <= -1)
{
e = errno;
CONS_Alert(CONS_WARNING, M_GetText("Could not register multicast address\n"));
if (e == ENODEV)
{
close(s);
I_OutputMsg("Binding failed: no IPv6 device\n");
return (SOCKET_TYPE)ERRSOCKET;
}
I_OutputMsg("setting IPV6_JOIN_GROUP failed: #%u, %s \n", e, strerror(e));
}
}
}
......@@ -816,33 +877,56 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
#ifdef FIONBIO
// make it non blocking
opt = true;
if (ioctl(s, FIONBIO, &trueval) != 0)
rc = ioctl(s, FIONBIO, &trueval);
if (rc == -1)
{
e = errno;
close(s);
I_OutputMsg("Seting FIOBIO on failed\n");
I_OutputMsg("FIOBIO failed: #%u, %s\n", e, strerror(e));
return (SOCKET_TYPE)ERRSOCKET;
}
#endif
opt = 0;
opts = (socklen_t)sizeof(opt);
getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &opts);
rc = getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &opts);
if (rc <= -1)
{
e = errno;
I_OutputMsg("getting SO_RCVBUF failed: #%u, %s\n", e, strerror(e));
}
CONS_Printf(M_GetText("Network system buffer: %dKb\n"), opt>>10);
if (opt < 64<<10) // 64k
{
opt = 64<<10;
opts = (socklen_t)sizeof(opt);
setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&opt, opts);
getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &opts);
if (opt < 64<<10)
rc = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&opt, opts);
if (rc <= -1)
{
e = errno;
I_OutputMsg("setting SO_RCVBUF failed: #%u, %s\n", e, strerror(e));
}
opt = 0;
rc = getsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &opts);
if (rc <= -1)
{
e = errno;
I_OutputMsg("getting SO_RCVBUF failed: #%u, %s\n", e, strerror(e));
}
if (opt <= 64<<10)
CONS_Alert(CONS_WARNING, M_GetText("Can't set buffer length to 64k, file transfer will be bad\n"));
else
CONS_Printf(M_GetText("Network system buffer set to: %dKb\n"), opt>>10);
}
if (getsockname(s, &straddr.any, &len) == -1)
rc = getsockname(s, &straddr.any, &len);
if (rc != 0)
{
e = errno;
CONS_Alert(CONS_WARNING, M_GetText("Failed to get port number\n"));
I_OutputMsg("getsockname failed: #%u, %s\n", e, strerror(e));
}
else
{
if (family == AF_INET)
......@@ -864,6 +948,7 @@ static boolean UDP_Socket(void)
#ifdef HAVE_IPV6
const INT32 b_ipv6 = !M_CheckParm("-noipv6");
#endif
const INT32 b_ipv4 = !M_CheckParm("-noipv4");
const char *serv;
......@@ -879,11 +964,20 @@ static boolean UDP_Socket(void)
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
#ifdef HAVE_IPV6
if (!b_ipv6)
I_OutputMsg("Disabling IPv6 support at runtime\n");
#else
I_OutputMsg("Compiled without IPv6 support\n");
#endif
if (serverrunning)
serv = serverport_name;
else
serv = clientport_name;
if (b_ipv4)
{
if (M_CheckParm("-bindaddr"))
{
while (M_IsNextParm())
......@@ -932,6 +1026,7 @@ static boolean UDP_Socket(void)
I_freeaddrinfo(ai);
}
}
}
#ifdef HAVE_IPV6
if (b_ipv6)
{
......@@ -996,11 +1091,14 @@ static boolean UDP_Socket(void)
s = 0;
if (b_ipv4)
{
// setup broadcast adress to BROADCASTADDR entry
broadcastaddress[s].any.sa_family = AF_INET;
broadcastaddress[s].ip4.sin_port = htons(atoi(DEFAULTPORT));
broadcastaddress[s].ip4.sin_addr.s_addr = htonl(INADDR_BROADCAST);
s++;
}
#ifdef HAVE_IPV6
if (b_ipv6)
......@@ -1016,7 +1114,7 @@ static boolean UDP_Socket(void)
broadcastaddresses = s;
doomcom->extratics = 1; // internet is very high ping
extratics = 1; // internet is very high ping
return true;
}
......@@ -1024,6 +1122,12 @@ static boolean UDP_Socket(void)
boolean I_InitTcpDriver(void)
{
boolean tcp_was_up = init_tcp_driver;
#ifdef __EMSCRIPTEN__
I_OutputMsg("Compiled without networking support\n");
return false;
#endif
if (!init_tcp_driver)
{
#ifdef USE_WINSOCK
......@@ -1083,10 +1187,10 @@ boolean I_InitTcpDriver(void)
{
I_AddExitFunc(I_ShutdownTcpDriver);
#ifdef HAVE_MINIUPNPC
if (M_CheckParm("-useUPnP"))
I_InitUPnP();
else
if (M_CheckParm("-noUPnP"))
UPNP_support = false;
else
I_InitUPnP();
#endif
}
return init_tcp_driver;
......@@ -1129,7 +1233,7 @@ static SINT8 SOCK_NetMakeNodewPort(const char *address, const char *port)
DEBFILE(va("Creating new node: %s@%s\n", address, port));
memset (&hints, 0x00, sizeof (hints));
hints.ai_flags = 0;
hints.ai_flags = AI_ADDRCONFIG;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
......@@ -1159,7 +1263,7 @@ static SINT8 SOCK_NetMakeNodewPort(const char *address, const char *port)
}
}
if (i < mysocketses)
if (i >= mysocketses)
runp = runp->ai_next;
else
break;
......@@ -1304,18 +1408,18 @@ boolean I_InitTcpNetwork(void)
// in-game.
// Since Boris has implemented join in-game, there is no actual need for specifying a
// particular number here.
// FIXME: for dedicated server, numnodes needs to be set to 0 upon start
// FIXME: for dedicated server, numnetnodes needs to be set to 0 upon start
if (dedicated)
doomcom->numnodes = 0;
numnetnodes = 0;
/* else if (M_IsNextParm())
doomcom->numnodes = (INT16)atoi(M_GetNextParm());*/
numnetnodes = (INT16)atoi(M_GetNextParm());*/
else
doomcom->numnodes = 1;
numnetnodes = 1;
if (doomcom->numnodes < 0)
doomcom->numnodes = 0;
if (doomcom->numnodes > MAXNETNODES)
doomcom->numnodes = MAXNETNODES;
if (numnetnodes < 0)
numnetnodes = 0;
if (numnetnodes > MAXNETNODES)
numnetnodes = MAXNETNODES;
// server
servernode = 0;
......
......@@ -35,16 +35,11 @@ static boolean MSUpdateAgain;
static time_t MSLastPing;
#ifdef HAVE_THREADS
static I_mutex MSMutex;
static I_cond MSCond;
# define Lock_state() I_lock_mutex (&MSMutex)
# define Unlock_state() I_unlock_mutex (MSMutex)
#else/*HAVE_THREADS*/
# define Lock_state()
# define Unlock_state()
#endif/*HAVE_THREADS*/
static void Command_Listserv_f(void);
......@@ -72,13 +67,11 @@ consvar_t cv_masterserver_room_id = CVAR_INIT ("masterserver_room_id", "-1", CV_
static INT16 ms_RoomId = -1;
#if defined (MASTERSERVER) && defined (HAVE_THREADS)
int ms_QueryId;
I_mutex ms_QueryId_mutex;
msg_server_t *ms_ServerList;
I_mutex ms_ServerList_mutex;
#endif
UINT16 current_port = 0;
......@@ -110,13 +103,9 @@ void AddMServCommands(void)
static void WarnGUI (void)
{
#ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex);
#endif
M_StartMessage(M_GetText("There was a problem connecting to\nthe Master Server\n\nCheck the console for details.\n"), NULL, MM_NOTHING);
#ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex);
#endif
}
#define NUM_LIST_SERVER MAXSERVERLIST
......@@ -160,14 +149,12 @@ char *GetMODVersion(int id)
c = HMS_compare_mod_version(buffer, 16);
#ifdef HAVE_THREADS
I_lock_mutex(&ms_QueryId_mutex);
{
if (id != ms_QueryId)
c = -1;
}
I_unlock_mutex(ms_QueryId_mutex);
#endif
if (c > 0)
return buffer;
......@@ -294,9 +281,7 @@ Finish_unlist (void)
}
Unlock_state();
#ifdef HAVE_THREADS
I_wake_all_cond(&MSCond);
#endif
}
Lock_state();
......@@ -307,7 +292,6 @@ Finish_unlist (void)
Unlock_state();
}
#ifdef HAVE_THREADS
static int *
Server_id (void)
{
......@@ -402,53 +386,67 @@ Change_masterserver_thread (char *api)
HMS_set_api(api);
}
#endif/*HAVE_THREADS*/
void RegisterServer(void)
{
#ifdef MASTERSERVER
#ifdef HAVE_THREADS
I_spawn_thread(
if (I_can_thread())
{
void *nsid = New_server_id();
if (!I_spawn_thread(
"register-server",
(I_thread_fn)Register_server_thread,
New_server_id()
);
#else
nsid
))
{
free(nsid);
}
}
else
{
Finish_registration();
#endif
#endif/*MASTERSERVER*/
}
}
static void UpdateServer(void)
{
#ifdef HAVE_THREADS
I_spawn_thread(
if (I_can_thread())
{
void *sid = Server_id();
if (!I_spawn_thread(
"update-server",
(I_thread_fn)Update_server_thread,
Server_id()
);
#else
sid
))
{
free(sid);
}
}
else
{
Finish_update();
#endif
}
}
void UnregisterServer(void)
{
#ifdef MASTERSERVER
#ifdef HAVE_THREADS
I_spawn_thread(
if (I_can_thread())
{
if (!I_spawn_thread(
"unlist-server",
(I_thread_fn)Unlist_server_thread,
Server_id()
);
#else
))
{
;
}
}
else
{
Finish_unlist();
#endif
#endif/*MASTERSERVER*/
}
}
static boolean
Online (void)
static boolean Online(void)
{
return ( serverrunning && cv_masterserver_room_id.value > 0 );
}
......@@ -482,26 +480,35 @@ static inline void SendPingToMasterServer(void)
void MasterClient_Ticker(void)
{
#ifdef MASTERSERVER
SendPingToMasterServer();
#endif
}
static void
Set_api (const char *api)
{
#ifdef HAVE_THREADS
I_spawn_thread(
char *dapi = strdup(api);
if (I_can_thread())
{
if (!I_spawn_thread(
"change-masterserver",
(I_thread_fn)Change_masterserver_thread,
strdup(api)
);
#else
HMS_set_api(strdup(api));
#endif
dapi
))
{
free(dapi);
}
}
else
{
HMS_set_api(dapi);
}
}
#else /*MASTERSERVER*/
#endif/*MASTERSERVER*/
void RegisterServer(void) {}
void UnregisterServer(void) {}
#endif
static boolean ServerName_CanChange(const char* newvalue)
{
......@@ -544,7 +551,9 @@ static void RoomId_OnChange(void)
{
UnregisterServer();
ms_RoomId = cv_masterserver_room_id.value;
#ifdef MASTERSERVER
if (Online())
#endif
RegisterServer();
}
}
......
......@@ -71,13 +71,11 @@ extern consvar_t cv_masterserver_timeout;
extern consvar_t cv_masterserver_debug;
extern consvar_t cv_masterserver_token;
#ifdef HAVE_THREADS
extern int ms_QueryId;
extern I_mutex ms_QueryId_mutex;
extern msg_server_t *ms_ServerList;
extern I_mutex ms_ServerList_mutex;
#endif
void RegisterServer(void);
void UnregisterServer(void);
......
......@@ -269,10 +269,10 @@ void PT_TextCmd(SINT8 node, INT32 netconsole)
}
// check if tic that we are making isn't too large else we cannot send it :(
// doomcom->numslots+1 "+1" since doomcom->numslots can change within this time and sent time
// numslots+1 "+1" since numslots can change within this time and sent time
j = software_MAXPACKETLENGTH
- (netbuffer->u.textcmd[0]+2+BASESERVERTICSSIZE
+ (doomcom->numslots+1)*sizeof(ticcmd_t));
+ (numslots+1)*sizeof(ticcmd_t));
// search a tic that have enougth space in the ticcmd
while ((textcmd = D_GetExistingTextcmd(tic, netconsole)),
......
......@@ -245,7 +245,7 @@ static boolean SV_SendServerConfig(INT32 node)
netbuffer->packettype = PT_SERVERCFG;
netbuffer->u.servercfg.serverplayer = (UINT8)serverplayer;
netbuffer->u.servercfg.totalslotnum = (UINT8)(doomcom->numslots);
netbuffer->u.servercfg.totalslotnum = (UINT8)numslots;
netbuffer->u.servercfg.gametic = (tic_t)LONG(gametic);
netbuffer->u.servercfg.clientnode = (UINT8)node;
netbuffer->u.servercfg.gamestate = (UINT8)gamestate;
......
......@@ -244,7 +244,7 @@ void PT_ServerTics(SINT8 node, INT32 netconsole)
if (realstart <= neededtic && realend > neededtic)
{
UINT8 *pak = (UINT8 *)&packet->cmds;
UINT8 *txtpak = (UINT8 *)&packet->cmds[packet->numslots * packet->numtics];
UINT8 *txtpak = (UINT8 *)&packet->cmds[numslots * packet->numtics];
for (tic_t i = realstart; i < realend; i++)
{
......@@ -253,7 +253,7 @@ void PT_ServerTics(SINT8 node, INT32 netconsole)
// copy the tics
pak = G_ScpyTiccmd(netcmds[i%BACKUPTICS], pak,
packet->numslots*sizeof (ticcmd_t));
numslots*sizeof (ticcmd_t));
CL_CopyNetCommandsFromServerPacket(i, &txtpak);
}
......@@ -320,7 +320,7 @@ static tic_t SV_CalculateNumTicsForPacket(SINT8 nodenum, tic_t firsttic, tic_t l
for (tic_t tic = firsttic; tic < lasttic; tic++)
{
size += sizeof (ticcmd_t) * doomcom->numslots;
size += sizeof (ticcmd_t) * numslots;
size += TotalTextCmdPerTic(tic);
if (size > software_MAXPACKETLENGTH)
......@@ -337,7 +337,7 @@ static tic_t SV_CalculateNumTicsForPacket(SINT8 nodenum, tic_t firsttic, tic_t l
if (size > MAXPACKETLENGTH)
I_Error("Too many players: can't send %s data for %d players to node %d\n"
"Well sorry nobody is perfect....\n",
sizeu1(size), doomcom->numslots, nodenum);
sizeu1(size), numslots, nodenum);
else
{
lasttic++; // send it anyway!
......@@ -394,20 +394,20 @@ void SV_SendTics(void)
netbuffer->packettype = PT_SERVERTICS;
netbuffer->u.serverpak.starttic = realfirsttic;
netbuffer->u.serverpak.numtics = (UINT8)(lasttictosend - realfirsttic);
netbuffer->u.serverpak.numslots = (UINT8)SHORT(doomcom->numslots);
netbuffer->u.serverpak.numslots = (UINT8)SHORT(numslots);
// Fill and send the packet
UINT8 *bufpos = (UINT8 *)&netbuffer->u.serverpak.cmds;
for (tic_t i = realfirsttic; i < lasttictosend; i++)
bufpos = G_DcpyTiccmd(bufpos, netcmds[i%BACKUPTICS], doomcom->numslots * sizeof (ticcmd_t));
bufpos = G_DcpyTiccmd(bufpos, netcmds[i%BACKUPTICS], numslots * sizeof (ticcmd_t));
for (tic_t i = realfirsttic; i < lasttictosend; i++)
SV_WriteNetCommandsForTic(i, &bufpos);
size_t packsize = bufpos - (UINT8 *)&(netbuffer->u);
HSendPacket(n, false, 0, packsize);
// When tics are too large, only one tic is sent so don't go backwards!
if (lasttictosend-doomcom->extratics > realfirsttic)
node->supposedtic = lasttictosend-doomcom->extratics;
if (lasttictosend-extratics > realfirsttic)
node->supposedtic = lasttictosend-extratics;
else
node->supposedtic = lasttictosend;
node->supposedtic = max(node->supposedtic, node->tic);
......
......@@ -181,9 +181,8 @@ void T_CrushCeiling(ceiling_t *ceiling)
if (res == pastdest)
{
mobj_t *mp = (void *)&ceiling->sector->soundorg;
ceiling->sector->soundorg.z = ceiling->sector->floorheight;
S_StartSound(mp,sfx_pstop);
S_StartSoundFromSector(ceiling->sector,sfx_pstop);
ceiling->direction = 1;
ceiling->speed = lines[ceiling->sourceline].args[3] << (FRACBITS - 2);
......@@ -224,7 +223,7 @@ INT32 EV_DoCeiling(mtag_t tag, line_t *line, ceiling_e type)
ceiling = Z_Calloc(sizeof (*ceiling), PU_LEVSPEC, NULL);
P_AddThinker(THINK_MAIN, &ceiling->thinker);
sec->ceilingdata = ceiling;
ceiling->thinker.function.acp1 = (actionf_p1)T_MoveCeiling;
ceiling->thinker.function = (actionf_p1)T_MoveCeiling;
ceiling->sector = sec;
ceiling->crush = false;
ceiling->sourceline = (INT32)(line-lines);
......@@ -370,7 +369,7 @@ INT32 EV_DoCrush(mtag_t tag, line_t *line, ceiling_e type)
ceiling = Z_Calloc(sizeof (*ceiling), PU_LEVSPEC, NULL);
P_AddThinker(THINK_MAIN, &ceiling->thinker);
sec->ceilingdata = ceiling;
ceiling->thinker.function.acp1 = (actionf_p1)T_CrushCeiling;
ceiling->thinker.function = (actionf_p1)T_CrushCeiling;
ceiling->sector = sec;
ceiling->crush = true;
ceiling->sourceline = (INT32)(line-lines);
......
......@@ -717,8 +717,9 @@ for (i = cvar.value; i; --i) spawnchance[numchoices++] = type
// upper 16 bits = distance limit
// var2 = If 1, only change to seestate. If 2, only play seesound. If 0, do both.
//
void A_Look(mobj_t *actor)
void A_Look(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -750,8 +751,9 @@ void A_Look(mobj_t *actor)
// 3 = don't check meleestate and missilestate
// var2 = unused
//
void A_Chase(mobj_t *actor)
void A_Chase(void *data)
{
mobj_t *actor = data;
INT32 delta;
INT32 locvar1 = var1;
......@@ -842,8 +844,9 @@ nomissile:
// var1 = unused
// var2 = unused
//
void A_FaceStabChase(mobj_t *actor)
void A_FaceStabChase(void *data)
{
mobj_t *actor = data;
INT32 delta;
if (LUA_CallAction(A_FACESTABCHASE, actor))
......@@ -966,8 +969,9 @@ static void P_FaceStabFlume(mobj_t *actor)
// var1 = effective duration
// var2 = effective nextstate
//
void A_FaceStabRev(mobj_t *actor)
void A_FaceStabRev(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -985,13 +989,13 @@ void A_FaceStabRev(mobj_t *actor)
if (!actor->reactiontime)
{
actor->reactiontime = locvar1;
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
}
else
{
if ((--actor->reactiontime) == 0)
{
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
P_SetMobjState(actor, locvar2);
}
else
......@@ -1010,8 +1014,9 @@ void A_FaceStabRev(mobj_t *actor)
// var1 = homing strength (recommended strength between 0-8)
// var2 = effective nextstate
//
void A_FaceStabHurl(mobj_t *actor)
void A_FaceStabHurl(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -1121,8 +1126,9 @@ void A_FaceStabHurl(mobj_t *actor)
// var1 = unused
// var2 = effective nextstate
//
void A_FaceStabMiss(mobj_t *actor)
void A_FaceStabMiss(void *data)
{
mobj_t *actor = data;
INT32 locvar2 = var2;
if (LUA_CallAction(A_FACESTABMISS, actor))
......@@ -1132,7 +1138,7 @@ void A_FaceStabMiss(mobj_t *actor)
{
actor->extravalue2 -= 2;
actor->extravalue1 = 0;
S_StartSound(actor, sfx_s3k47);
S_StartSoundFromMobj(actor, sfx_s3k47);
P_SharpDust(actor, MT_SPINDUST, actor->angle);
}
......@@ -1155,8 +1161,9 @@ void A_FaceStabMiss(mobj_t *actor)
// var1 = object to create
// var2 = effective nextstate for created object
//
void A_StatueBurst(mobj_t *actor)
void A_StatueBurst(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobjtype_t chunktype = (mobjtype_t)actor->info->raisestate;
......@@ -1177,9 +1184,9 @@ void A_StatueBurst(mobj_t *actor)
P_SetMobjState(new, (statenum_t)locvar2);
if (P_MobjWasRemoved(new))
return;
S_StartSound(new, new->info->attacksound);
S_StartSoundFromMobj(new, new->info->attacksound);
S_StopSound(actor);
S_StartSound(actor, sfx_s3k96);
S_StartSoundFromMobj(actor, sfx_s3k96);
{
fixed_t a, b;
......@@ -1217,8 +1224,9 @@ void A_StatueBurst(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_JetJawRoam(mobj_t *actor)
void A_JetJawRoam(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_JETJAWROAM, actor))
return;
......@@ -1244,8 +1252,9 @@ void A_JetJawRoam(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_JetJawChomp(mobj_t *actor)
void A_JetJawChomp(void *data)
{
mobj_t *actor = data;
INT32 delta;
if (LUA_CallAction(A_JETJAWCHOMP, actor))
......@@ -1283,8 +1292,9 @@ void A_JetJawChomp(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_PointyThink(mobj_t *actor)
void A_PointyThink(void *data)
{
mobj_t *actor = data;
INT32 i;
player_t *player = NULL;
mobj_t *ball;
......@@ -1397,8 +1407,9 @@ void A_PointyThink(mobj_t *actor)
// 1 = tracer
// var2 = unused
//
void A_CheckBuddy(mobj_t *actor)
void A_CheckBuddy(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_CHECKBUDDY, actor))
......@@ -1439,8 +1450,9 @@ static void P_ParabolicMove(mobj_t *actor, fixed_t x, fixed_t y, fixed_t z, fixe
// var1 = object type to fire
// var2 = unused
//
void A_HoodFire(mobj_t *actor)
void A_HoodFire(void *data)
{
mobj_t *actor = data;
mobj_t *arrow;
INT32 locvar1 = var1;
......@@ -1473,8 +1485,9 @@ void A_HoodFire(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_HoodThink(mobj_t *actor)
void A_HoodThink(void *data)
{
mobj_t *actor = data;
fixed_t dx, dy, dz, dm;
boolean checksight;
......@@ -1494,7 +1507,7 @@ void A_HoodThink(mobj_t *actor)
// Target dangerously close to robohood, retreat then.
if ((dm < 256<<FRACBITS) && (abs(dz) < 128<<FRACBITS) && !(actor->flags2 & MF2_AMBUSH))
{
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
P_SetMobjState(actor, actor->info->raisestate);
return;
}
......@@ -1543,8 +1556,9 @@ void A_HoodThink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_HoodFall(mobj_t *actor)
void A_HoodFall(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_HOODFALL, actor))
return;
......@@ -1563,8 +1577,9 @@ void A_HoodFall(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ArrowBonks(mobj_t *actor)
void A_ArrowBonks(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_ARROWBONKS, actor))
return;
......@@ -1586,8 +1601,9 @@ void A_ArrowBonks(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SnailerThink(mobj_t *actor)
void A_SnailerThink(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SNAILERTHINK, actor))
return;
......@@ -1659,8 +1675,9 @@ void A_SnailerThink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SharpChase(mobj_t *actor)
void A_SharpChase(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SHARPCHASE, actor))
return;
......@@ -1701,7 +1718,7 @@ void A_SharpChase(mobj_t *actor)
actor->threshold = actor->info->painchance;
P_SetMobjState(actor, actor->info->missilestate);
if (!P_MobjWasRemoved(actor))
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
}
}
......@@ -1712,8 +1729,9 @@ void A_SharpChase(mobj_t *actor)
// var1 = object # to spawn as dust (if not provided not done)
// var2 = if nonzero, do the old-style spinning using this as the angle difference
//
void A_SharpSpin(mobj_t *actor)
void A_SharpSpin(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
angle_t oldang = actor->angle;
......@@ -1731,7 +1749,7 @@ void A_SharpSpin(mobj_t *actor)
actor->angle = ang;
actor->threshold--;
if (leveltime & 1)
S_StartSound(actor, actor->info->painsound);
S_StartSoundFromMobj(actor, actor->info->painsound);
}
else
{
......@@ -1749,8 +1767,9 @@ void A_SharpSpin(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SharpDecel(mobj_t *actor)
void A_SharpDecel(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SHARPDECEL, actor))
return;
......@@ -1770,8 +1789,9 @@ void A_SharpDecel(mobj_t *actor)
// var1 = speed (actor info's speed if 0)
// var2 = state to switch to when blocked (spawnstate if 0)
//
void A_CrushstaceanWalk(mobj_t *actor)
void A_CrushstaceanWalk(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = (var1 ? var1 : (INT32)actor->info->speed);
INT32 locvar2 = (var2 ? var2 : (INT32)actor->info->spawnstate);
angle_t ang = actor->angle + ((actor->flags2 & MF2_AMBUSH) ? ANGLE_90 : ANGLE_270);
......@@ -1803,8 +1823,9 @@ void A_CrushstaceanWalk(mobj_t *actor)
// var1 = unused
// var2 = state to go to if unsuccessful (spawnstate if 0)
//
void A_CrushstaceanPunch(mobj_t *actor)
void A_CrushstaceanPunch(void *data)
{
mobj_t *actor = data;
INT32 locvar2 = (var2 ? var2 : (INT32)actor->info->spawnstate);
if (LUA_CallAction(A_CRUSHSTACEANPUNCH, actor))
......@@ -1822,7 +1843,7 @@ void A_CrushstaceanPunch(mobj_t *actor)
actor->tracer->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y);
P_SetMobjState(actor->tracer, actor->tracer->info->missilestate);
actor->tracer->extravalue1 = actor->tracer->extravalue2 = 0;
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
}
// Function: A_CrushclawAim
......@@ -1832,8 +1853,9 @@ void A_CrushstaceanPunch(mobj_t *actor)
// var1 = sideways offset
// var2 = vertical offset
//
void A_CrushclawAim(mobj_t *actor)
void A_CrushclawAim(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *crab = actor->tracer;
......@@ -1894,8 +1916,9 @@ void A_CrushclawAim(mobj_t *actor)
// anything else - backwards
// var2 = state to change to when done
//
void A_CrushclawLaunch(mobj_t *actor)
void A_CrushclawLaunch(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *crab = actor->tracer;
......@@ -1917,7 +1940,7 @@ void A_CrushclawLaunch(mobj_t *actor)
if (!actor->extravalue1)
{
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
actor->extravalue1 = ((locvar1) ? -1 : 32);
}
else if (actor->extravalue1 != 1)
......@@ -1976,7 +1999,7 @@ void A_CrushclawLaunch(mobj_t *actor)
actor->extravalue2 = FixedHypot(actor->x - actor->target->x, actor->y - actor->target->y)>>FRACBITS;
P_SetMobjState(actor, locvar2);
S_StopSound(actor);
S_StartSound(actor, sfx_s3k49);
S_StartSoundFromMobj(actor, sfx_s3k49);
}
else
{
......@@ -2004,7 +2027,7 @@ void A_CrushclawLaunch(mobj_t *actor)
P_SetMobjState(actor, locvar2);
S_StopSound(actor);
if (!locvar1)
S_StartSound(actor, sfx_s3k64);
S_StartSoundFromMobj(actor, sfx_s3k64);
}
}
......@@ -2035,8 +2058,9 @@ void A_CrushclawLaunch(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_VultureVtol(mobj_t *actor)
void A_VultureVtol(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_VULTUREVTOL, actor))
return;
......@@ -2061,7 +2085,7 @@ void A_VultureVtol(mobj_t *actor)
// Attack!
actor->momz = 0;
P_SetMobjState(actor, actor->info->missilestate);
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
}
}
......@@ -2072,8 +2096,9 @@ void A_VultureVtol(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_VultureCheck(mobj_t *actor)
void A_VultureCheck(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_VULTURECHECK, actor))
return;
......@@ -2126,8 +2151,9 @@ static void P_VultureHoverParticle(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_VultureHover(mobj_t *actor)
void A_VultureHover(void *data)
{
mobj_t *actor = data;
fixed_t targetz;
fixed_t distdif;
fixed_t memz = actor->z;
......@@ -2191,8 +2217,9 @@ void A_VultureHover(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_VultureBlast(mobj_t *actor)
void A_VultureBlast(void *data)
{
mobj_t *actor = data;
mobj_t *dust;
UINT8 i;
angle_t faa;
......@@ -2201,7 +2228,7 @@ void A_VultureBlast(mobj_t *actor)
if (LUA_CallAction(A_VULTUREBLAST, actor))
return;
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
faa = (actor->angle >> ANGLETOFINESHIFT) & FINEMASK;
faacos = FINECOSINE(faa);
......@@ -2231,8 +2258,9 @@ void A_VultureBlast(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_VultureFly(mobj_t *actor)
void A_VultureFly(void *data)
{
mobj_t *actor = data;
fixed_t speedmax = 18*FRACUNIT;
angle_t angledif;
fixed_t dx, dy, dz, dxy, dm;
......@@ -2255,7 +2283,7 @@ void A_VultureFly(mobj_t *actor)
dxy = FixedHypot(dx, dy);
if (leveltime % 4 == 0)
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
if (angledif > ANGLE_180)
angledif = InvAngle(angledif);
......@@ -2308,7 +2336,7 @@ void A_VultureFly(mobj_t *actor)
actor->flags &= ~MF_NOGRAVITY;
P_SetMobjState(actor, actor->info->painstate);
S_StopSound(actor);
S_StartSound(actor, actor->info->painsound);
S_StartSoundFromMobj(actor, actor->info->painsound);
return;
}
actor->extravalue1 = momm;
......@@ -2330,8 +2358,9 @@ void A_VultureFly(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SkimChase(mobj_t *actor)
void A_SkimChase(void *data)
{
mobj_t *actor = data;
INT32 delta;
if (LUA_CallAction(A_SKIMCHASE, actor))
......@@ -2418,8 +2447,9 @@ nomissile:
// var1 = unused
// var2 = unused
//
void A_FaceTarget(mobj_t *actor)
void A_FaceTarget(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_FACETARGET, actor))
return;
......@@ -2436,8 +2466,9 @@ void A_FaceTarget(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_FaceTracer(mobj_t *actor)
void A_FaceTracer(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_FACETRACER, actor))
return;
......@@ -2456,8 +2487,9 @@ void A_FaceTracer(mobj_t *actor)
// var2 >> 16 = height offset
// var2 & 65535 = airtime
//
void A_LobShot(mobj_t *actor)
void A_LobShot(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2 >> 16;
mobj_t *shot;
......@@ -2536,7 +2568,7 @@ void A_LobShot(mobj_t *actor)
*/
if (shot->info->seesound)
S_StartSound(shot, shot->info->seesound);
S_StartSoundFromMobj(shot, shot->info->seesound);
if (!(actor->flags & MF_BOSS))
{
......@@ -2554,8 +2586,9 @@ void A_LobShot(mobj_t *actor)
// var1 = object # to shoot
// var2 = height offset
//
void A_FireShot(mobj_t *actor)
void A_FireShot(void *data)
{
mobj_t *actor = data;
fixed_t z;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -2593,8 +2626,9 @@ void A_FireShot(mobj_t *actor)
// var1 = object # to shoot
// var2 = height offset
//
void A_SuperFireShot(mobj_t *actor)
void A_SuperFireShot(void *data)
{
mobj_t *actor = data;
fixed_t z;
mobj_t *mo;
INT32 locvar1 = var1;
......@@ -2642,8 +2676,9 @@ void A_SuperFireShot(mobj_t *actor)
// 4 - Boss 3 Right side upper
// 5 - Boss 3 Right side lower
//
void A_BossFireShot(mobj_t *actor)
void A_BossFireShot(void *data)
{
mobj_t *actor = data;
fixed_t x, y, z;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -2729,8 +2764,9 @@ void A_BossFireShot(mobj_t *actor)
// var1 = object # to shoot
// var2 = firing sound
//
void A_Boss7FireMissiles(mobj_t *actor)
void A_Boss7FireMissiles(void *data)
{
mobj_t *actor = data;
mobj_t dummymo;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -2748,7 +2784,7 @@ void A_Boss7FireMissiles(mobj_t *actor)
if (P_MobjWasRemoved(actor))
return;
S_StartSound(NULL, locvar2);
S_StartSoundFromEverywhere(locvar2);
// set dummymo's coordinates
dummymo.x = actor->target->x;
......@@ -2788,8 +2824,9 @@ void A_Boss7FireMissiles(mobj_t *actor)
// 3 - Boss 1 Middle
// >=3 - Generic middle
//
void A_Boss1Laser(mobj_t *actor)
void A_Boss1Laser(void *data)
{
mobj_t *actor = data;
fixed_t x, y, z, floorz, speed;
INT32 locvar1 = var1;
INT32 locvar2 = (var2 & 65535);
......@@ -2871,7 +2908,7 @@ void A_Boss1Laser(mobj_t *actor)
{
actor->angle = R_PointToAngle2(x, y, actor->target->x, actor->target->y);
if (mobjinfo[locvar1].seesound)
S_StartSound(actor, mobjinfo[locvar1].seesound);
S_StartSoundFromMobj(actor, mobjinfo[locvar1].seesound);
point = P_SpawnMobj(x + P_ReturnThrustX(actor, actor->angle, actor->radius), y + P_ReturnThrustY(actor, actor->angle, actor->radius), actor->z - actor->height / 2, MT_EGGMOBILE_TARGET);
if (!P_MobjWasRemoved(point))
......@@ -2956,7 +2993,7 @@ void A_Boss1Laser(mobj_t *actor)
P_SetObjectMomZ(steam, FRACUNIT + 2*P_RandomFixed(), true);
P_InstaThrust(steam, FixedAngle(P_RandomKey(360)*FRACUNIT), 2*P_RandomFixed());
if (point->info->painsound)
S_StartSound(steam, point->info->painsound);
S_StartSoundFromMobj(steam, point->info->painsound);
}
}
else
......@@ -2968,7 +3005,7 @@ void A_Boss1Laser(mobj_t *actor)
&& P_TryMove(point, point->x + distx, point->y + disty, false))
{
if (point->info->seesound)
S_StartSound(point, point->info->seesound);
S_StartSoundFromMobj(point, point->info->seesound);
}
else
P_RemoveMobj(point);
......@@ -2995,8 +3032,9 @@ void A_Boss1Laser(mobj_t *actor)
// & 1 - change horizontal angle
// & 2 - change vertical angle
//
void A_FocusTarget(mobj_t *actor)
void A_FocusTarget(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -3046,8 +3084,9 @@ void A_FocusTarget(mobj_t *actor)
// var1 = sfx to play
// var2 = sfx to play in pinch
//
void A_Boss4Reverse(mobj_t *actor)
void A_Boss4Reverse(void *data)
{
mobj_t *actor = data;
sfxenum_t locvar1 = (sfxenum_t)var1;
sfxenum_t locvar2 = (sfxenum_t)var2;
......@@ -3057,7 +3096,7 @@ void A_Boss4Reverse(mobj_t *actor)
actor->reactiontime = 0;
if (actor->movedir < 3)
{
S_StartSound(NULL, locvar1);
S_StartSoundFromEverywhere(locvar1);
if (actor->movedir == 1)
actor->movedir = 2;
else
......@@ -3065,7 +3104,7 @@ void A_Boss4Reverse(mobj_t *actor)
}
else
{
S_StartSound(NULL, locvar2);
S_StartSoundFromEverywhere(locvar2);
if (actor->movedir == 4)
actor->movedir = 5;
else
......@@ -3082,14 +3121,15 @@ void A_Boss4Reverse(mobj_t *actor)
// var1 = sfx to play
// var2 = unused
//
void A_Boss4SpeedUp(mobj_t *actor)
void A_Boss4SpeedUp(void *data)
{
mobj_t *actor = data;
sfxenum_t locvar1 = (sfxenum_t)var1;
if (LUA_CallAction(A_BOSS4SPEEDUP, actor))
return;
S_StartSound(NULL, locvar1);
S_StartSoundFromEverywhere(locvar1);
actor->reactiontime = 2;
}
......@@ -3100,14 +3140,15 @@ void A_Boss4SpeedUp(mobj_t *actor)
// var1 = sfx to play
// var2 = unused
//
void A_Boss4Raise(mobj_t *actor)
void A_Boss4Raise(void *data)
{
mobj_t *actor = data;
sfxenum_t locvar1 = (sfxenum_t)var1;
if (LUA_CallAction(A_BOSS4RAISE, actor))
return;
S_StartSound(NULL, locvar1);
S_StartSoundFromEverywhere(locvar1);
actor->reactiontime = 1;
}
......@@ -3126,8 +3167,9 @@ void A_Boss4Raise(mobj_t *actor)
//
#define SKULLSPEED (20*FRACUNIT)
void A_SkullAttack(mobj_t *actor)
void A_SkullAttack(void *data)
{
mobj_t *actor = data;
mobj_t *dest;
angle_t an;
INT32 dist;
......@@ -3146,7 +3188,7 @@ void A_SkullAttack(mobj_t *actor)
dest = actor->target;
actor->flags2 |= MF2_SKULLFLY;
if (actor->info->activesound)
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
......@@ -3244,8 +3286,9 @@ void A_SkullAttack(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_BossZoom(mobj_t *actor)
void A_BossZoom(void *data)
{
mobj_t *actor = data;
mobj_t *dest;
angle_t an;
INT32 dist;
......@@ -3284,8 +3327,9 @@ void A_BossZoom(mobj_t *actor)
// & 2 - Use entire vertical range of object to spawn
// var2 = Object to spawn. Default is MT_SONIC3KBOSSEXPLODE.
//
void A_BossScream(mobj_t *actor)
void A_BossScream(void *data)
{
mobj_t *actor = data;
mobj_t *mo;
fixed_t x, y, z;
angle_t fa;
......@@ -3327,7 +3371,7 @@ void A_BossScream(mobj_t *actor)
mo->flags2 |= MF2_OBJECTFLIP;
P_SetScale(mo, actor->scale, true);
if (actor->info->deathsound)
S_StartSound(mo, actor->info->deathsound);
S_StartSoundFromMobj(mo, actor->info->deathsound);
}
// Function: A_Scream
......@@ -3337,8 +3381,9 @@ void A_BossScream(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Scream(mobj_t *actor)
void A_Scream(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SCREAM, actor))
return;
......@@ -3353,13 +3398,14 @@ void A_Scream(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Pain(mobj_t *actor)
void A_Pain(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_PAIN, actor))
return;
if (actor->info->painsound)
S_StartSound(actor, actor->info->painsound);
S_StartSoundFromMobj(actor, actor->info->painsound);
actor->flags2 &= ~MF2_FIRING;
actor->flags2 &= ~MF2_SUPERFIRE;
......@@ -3372,8 +3418,9 @@ void A_Pain(mobj_t *actor)
// var1 = value to set repeat to if nonzero
// var2 = unused
//
void A_Fall(mobj_t *actor)
void A_Fall(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_FALL, actor))
......@@ -3401,8 +3448,9 @@ void A_Fall(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_1upThinker(mobj_t *actor)
void A_1upThinker(void *data)
{
mobj_t *actor = data;
INT32 i;
fixed_t dist = INT32_MAX;
fixed_t temp;
......@@ -3472,8 +3520,9 @@ void A_1upThinker(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_MonitorPop(mobj_t *actor)
void A_MonitorPop(void *data)
{
mobj_t *actor = data;
mobjtype_t item = 0;
mobj_t *newmobj;
......@@ -3482,7 +3531,7 @@ void A_MonitorPop(mobj_t *actor)
// Spawn the "pop" explosion.
if (actor->info->deathsound)
S_StartSound(actor, actor->info->deathsound);
S_StartSoundFromMobj(actor, actor->info->deathsound);
P_SpawnMobjFromMobj(actor, 0, 0, actor->height/4, MT_EXPLODE);
// We're dead now. De-solidify.
......@@ -3563,8 +3612,9 @@ void A_MonitorPop(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_GoldMonitorPop(mobj_t *actor)
void A_GoldMonitorPop(void *data)
{
mobj_t *actor = data;
mobjtype_t item = 0;
mobj_t *newmobj;
......@@ -3573,7 +3623,7 @@ void A_GoldMonitorPop(mobj_t *actor)
// Don't spawn the "pop" explosion, because the monitor isn't broken.
if (actor->info->deathsound)
S_StartSound(actor, actor->info->deathsound);
S_StartSoundFromMobj(actor, actor->info->deathsound);
//P_SpawnMobjFromMobj(actor, 0, 0, actor.height/4, MT_EXPLODE);
// Remove our flags for a bit.
......@@ -3654,8 +3704,9 @@ void A_GoldMonitorPop(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_GoldMonitorRestore(mobj_t *actor)
void A_GoldMonitorRestore(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_GOLDMONITORRESTORE, actor))
return;
......@@ -3670,8 +3721,9 @@ void A_GoldMonitorRestore(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_GoldMonitorSparkle(mobj_t *actor)
void A_GoldMonitorSparkle(void *data)
{
mobj_t *actor = data;
fixed_t i, ngangle, xofs, yofs;
if (LUA_CallAction(A_GOLDMONITORSPARKLE, actor))
......@@ -3698,8 +3750,9 @@ void A_GoldMonitorSparkle(mobj_t *actor)
// var1 = damagetype
// var2 = unused
//
void A_Explode(mobj_t *actor)
void A_Explode(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_EXPLODE, actor))
......@@ -3886,11 +3939,11 @@ static void P_DoCybrakdemonDeath(mobj_t *mo)
mo->flags |= MF_NOCLIP;
mo->flags &= ~(MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT);
S_StartSound(NULL, sfx_bedie2);
S_StartSoundFromEverywhere(sfx_bedie2);
P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_CYBRAKDEMON_VILE_EXPLOSION);
mo->z += P_MobjFlip(mo);
P_SetObjectMomZ(mo, 12*FRACUNIT, false);
S_StartSound(mo, sfx_bgxpld);
S_StartSoundFromMobj(mo, sfx_bgxpld);
if (mo->spawnpoint && !(mo->spawnpoint->args[6] & TMB_NODEATHFLING))
P_InstaThrust(mo, R_PointToAngle2(0, 0, mo->x, mo->y), 14*FRACUNIT);
}
......@@ -3998,20 +4051,21 @@ static void P_DoBossDefaultDeath(mobj_t *mo)
// var1 = unused
// var2 = unused
//
void A_BossDeath(mobj_t *mo)
void A_BossDeath(void *data)
{
mobj_t *actor = data;
INT32 i;
if (LUA_CallAction(A_BOSSDEATH, mo))
if (LUA_CallAction(A_BOSSDEATH, actor))
return;
if (mo->spawnpoint && mo->spawnpoint->args[2])
P_LinedefExecute(mo->spawnpoint->args[2], mo, NULL);
mo->health = 0;
if (actor->spawnpoint && actor->spawnpoint->args[2])
P_LinedefExecute(actor->spawnpoint->args[2], actor, NULL);
actor->health = 0;
// Boss is dead (but not necessarily fleeing...)
// Lua may use this to ignore bosses after they start fleeing
mo->flags2 |= MF2_BOSSDEAD;
actor->flags2 |= MF2_BOSSDEAD;
// make sure there is a player alive for victory
for (i = 0; i < MAXPLAYERS; i++)
......@@ -4022,46 +4076,46 @@ void A_BossDeath(mobj_t *mo)
if (i == MAXPLAYERS)
return; // no one left alive, so do not end game
P_DoBossVictory(mo);
P_DoBossVictory(actor);
if (LUA_HookMobj(mo, MOBJ_HOOK(BossDeath)))
if (LUA_HookMobj(actor, MOBJ_HOOK(BossDeath)))
return;
else if (P_MobjWasRemoved(mo))
else if (P_MobjWasRemoved(actor))
return;
// Spawn your junk
switch (mo->type)
switch (actor->type)
{
default:
break;
case MT_EGGMOBILE: // twin laser pods
P_SpawnBoss1Junk(mo);
P_SpawnBoss1Junk(actor);
break;
case MT_EGGMOBILE2: // twin tanks + spigot
P_SpawnBoss2Junk(mo);
P_SpawnBoss2Junk(actor);
break;
case MT_EGGMOBILE3:
P_SpawnBoss3Junk(mo);
P_SpawnBoss3Junk(actor);
break;
}
// now do another switch case for escaping
switch (mo->type)
switch (actor->type)
{
case MT_BLACKEGGMAN:
mo->flags |= MF_NOCLIP;
mo->flags &= ~MF_SPECIAL;
actor->flags |= MF_NOCLIP;
actor->flags &= ~MF_SPECIAL;
S_StartSound(NULL, sfx_befall);
S_StartSoundFromEverywhere(sfx_befall);
break;
case MT_CYBRAKDEMON:
P_DoCybrakdemonDeath(mo);
P_DoCybrakdemonDeath(actor);
break;
case MT_FANG:
P_DoBoss5Death(mo);
P_DoBoss5Death(actor);
break;
default: //eggmobiles
P_DoBossDefaultDeath(mo);
P_DoBossDefaultDeath(actor);
break;
}
}
......@@ -4073,8 +4127,9 @@ void A_BossDeath(mobj_t *mo)
// var1 = new fixed_t shadowscale (default = FRACUNIT)
// var2 = unused
//
void A_SetShadowScale(mobj_t *actor)
void A_SetShadowScale(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_SETSHADOWSCALE, actor))
......@@ -4091,8 +4146,9 @@ void A_SetShadowScale(mobj_t *actor)
// var1 = new fixed_t shadowscale (default = FRACUNIT)
// var2 = unused
//
void A_ShadowScream(mobj_t *actor)
void A_ShadowScream(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SHADOWSCREAM, actor))
return;
......@@ -4108,8 +4164,9 @@ void A_ShadowScream(mobj_t *actor)
// var1 = Power index #
// var2 = Power duration in tics
//
void A_CustomPower(mobj_t *actor)
void A_CustomPower(void *data)
{
mobj_t *actor = data;
player_t *player;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -4134,7 +4191,7 @@ void A_CustomPower(mobj_t *actor)
P_SetPower(player, locvar1, locvar2);
if (actor->info->seesound)
S_StartSound(player->mo, actor->info->seesound);
S_StartSoundFromMobj(player->mo, actor->info->seesound);
}
// Function: A_GiveWeapon
......@@ -4144,8 +4201,9 @@ void A_CustomPower(mobj_t *actor)
// var1 = Weapon index #
// var2 = unused
//
void A_GiveWeapon(mobj_t *actor)
void A_GiveWeapon(void *data)
{
mobj_t *actor = data;
player_t *player;
INT32 locvar1 = var1;
......@@ -4168,7 +4226,7 @@ void A_GiveWeapon(mobj_t *actor)
player->ringweapons |= locvar1;
if (actor->info->seesound)
S_StartSound(player->mo, actor->info->seesound);
S_StartSoundFromMobj(player->mo, actor->info->seesound);
}
// Function: A_RingBox
......@@ -4178,8 +4236,9 @@ void A_GiveWeapon(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_RingBox(mobj_t *actor)
void A_RingBox(void *data)
{
mobj_t *actor = data;
player_t *player;
if (LUA_CallAction(A_RINGBOX, actor))
......@@ -4195,7 +4254,7 @@ void A_RingBox(mobj_t *actor)
P_GivePlayerRings(player, actor->info->reactiontime);
if (actor->info->seesound)
S_StartSound(player->mo, actor->info->seesound);
S_StartSoundFromMobj(player->mo, actor->info->seesound);
}
// Function: A_Invincibility
......@@ -4205,8 +4264,9 @@ void A_RingBox(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Invincibility(mobj_t *actor)
void A_Invincibility(void *data)
{
mobj_t *actor = data;
player_t *player;
if (LUA_CallAction(A_INVINCIBILITY, actor))
......@@ -4238,8 +4298,9 @@ void A_Invincibility(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SuperSneakers(mobj_t *actor)
void A_SuperSneakers(void *data)
{
mobj_t *actor = data;
player_t *player;
if (LUA_CallAction(A_SUPERSNEAKERS, actor))
......@@ -4273,8 +4334,9 @@ void A_SuperSneakers(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_AwardScore(mobj_t *actor)
void A_AwardScore(void *data)
{
mobj_t *actor = data;
player_t *player;
if (LUA_CallAction(A_AWARDSCORE, actor))
......@@ -4290,7 +4352,7 @@ void A_AwardScore(mobj_t *actor)
P_AddPlayerScore(player, actor->info->reactiontime);
if (actor->info->seesound)
S_StartSound(player->mo, actor->info->seesound);
S_StartSoundFromMobj(player->mo, actor->info->seesound);
}
// Function: A_ExtraLife
......@@ -4300,8 +4362,9 @@ void A_AwardScore(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ExtraLife(mobj_t *actor)
void A_ExtraLife(void *data)
{
mobj_t *actor = data;
player_t *player;
if (LUA_CallAction(A_EXTRALIFE, actor))
......@@ -4323,7 +4386,7 @@ void A_ExtraLife(mobj_t *actor)
if (ultimatemode) //I don't THINK so!
{
S_StartSound(player->mo, sfx_lose);
S_StartSoundFromMobj(player->mo, sfx_lose);
return;
}
......@@ -4337,8 +4400,9 @@ void A_ExtraLife(mobj_t *actor)
// var1 = Shield type (make with SH_ constants)
// var2 = unused
//
void A_GiveShield(mobj_t *actor)
void A_GiveShield(void *data)
{
mobj_t *actor = data;
player_t *player;
UINT16 locvar1 = var1;
......@@ -4354,7 +4418,7 @@ void A_GiveShield(mobj_t *actor)
player = actor->target->player;
P_SwitchShield(player, locvar1);
S_StartSound(player->mo, actor->info->seesound);
S_StartSoundFromMobj(player->mo, actor->info->seesound);
}
// Function: A_GravityBox
......@@ -4364,8 +4428,9 @@ void A_GiveShield(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_GravityBox(mobj_t *actor)
void A_GravityBox(void *data)
{
mobj_t *actor = data;
player_t *player;
if (LUA_CallAction(A_GRAVITYBOX, actor))
......@@ -4379,7 +4444,7 @@ void A_GravityBox(mobj_t *actor)
player = actor->target->player;
S_StartSound(player, actor->info->activesound);
S_StartSoundFromMobj(player->mo, actor->info->activesound);
player->powers[pw_gravityboots] = (UINT16)(actor->info->reactiontime + 1);
}
......@@ -4391,8 +4456,9 @@ void A_GravityBox(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ScoreRise(mobj_t *actor)
void A_ScoreRise(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SCORERISE, actor))
return;
......@@ -4407,8 +4473,9 @@ void A_ScoreRise(mobj_t *actor)
// var1 = jump strength
// var2 = horizontal movement
//
void A_BunnyHop(mobj_t *actor)
void A_BunnyHop(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -4430,8 +4497,9 @@ void A_BunnyHop(mobj_t *actor)
// var1 = Distance to look for players. If no player is in this distance, bubbles aren't spawned. (Ambush overrides)
// var2 = unused
//
void A_BubbleSpawn(mobj_t *actor)
void A_BubbleSpawn(void *data)
{
mobj_t *actor = data;
INT32 i, locvar1 = var1;
UINT8 prandom;
mobj_t *bubble = NULL;
......@@ -4479,8 +4547,9 @@ void A_BubbleSpawn(mobj_t *actor)
// var1 = Distance to look for players. If no player is in this distance, bubbles aren't spawned. (Ambush overrides)
// var2 = unused
//
void A_FanBubbleSpawn(mobj_t *actor)
void A_FanBubbleSpawn(void *data)
{
mobj_t *actor = data;
INT32 i, locvar1 = var1;
UINT8 prandom;
mobj_t *bubble = NULL;
......@@ -4524,8 +4593,9 @@ void A_FanBubbleSpawn(mobj_t *actor)
// 1 = Rise straight up
// var2 = rising speed
//
void A_BubbleRise(mobj_t *actor)
void A_BubbleRise(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -4563,8 +4633,9 @@ void A_BubbleRise(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_BubbleCheck(mobj_t *actor)
void A_BubbleCheck(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_BUBBLECHECK, actor))
return;
......@@ -4581,8 +4652,9 @@ void A_BubbleCheck(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_AttractChase(mobj_t *actor)
void A_AttractChase(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_ATTRACTCHASE, actor))
return;
......@@ -4651,8 +4723,9 @@ void A_AttractChase(mobj_t *actor)
// lower 16 bits = proximity check distance (0 disables)
// upper 16 bits = 0 to check proximity with target, 1 for tracer
//
void A_DropMine(mobj_t *actor)
void A_DropMine(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t z;
......@@ -4694,7 +4767,7 @@ void A_DropMine(mobj_t *actor)
mine->momz = actor->momz + actor->pmomz;
}
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
}
// Function: A_FishJump
......@@ -4704,8 +4777,9 @@ void A_DropMine(mobj_t *actor)
// var1 = Jump strength (in FRACBITS), if specified. Otherwise, uses the angle value.
// var2 = Trail object to spawn, if desired.
//
void A_FishJump(mobj_t *actor)
void A_FishJump(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -4759,8 +4833,9 @@ void A_FishJump(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ThrownRing(mobj_t *actor)
void A_ThrownRing(void *data)
{
mobj_t *actor = data;
INT32 c = 0;
INT32 stop;
player_t *player;
......@@ -4796,7 +4871,7 @@ void A_ThrownRing(mobj_t *actor)
// A_GrenadeRing beeping lives once moooooore -SH
if (actor->type == MT_THROWNGRENADE && actor->fuse % TICRATE == 0)
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
// decrement bounce ring time
if (actor->flags2 & MF2_BOUNCERING)
......@@ -4919,8 +4994,9 @@ void A_ThrownRing(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SetSolidSteam(mobj_t *actor)
void A_SetSolidSteam(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SETSOLIDSTEAM, actor))
return;
......@@ -4931,12 +5007,12 @@ void A_SetSolidSteam(mobj_t *actor)
if (P_RandomChance(FRACUNIT/8))
{
if (actor->info->deathsound)
S_StartSound(actor, actor->info->deathsound); // Hiss!
S_StartSoundFromMobj(actor, actor->info->deathsound); // Hiss!
}
else
{
if (actor->info->painsound)
S_StartSound(actor, actor->info->painsound);
S_StartSoundFromMobj(actor, actor->info->painsound);
}
}
......@@ -4950,8 +5026,9 @@ void A_SetSolidSteam(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_UnsetSolidSteam(mobj_t *actor)
void A_UnsetSolidSteam(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_UNSETSOLIDSTEAM, actor))
return;
......@@ -4966,8 +5043,9 @@ void A_UnsetSolidSteam(mobj_t *actor)
// var1 = degrees to rotate object (must be positive, because I'm lazy)
// var2 = unused
//
void A_SignSpin(mobj_t *actor)
void A_SignSpin(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT16 i;
angle_t rotateangle = FixedAngle(locvar1 << FRACBITS);
......@@ -4979,7 +5057,7 @@ void A_SignSpin(mobj_t *actor)
{
if (actor->flags2 & MF2_BOSSFLEE)
{
S_StartSound(actor, actor->info->deathsound);
S_StartSoundFromMobj(actor, actor->info->deathsound);
actor->flags2 &= ~MF2_BOSSFLEE;
}
if (actor->spawnpoint)
......@@ -5006,7 +5084,7 @@ void A_SignSpin(mobj_t *actor)
{
if (!(actor->flags2 & MF2_BOSSFLEE))
{
S_StartSound(actor, actor->info->painsound);
S_StartSoundFromMobj(actor, actor->info->painsound);
actor->flags2 |= MF2_BOSSFLEE;
}
actor->movedir = rotateangle;
......@@ -5061,8 +5139,9 @@ static boolean SignSkinCheck(player_t *player, INT32 num)
// var1 = number of skin to display (e.g. 2 = Knuckles; special cases: -1 = target's skin, -2 = skin roulette, -3 = Eggman)
// var2 = custom sign color, if desired.
//
void A_SignPlayer(mobj_t *actor)
void A_SignPlayer(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
skin_t *skin = NULL;
......@@ -5190,8 +5269,9 @@ void A_SignPlayer(mobj_t *actor)
// var1 = unused
// var2 = invert, z offset
//
void A_OverlayThink(mobj_t *actor)
void A_OverlayThink(void *data)
{
mobj_t *actor = data;
fixed_t destx, desty;
if (LUA_CallAction(A_OVERLAYTHINK, actor))
......@@ -5242,8 +5322,9 @@ void A_OverlayThink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_JetChase(mobj_t *actor)
void A_JetChase(void *data)
{
mobj_t *actor = data;
fixed_t thefloor;
if (LUA_CallAction(A_JETCHASE, actor))
......@@ -5337,8 +5418,9 @@ void A_JetChase(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_JetbThink(mobj_t *actor)
void A_JetbThink(void *data)
{
mobj_t *actor = data;
sector_t *nextsector;
fixed_t thefloor;
......@@ -5371,7 +5453,7 @@ void A_JetbThink(mobj_t *actor)
P_SetTarget(&bomb->target, actor);
P_SetScale(bomb, actor->scale, true);
actor->reactiontime = TICRATE; // one second
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
}
}
}
......@@ -5404,8 +5486,9 @@ void A_JetbThink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_JetgShoot(mobj_t *actor)
void A_JetgShoot(void *data)
{
mobj_t *actor = data;
fixed_t dist;
if (LUA_CallAction(A_JETGSHOOT, actor))
......@@ -5437,7 +5520,7 @@ void A_JetgShoot(mobj_t *actor)
actor->reactiontime = actor->info->reactiontime*TICRATE*2;
if (actor->info->attacksound)
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
}
// Function: A_ShootBullet
......@@ -5447,8 +5530,9 @@ void A_JetgShoot(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ShootBullet(mobj_t *actor)
void A_ShootBullet(void *data)
{
mobj_t *actor = data;
fixed_t dist;
if (LUA_CallAction(A_SHOOTBULLET, actor))
......@@ -5469,7 +5553,7 @@ void A_ShootBullet(mobj_t *actor)
P_SpawnMissile(actor, actor->target, (mobjtype_t)actor->info->raisestate);
if (actor->info->attacksound)
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
}
static mobj_t *minus;
......@@ -5503,8 +5587,9 @@ static boolean PIT_MinusCarry(mobj_t *thing)
// var1 = If 1, play digging sound.
// var2 = unused
//
void A_MinusDigging(mobj_t *actor)
void A_MinusDigging(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 rad = 32;
angle_t fa = (actor->angle >> ANGLETOFINESHIFT) & FINEMASK;
......@@ -5540,7 +5625,7 @@ void A_MinusDigging(mobj_t *actor)
P_TryMove(actor, actor->target->x, actor->target->y, false);
if (P_MobjWasRemoved(actor))
return;
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
// Spawn growing dirt pile.
par = P_SpawnMobj(actor->x, actor->y, mz, MT_MINUSDIRT);
......@@ -5582,7 +5667,7 @@ void A_MinusDigging(mobj_t *actor)
minus = actor;
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_MinusCarry);
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_MinusCarry, minus);
}
else
{
......@@ -5600,8 +5685,9 @@ void A_MinusDigging(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_MinusPopup(mobj_t *actor)
void A_MinusPopup(void *data)
{
mobj_t *actor = data;
INT32 num = 6;
angle_t ani = FixedAngle(FRACUNIT*360/num);
INT32 i;
......@@ -5614,7 +5700,7 @@ void A_MinusPopup(mobj_t *actor)
else
actor->momz = 10*FRACUNIT;
S_StartSound(actor, sfx_s3k82);
S_StartSoundFromMobj(actor, sfx_s3k82);
for (i = 1; i <= num; i++)
{
mobj_t *rock = P_SpawnMobjFromMobj(actor, 0, 0, actor->height/4, MT_ROCKCRUMBLE1);
......@@ -5639,8 +5725,9 @@ void A_MinusPopup(mobj_t *actor)
// var1 = State to switch to (if 0, use seestate).
// var2 = If not 0, spawn debris when hitting the floor.
//
void A_MinusCheck(mobj_t *actor)
void A_MinusCheck(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -5676,8 +5763,9 @@ void A_MinusCheck(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ChickenCheck(mobj_t *actor)
void A_ChickenCheck(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_CHICKENCHECK, actor))
return;
......@@ -5703,8 +5791,9 @@ void A_ChickenCheck(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_JetgThink(mobj_t *actor)
void A_JetgThink(void *data)
{
mobj_t *actor = data;
sector_t *nextsector;
fixed_t thefloor;
......@@ -5757,8 +5846,9 @@ void A_JetgThink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_MouseThink(mobj_t *actor)
void A_MouseThink(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_MOUSETHINK, actor))
return;
......@@ -5791,8 +5881,9 @@ void A_MouseThink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_DetonChase(mobj_t *actor)
void A_DetonChase(void *data)
{
mobj_t *actor = data;
angle_t exact;
fixed_t xydist, dist;
......@@ -5924,7 +6015,7 @@ void A_DetonChase(mobj_t *actor)
xyspeed = 1;
if (leveltime % xyspeed == 0)
S_StartSound(actor, sfx_deton);
S_StartSoundFromMobj(actor, sfx_deton);
}
}
......@@ -5940,8 +6031,9 @@ void A_DetonChase(mobj_t *actor)
// upper 16 bits = forward/backward offset
// lower 16 bits = sideways offset
//
void A_CapeChase(mobj_t *actor)
void A_CapeChase(void *data)
{
mobj_t *actor = data;
mobj_t *chaser;
fixed_t foffsetx, foffsety, boffsetx, boffsety;
INT32 locvar1 = var1;
......@@ -6003,8 +6095,9 @@ void A_CapeChase(mobj_t *actor)
// 1 = Use tracer
// var2 = unused
//
void A_RotateSpikeBall(mobj_t *actor)
void A_RotateSpikeBall(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
const fixed_t radius = FixedMul(12*actor->info->speed, actor->scale);
......@@ -6054,8 +6147,9 @@ void A_RotateSpikeBall(mobj_t *actor)
// 2 = Throw when target leaves MF2_SKULLFLY.
// var2 = unused
//
void A_UnidusBall(mobj_t *actor)
void A_UnidusBall(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
boolean canthrow = false;
......@@ -6109,7 +6203,7 @@ void A_UnidusBall(mobj_t *actor)
else if (locvar1 == 2)
{
boolean skull = (actor->target->flags2 & MF2_SKULLFLY) == MF2_SKULLFLY;
if (actor->target->state == &states[actor->target->info->painstate])
if (P_IsMobjInPainState(actor->target))
{
P_KillMobj(actor, NULL, NULL, 0);
return;
......@@ -6147,8 +6241,9 @@ void A_UnidusBall(mobj_t *actor)
//
// var1 = unused
// var2 = unused
void A_RockSpawn(mobj_t *actor)
void A_RockSpawn(void *data)
{
mobj_t *actor = data;
mobj_t *mo;
mobjtype_t type;
fixed_t dist;
......@@ -6192,8 +6287,9 @@ void A_RockSpawn(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SlingAppear(mobj_t *actor)
void A_SlingAppear(void *data)
{
mobj_t *actor = data;
UINT8 mlength = 4;
mobj_t *spawnee, *hprev;
......@@ -6247,8 +6343,9 @@ void A_SlingAppear(mobj_t *actor)
// lower 16 bits = if > 0, state to change to when fuse = 1
// upper 16 bits: 0 = (default) don't set fuse unless 0, 1 = force change, 2 = force no change
//
void A_SetFuse(mobj_t *actor)
void A_SetFuse(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -6272,8 +6369,9 @@ void A_SetFuse(mobj_t *actor)
// var1 = shoot bullets?
// var2 = "pogo mode" speed
//
void A_CrawlaCommanderThink(mobj_t *actor)
void A_CrawlaCommanderThink(void *data)
{
mobj_t *actor = data;
fixed_t dist;
sector_t *nextsector;
fixed_t thefloor;
......@@ -6293,7 +6391,7 @@ void A_CrawlaCommanderThink(mobj_t *actor)
if (!actor->fuse && actor->flags2 & MF2_FRET)
{
if (actor->info->painsound)
S_StartSound(actor, actor->info->painsound);
S_StartSoundFromMobj(actor, actor->info->painsound);
actor->fuse = TICRATE/2;
actor->momz = 0;
......@@ -6388,7 +6486,7 @@ void A_CrawlaCommanderThink(mobj_t *actor)
P_InstaThrust(actor, actor->angle, FixedMul(40*FRACUNIT, actor->scale));
actor->threshold = 1;
if (actor->info->attacksound)
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
}
}
actor->reactiontime = 3*TICRATE + (P_RandomByte()>>2);
......@@ -6401,7 +6499,7 @@ void A_CrawlaCommanderThink(mobj_t *actor)
if (!hovermode && actor->z <= actor->floorz)
{
if (actor->info->activesound)
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
if (dist < FixedMul(256*FRACUNIT, actor->scale))
{
......@@ -6433,8 +6531,9 @@ void A_CrawlaCommanderThink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_RingExplode(mobj_t *actor)
void A_RingExplode(void *data)
{
mobj_t *actor = data;
mobj_t *mo2;
thinker_t *th;
angle_t d;
......@@ -6445,7 +6544,7 @@ void A_RingExplode(mobj_t *actor)
for (d = 0; d < 16; d++)
P_SpawnParaloop(actor->x, actor->y, actor->z + actor->height, FixedMul(actor->info->painchance, actor->scale), 16, MT_NIGHTSPARKLE, S_NULL, d*(ANGLE_22h), true);
S_StartSound(actor, sfx_prloop);
S_StartSoundFromMobj(actor, sfx_prloop);
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
{
......@@ -6477,7 +6576,9 @@ void A_RingExplode(mobj_t *actor)
// var1 = object # to explode as debris
// var2 = unused
//
void A_OldRingExplode(mobj_t *actor) {
void A_OldRingExplode(void *data)
{
mobj_t *actor = data;
UINT8 i;
mobj_t *mo;
const fixed_t ns = FixedMul(20 * FRACUNIT, actor->scale);
......@@ -6561,8 +6662,9 @@ void A_OldRingExplode(mobj_t *actor) {
// var1 = unused
// var2 = unused
//
void A_MixUp(mobj_t *actor)
void A_MixUp(void *data)
{
mobj_t *actor = data;
boolean teleported[MAXPLAYERS];
INT32 i, numplayers = 0, prandom = 0;
......@@ -6576,7 +6678,7 @@ void A_MixUp(mobj_t *actor)
// The random factor is okay for other game modes, but in these, it is cripplingly unfair.
if (gametype == GT_HIDEANDSEEK || gametype == GT_RACE)
{
S_StartSound(actor, sfx_lose);
S_StartSoundFromMobj(actor, sfx_lose);
return;
}
......@@ -6597,7 +6699,7 @@ void A_MixUp(mobj_t *actor)
if (numplayers <= 1) // Not enough players to mix up.
{
S_StartSound(actor, sfx_lose);
S_StartSoundFromMobj(actor, sfx_lose);
return;
}
else if (numplayers == 2) // Special case -- simple swap
......@@ -6817,7 +6919,7 @@ void A_MixUp(mobj_t *actor)
}
// Play the 'bowrwoosh!' sound
S_StartSound(NULL, sfx_mixup);
S_StartSoundFromEverywhere(sfx_mixup);
}
// Function: A_RecyclePowers
......@@ -6827,8 +6929,9 @@ void A_MixUp(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_RecyclePowers(mobj_t *actor)
void A_RecyclePowers(void *data)
{
mobj_t *actor = data;
INT32 i, j, k, numplayers = 0;
#ifdef WEIGHTEDRECYCLER
......@@ -6846,7 +6949,7 @@ void A_RecyclePowers(mobj_t *actor)
if (!multiplayer)
{
S_StartSound(actor, sfx_lose);
S_StartSoundFromMobj(actor, sfx_lose);
return;
}
......@@ -6885,7 +6988,7 @@ void A_RecyclePowers(mobj_t *actor)
if (numplayers <= 1)
{
S_StartSound(actor, sfx_lose);
S_StartSoundFromMobj(actor, sfx_lose);
return; //nobody to touch!
}
......@@ -6909,7 +7012,8 @@ void A_RecyclePowers(mobj_t *actor)
#ifdef WEIGHTEDRECYCLER
//the joys of qsort...
if (beneficiary != 255) {
if (beneficiary != 255)
{
qsort(playerslist, numplayers, sizeof(UINT8), P_RecycleCompare);
// now, make sure the benificiary is in the best slot
......@@ -6958,7 +7062,7 @@ void A_RecyclePowers(mobj_t *actor)
P_FlashPal(&players[recv_pl], PAL_RECYCLE, 10);
}
S_StartSound(NULL, sfx_gravch); //heh, the sound effect I used is already in
S_StartSoundFromEverywhere(sfx_gravch); //heh, the sound effect I used is already in
}
// Function: A_Boss1Chase
......@@ -6968,8 +7072,9 @@ void A_RecyclePowers(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Boss1Chase(mobj_t *actor)
void A_Boss1Chase(void *data)
{
mobj_t *actor = data;
INT32 delta;
if (LUA_CallAction(A_BOSS1CHASE, actor))
......@@ -7087,8 +7192,9 @@ nomissile:
// var1 = unused
// var2 = unused
//
void A_Boss2Chase(mobj_t *actor)
void A_Boss2Chase(void *data)
{
mobj_t *actor = data;
fixed_t radius;
boolean reverse = false;
INT32 speedvar;
......@@ -7220,8 +7326,9 @@ void A_Boss2Chase(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Boss2Pogo(mobj_t *actor)
void A_Boss2Pogo(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_BOSS2POGO, actor))
return;
......@@ -7268,8 +7375,9 @@ void A_Boss2Pogo(mobj_t *actor)
// var1 = Invincibility duration
// var2 = unused
//
void A_Boss2TakeDamage(mobj_t *actor)
void A_Boss2TakeDamage(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_BOSS2TAKEDAMAGE, actor))
......@@ -7290,8 +7398,9 @@ void A_Boss2TakeDamage(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Boss7Chase(mobj_t *actor)
void A_Boss7Chase(void *data)
{
mobj_t *actor = data;
INT32 delta;
INT32 i;
......@@ -7311,7 +7420,7 @@ void A_Boss7Chase(mobj_t *actor)
if (actor->flags2 & MF2_FRET)
{
P_SetMobjState(actor, S_BLACKEGG_DESTROYPLAT1);
S_StartSound(0, sfx_s3k53);
S_StartSoundFromEverywhere(sfx_s3k53);
actor->flags2 &= ~MF2_FRET;
return;
}
......@@ -7348,7 +7457,7 @@ void A_Boss7Chase(mobj_t *actor)
{
// Punch him!
P_SetMobjState(actor, actor->info->meleestate);
S_StartSound(0, sfx_begrnd); // warning sound
S_StartSoundFromEverywhere(sfx_begrnd); // warning sound
return;
}
}
......@@ -7402,7 +7511,7 @@ void A_Boss7Chase(mobj_t *actor)
if (P_MobjWasRemoved(actor))
return;
P_SetMobjState(actor, actor->info->missilestate);
S_StartSound(0, sfx_beflap);
S_StartSoundFromEverywhere(sfx_beflap);
break;
}
......@@ -7431,8 +7540,9 @@ void A_Boss7Chase(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_GoopSplat(mobj_t *actor)
void A_GoopSplat(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_GOOPSPLAT, actor))
return;
......@@ -7453,8 +7563,9 @@ void A_GoopSplat(mobj_t *actor)
// var1 = pogo jump strength
// var2 = idle pogo speed
//
void A_Boss2PogoSFX(mobj_t *actor)
void A_Boss2PogoSFX(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -7483,7 +7594,7 @@ void A_Boss2PogoSFX(mobj_t *actor)
actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_RandomChance(FRACUNIT/2) ? -prandom : +prandom);
P_InstaThrust(actor, actor->angle, FixedMul(FixedMul(actor->info->speed,(locvar2)), actor->scale));
}
if (actor->info->activesound) S_StartSound(actor, actor->info->activesound);
if (actor->info->activesound) S_StartSoundFromMobj(actor, actor->info->activesound);
actor->momz = FixedMul(locvar1, actor->scale); // Bounce up in air
actor->reactiontime = 1;
}
......@@ -7495,8 +7606,9 @@ void A_Boss2PogoSFX(mobj_t *actor)
// var1 = pogo jump strength
// var2 = idle pogo speed
//
void A_Boss2PogoTarget(mobj_t *actor)
void A_Boss2PogoTarget(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -7571,7 +7683,7 @@ void A_Boss2PogoTarget(mobj_t *actor)
P_InstaThrust(actor, actor->angle, FixedMul(FixedMul(actor->info->speed,(locvar2)), actor->scale)); // Move at wandering speed
}
// Boing!
if (actor->info->activesound) S_StartSound(actor, actor->info->activesound);
if (actor->info->activesound) S_StartSoundFromMobj(actor, actor->info->activesound);
if (actor->info->missilestate) // spawn the pogo stick collision box
{
......@@ -7590,8 +7702,9 @@ void A_Boss2PogoTarget(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_EggmanBox(mobj_t *actor)
void A_EggmanBox(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_EGGMANBOX, actor))
return;
......@@ -7611,8 +7724,9 @@ void A_EggmanBox(mobj_t *actor)
// var1 = object # to repeatedly fire
// var2 = distance threshold
//
void A_TurretFire(mobj_t *actor)
void A_TurretFire(void *data)
{
mobj_t *actor = data;
INT32 count = 0;
fixed_t dist;
INT32 locvar1 = var1;
......@@ -7649,8 +7763,9 @@ void A_TurretFire(mobj_t *actor)
// var1 = object # to repeatedly fire
// var2 = distance threshold
//
void A_SuperTurretFire(mobj_t *actor)
void A_SuperTurretFire(void *data)
{
mobj_t *actor = data;
INT32 count = 0;
fixed_t dist;
INT32 locvar1 = var1;
......@@ -7688,8 +7803,9 @@ void A_SuperTurretFire(mobj_t *actor)
// var1 = Don't play activesound?
// var2 = unused
//
void A_TurretStop(mobj_t *actor)
void A_TurretStop(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_TURRETSTOP, actor))
......@@ -7699,7 +7815,7 @@ void A_TurretStop(mobj_t *actor)
actor->flags2 &= ~MF2_SUPERFIRE;
if (actor->target && actor->info->activesound && !locvar1)
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
}
// Function: A_SparkFollow
......@@ -7709,8 +7825,9 @@ void A_TurretStop(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SparkFollow(mobj_t *actor)
void A_SparkFollow(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SPARKFOLLOW, actor))
return;
......@@ -7742,8 +7859,9 @@ void A_SparkFollow(mobj_t *actor)
// var1 = sfx to play
// var2 = length of sfx, set to threshold if played
//
void A_BuzzFly(mobj_t *actor)
void A_BuzzFly(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -7830,7 +7948,7 @@ void A_BuzzFly(mobj_t *actor)
if (locvar1 != sfx_None && !actor->threshold)
{
S_StartSound(actor, locvar1);
S_StartSoundFromMobj(actor, locvar1);
actor->threshold = locvar2;
}
}
......@@ -7842,8 +7960,9 @@ void A_BuzzFly(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_GuardChase(mobj_t *actor)
void A_GuardChase(void *data)
{
mobj_t *actor = data;
INT32 delta;
if (LUA_CallAction(A_GUARDCHASE, actor))
......@@ -7945,10 +8064,10 @@ void A_GuardChase(mobj_t *actor)
// Now that we've moved, its time for our shield to move!
// Otherwise it'll never act as a proper overlay.
if (actor->tracer && actor->tracer->state
&& actor->tracer->state->action.acp1)
&& actor->tracer->state->action)
{
var1 = actor->tracer->state->var1, var2 = actor->tracer->state->var2;
actor->tracer->state->action.acp1(actor->tracer);
actor->tracer->state->action(actor->tracer);
}
}
......@@ -7959,8 +8078,9 @@ void A_GuardChase(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_EggShield(mobj_t *actor)
void A_EggShield(void *data)
{
mobj_t *actor = data;
INT32 i;
player_t *player;
fixed_t blockdist;
......@@ -8049,8 +8169,9 @@ void A_EggShield(mobj_t *actor)
// var1 = 1 (use value in var2); 0 (use info table value)
// var2 = if var1 = 1, then value to set
//
void A_SetReactionTime(mobj_t *actor)
void A_SetReactionTime(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_SETREACTIONTIME, actor))
return;
......@@ -8067,8 +8188,9 @@ void A_SetReactionTime(mobj_t *actor)
// var1 = ball number
// var2 = total balls
//
void A_Boss1Spikeballs(mobj_t *actor)
void A_Boss1Spikeballs(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *ball;
......@@ -8083,9 +8205,9 @@ void A_Boss1Spikeballs(mobj_t *actor)
ball->movedir = FixedAngle(FixedMul(FixedDiv(locvar1<<FRACBITS, locvar2<<FRACBITS), 360<<FRACBITS));
ball->threshold = ball->radius + actor->radius + ball->info->painchance;
S_StartSound(ball, ball->info->seesound);
S_StartSoundFromMobj(ball, ball->info->seesound);
var1 = ball->state->var1, var2 = ball->state->var2;
ball->state->action.acp1(ball);
ball->state->action(ball);
}
// Function: A_Boss3TakeDamage
......@@ -8095,8 +8217,9 @@ void A_Boss1Spikeballs(mobj_t *actor)
// var1 = movecount value
// var2 = unused
//
void A_Boss3TakeDamage(mobj_t *actor)
void A_Boss3TakeDamage(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_BOSS3TAKEDAMAGE, actor))
return;
......@@ -8111,8 +8234,9 @@ void A_Boss3TakeDamage(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Boss3Path(mobj_t *actor)
void A_Boss3Path(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_BOSS3PATH, actor))
return;
......@@ -8235,8 +8359,9 @@ void A_Boss3Path(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Boss3ShockThink(mobj_t *actor)
void A_Boss3ShockThink(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_BOSS3SHOCKTHINK, actor))
return;
......@@ -8293,8 +8418,9 @@ void A_Boss3ShockThink(mobj_t *actor)
// var1 = object spawned
// var2 = amount of objects spawned
//
void A_Shockwave(mobj_t *actor)
void A_Shockwave(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
INT32 i;
......@@ -8333,7 +8459,7 @@ void A_Shockwave(mobj_t *actor)
sprev = shock;
}
S_StartSound(actor, shock->info->seesound);
S_StartSoundFromMobj(actor, shock->info->seesound);
}
// Function: A_LinedefExecute
......@@ -8343,8 +8469,9 @@ void A_Shockwave(mobj_t *actor)
// var1 = tag
// var2 = add angle to tag (optional)
//
void A_LinedefExecute(mobj_t *actor)
void A_LinedefExecute(void *data)
{
mobj_t *actor = data;
INT32 tagnum;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -8371,8 +8498,9 @@ void A_LinedefExecute(mobj_t *actor)
// var1 = mapthing arg to take tag from
// var2 = unused
//
void A_LinedefExecuteFromArg(mobj_t *actor)
void A_LinedefExecuteFromArg(void *data)
{
mobj_t *actor = data;
INT32 tagnum;
INT32 locvar1 = var1;
......@@ -8403,8 +8531,9 @@ void A_LinedefExecuteFromArg(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_PlaySeeSound(mobj_t *actor)
void A_PlaySeeSound(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_PLAYSEESOUND, actor))
return;
......@@ -8422,8 +8551,9 @@ void A_PlaySeeSound(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_PlayAttackSound(mobj_t *actor)
void A_PlayAttackSound(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_PLAYATTACKSOUND, actor))
return;
......@@ -8438,13 +8568,14 @@ void A_PlayAttackSound(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_PlayActiveSound(mobj_t *actor)
void A_PlayActiveSound(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_PLAYACTIVESOUND, actor))
return;
if (actor->info->activesound)
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
}
// Function: A_SmokeTrailer
......@@ -8454,8 +8585,9 @@ void A_PlayActiveSound(mobj_t *actor)
// var1 = object # to spawn as smoke
// var2 = unused
//
void A_SmokeTrailer(mobj_t *actor)
void A_SmokeTrailer(void *data)
{
mobj_t *actor = data;
mobj_t *th;
INT32 locvar1 = var1;
......@@ -8494,8 +8626,9 @@ void A_SmokeTrailer(mobj_t *actor)
// var2 >> 16 = z
// var2 & 65535 = type
//
void A_SpawnObjectAbsolute(mobj_t *actor)
void A_SpawnObjectAbsolute(void *data)
{
mobj_t *actor = data;
INT16 x, y, z; // Want to be sure we can use negative values
mobjtype_t type;
mobj_t *mo;
......@@ -8532,8 +8665,9 @@ void A_SpawnObjectAbsolute(mobj_t *actor)
// var2 >> 16 = z
// var2 & 65535 = type
//
void A_SpawnObjectRelative(mobj_t *actor)
void A_SpawnObjectRelative(void *data)
{
mobj_t *actor = data;
INT16 x, y, z; // Want to be sure we can use negative values
mobjtype_t type;
mobj_t *mo;
......@@ -8573,8 +8707,9 @@ void A_SpawnObjectRelative(mobj_t *actor)
// var1 = min
// var2 = max
//
void A_ChangeAngleRelative(mobj_t *actor)
void A_ChangeAngleRelative(void *data)
{
mobj_t *actor = data;
// Oh god, the old code /sucked/. Changed this and the absolute version to get a random range using amin and amax instead of
// getting a random angle from the _entire_ spectrum and then clipping. While we're at it, do the angle conversion to the result
// rather than the ranges, so <0 and >360 work as possible values. -Red
......@@ -8609,8 +8744,9 @@ void A_ChangeAngleRelative(mobj_t *actor)
// var1 = min
// var2 = max
//
void A_ChangeAngleAbsolute(mobj_t *actor)
void A_ChangeAngleAbsolute(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
//angle_t angle = (P_RandomByte()+1)<<24;
......@@ -8642,8 +8778,9 @@ void A_ChangeAngleAbsolute(mobj_t *actor)
// var1 = angle
// var2 = relative? (default)
//
void A_RollAngle(mobj_t *actor)
void A_RollAngle(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
const angle_t angle = FixedAngle(locvar1*FRACUNIT);
......@@ -8666,8 +8803,9 @@ void A_RollAngle(mobj_t *actor)
// var1 = min
// var2 = max
//
void A_ChangeRollAngleRelative(mobj_t *actor)
void A_ChangeRollAngleRelative(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
const fixed_t amin = locvar1*FRACUNIT;
......@@ -8691,8 +8829,9 @@ void A_ChangeRollAngleRelative(mobj_t *actor)
// var1 = min
// var2 = max
//
void A_ChangeRollAngleAbsolute(mobj_t *actor)
void A_ChangeRollAngleAbsolute(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
const fixed_t amin = locvar1*FRACUNIT;
......@@ -8718,8 +8857,9 @@ void A_ChangeRollAngleAbsolute(mobj_t *actor)
// lower 16 bits = If 1, play sound using calling object as origin. If 0, play sound without an origin
// upper 16 bits = If 1, do not play sound during preticker.
//
void A_PlaySound(mobj_t *actor)
void A_PlaySound(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -8729,7 +8869,7 @@ void A_PlaySound(mobj_t *actor)
if (leveltime < 2 && (locvar2 >> 16))
return;
S_StartSound((locvar2 & 65535) ? actor : NULL, locvar1);
S_StartSoundFromMobj((locvar2 & 65535) ? actor : NULL, locvar1);
}
// Function: A_FindTarget
......@@ -8739,8 +8879,9 @@ void A_PlaySound(mobj_t *actor)
// var1 = mobj type
// var2 = if (0) nearest; else furthest;
//
void A_FindTarget(mobj_t *actor)
void A_FindTarget(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *targetedmobj = NULL;
......@@ -8803,8 +8944,9 @@ void A_FindTarget(mobj_t *actor)
// var1 = mobj type
// var2 = if (0) nearest; else furthest;
//
void A_FindTracer(mobj_t *actor)
void A_FindTracer(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *targetedmobj = NULL;
......@@ -8867,8 +9009,9 @@ void A_FindTracer(mobj_t *actor)
// var1 = tics to set to
// var2 = if this is set, and no var1 is supplied, the mobj's threshold value will be used.
//
void A_SetTics(mobj_t *actor)
void A_SetTics(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -8888,8 +9031,9 @@ void A_SetTics(mobj_t *actor)
// var1 = lower bound
// var2 = upper bound
//
void A_SetRandomTics(mobj_t *actor)
void A_SetRandomTics(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -8906,8 +9050,9 @@ void A_SetRandomTics(mobj_t *actor)
// var1 = if (var1 > 0), find target and add its color value to yours
// var2 = if (var1 = 0), color value to add
//
void A_ChangeColorRelative(mobj_t *actor)
void A_ChangeColorRelative(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -8931,8 +9076,9 @@ void A_ChangeColorRelative(mobj_t *actor)
// var1 = if (var1 > 0), set your color to your target's color
// var2 = if (var1 = 0), color value to set to
//
void A_ChangeColorAbsolute(mobj_t *actor)
void A_ChangeColorAbsolute(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -8955,8 +9101,9 @@ void A_ChangeColorAbsolute(mobj_t *actor)
// var1 = if (var1 != 0), dye your target instead of yourself
// var2 = color value to dye
//
void A_Dye(mobj_t *actor)
void A_Dye(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -8990,8 +9137,9 @@ void A_Dye(mobj_t *actor)
// var1 = translation ID
// var2 = unused
//
void A_SetTranslation(mobj_t *actor)
void A_SetTranslation(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_SETTRANSLATION, actor))
......@@ -9010,8 +9158,9 @@ void A_SetTranslation(mobj_t *actor)
// var1 = angle
// var2 = force
//
void A_MoveRelative(mobj_t *actor)
void A_MoveRelative(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9028,8 +9177,9 @@ void A_MoveRelative(mobj_t *actor)
// var1 = angle
// var2 = force
//
void A_MoveAbsolute(mobj_t *actor)
void A_MoveAbsolute(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9046,8 +9196,9 @@ void A_MoveAbsolute(mobj_t *actor)
// var1 = amount of force
// var2 = If 1, xy momentum is lost. If 0, xy momentum is kept
//
void A_Thrust(mobj_t *actor)
void A_Thrust(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9072,8 +9223,9 @@ void A_Thrust(mobj_t *actor)
// lower 16 bits = If 1, xy momentum is lost. If 0, xy momentum is kept
// upper 16 bits = If 1, z momentum is lost. If 0, z momentum is kept
//
void A_ZThrust(mobj_t *actor)
void A_ZThrust(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9105,8 +9257,9 @@ void A_ZThrust(mobj_t *actor)
// 0 = target/tracer's target
// 1 = target/tracer's tracer
//
void A_SetTargetsTarget(mobj_t *actor)
void A_SetTargetsTarget(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *oldtarg = NULL, *newtarg = NULL;
......@@ -9149,8 +9302,9 @@ void A_SetTargetsTarget(mobj_t *actor)
// else if var2 == 1, remove the flag from the current flags
// else if var2 == 0, set the flags to the exact value
//
void A_SetObjectFlags(mobj_t *actor)
void A_SetObjectFlags(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
boolean unlinkthings = false;
......@@ -9166,7 +9320,8 @@ void A_SetObjectFlags(mobj_t *actor)
if ((UINT32)(locvar1 & (MF_NOBLOCKMAP|MF_NOSECTOR)) != (actor->flags & (MF_NOBLOCKMAP|MF_NOSECTOR))) // Blockmap/sector status has changed, so reset the links
unlinkthings = true;
if (unlinkthings) {
if (unlinkthings)
{
P_UnsetThingPosition(actor);
if (sector_list)
{
......@@ -9191,8 +9346,9 @@ void A_SetObjectFlags(mobj_t *actor)
// else if var2 == 1, remove the flag from the current flags
// else if var2 == 0, set the flags to the exact value
//
void A_SetObjectFlags2(mobj_t *actor)
void A_SetObjectFlags2(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9218,8 +9374,9 @@ void A_SetObjectFlags2(mobj_t *actor)
// 3 - Boss 4 jet flame
// var2 = unused
//
void A_BossJetFume(mobj_t *actor)
void A_BossJetFume(void *data)
{
mobj_t *actor = data;
mobj_t *filler;
INT32 locvar1 = var1;
......@@ -9366,8 +9523,9 @@ void A_BossJetFume(mobj_t *actor)
// var1 = state number 1
// var2 = state number 2
//
void A_RandomState(mobj_t *actor)
void A_RandomState(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9384,8 +9542,9 @@ void A_RandomState(mobj_t *actor)
// var1 = Minimum state number to choose.
// var2 = Maximum state number to use.
//
void A_RandomStateRange(mobj_t *actor)
void A_RandomStateRange(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9402,8 +9561,9 @@ void A_RandomStateRange(mobj_t *actor)
// var1 = Minimum state number to use.
// var2 = Maximum state number to use. The difference will act as a modulo operator.
//
void A_StateRangeByAngle(mobj_t *actor)
void A_StateRangeByAngle(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9423,8 +9583,9 @@ void A_StateRangeByAngle(mobj_t *actor)
// var1 = Minimum state number to use.
// var2 = Maximum state number to use. The difference will act as a modulo operator.
//
void A_StateRangeByParameter(mobj_t *actor)
void A_StateRangeByParameter(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
UINT8 parameter = (actor->spawnpoint ? actor->spawnpoint->extrainfo : 0);
......@@ -9445,8 +9606,9 @@ void A_StateRangeByParameter(mobj_t *actor)
// var1 = state # to use 1st action from
// var2 = state # to use 2nd action from
//
void A_DualAction(mobj_t *actor)
void A_DualAction(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9460,14 +9622,14 @@ void A_DualAction(mobj_t *actor)
astate = &states[locvar1];
CONS_Debug(DBG_GAMELOGIC, "A_DualAction: Calling First Action (state %d)...\n", locvar1);
states[locvar1].action.acp1(actor);
states[locvar1].action(actor);
var1 = states[locvar2].var1;
var2 = states[locvar2].var2;
astate = &states[locvar2];
CONS_Debug(DBG_GAMELOGIC, "A_DualAction: Calling Second Action (state %d)...\n", locvar2);
states[locvar2].action.acp1(actor);
states[locvar2].action(actor);
}
// Function: A_RemoteAction
......@@ -9477,8 +9639,9 @@ void A_DualAction(mobj_t *actor)
// var1 = remote object (-2 uses tracer, -1 uses target)
// var2 = state reference for calling an action
//
void A_RemoteAction(mobj_t *actor)
void A_RemoteAction(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *originaltarget = actor->target; // Hold on to the target for later.
......@@ -9550,7 +9713,7 @@ void A_RemoteAction(mobj_t *actor)
CONS_Debug(DBG_GAMELOGIC, "A_RemoteAction: Calling action on %p\n"
"var1 is %d\nvar2 is %d\n", actor->target, var1, var2);
states[locvar2].action.acp1(actor->target);
states[locvar2].action(actor->target);
}
P_SetTarget(&actor->target, originaltarget); // Restore the original target.
......@@ -9563,8 +9726,9 @@ void A_RemoteAction(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ToggleFlameJet(mobj_t* actor)
void A_ToggleFlameJet(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_TOGGLEFLAMEJET, actor))
return;
......@@ -9606,8 +9770,9 @@ void A_ToggleFlameJet(mobj_t* actor)
// Bits 1-10: X factor
// Bits 11-20: Y factor
// Bits 21-30: Z factor
void A_OrbitNights(mobj_t* actor)
void A_OrbitNights(void *data)
{
mobj_t *actor = data;
INT32 ofs = (var2 & 0x3FF);
boolean ishelper = (var2 & 0x10000);
boolean donotrescale = (var2 & 0x40000);
......@@ -9684,8 +9849,9 @@ void A_OrbitNights(mobj_t* actor)
// var1 = duration in tics
// var2 = unused
//
void A_GhostMe(mobj_t *actor)
void A_GhostMe(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
mobj_t *ghost;
......@@ -9706,8 +9872,9 @@ void A_GhostMe(mobj_t *actor)
// 0 = target
// 1 = tracer
//
void A_SetObjectState(mobj_t *actor)
void A_SetObjectState(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *target;
......@@ -9745,8 +9912,9 @@ void A_SetObjectState(mobj_t *actor)
// lower 16 bits = type
// upper 16 bits = range (if == 0, across whole map)
//
void A_SetObjectTypeState(mobj_t *actor)
void A_SetObjectTypeState(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
const UINT16 loc2lw = (UINT16)(locvar2 & 65535);
......@@ -9793,8 +9961,9 @@ void A_SetObjectTypeState(mobj_t *actor)
// 1 = tracer
// var2 = unused
//
void A_KnockBack(mobj_t *actor)
void A_KnockBack(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
mobj_t *target;
......@@ -9826,8 +9995,9 @@ void A_KnockBack(mobj_t *actor)
// lower 16 bits = If 1, xy momentum is lost. If 0, xy momentum is kept
// upper 16 bits = 0 - target, 1 - tracer
//
void A_PushAway(mobj_t *actor)
void A_PushAway(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *target; // target
......@@ -9862,8 +10032,9 @@ void A_PushAway(mobj_t *actor)
// var1 = ammount of drained rings
// var2 = unused
//
void A_RingDrain(mobj_t *actor)
void A_RingDrain(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
player_t *player;
......@@ -9890,8 +10061,9 @@ void A_RingDrain(mobj_t *actor)
// lower 16 bits = missile type
// upper 16 bits = height offset
//
void A_SplitShot(mobj_t *actor)
void A_SplitShot(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
const UINT16 loc2lw = (UINT16)(locvar2 & 65535);
......@@ -9933,8 +10105,9 @@ void A_SplitShot(mobj_t *actor)
// var1 = splitting missile type
// var2 = splitting angle
//
void A_MissileSplit(mobj_t *actor)
void A_MissileSplit(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -9956,8 +10129,9 @@ void A_MissileSplit(mobj_t *actor)
// upper 16 bits = missile type #
// var2 = height offset
//
void A_MultiShot(mobj_t *actor)
void A_MultiShot(void *data)
{
mobj_t *actor = data;
fixed_t z, xr, yr;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10019,8 +10193,9 @@ void A_MultiShot(mobj_t *actor)
// upper 16 bits = maximum step #
// var2 = force
//
void A_InstaLoop(mobj_t *actor)
void A_InstaLoop(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t force = max(locvar2, 1)*FRACUNIT; // defaults to 1 if var2 < 1
......@@ -10048,8 +10223,9 @@ void A_InstaLoop(mobj_t *actor)
// lower 16 bits = vertical rotation speed in 1/10 fracunits per tic
// upper 16 bits = horizontal rotation speed in 1/10 fracunits per tic
//
void A_Custom3DRotate(mobj_t *actor)
void A_Custom3DRotate(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10118,8 +10294,9 @@ void A_Custom3DRotate(mobj_t *actor)
// else, do not call a specific state if no players are available
// var2 = state number
//
void A_SearchForPlayers(mobj_t *actor)
void A_SearchForPlayers(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10149,8 +10326,9 @@ void A_SearchForPlayers(mobj_t *actor)
// upper 16 bits = numerator (defaults to 1 if zero)
// var2 = state number
//
void A_CheckRandom(mobj_t *actor)
void A_CheckRandom(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t chance = FRACUNIT;
......@@ -10177,8 +10355,9 @@ void A_CheckRandom(mobj_t *actor)
// var1 = if player rings >= var1 call state
// var2 = state number
//
void A_CheckTargetRings(mobj_t *actor)
void A_CheckTargetRings(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10199,8 +10378,9 @@ void A_CheckTargetRings(mobj_t *actor)
// var1 = if player rings >= var1 call state
// var2 = state number
//
void A_CheckRings(mobj_t *actor)
void A_CheckRings(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
INT32 i, cntr = 0;
......@@ -10222,8 +10402,9 @@ void A_CheckRings(mobj_t *actor)
// var1 = if total player rings >= var1 call state
// var2 = state number
//
void A_CheckTotalRings(mobj_t *actor)
void A_CheckTotalRings(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10246,8 +10427,9 @@ void A_CheckTotalRings(mobj_t *actor)
// var1 = if health <= var1 call state
// var2 = state number
//
void A_CheckHealth(mobj_t *actor)
void A_CheckHealth(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10267,8 +10449,9 @@ void A_CheckHealth(mobj_t *actor)
// upper 16 bits = 0 - target, 1 - tracer
// var2 = state number
//
void A_CheckRange(mobj_t *actor)
void A_CheckRange(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t dist;
......@@ -10297,8 +10480,9 @@ void A_CheckRange(mobj_t *actor)
// upper 16 bits = 0 - target, 1 - tracer
// var2 = state number
//
void A_CheckHeight(mobj_t *actor)
void A_CheckHeight(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t height;
......@@ -10327,8 +10511,9 @@ void A_CheckHeight(mobj_t *actor)
// upper 16 bits = 0 - target, 1 - tracer
// var2 = state number
//
void A_CheckTrueRange(mobj_t *actor)
void A_CheckTrueRange(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t height; // vertical range
......@@ -10371,8 +10556,9 @@ void A_CheckTrueRange(mobj_t *actor)
// lower 16 bits = state to call
// upper 16 bits = range (if == 0, check whole map)
//
void A_CheckThingCount(mobj_t *actor)
void A_CheckThingCount(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10423,8 +10609,9 @@ void A_CheckThingCount(mobj_t *actor)
// 1 = tracer
// var2 = state number
//
void A_CheckAmbush(mobj_t *actor)
void A_CheckAmbush(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
angle_t at; // angle target is currently facing
......@@ -10464,8 +10651,9 @@ void A_CheckAmbush(mobj_t *actor)
// var1 = if custom value >= var1, call state
// var2 = state number
//
void A_CheckCustomValue(mobj_t *actor)
void A_CheckCustomValue(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10483,8 +10671,9 @@ void A_CheckCustomValue(mobj_t *actor)
// var1 = if memory value >= var1, call state
// var2 = state number
//
void A_CheckCusValMemo(mobj_t *actor)
void A_CheckCusValMemo(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10508,8 +10697,9 @@ void A_CheckCusValMemo(mobj_t *actor)
// else if var2 == 1, substract var1 from the custom value
// else if var2 == 0, replace the custom value with var1
//
void A_SetCustomValue(mobj_t *actor)
void A_SetCustomValue(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10555,8 +10745,9 @@ void A_SetCustomValue(mobj_t *actor)
// else if var2 == 1, mem -= cv || cv -= mem
// else mem = cv || cv = mem
//
void A_UseCusValMemo(mobj_t *actor)
void A_UseCusValMemo(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10618,8 +10809,9 @@ void A_UseCusValMemo(mobj_t *actor)
// else if var2 == 1, substract var1 from the target's custom value
// else if var2 == 0, replace the target's custom value with var1
//
void A_RelayCustomValue(mobj_t *actor)
void A_RelayCustomValue(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10680,8 +10872,9 @@ void A_RelayCustomValue(mobj_t *actor)
// else if var2 == 1, only replace new action's var2 with custom value
// else if var2 == 0, only replace new action's var1 with custom value
//
void A_CusValAction(mobj_t *actor)
void A_CusValAction(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10720,7 +10913,7 @@ void A_CusValAction(mobj_t *actor)
}
astate = &states[locvar1];
states[locvar1].action.acp1(actor);
states[locvar1].action(actor);
}
// Function: A_ForceStop
......@@ -10732,8 +10925,9 @@ void A_CusValAction(mobj_t *actor)
// else, stop x-y-movement only
// var2 = unused
//
void A_ForceStop(mobj_t *actor)
void A_ForceStop(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_FORCESTOP, actor))
......@@ -10751,8 +10945,9 @@ void A_ForceStop(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_ForceWin(mobj_t *actor)
void A_ForceWin(void *data)
{
mobj_t *actor = data;
INT32 i;
if (LUA_CallAction(A_FORCEWIN, actor))
......@@ -10785,8 +10980,9 @@ void A_ForceWin(mobj_t *actor)
// else, actor solid
// var2 = unused
//
void A_SpikeRetract(mobj_t *actor)
void A_SpikeRetract(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_SPIKERETRACT, actor))
......@@ -10823,8 +11019,9 @@ void A_SpikeRetract(mobj_t *actor)
// else if var1 == 6, set actor to raisestate
// var2 = unused
//
void A_InfoState(mobj_t *actor)
void A_InfoState(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
switch (locvar1)
{
......@@ -10868,8 +11065,9 @@ void A_InfoState(mobj_t *actor)
// var1 = repeat count
// var2 = state to return to if extravalue2 > 0
//
void A_Repeat(mobj_t *actor)
void A_Repeat(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -10892,8 +11090,9 @@ void A_Repeat(mobj_t *actor)
// upper 16 bits: 0 = actor, 1 = target, 2 = tracer
// lower 16 bits: 0 = instant change, 1 = smooth change
//
void A_SetScale(mobj_t *actor)
void A_SetScale(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *target;
......@@ -10935,8 +11134,9 @@ void A_SetScale(mobj_t *actor)
// var1 = Mobj affected: 0 - actor, 1 - target, 2 - tracer
// var2 = Action: 0 - Damage, 1 - Kill, 2 - Remove
//
void A_RemoteDamage(mobj_t *actor)
void A_RemoteDamage(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *target; // we MUST have a target
......@@ -10987,8 +11187,9 @@ void A_RemoteDamage(mobj_t *actor)
// var1 = speed multiple
// var2 = destination: 0 = target, 1 = tracer
//
void A_HomingChase(mobj_t *actor)
void A_HomingChase(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *dest;
......@@ -11036,8 +11237,9 @@ void A_HomingChase(mobj_t *actor)
// use vertical angle variable as horizontal distance to cover during momz calculation
// upper 16 bits = height offset
//
void A_TrapShot(mobj_t *actor)
void A_TrapShot(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
boolean oldstyle = (locvar2 & 32768) ? true : false;
......@@ -11072,7 +11274,7 @@ void A_TrapShot(mobj_t *actor)
P_SetScale(missile, actor->scale, true);
if (missile->info->seesound)
S_StartSound(missile, missile->info->seesound);
S_StartSoundFromMobj(missile, missile->info->seesound);
P_SetTarget(&missile->target, actor);
missile->angle = actor->angle;
......@@ -11106,8 +11308,9 @@ void A_TrapShot(mobj_t *actor)
// var1 = mobj to spawn
// var2 = If 0, target only the actor's target. Else, target every player, period.
//
void A_VileTarget(mobj_t *actor)
void A_VileTarget(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *fog;
......@@ -11198,8 +11401,9 @@ void A_VileTarget(mobj_t *actor)
// Lower 16 bits = optional explosion object
// Upper 16 bits = If 0, attack only the actor's target. Else, attack all the players. All of them.
//
void A_VileAttack(mobj_t *actor)
void A_VileAttack(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
sfxenum_t soundtoplay;
......@@ -11227,11 +11431,12 @@ void A_VileAttack(mobj_t *actor)
explosionType = (mobjtype_t)(locvar2 & 0xFFFF);
}
if (!(locvar2 & 0xFFFF0000)) {
if (!(locvar2 & 0xFFFF0000))
{
if (!P_CheckSight(actor, actor->target))
return;
S_StartSound(actor, soundtoplay);
S_StartSoundFromMobj(actor, soundtoplay);
P_DamageMobj(actor->target, actor, actor, 1, 0);
//actor->target->momz = 1000*FRACUNIT/actor->target->info->mass; // How id did it
actor->target->momz += FixedMul(10*FRACUNIT, actor->scale)*P_MobjFlip(actor->target); // How we're doing it
......@@ -11272,7 +11477,7 @@ void A_VileAttack(mobj_t *actor)
if (!P_CheckSight(actor, players[i].mo))
continue;
S_StartSound(actor, soundtoplay);
S_StartSoundFromMobj(actor, soundtoplay);
P_DamageMobj(players[i].mo, actor, actor, 1, 0);
//actor->target->momz = 1000*FRACUNIT/actor->target->info->mass; // How id did it
players[i].mo->momz += FixedMul(10*FRACUNIT, actor->scale)*P_MobjFlip(players[i].mo); // How we're doing it
......@@ -11315,8 +11520,9 @@ void A_VileAttack(mobj_t *actor)
// Lower 16 bits = mobj to spawn (0 doesn't spawn a line at all)
// Upper 16 bits = # to spawn (default is 8)
//
void A_VileFire(mobj_t *actor)
void A_VileFire(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *dest;
......@@ -11354,7 +11560,7 @@ void A_VileFire(mobj_t *actor)
// Play sound, if one's specified
if (locvar1 > 0 && locvar1 < NUMSFX)
S_StartSound(actor, (sfxenum_t)locvar1);
S_StartSoundFromMobj(actor, (sfxenum_t)locvar1);
// Now draw the line to the actor's target
if (locvar2 & 0xFFFF)
......@@ -11368,7 +11574,8 @@ void A_VileFire(mobj_t *actor)
lineMobj = (mobjtype_t)(locvar2 & 0xFFFF);
numLineMobjs = (UINT16)(locvar2 >> 16);
if (numLineMobjs == 0) {
if (numLineMobjs == 0)
{
numLineMobjs = 8;
}
......@@ -11399,8 +11606,9 @@ void A_VileFire(mobj_t *actor)
// var1 = lower-bound of frame length, in tics
// var2 = optional sound to play
//
void A_BrakChase(mobj_t *actor)
void A_BrakChase(void *data)
{
mobj_t *actor = data;
INT32 delta;
INT32 lowerbound;
INT32 newtics;
......@@ -11429,7 +11637,7 @@ void A_BrakChase(mobj_t *actor)
{
actor->reactiontime--;
if (actor->reactiontime == 0 && actor->type == MT_CYBRAKDEMON)
S_StartSound(0, sfx_bewar1 + P_RandomKey(4));
S_StartSoundFromEverywhere(sfx_bewar1 + P_RandomKey(4));
}
// modify target threshold
......@@ -11511,12 +11719,12 @@ void A_BrakChase(mobj_t *actor)
// Optionally play a sound effect
if (locvar2 > 0 && locvar2 < NUMSFX)
S_StartSound(actor, (sfxenum_t)locvar2);
S_StartSoundFromMobj(actor, (sfxenum_t)locvar2);
// make active sound
if (actor->type != MT_CYBRAKDEMON && actor->info->activesound && P_RandomChance(3*FRACUNIT/256))
{
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
}
}
......@@ -11528,8 +11736,9 @@ void A_BrakChase(mobj_t *actor)
// var1 = object # to shoot
// var2 = unused
//
void A_BrakFireShot(mobj_t *actor)
void A_BrakFireShot(void *data)
{
mobj_t *actor = data;
fixed_t x, y, z;
INT32 locvar1 = var1;
......@@ -11578,8 +11787,9 @@ void A_BrakFireShot(mobj_t *actor)
// Upper 16 bits: if 0, aim 1/3 of the way. Else, aim directly at target.
//
void A_BrakLobShot(mobj_t *actor)
void A_BrakLobShot(void *data)
{
mobj_t *actor = data;
fixed_t v; // Velocity to shoot object
fixed_t a1, a2, aToUse; // Velocity squared
fixed_t g; // Gravity
......@@ -11669,7 +11879,7 @@ void A_BrakLobShot(mobj_t *actor)
if (P_MobjWasRemoved(shot))
return;
if (shot->info->seesound)
S_StartSound(shot, shot->info->seesound);
S_StartSoundFromMobj(shot, shot->info->seesound);
P_SetTarget(&shot->target, actor); // where it came from
shot->angle = actor->angle;
......@@ -11694,8 +11904,9 @@ void A_BrakLobShot(mobj_t *actor)
// Lower 16 bits: distance to toss them (No default - 0 does just that - but negatives will revert to 128)
// Upper 16 bits: airtime in tics (default 16)
//
void A_NapalmScatter(mobj_t *actor)
void A_NapalmScatter(void *data)
{
mobj_t *actor = data;
mobjtype_t typeOfShot = var1 & 0x0000FFFF; // Type
INT32 numToShoot = (var1 & 0xFFFF0000) >> 16; // How many
fixed_t distance = (var2 & 0x0000FFFF) << FRACBITS; // How far
......@@ -11753,8 +11964,9 @@ void A_NapalmScatter(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SpawnFreshCopy(mobj_t *actor)
void A_SpawnFreshCopy(void *data)
{
mobj_t *actor = data;
mobj_t *newObject;
if (LUA_CallAction(A_SPAWNFRESHCOPY, actor))
......@@ -11770,7 +11982,7 @@ void A_SpawnFreshCopy(mobj_t *actor)
P_SetTarget(&newObject->tracer, actor->tracer);
if (newObject->info->seesound)
S_StartSound(newObject, newObject->info->seesound);
S_StartSoundFromMobj(newObject, newObject->info->seesound);
}
// Internal Flicky spawning function.
......@@ -11830,8 +12042,9 @@ mobj_t *P_InternalFlickySpawn(mobj_t *actor, mobjtype_t flickytype, fixed_t momz
// bit 19: if 1, spawn flicky slightly backward from spawn position. doesn't stack with 18.
// var2 = upwards thrust for spawned flicky. If zero, default value is provided.
//
void A_FlickySpawn(mobj_t *actor)
void A_FlickySpawn(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1 & 65535;
INT32 locvar2 = var2;
INT32 test = (var1 >> 16);
......@@ -11897,8 +12110,9 @@ void P_InternalFlickySetColor(mobj_t *actor, UINT8 color)
// If TMFF_STATIONARY (MF_GRENADEBOUNCE): Flickies stand in-place without gravity (unless they hop, then gravity is applied.)
// If TMFF_HOP (MF_NOCLIPTHING): is flagged, Flickies hop.
//
void A_FlickyCenter(mobj_t *actor)
void A_FlickyCenter(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
UINT16 flickytype = (locvar1 & 0xFFFF);
......@@ -12030,8 +12244,9 @@ void P_InternalFlickyBubble(mobj_t *actor)
// var1 = how far around the target (in angle constants) the flicky should look
// var2 = distance from target to aim for
//
void A_FlickyAim(mobj_t *actor)
void A_FlickyAim(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
boolean flickyhitwall = false;
......@@ -12131,8 +12346,9 @@ void P_InternalFlickyFly(mobj_t *actor, fixed_t flyspeed, fixed_t targetdist, fi
// var1 = how fast to fly
// var2 = how far ahead the target should be considered
//
void A_FlickyFly(mobj_t *actor)
void A_FlickyFly(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12151,8 +12367,9 @@ void A_FlickyFly(mobj_t *actor)
// var1 = how fast to fly
// var2 = how far ahead the target should be considered
//
void A_FlickySoar(mobj_t *actor)
void A_FlickySoar(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12175,8 +12392,9 @@ void A_FlickySoar(mobj_t *actor)
// var2 = state to change to upon slowing down
// the spawnstate of the mobj = state to change to when above water
//
void A_FlickyCoast(mobj_t *actor)
void A_FlickyCoast(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12222,8 +12440,9 @@ void P_InternalFlickyHop(mobj_t *actor, fixed_t momz, fixed_t momh, angle_t angl
// var1 = vertical thrust
// var2 = horizontal thrust
//
void A_FlickyHop(mobj_t *actor)
void A_FlickyHop(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12240,8 +12459,9 @@ void A_FlickyHop(mobj_t *actor)
// var1 = intended vertical thrust
// var2 = intended horizontal thrust
//
void A_FlickyFlounder(mobj_t *actor)
void A_FlickyFlounder(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
angle_t hopangle;
......@@ -12263,8 +12483,9 @@ void A_FlickyFlounder(mobj_t *actor)
// var2 = state to change to upon falling
// the meleestate of the mobj = state to change to when underwater
//
void A_FlickyCheck(mobj_t *actor)
void A_FlickyCheck(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12300,8 +12521,9 @@ void A_FlickyCheck(mobj_t *actor)
// var1 = state to change to when falling below height relative to target
// var2 = height relative to target to change state at
//
void A_FlickyHeightCheck(mobj_t *actor)
void A_FlickyHeightCheck(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12335,8 +12557,9 @@ void A_FlickyHeightCheck(mobj_t *actor)
// var2 = state to change to upon falling
// the meleestate of the mobj = state to change to when underwater
//
void A_FlickyFlutter(mobj_t *actor)
void A_FlickyFlutter(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12365,8 +12588,9 @@ void A_FlickyFlutter(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_FlameParticle(mobj_t *actor)
void A_FlameParticle(void *data)
{
mobj_t *actor = data;
mobjtype_t type = (mobjtype_t)(mobjinfo[actor->type].painchance);
fixed_t rad, hei;
mobj_t *particle;
......@@ -12395,8 +12619,9 @@ void A_FlameParticle(mobj_t *actor)
// var1 = bit 1 = bit 1 = don't make fast, bit 2 = don't set tracer
// var2 = unused
//
void A_FadeOverlay(mobj_t *actor)
void A_FadeOverlay(void *data)
{
mobj_t *actor = data;
mobj_t *fade;
INT32 locvar1 = var1;
......@@ -12428,8 +12653,9 @@ void A_FadeOverlay(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Boss5Jump(mobj_t *actor)
void A_Boss5Jump(void *data)
{
mobj_t *actor = data;
fixed_t v; // Velocity to jump at
fixed_t a1, a2, aToUse; // Velocity squared
fixed_t g; // Gravity
......@@ -12512,8 +12738,9 @@ void A_Boss5Jump(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_LightBeamReset(mobj_t *actor)
void A_LightBeamReset(void *data)
{
mobj_t *actor = data;
// INT32 locvar1 = var1;
// INT32 locvar2 = var2;
......@@ -12541,8 +12768,9 @@ void A_LightBeamReset(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_MineExplode(mobj_t *actor)
void A_MineExplode(void *data)
{
mobj_t *actor = data;
// INT32 locvar1 = var1;
// INT32 locvar2 = var2;
......@@ -12564,7 +12792,7 @@ void A_MineExplode(mobj_t *actor)
#define dist 64
UINT8 i;
mobjtype_t type = ((actor->eflags & MFE_UNDERWATER) ? MT_UWEXPLODE : MT_SONIC3KBOSSEXPLODE);
S_StartSound(actor, ((actor->eflags & MFE_UNDERWATER) ? sfx_s3k57 : sfx_s3k4e));
S_StartSoundFromMobj(actor, ((actor->eflags & MFE_UNDERWATER) ? sfx_s3k57 : sfx_s3k4e));
P_SpawnMobj(actor->x, actor->y, actor->z, type);
for (i = 0; i < 16; i++)
{
......@@ -12595,8 +12823,9 @@ void A_MineExplode(mobj_t *actor)
// var1 = Distance to alert at
// var2 = unused
//
void A_MineRange(mobj_t *actor)
void A_MineRange(void *data)
{
mobj_t *actor = data;
fixed_t dm;
INT32 locvar1 = var1;
// INT32 locvar2 = var2;
......@@ -12618,8 +12847,9 @@ void A_MineRange(mobj_t *actor)
// var1 = Object type to connect to ground
// var2 = Object type to place on ground
//
void A_ConnectToGround(mobj_t *actor)
void A_ConnectToGround(void *data)
{
mobj_t *actor = data;
mobj_t *work;
fixed_t endz;
angle_t ang;
......@@ -12681,8 +12911,9 @@ void A_ConnectToGround(mobj_t *actor)
// var2 >> 16 = z
// var2 & 65535 = state
//
void A_SpawnParticleRelative(mobj_t *actor)
void A_SpawnParticleRelative(void *data)
{
mobj_t *actor = data;
INT16 x, y, z; // Want to be sure we can use negative values
statenum_t state;
mobj_t *mo;
......@@ -12724,8 +12955,9 @@ void A_SpawnParticleRelative(mobj_t *actor)
// var1 = same as A_MultiShot
// var2 = same as A_MultiShot
//
void A_MultiShotDist(mobj_t *actor)
void A_MultiShotDist(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12760,8 +12992,9 @@ void A_MultiShotDist(mobj_t *actor)
// var2 >> 16 = forward offset
// var2 & 65535 = vertical offset
//
void A_WhoCaresIfYourSonIsABee(mobj_t *actor)
void A_WhoCaresIfYourSonIsABee(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t foffsetx;
......@@ -12779,7 +13012,7 @@ void A_WhoCaresIfYourSonIsABee(mobj_t *actor)
actor->extravalue1--;
if (actor->info->attacksound)
S_StartSound(actor, actor->info->attacksound);
S_StartSoundFromMobj(actor, actor->info->attacksound);
foffsetx = P_ReturnThrustX(actor, actor->angle, FixedMul((locvar2 >> 16)*FRACUNIT, actor->scale));
foffsety = P_ReturnThrustY(actor, actor->angle, FixedMul((locvar2 >> 16)*FRACUNIT, actor->scale));
......@@ -12800,8 +13033,9 @@ void A_WhoCaresIfYourSonIsABee(mobj_t *actor)
// var1 = state to go to when extravalue1
// var2 = unused
//
void A_ParentTriesToSleep(mobj_t *actor)
void A_ParentTriesToSleep(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_PARENTTRIESTOSLEEP, actor))
......@@ -12810,7 +13044,7 @@ void A_ParentTriesToSleep(mobj_t *actor)
if (actor->extravalue1)
{
if (actor->info->seesound)
S_StartSound(actor, actor->info->seesound);
S_StartSoundFromMobj(actor, actor->info->seesound);
actor->reactiontime = 0;
P_SetMobjState(actor, locvar1);
}
......@@ -12818,7 +13052,7 @@ void A_ParentTriesToSleep(mobj_t *actor)
{
actor->reactiontime = 1;
if (actor->info->activesound) // more like INactivesound doy hoy hoy
S_StartSound(actor, actor->info->activesound);
S_StartSoundFromMobj(actor, actor->info->activesound);
}
}
......@@ -12830,8 +13064,9 @@ void A_ParentTriesToSleep(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_CryingToMomma(mobj_t *actor)
void A_CryingToMomma(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_CRYINGTOMOMMA, actor))
return;
......@@ -12857,8 +13092,9 @@ void A_CryingToMomma(mobj_t *actor)
// var1 = mask
// var2 = state to go
//
void A_CheckFlags2(mobj_t *actor)
void A_CheckFlags2(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -12876,8 +13112,9 @@ void A_CheckFlags2(mobj_t *actor)
// var1 = if 1, always go to ambush-marked waypoint. if 2, go to MT_BOSSFLYPOINT.
// var2 = unused
//
void A_Boss5FindWaypoint(mobj_t *actor)
void A_Boss5FindWaypoint(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
boolean avoidcenter;
INT32 i;
......@@ -13066,8 +13303,9 @@ nowaypoints:
// var1 = state to change to upon being slow enough
// var2 = minimum speed
//
void A_DoNPCSkid(mobj_t *actor)
void A_DoNPCSkid(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t x, y, z;
......@@ -13126,8 +13364,9 @@ void A_DoNPCSkid(mobj_t *actor)
// Otherwise, vertical and horizontal speed
// will be multiplied by this.
//
void A_DoNPCPain(mobj_t *actor)
void A_DoNPCPain(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t vspeed = 0;
......@@ -13177,8 +13416,9 @@ void A_DoNPCPain(mobj_t *actor)
// var1 = value to set extravalue2 to
// var2 = unused
//
void A_PrepareRepeat(mobj_t *actor)
void A_PrepareRepeat(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_PREPAREREPEAT, actor))
......@@ -13194,8 +13434,9 @@ void A_PrepareRepeat(mobj_t *actor)
// var1 = maximum value to setextravalue2 to (normally)
// var2 = pinch annoyance
//
void A_Boss5ExtraRepeat(mobj_t *actor)
void A_Boss5ExtraRepeat(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
INT32 calc;
......@@ -13232,8 +13473,9 @@ void A_Boss5ExtraRepeat(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_Boss5Calm(mobj_t *actor)
void A_Boss5Calm(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_BOSS5CALM, actor))
return;
......@@ -13248,8 +13490,9 @@ void A_Boss5Calm(mobj_t *actor)
// var1 = state to change to upon hitting ground.
// var2 = state to change to upon hitting ground if health == pinchhealth, assuming it exists
//
void A_Boss5CheckOnGround(mobj_t *actor)
void A_Boss5CheckOnGround(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -13279,8 +13522,9 @@ void A_Boss5CheckOnGround(mobj_t *actor)
// var1 = state to change to when hitting ground.
// var2 = state to change to when falling.
//
void A_Boss5CheckFalling(mobj_t *actor)
void A_Boss5CheckFalling(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -13306,8 +13550,9 @@ void A_Boss5CheckFalling(mobj_t *actor)
// var1 = object # to shoot
// var2 = height offset (from default of +48 FU)
//
void A_Boss5PinchShot(mobj_t *actor)
void A_Boss5PinchShot(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t zoffset;
......@@ -13341,8 +13586,9 @@ void A_Boss5PinchShot(mobj_t *actor)
// var1 = object # to shoot
// var2 = height offset (from default of +48 FU)
//
void A_Boss5MakeItRain(mobj_t *actor)
void A_Boss5MakeItRain(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
INT32 offset = (48 + locvar2)<<16; // upper 16 bits, not fixed_t!
......@@ -13376,8 +13622,9 @@ void A_Boss5MakeItRain(mobj_t *actor)
// var1 = state # to set on MT_BROKENROBOT (if 0 do nothing, if -1 go to if colorized)
// var2 = mode (-1 = spin, 0 = make 1, & 1 make 8, & 2 alart mode)
//
void A_Boss5MakeJunk(mobj_t *actor)
void A_Boss5MakeJunk(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
mobj_t *broked = NULL;
......@@ -13393,7 +13640,7 @@ void A_Boss5MakeJunk(mobj_t *actor)
P_SpawnMobjFromMobj(actor, 0, 0, 0, MT_PROJECTORLIGHT);
actor->z += P_MobjFlip(actor)*actor->height;
actor->flags |= MF_NOGRAVITY;
S_StartSound(actor, sfx_vwre);
S_StartSoundFromMobj(actor, sfx_vwre);
actor->extravalue2 = 49;
P_SetMobjState(actor, -locvar1);
actor->extravalue2 = curextravalue2;
......@@ -13459,7 +13706,7 @@ void A_Boss5MakeJunk(mobj_t *actor)
broked = P_SpawnMobjFromMobj(actor, 0, 0, 64<<FRACBITS, MT_GHOST);
if (!P_MobjWasRemoved(broked))
{
S_StartSound(broked, sfx_alart);
S_StartSoundFromMobj(broked, sfx_alart);
broked->fuse = states[S_FANG_INTRO12].tics+10;
P_SetMobjState(broked, S_ALART1);
}
......@@ -13468,11 +13715,11 @@ void A_Boss5MakeJunk(mobj_t *actor)
{
if (!P_MobjWasRemoved(broked))
broked->z += broked->momz;
S_StartSound(actor, sfx_s3kccs);
S_StartSoundFromMobj(actor, sfx_s3kccs);
actor->flags &= ~MF_NOCLIPTHING;
}
else
S_StartSound(actor, sfx_s3kd3s);
S_StartSoundFromMobj(actor, sfx_s3kd3s);
}
// Function: A_LookForBetter
......@@ -13483,8 +13730,9 @@ void A_Boss5MakeJunk(mobj_t *actor)
// var1 upper 16 bits = distance limit
// var2 = unused
//
void A_LookForBetter(mobj_t *actor)
void A_LookForBetter(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_LOOKFORBETTER, actor))
......@@ -13545,8 +13793,9 @@ static void P_DustRing(mobjtype_t mobjtype, UINT32 div, fixed_t x, fixed_t y, fi
// var1 = Thing type to spawn as dust
// var2 = unused
//
void A_Boss5BombExplode(mobj_t *actor)
void A_Boss5BombExplode(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_BOSS5BOMBEXPLODE, actor))
......@@ -13593,7 +13842,8 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing)
if (abs(thing->x - dustdevil->x) > dustdevil->radius || abs(thing->y - dustdevil->y) > dustdevil->radius)
return true;
if (thing->z + thing->height >= dustdevil->z && dustdevil->z + dustdevil->height >= thing->z) {
if (thing->z + thing->height >= dustdevil->z && dustdevil->z + dustdevil->height >= thing->z)
{
fixed_t pos = thing->z - dustdevil->z;
fixed_t thrust = max(FixedDiv(pos, dustdevil->height) * 20, 8 * FRACUNIT);
angle_t fa = R_PointToAngle2(thing->x, thing->y, dustdevil->x, dustdevil->y) >> ANGLETOFINESHIFT;
......@@ -13640,7 +13890,7 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing)
player->powers[pw_carry] = CR_NONE;
player->powers[pw_nocontrol] = 0;
P_SetTarget(&thing->tracer, NULL);
S_StartSound(thing, sfx_wdjump);
S_StartSoundFromMobj(thing, sfx_wdjump);
P_SetMobjState(thing, S_PLAY_FALL);
}
......@@ -13657,8 +13907,9 @@ static boolean PIT_DustDevilLaunch(mobj_t *thing)
// var1 = unused
// var2 = unused
//
void A_DustDevilThink(mobj_t *actor)
void A_DustDevilThink(void *data)
{
mobj_t *actor = data;
fixed_t scale = actor->scale;
mobj_t *layer = actor->tracer;
INT32 xl, xh, yl, yh;
......@@ -13668,7 +13919,8 @@ void A_DustDevilThink(mobj_t *actor)
return;
//Chained thinker for the spiralling dust column.
while (layer && !P_MobjWasRemoved(layer)) {
while (layer && !P_MobjWasRemoved(layer))
{
angle_t fa = layer->angle >> ANGLETOFINESHIFT;
P_MoveOrigin(layer, layer->x + 5 * FixedMul(scale, FINECOSINE(fa)), layer->y + 5 * FixedMul(scale, FINESINE(fa)), layer->z);
P_SetScale(layer, scale, true);
......@@ -13680,7 +13932,8 @@ void A_DustDevilThink(mobj_t *actor)
}
//Spawn random dust around the column on the base.
if (P_IsObjectOnGround(actor)) {
if (P_IsObjectOnGround(actor))
{
angle_t dustang = ((P_RandomRange(0, 7)*ANGLE_45)>>ANGLETOFINESHIFT) & FINEMASK;
mobj_t *dust = P_SpawnMobj(actor->x + 96 * FixedMul(scale, FINECOSINE(dustang)), actor->y + 96 * FixedMul(scale, FINESINE(dustang)), actor->z, MT_ARIDDUST);
if (!P_MobjWasRemoved(dust))
......@@ -13691,12 +13944,14 @@ void A_DustDevilThink(mobj_t *actor)
}
actor->extravalue1++;
if (actor->extravalue1 == 12) {
if (actor->extravalue1 == 12)
{
size_t i = 0;
actor->extravalue1 = 0;
//Create a set of items for the rising dust column
for (; i <= 3; i++) {
for (; i <= 3; i++)
{
fixed_t fa = (ANGLE_90*i) >> ANGLETOFINESHIFT;
fixed_t px = actor->x + 70 * FixedMul(scale, FINECOSINE(fa));
fixed_t py = actor->y + 70 * FixedMul(scale, FINESINE(fa));
......@@ -13726,11 +13981,11 @@ void A_DustDevilThink(mobj_t *actor)
dustdevil = actor;
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_DustDevilLaunch);
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_DustDevilLaunch, dustdevil);
//Whirlwind sound effect.
if (leveltime % 70 == 0)
S_StartSound(actor, sfx_s3kcel);
S_StartSoundFromMobj(actor, sfx_s3kcel);
}
// stuff used by A_TNTExplode
......@@ -13759,7 +14014,7 @@ static boolean PIT_TNTExplode(mobj_t *nearby)
if (nearby->state == &states[nearby->info->spawnstate])
{
if (barrel->info->attacksound)
S_StartSound(nearby, barrel->info->attacksound);
S_StartSoundFromMobj(nearby, barrel->info->attacksound);
nearby->momx = FixedMul(FixedDiv(dx, dm), explodethrust);
nearby->momy = FixedMul(FixedDiv(dy, dm), explodethrust);
nearby->momz = FixedMul(FixedDiv(dz, dm), explodethrust);
......@@ -13803,8 +14058,9 @@ static boolean PIT_TNTExplode(mobj_t *nearby)
// var1 = Thing type to spawn as dust.
// var2 = unused
//
void A_TNTExplode(mobj_t *actor)
void A_TNTExplode(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 xl, xh, yl, yh;
static mappoint_t epicenter = {0,0,0};
......@@ -13828,7 +14084,7 @@ void A_TNTExplode(mobj_t *actor)
P_SetThingPosition(actor);
actor->flags2 = MF2_EXPLOSION;
if (actor->info->deathsound)
S_StartSound(actor, actor->info->deathsound);
S_StartSoundFromMobj(actor, actor->info->deathsound);
explodethrust = 32*FRACUNIT;
exploderadius = 256*FRACUNIT;
......@@ -13842,7 +14098,7 @@ void A_TNTExplode(mobj_t *actor)
barrel = actor;
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_TNTExplode);
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_TNTExplode, barrel);
// cause a quake -- P_StartQuake does not exist yet
epicenter.x = actor->x;
......@@ -13869,8 +14125,9 @@ void A_TNTExplode(mobj_t *actor)
// var1 = Frame range.
// var2 = unused
//
void A_DebrisRandom(mobj_t *actor)
void A_DebrisRandom(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_DEBRISRANDOM, actor))
......@@ -13903,8 +14160,9 @@ static mobj_t *P_TrainSeg(mobj_t *src, fixed_t x, fixed_t y, fixed_t z, angle_t
// var1 = Train width.
// var2 = Train length.
//
void A_TrainCameo(mobj_t *actor)
void A_TrainCameo(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t x = actor->x;
......@@ -13942,8 +14200,9 @@ void A_TrainCameo(mobj_t *actor)
// var1 = Train width.
// var2 = Train length.
//
void A_TrainCameo2(mobj_t *actor)
void A_TrainCameo2(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t x = actor->x;
......@@ -13976,8 +14235,9 @@ void A_TrainCameo2(mobj_t *actor)
// var1 = Mobj type.
// var2 = Unused
//
void A_CanarivoreGas(mobj_t *actor)
void A_CanarivoreGas(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
if (LUA_CallAction(A_CANARIVOREGAS, actor))
......@@ -13995,8 +14255,9 @@ void A_CanarivoreGas(mobj_t *actor)
// var1 = Fuse (if 0, default to TICRATE/2).
// var2 = Unused
//
void A_KillSegments(mobj_t *actor)
void A_KillSegments(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
mobj_t *seg = actor->tracer;
INT32 fuse = locvar1 ? locvar1 : TICRATE/2;
......@@ -14080,8 +14341,9 @@ static void P_SnapperLegPlace(mobj_t *mo)
// var1 = Leg mobj type.
// var2 = Head mobj type.
//
void A_SnapperSpawn(mobj_t *actor)
void A_SnapperSpawn(void *data)
{
mobj_t *actor = data;
mobjtype_t legtype = (mobjtype_t)var1;
mobjtype_t headtype = (mobjtype_t)var2;
mobj_t *ptr = actor;
......@@ -14137,8 +14399,9 @@ void A_SnapperSpawn(mobj_t *actor)
// var1 = Unused
// var2 = Unused
//
void A_SnapperThinker(mobj_t *actor)
void A_SnapperThinker(void *data)
{
mobj_t *actor = data;
fixed_t x0 = actor->x;
fixed_t y0 = actor->y;
fixed_t xs, ys;
......@@ -14259,8 +14522,9 @@ void A_SnapperThinker(mobj_t *actor)
// var1 = mobjtype for sides
// var2 = distance sides should be placed apart
//
void A_SaloonDoorSpawn(mobj_t *actor)
void A_SaloonDoorSpawn(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
angle_t ang = actor->angle;
......@@ -14300,8 +14564,9 @@ void A_SaloonDoorSpawn(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_MinecartSparkThink(mobj_t *actor)
void A_MinecartSparkThink(void *data)
{
mobj_t *actor = data;
fixed_t dx = actor->momx;
fixed_t dy = actor->momy;
fixed_t dz, dm;
......@@ -14337,8 +14602,9 @@ void A_MinecartSparkThink(mobj_t *actor)
// var1 = Modulo
// var2 = State
//
void A_ModuloToState(mobj_t *actor)
void A_ModuloToState(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -14357,8 +14623,9 @@ void A_ModuloToState(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_LavafallRocks(mobj_t *actor)
void A_LavafallRocks(void *data)
{
mobj_t *actor = data;
UINT8 i;
if (LUA_CallAction(A_LAVAFALLROCKS, actor))
......@@ -14387,8 +14654,9 @@ void A_LavafallRocks(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_LavafallLava(mobj_t *actor)
void A_LavafallLava(void *data)
{
mobj_t *actor = data;
mobj_t *lavafall;
UINT8 i;
......@@ -14419,8 +14687,9 @@ void A_LavafallLava(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_FallingLavaCheck(mobj_t *actor)
void A_FallingLavaCheck(void *data)
{
mobj_t *actor = data;
if (LUA_CallAction(A_FALLINGLAVACHECK, actor))
return;
......@@ -14441,8 +14710,9 @@ void A_FallingLavaCheck(mobj_t *actor)
// var1 = Scale to shrink to
// var2 = Shrinking speed
//
void A_FireShrink(mobj_t *actor)
void A_FireShrink(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -14468,8 +14738,9 @@ void A_FireShrink(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_SpawnPterabytes(mobj_t *actor)
void A_SpawnPterabytes(void *data)
{
mobj_t *actor = data;
mobj_t *waypoint, *ptera;
fixed_t c, s;
fixed_t rad = 280*FRACUNIT;
......@@ -14518,8 +14789,9 @@ void A_SpawnPterabytes(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_PterabyteHover(mobj_t *actor)
void A_PterabyteHover(void *data)
{
mobj_t *actor = data;
angle_t ang, fa;
if (LUA_CallAction(A_PTERABYTEHOVER, actor))
......@@ -14539,8 +14811,9 @@ void A_PterabyteHover(mobj_t *actor)
// var1 = Distance currently spawned rock should travel before spawning a new one
// var2 = Object type to spawn
//
void A_RolloutSpawn(mobj_t *actor)
void A_RolloutSpawn(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
......@@ -14573,8 +14846,9 @@ void A_RolloutSpawn(mobj_t *actor)
// var1 = Drag
// var2 = Vertical bobbing speed factor
//
void A_RolloutRock(mobj_t *actor)
void A_RolloutRock(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
UINT8 maxframes = actor->info->reactiontime; // number of frames the mobj cycles through
......@@ -14603,7 +14877,7 @@ void A_RolloutRock(mobj_t *actor)
actor->friction = FRACUNIT; // turns out riding on solids sucks, so let's just make it easier on ourselves
if (actor->eflags & MFE_JUSTHITFLOOR)
S_StartSound(actor, actor->info->painsound);
S_StartSoundFromMobj(actor, actor->info->painsound);
if (actor->threshold)
actor->threshold--;
......@@ -14617,9 +14891,9 @@ void A_RolloutRock(mobj_t *actor)
if (flip*prevmomz < 0 && flip*actor->momz >= 0 && !actor->threshold)
{
if (actor->eflags & MFE_UNDERWATER)
S_StartSound(actor, sfx_splash);
S_StartSoundFromMobj(actor, sfx_splash);
else if (!actor->threshold)
S_StartSound(actor, sfx_splish);
S_StartSoundFromMobj(actor, sfx_splish);
actor->threshold = max((topspeed - speed) >> FRACBITS, 8);
}
}
......@@ -14673,8 +14947,9 @@ void A_RolloutRock(mobj_t *actor)
// var1 = Tail segments to spawn
// var2 = unused
//
void A_DragonbomberSpawn(mobj_t *actor)
void A_DragonbomberSpawn(void *data)
{
mobj_t *actor = data;
UINT8 i;
mobj_t *mo = actor;
......@@ -14713,8 +14988,9 @@ void A_DragonbomberSpawn(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_DragonWing(mobj_t *actor)
void A_DragonWing(void *data)
{
mobj_t *actor = data;
mobj_t *target = actor->target;
fixed_t x, y;
......@@ -14739,8 +15015,9 @@ void A_DragonWing(mobj_t *actor)
// var1 = unused
// var2 = unused
//
void A_DragonSegment(mobj_t *actor)
void A_DragonSegment(void *data)
{
mobj_t *actor = data;
mobj_t *target = actor->target;
fixed_t dist;
fixed_t radius;
......@@ -14782,8 +15059,9 @@ void A_DragonSegment(mobj_t *actor)
// &1: height is absolute
// &2: scale with actor's scale
//
void A_ChangeHeight(mobj_t *actor)
void A_ChangeHeight(void *data)
{
mobj_t *actor = data;
INT32 locvar1 = var1;
INT32 locvar2 = var2;
fixed_t height = locvar1;
......
......@@ -228,7 +228,7 @@ void T_MoveFloor(floormove_t *movefloor)
movefloor->direction = -1;
movefloor->speed = lines[movefloor->sourceline].args[3] << (FRACBITS - 2);
movefloor->sector->soundorg.z = movefloor->sector->floorheight;
S_StartSound(&movefloor->sector->soundorg, sfx_pstop);
S_StartSoundFromSector(movefloor->sector, sfx_pstop);
remove = false;
}
else
......@@ -408,7 +408,7 @@ void T_MoveElevator(elevator_t *elevator)
/*
// make floor move sound
if (!(leveltime&7))
S_StartSound(&elevator->sector->soundorg, sfx_stnmov);
S_StartSoundFromMobj(&elevator->sector->soundorg, sfx_stnmov);
*/
if (res == pastdest || res == crushed) // if destination height acheived
{
......@@ -486,7 +486,7 @@ void T_MoveElevator(elevator_t *elevator)
dontupdate = true;
}
// make floor stop sound
// S_StartSound(&elevator->sector->soundorg, sfx_pstop);
// S_StartSoundFromMobj(&elevator->sector->soundorg, sfx_pstop);
}
if (!dontupdate)
{
......@@ -677,9 +677,8 @@ void T_BounceCheese(bouncecheese_t *bouncer)
bouncer->low = !bouncer->low;
if (abs(bouncer->speed) > 6*FRACUNIT)
{
mobj_t *mp = (void *)&actionsector->soundorg;
actionsector->soundorg.z = bouncer->sector->floorheight;
S_StartSound(mp, sfx_splash);
S_StartSoundFromSector(actionsector, sfx_splash);
}
}
......@@ -1178,7 +1177,7 @@ void T_ThwompSector(thwomp_t *thwomp)
if (res == pastdest)
{
if (rover->fofflags & FOF_EXISTS)
S_StartSound((void *)&actionsector->soundorg, thwomp->sound);
S_StartSoundFromSector(actionsector, thwomp->sound);
thwomp->direction = 1; // start heading back up
thwomp->delay = TICRATE; // but only after a small delay
......@@ -1625,7 +1624,7 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype)
sec->floordata = dofloor;
// set up some generic aspects of the floormove_t
dofloor->thinker.function.acp1 = (actionf_p1)T_MoveFloor;
dofloor->thinker.function = (actionf_p1)T_MoveFloor;
dofloor->type = floortype;
dofloor->crush = false; // default: types that crush will change this
dofloor->sector = sec;
......@@ -1760,7 +1759,7 @@ void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype)
P_AddThinker(THINK_MAIN, &elevator->thinker);
sec->floordata = elevator;
sec->ceilingdata = elevator;
elevator->thinker.function.acp1 = (actionf_p1)T_MoveElevator;
elevator->thinker.function = (actionf_p1)T_MoveElevator;
elevator->type = elevtype;
elevator->sourceline = line;
elevator->distance = 1; // Always crush unless otherwise
......@@ -1884,7 +1883,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover)
}
sec->soundorg.z = (controlsec->floorheight + controlsec->ceilingheight)/2;
S_StartSound(&sec->soundorg, mobjinfo[type].activesound);
S_StartSoundFromSector(sec, mobjinfo[type].activesound);
#undef controlsec
......@@ -1970,7 +1969,7 @@ void EV_BounceSector(sector_t *sec, fixed_t momz, line_t *sourceline)
bouncer = Z_Calloc(sizeof (*bouncer), PU_LEVSPEC, NULL);
P_AddThinker(THINK_MAIN, &bouncer->thinker);
sec->ceilingdata = bouncer;
bouncer->thinker.function.acp1 = (actionf_p1)T_BounceCheese;
bouncer->thinker.function = (actionf_p1)T_BounceCheese;
// set up the fields according to the type of elevator action
bouncer->sourceline = sourceline;
......@@ -1996,7 +1995,7 @@ void EV_DoContinuousFall(sector_t *sec, sector_t *backsector, fixed_t spd, boole
// create and initialize new thinker
faller = Z_Calloc(sizeof (*faller), PU_LEVSPEC, NULL);
P_AddThinker(THINK_MAIN, &faller->thinker);
faller->thinker.function.acp1 = (actionf_p1)T_ContinuousFalling;
faller->thinker.function = (actionf_p1)T_ContinuousFalling;
// set up the fields
faller->sector = sec;
......@@ -2032,7 +2031,7 @@ INT32 EV_StartCrumble(sector_t *sec, ffloor_t *rover, boolean floating,
// create and initialize new crumble thinker
crumble = Z_Calloc(sizeof (*crumble), PU_LEVSPEC, NULL);
P_AddThinker(THINK_MAIN, &crumble->thinker);
crumble->thinker.function.acp1 = (actionf_p1)T_StartCrumble;
crumble->thinker.function = (actionf_p1)T_StartCrumble;
// set up the fields
crumble->sector = sec;
......@@ -2098,7 +2097,7 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
thing = SearchMarioNode(roversec->touching_thinglist);
if (!thing)
S_StartSound(puncher, sfx_mario1); // "Thunk!" sound - puncher is "close enough".
S_StartSoundFromMobj(puncher, sfx_mario1); // "Thunk!" sound - puncher is "close enough".
else // Found something!
{
const boolean itsamonitor = (thing->flags & MF_MONITOR) == MF_MONITOR;
......@@ -2108,7 +2107,7 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
P_AddThinker(THINK_MAIN, &block->thinker);
roversec->floordata = block;
roversec->ceilingdata = block;
block->thinker.function.acp1 = (actionf_p1)T_MarioBlock;
block->thinker.function = (actionf_p1)T_MarioBlock;
// Set up the fields
block->sector = roversec;
......@@ -2142,12 +2141,12 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
thing->momz = FixedMul(3*FRACUNIT, thing->scale);
P_TouchSpecialThing(thing, puncher, false);
// "Thunk!" sound
S_StartSound(puncher, sfx_mario1); // Puncher is "close enough"
S_StartSoundFromMobj(puncher, sfx_mario1); // Puncher is "close enough"
}
else
{
// "Powerup rise" sound
S_StartSound(puncher, sfx_mario9); // Puncher is "close enough"
S_StartSoundFromMobj(puncher, sfx_mario9); // Puncher is "close enough"
}
if (itsamonitor && thing)
......
......@@ -412,7 +412,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
{
if (special->type == MT_STEAM)
{
if (player && player->mo->state == &states[player->mo->info->painstate]) // can't use gas jets when player is in pain!
if (player && P_IsPlayerInState(player, S_PLAY_PAIN)) // can't use gas jets when player is in pain!
return;
fixed_t speed = special->info->mass; // gas jets use this for the vertical thrust
......@@ -466,7 +466,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
toucher->momz /= -8;
special->flags &= ~MF_SPECIAL;
if (special->info->activesound)
S_StartSound(special, special->info->activesound);
S_StartSoundFromMobj(special, special->info->activesound);
P_SetTarget(&special->tracer, toucher);
player->homing = 0;
return;
......@@ -703,7 +703,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (!(gametyperules & GTR_SPECIALSTAGES) || modeattacking) // score only?
{
S_StartSound(toucher, sfx_chchng);
S_StartSoundFromMobj(toucher, sfx_chchng);
break;
}
......@@ -716,20 +716,20 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
player->continues += 1;
player->gotcontinue = true;
if (P_IsLocalPlayer(player))
S_StartSound(NULL, sfx_s3kac);
S_StartSoundFromEverywhere(sfx_s3kac);
else
S_StartSound(toucher, sfx_chchng);
S_StartSoundFromMobj(toucher, sfx_chchng);
}
else
{
P_GiveCoopLives(player, 1, true); // if continues are disabled, a life is a reasonable substitute
S_StartSound(toucher, sfx_chchng);
S_StartSoundFromMobj(toucher, sfx_chchng);
}
}
else
{
token++;
S_StartSound(toucher, sfx_token);
S_StartSoundFromMobj(toucher, sfx_token);
}
break;
......@@ -752,10 +752,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
{
if (!playeringame[i] || players[i].spectator)
continue;
players[i].exiting = (14*TICRATE)/5 + 1;
P_DoPlayerExit(&players[i], true);
}
//S_StartSound(NULL, sfx_lvpass);
//S_StartSoundFromEverywhere(sfx_lvpass);
}
break;
......@@ -849,7 +848,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (prevCollected == false && P_EmblemWasCollected(special->health - 1) == true)
{
// Play the sound if it was collected.
S_StartSound((shareEmblems ? NULL : special), special->info->deathsound);
S_StartSoundFromMobj((shareEmblems ? NULL : special), special->info->deathsound);
}
else
{
......@@ -922,7 +921,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
// The fuse code plays this sound effect
//if (players[consoleplayer].ctfteam == player->ctfteam)
// S_StartSound(NULL, sfx_hoop1);
// S_StartSoundFromEverywhere(sfx_hoop1);
}
}
}
......@@ -975,14 +974,14 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
// Don't play Ideya sound in special stage mode
}
else
S_StartSound(toucher, special->info->activesound);
S_StartSoundFromMobj(toucher, special->info->activesound);
}
else //Initial transformation. Don't allow second chances in special stages!
{
if (player->powers[pw_carry] == CR_NIGHTSMODE)
return;
S_StartSound(toucher, sfx_supert);
S_StartSoundFromMobj(toucher, sfx_supert);
}
P_SwitchSpheresBonusMode(false);
if (!(netgame || multiplayer) && !(player->powers[pw_carry] == CR_NIGHTSMODE))
......@@ -1069,7 +1068,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
else if (player->mo->tracer && player->mare)
{
P_KillMobj(toucher->tracer, NULL, NULL, 0); // No emerald for you just yet!
S_StartSound(NULL, sfx_ghosty);
S_StartSoundFromEverywhere(sfx_ghosty);
special->flags2 |= MF2_DONTDRAW;
}
......@@ -1141,7 +1140,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
for (d = 0; d < 16; d++)
P_SpawnParaloop(x, y, z, gatherradius, 16, MT_NIGHTSPARKLE, sparklestate, d*ANGLE_22h, false);
S_StartSound(toucher, sfx_prloop);
S_StartSoundFromMobj(toucher, sfx_prloop);
// Now we RE-scan all the thinkers to find close objects to pull
// in from the paraloop. Isn't this just so efficient?
......@@ -1174,7 +1173,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
mo2->flags2 &= ~MF2_DONTDRAW;
mo2->flags |= MF_SPECIAL;
mo2->flags &= ~MF_NIGHTSITEM;
S_StartSound(toucher, sfx_hidden);
S_StartSoundFromMobj(toucher, sfx_hidden);
continue;
}
}
......@@ -1240,7 +1239,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (player->bumpertime <= (TICRATE/2)-5)
{
S_StartSound(toucher, special->info->seesound);
S_StartSoundFromMobj(toucher, special->info->seesound);
if (player->powers[pw_carry] == CR_NIGHTSMODE)
{
player->bumpertime = TICRATE/2;
......@@ -1298,7 +1297,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
players[i].powers[pw_nights_superloop] = (UINT16)special->info->speed;
if (special->info->deathsound != sfx_None)
S_StartSound(NULL, special->info->deathsound);
S_StartSoundFromEverywhere(special->info->deathsound);
}
// CECHO showing you what this item is
......@@ -1320,7 +1319,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (playeringame[i] && players[i].powers[pw_carry] == CR_NIGHTSMODE)
players[i].drillmeter = special->info->speed;
if (special->info->deathsound != sfx_None)
S_StartSound(NULL, special->info->deathsound);
S_StartSoundFromEverywhere(special->info->deathsound);
}
// CECHO showing you what this item is
......@@ -1354,7 +1353,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_SetTarget(&flickyobj->target, players[i].mo);
}
if (special->info->deathsound != sfx_None)
S_StartSound(NULL, special->info->deathsound);
S_StartSoundFromEverywhere(special->info->deathsound);
}
// CECHO showing you what this item is
......@@ -1386,7 +1385,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_RestoreMusic(&players[i]);
}
if (special->info->deathsound != sfx_None)
S_StartSound(NULL, special->info->deathsound);
S_StartSoundFromEverywhere(special->info->deathsound);
}
// CECHO showing you what this item is
......@@ -1414,7 +1413,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
players[i].linktimer = nightslinktics;
}
if (special->info->deathsound != sfx_None)
S_StartSound(NULL, special->info->deathsound);
S_StartSoundFromEverywhere(special->info->deathsound);
}
// CECHO showing you what this item is
......@@ -1468,11 +1467,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
// Play hoop sound -- pick one depending on the current link.
if (player->linkcount <= 5)
S_StartSound(toucher, sfx_hoop1);
S_StartSoundFromMobj(toucher, sfx_hoop1);
else if (player->linkcount <= 10)
S_StartSound(toucher, sfx_hoop2);
S_StartSoundFromMobj(toucher, sfx_hoop2);
else
S_StartSound(toucher, sfx_hoop3);
S_StartSoundFromMobj(toucher, sfx_hoop3);
return;
// ***** //
......@@ -1487,7 +1486,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
{
// Stop it!
special->momx = special->momy = 0;
S_StartSound(toucher, sfx_mario2);
S_StartSoundFromMobj(toucher, sfx_mario2);
P_SetTarget(&special->target, NULL);
special->threshold = TICRATE - 1;
toucher->momz = -toucher->momz;
......@@ -1500,7 +1499,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
// Kick that sucker around!
special->movedir = ((special->movedir == 1) ? -1 : 1);
P_InstaThrust(special, toucher->angle, (special->info->speed*special->scale));
S_StartSound(toucher, sfx_mario2);
S_StartSoundFromMobj(toucher, sfx_mario2);
P_SetTarget(&special->target, toucher);
special->threshold = (3*TICRATE)/2;
if (bounceon)
......@@ -1550,7 +1549,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (player->bot && player->bot != BOT_MPAI)
return;
S_StartSound(toucher, sfx_mario3);
S_StartSoundFromMobj(toucher, sfx_mario3);
player->powers[pw_shield] = (player->powers[pw_shield] & SH_NOSTACK)|SH_FIREFLOWER;
......@@ -1603,7 +1602,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
player->homing = 0;
// Play a bounce sound?
S_StartSound(toucher, special->info->painsound);
S_StartSoundFromMobj(toucher, special->info->painsound);
}
return;
......@@ -1654,7 +1653,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
player->homing = 0;
// Play a bounce sound?
S_StartSound(toucher, special->info->painsound);
S_StartSoundFromMobj(toucher, special->info->painsound);
// experimental bounce
if (special->target)
......@@ -1704,7 +1703,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_SetPlayerAngle(player, toucher->angle);
#endif
S_StartSound(toucher, special->info->attacksound); // home run
S_StartSoundFromMobj(toucher, special->info->attacksound); // home run
return;
......@@ -1760,7 +1759,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (macespin)
{
player->powers[pw_carry] = CR_MACESPIN;
S_StartSound(toucher, sfx_spin);
S_StartSoundFromMobj(toucher, sfx_spin);
P_SetMobjState(toucher, S_PLAY_ROLL);
}
else
......@@ -1784,7 +1783,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
special->target->momz = 0;
special->target->flags |= MF_NOGRAVITY;
P_SetMobjState(special->target, special->info->raisestate);
S_StartSound(special->target, special->info->activesound);
S_StartSoundFromMobj(special->target, special->info->activesound);
P_RemoveMobj(special);
}
return;
......@@ -1820,8 +1819,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (!player->climbing)
{
if (player->bot && player->bot != BOT_MPAI && toucher->state-states != S_PLAY_GASP)
S_StartSound(toucher, special->info->deathsound); // Force it to play a sound for bots
if (player->bot && player->bot != BOT_MPAI && !P_IsPlayerInState(player, S_PLAY_GASP))
S_StartSoundFromMobj(toucher, special->info->deathsound); // Force it to play a sound for bots
P_SetMobjState(toucher, S_PLAY_GASP);
P_ResetPlayer(player);
}
......@@ -1840,7 +1839,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
special->momz = 0;
special->flags |= MF_NOGRAVITY;
P_SetMobjState(special, special->info->deathstate);
S_StartSound (special, special->info->deathsound+(P_RandomKey(special->info->mass)));
S_StartSoundFromMobj(special, special->info->deathsound+(P_RandomKey(special->info->mass)));
}
return;
......@@ -1924,7 +1923,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
}
}
S_StartSound(toucher, special->info->deathsound); // was NULL, but changed to player so you could hear others pick up rings
S_StartSoundFromMobj(toucher, special->info->deathsound); // was NULL, but changed to player so you could hear others pick up rings
P_KillMobj(special, NULL, toucher, 0);
special->shadowscale = 0;
}
......@@ -1949,7 +1948,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
{
// blatant reuse of a variable that's normally unused in circuit
if (!player->tossdelay)
S_StartSound(toucher, sfx_lose);
S_StartSoundFromMobj(toucher, sfx_lose);
player->tossdelay = 3;
return;
}
......@@ -1990,7 +1989,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
P_SpectatorJoinGame(&players[i]); //players[i].playerstate = PST_REBORN;
}
}
S_StartSound(NULL, post->info->painsound);
S_StartSoundFromEverywhere(post->info->painsound);
}
else
{
......@@ -2007,7 +2006,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
player->starpostz += post->height>>FRACBITS;
}
player->starpostnum = post->health;
S_StartSound(toucher, post->info->painsound);
S_StartSoundFromMobj(toucher, post->info->painsound);
}
P_ClearStarPost(post->health);
......@@ -2304,7 +2303,7 @@ void P_CheckTimeLimit(void)
{
// Play the starpost sfx after the first second of overtime.
if (gamestate == GS_LEVEL && (leveltime == (timelimitintics + TICRATE)))
S_StartSound(NULL, sfx_strpst);
S_StartSoundFromEverywhere(sfx_strpst);
// Normal Match
if (!G_GametypeHasTeams())
......@@ -2895,7 +2894,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
if (++i == 2) // we've already removed 2 of these, let's stop now
break;
else
S_StartSound(mo, mo->info->deathsound); // done once to prevent sound stacking
S_StartSoundFromMobj(mo, mo->info->deathsound); // done once to prevent sound stacking
}
}
break;
......@@ -2946,16 +2945,16 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
{
target->movedir = damagetype; // we're MOVING the Damage Into anotheR function... Okay, this is a bit of a hack.
if (target->player->charflags & SF_MACHINE)
S_StartSound(target, sfx_fizzle);
S_StartSoundFromMobj(target, sfx_fizzle);
else
S_StartSound(target, sfx_drown);
S_StartSoundFromMobj(target, sfx_drown);
// Don't jump up when drowning
}
else
{
P_SetObjectMomZ(target, 14*FRACUNIT, false);
if (damagetype == DMG_SPIKE) // Spikes
S_StartSound(target, sfx_spkdth);
S_StartSoundFromMobj(target, sfx_spkdth);
else
P_PlayDeathSound(target);
}
......@@ -2981,7 +2980,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
mobj_t *chunk;
fixed_t momz;
S_StartSound(target, target->info->deathsound);
S_StartSoundFromMobj(target, target->info->deathsound);
if (target->info->xdeathstate != S_NULL)
{
......@@ -3058,7 +3057,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
mobj_t *chunk;
boolean sprflip;
S_StartSound(target, target->info->deathsound);
S_StartSoundFromMobj(target, target->info->deathsound);
if (!P_MobjWasRemoved(target->tracer))
P_RemoveMobj(target->tracer);
......@@ -3189,7 +3188,7 @@ static void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
player->powers[pw_flashing] = flashingtics;
P_SetMobjState(target, S_PLAY_NIGHTS_STUN);
S_StartSound(target, sfx_nghurt);
S_StartSoundFromMobj(target, sfx_nghurt);
player->mo->spriteroll = 0;
......@@ -3204,7 +3203,7 @@ static void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
)
{
S_FadeMusic(0, 10*MUSICRATE);
S_StartSound(NULL, sfx_timeup); // that creepy "out of time" music from NiGHTS.
S_StartSoundFromEverywhere(sfx_timeup); // that creepy "out of time" music from NiGHTS.
}
else
P_PlayJingle(player, ((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap)) ? JT_NIGHTSTIMEOUT : JT_SSTIMEOUT);
......@@ -3226,15 +3225,15 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN
return false;
// Ignore IT players shooting each other, unless friendlyfire is on.
if ((player->pflags & PF_TAGIT && !((cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE) || (damagetype & DMG_CANHURTSELF)) &&
source && source->player && source->player->pflags & PF_TAGIT)))
if ((player->pflags & PF_TAGIT && source && source->player && !(((cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE)) || ((damagetype & DMG_CANHURTSELF) && source->player == player)) &&
source->player->pflags & PF_TAGIT)))
{
if (inflictor->type == MT_LHRT && !(player->powers[pw_shield] & SH_NOSTACK))
{
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
{
P_SwitchShield(player, SH_PINK);
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
S_StartSoundFromMobj(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
return false;
......@@ -3242,14 +3241,15 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN
// Don't allow players on the same team to hurt one another,
// unless cv_friendlyfire is on.
if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE) || (damagetype & DMG_CANHURTSELF)) && (player->pflags & PF_TAGIT) == (source->player->pflags & PF_TAGIT))
if (source && source->player && !((cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE)) || ((damagetype & DMG_CANHURTSELF) && source->player == player)) &&
(player->pflags & PF_TAGIT) == (source->player->pflags & PF_TAGIT))
{
if (inflictor->type == MT_LHRT && !(player->powers[pw_shield] & SH_NOSTACK))
{
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
{
P_SwitchShield(player, SH_PINK);
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
S_StartSoundFromMobj(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
else if (!(inflictor->flags & MF_FIRE))
......@@ -3289,7 +3289,7 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN
if (player->powers[pw_shield])
{
P_RemoveShield(player);
S_StartSound(target, sfx_shldls);
S_StartSoundFromMobj(target, sfx_shldls);
return true;
}
......@@ -3334,7 +3334,7 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
{
P_SwitchShield(player, SH_PINK);
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
S_StartSoundFromMobj(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
return false;
......@@ -3344,7 +3344,7 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou
// Tag handling
if (G_TagGametype())
return P_TagDamage(target, inflictor, source, damage, damagetype);
else if (damagetype & DMG_CANHURTSELF)
else if ((damagetype & DMG_CANHURTSELF) && source && source->player && source->player == player)
return true;
else if (G_GametypeHasTeams()) // CTF + Team Match
{
......@@ -3357,7 +3357,7 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
{
P_SwitchShield(player, SH_PINK);
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
S_StartSoundFromMobj(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
else if (!(inflictor->flags & MF_FIRE))
......@@ -3413,24 +3413,26 @@ static void P_KillPlayer(player_t *player, mobj_t *source, INT32 damage)
if ((gametyperules & GTR_TEAMFLAGS) && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG)))
{
P_PlayerFlagBurst(player, false);
if (source && source->player)
if (source && source->player && source->player != player) // Don't score points against yourself
{
// Award no points when players shoot each other when cv_friendlyfire is on.
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
P_AddPlayerScore(source->player, 25);
}
}
if (source && source->player && !player->powers[pw_super]) //don't score points against super players
if (source && source->player && source->player != player && !player->powers[pw_super]) //don't score points against super players or yourself
{
// Award no points when players shoot each other when cv_friendlyfire is on.
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
{
P_AddPlayerScore(source->player, 100);
}
}
// If the player was super, tell them he/she ain't so super nomore.
if (!G_CoopGametype() && player->powers[pw_super])
{
S_StartSound(NULL, sfx_s3k66); //let all players hear it.
S_StartSoundFromEverywhere(sfx_s3k66); //let all players hear it.
HU_SetCEchoFlags(0);
HU_SetCEchoDuration(5);
HU_DoCEcho(va("%s\\is no longer super.\\\\\\\\", player_names[player-players]));
......@@ -3531,21 +3533,21 @@ static void P_ShieldDamage(player_t *player, mobj_t *inflictor, mobj_t *source,
P_ForceFeed(player, 40, 10, TICRATE, 40 + min(damage, 100)*2);
if (damagetype == DMG_SPIKE) // spikes
S_StartSound(player->mo, sfx_spkdth);
S_StartSoundFromMobj(player->mo, sfx_spkdth);
else
S_StartSound (player->mo, sfx_shldls); // Ba-Dum! Shield loss.
S_StartSoundFromMobj(player->mo, sfx_shldls); // Ba-Dum! Shield loss.
if ((gametyperules & GTR_TEAMFLAGS) && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG)))
{
P_PlayerFlagBurst(player, false);
if (source && source->player)
if (source && source->player && source->player != player) // Don't score points against yourself
{
// Award no points when players shoot each other when cv_friendlyfire is on.
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
P_AddPlayerScore(source->player, 25);
}
}
if (source && source->player && !player->powers[pw_super]) //don't score points against super players
if (source && source->player && source->player != player && !player->powers[pw_super]) //don't score points against super players or yourself
{
// Award no points when players shoot each other when cv_friendlyfire is on.
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
......@@ -3560,9 +3562,9 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN
P_ForceFeed(player, 40, 10, TICRATE, 40 + min(damage, 100)*2);
if (damagetype == DMG_SPIKE) // spikes
S_StartSound(player->mo, sfx_spkdth);
S_StartSoundFromMobj(player->mo, sfx_spkdth);
if (source && source->player && !player->powers[pw_super]) //don't score points against super players
if (source && source->player && source->player != player && !player->powers[pw_super]) //don't score points against super players
{
// Award no points when players shoot each other when cv_friendlyfire is on.
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
......@@ -3572,7 +3574,7 @@ static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, IN
if ((gametyperules & GTR_TEAMFLAGS) && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG)))
{
P_PlayerFlagBurst(player, false);
if (source && source->player)
if (source && source->player && source->player != player) // Don't score points against yourself
{
// Award no points when players shoot each other when cv_friendlyfire is on.
if (!G_GametypeHasTeams() || !(source->player->ctfteam == player->ctfteam && source != player->mo))
......@@ -3619,7 +3621,7 @@ void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source)
if (player->revitem != MT_LHRT && player->spinitem != MT_LHRT && player->thokitem != MT_LHRT) // Healers do not get to heal other healers.
{
P_SwitchShield(player, SH_PINK);
S_StartSound(player->mo, mobjinfo[MT_PITY_ICON].seesound);
S_StartSoundFromMobj(player->mo, mobjinfo[MT_PITY_ICON].seesound);
}
}
......@@ -3633,11 +3635,11 @@ void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source)
if (player->powers[pw_shield] || (player->bot && player->bot != BOT_MPAI)) //If One-Hit Shield
{
P_RemoveShield(player);
S_StartSound(player->mo, sfx_shldls); // Ba-Dum! Shield loss.
S_StartSoundFromMobj(player->mo, sfx_shldls); // Ba-Dum! Shield loss.
}
else
{
S_StartSound(player->mo, sfx_nghurt);
S_StartSoundFromMobj(player->mo, sfx_nghurt);
if (player->nightstime > 5*TICRATE)
player->nightstime -= 5*TICRATE;
else
......@@ -3655,7 +3657,7 @@ void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source)
if (mapheaderinfo[gamemap-1]->levelflags & LF_MIXNIGHTSCOUNTDOWN)
{
S_FadeMusic(0, 10*MUSICRATE);
S_StartSound(NULL, sfx_timeup); // that creepy "out of time" music from NiGHTS.
S_StartSoundFromEverywhere(sfx_timeup); // that creepy "out of time" music from NiGHTS.
}
else
S_ChangeMusicInternal((((maptol & TOL_NIGHTS) && !G_IsSpecialStage(gamemap)) ? "_ntime" : "_drown"), false);
......@@ -3885,7 +3887,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
// To reduce griefing potential, don't allow players to be killed
// by friendly fire. Spilling their rings and other items is enough.
else if (!force && G_GametypeHasTeams()
&& source && source->player && (source->player->ctfteam == player->ctfteam)
&& source && source->player && source->player != player && (source->player->ctfteam == player->ctfteam)
&& (cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE)))
{
damage = 0;
......
......@@ -78,7 +78,7 @@ fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *sector, INT16 lighta, INT1
P_AddThinker(THINK_MAIN, &flick->thinker);
flick->thinker.function.acp1 = (actionf_p1)T_FireFlicker;
flick->thinker.function = (actionf_p1)T_FireFlicker;
flick->sector = sector;
flick->maxlight = max(lighta, lightb);
flick->minlight = min(lighta, lightb);
......@@ -136,7 +136,7 @@ void P_SpawnLightningFlash(sector_t *sector)
if (sector->lightingdata)
{
if (((lightflash_t *)sector->lightingdata)->thinker.function.acp1
if (((lightflash_t *)sector->lightingdata)->thinker.function
== (actionf_p1)T_LightningFlash)
{
// lightning was already flashing in this sector
......@@ -153,7 +153,7 @@ void P_SpawnLightningFlash(sector_t *sector)
P_AddThinker(THINK_MAIN, &flash->thinker);
flash->thinker.function.acp1 = (actionf_p1)T_LightningFlash;
flash->thinker.function = (actionf_p1)T_LightningFlash;
flash->sector = sector;
flash->maxlight = 255;
flash->minlight = minlight;
......@@ -215,7 +215,7 @@ strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *sector, INT16 lighta, INT16 lig
flash->sector = sector;
flash->darktime = darktime;
flash->brighttime = brighttime;
flash->thinker.function.acp1 = (actionf_p1)T_StrobeFlash;
flash->thinker.function = (actionf_p1)T_StrobeFlash;
flash->maxlight = max(lighta, lightb);
flash->minlight = min(lighta, lightb);
......@@ -285,7 +285,7 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *sector, INT16 lighta, INT16 ligh
g->sector = sector;
g->minlight = min(lighta, lightb);
g->maxlight = max(lighta, lightb);
g->thinker.function.acp1 = (actionf_p1)T_Glow;
g->thinker.function = (actionf_p1)T_Glow;
g->direction = 1;
g->speed = (INT16)(length/4);
if (g->speed > (g->maxlight - g->minlight)/2) // don't make it ridiculous speed
......@@ -333,7 +333,7 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean
}
ll = Z_Calloc(sizeof (*ll), PU_LEVSPEC, NULL);
ll->thinker.function.acp1 = (actionf_p1)T_LightFade;
ll->thinker.function = (actionf_p1)T_LightFade;
sector->lightingdata = ll; // set it to the lightlevel_t
P_AddThinker(THINK_MAIN, &ll->thinker); // add thinker
......@@ -368,7 +368,7 @@ void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, bool
{
if (!force && ticbased // always let speed fader execute
&& sectors[i].lightingdata
&& ((lightlevel_t*)sectors[i].lightingdata)->thinker.function.acp1 == (actionf_p1)T_LightFade)
&& ((lightlevel_t*)sectors[i].lightingdata)->thinker.function == (actionf_p1)T_LightFade)
// && ((lightlevel_t*)sectors[i].lightingdata)->timer > 2)
{
CONS_Debug(DBG_GAMELOGIC, "Line type 420 Executor: Fade light thinker already exists, timer: %d\n", ((lightlevel_t*)sectors[i].lightingdata)->timer);
......
......@@ -130,6 +130,10 @@ boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam);
void P_SlideCameraMove(camera_t *thiscam);
boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcalled);
pflags_t P_GetJumpFlags(player_t *player);
statenum_t P_GetCanonicalPlayerState(player_t *player, statenum_t state);
boolean P_IsPlayerInState(player_t *player, statenum_t state);
boolean P_IsPlayerInSuperTransformationState(player_t *player);
boolean P_IsPlayerInNightsTransformationState(player_t *player);
boolean P_PlayerInPain(player_t *player);
void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor);
void P_ResetPlayer(player_t *player);
......@@ -216,9 +220,9 @@ void P_DoMetalJetFume(player_t *player, mobj_t *fume);
void P_DoFollowMobj(player_t *player, mobj_t *followmobj);
void P_PlayLivesJingle(player_t *player);
#define P_PlayRinglossSound(s) S_StartSound(s, (mariomode) ? sfx_mario8 : sfx_altow1 + P_RandomKey(4));
#define P_PlayDeathSound(s) S_StartSound(s, sfx_altdi1 + P_RandomKey(4));
#define P_PlayVictorySound(s) S_StartSound(s, sfx_victr1 + P_RandomKey(4));
#define P_PlayRinglossSound(s) S_StartSoundFromMobj(s, (mariomode) ? sfx_mario8 : sfx_altow1 + P_RandomKey(4));
#define P_PlayDeathSound(s) S_StartSoundFromMobj(s, sfx_altdi1 + P_RandomKey(4));
#define P_PlayVictorySound(s) S_StartSoundFromMobj(s, sfx_victr1 + P_RandomKey(4));
boolean P_GetLives(player_t *player);
boolean P_SpectatorJoinGame(player_t *player);
......@@ -304,7 +308,7 @@ void P_SceneryThinker(mobj_t *mobj);
// To test it in Lua, check mobj.valid
FUNCINLINE static ATTRINLINE boolean P_MobjWasRemoved(mobj_t *mobj)
{
return mobj == NULL || mobj->thinker.function.acp1 != (actionf_p1)P_MobjThinker;
return mobj == NULL || mobj->thinker.function != (actionf_p1)P_MobjThinker;
}
fixed_t P_MobjFloorZ(sector_t *sector, sector_t *boundsec, fixed_t x, fixed_t y, fixed_t radius, line_t *line, boolean lowest, boolean perfect);
......@@ -553,5 +557,6 @@ void P_DoSuperDetransformation(player_t *player);
void P_ExplodeMissile(mobj_t *mo);
void P_CheckGravity(mobj_t *mo, boolean affect);
void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope);
boolean P_IsMobjInPainState(mobj_t *mobj);
#endif // __P_LOCAL__
......@@ -414,7 +414,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
{
pflags = PF_SPINNING;
P_SetMobjState(object, S_PLAY_ROLL);
S_StartSound(object, sfx_spin);
S_StartSoundFromMobj(object, sfx_spin);
}
else
P_SetMobjState(object, S_PLAY_ROLL);
......@@ -494,7 +494,7 @@ springstate:
{
if (object->player->charability == CA_TWINSPIN || object->player->charability2 == CA2_MELEE)
P_TwinSpinRejuvenate(object->player, (object->player->charability == CA_TWINSPIN ? object->player->thokitem : object->player->revitem));
S_StartSound(object, sfx_sprong); // strong spring. sprong.
S_StartSoundFromMobj(object, sfx_sprong); // strong spring. sprong.
}
}
......@@ -508,7 +508,7 @@ static void P_DoFan(mobj_t *fan, mobj_t *object)
fixed_t speed = fan->info->mass; // fans use this for the vertical thrust
SINT8 flipval = P_MobjFlip(fan); // virtually everything here centers around the thruster's gravity, not the object's!
if (p && object->state == &states[object->info->painstate]) // can't use fans when player is in pain!
if (p && P_IsPlayerInState(p, S_PLAY_PAIN)) // can't use fans when player is in pain!
return;
// is object's top below thruster's position? if not, calculate distance between their bottoms
......@@ -585,7 +585,7 @@ static void P_DoPterabyteCarry(player_t *player, mobj_t *ptera)
P_SetTarget(&player->mo->tracer, ptera);
player->pflags &= ~PF_APPLYAUTOBRAKE;
player->powers[pw_carry] = CR_PTERABYTE;
S_StartSound(player->mo, sfx_s3k4a);
S_StartSoundFromMobj(player->mo, sfx_s3k4a);
P_UnsetThingPosition(player->mo);
player->mo->x = ptera->x;
player->mo->y = ptera->y;
......@@ -654,7 +654,7 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
P_ResetPlayer(sonic);
P_SetTarget(&sonic->mo->tracer, tails->mo);
sonic->powers[pw_carry] = CR_PLAYER;
S_StartSound(sonic->mo, sfx_s3k4a);
S_StartSoundFromMobj(sonic->mo, sfx_s3k4a);
P_UnsetThingPosition(sonic->mo);
sonic->mo->x = tails->mo->x;
sonic->mo->y = tails->mo->y;
......@@ -699,7 +699,7 @@ static void P_SlapStick(mobj_t *fang, mobj_t *pole)
var1 = var2 = 0;
A_Scream(pole->tracer->tracer);
S_StartSound(fang, sfx_altdi1);
S_StartSoundFromMobj(fang, sfx_altdi1);
P_SetTarget(&pole->tracer->tracer, NULL);
P_SetMobjState(pole->tracer, pole->info->xdeathstate);
......@@ -810,7 +810,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
{
mobj_t *iter;
if (thing->flags & MF_SOLID)
S_StartSound(tmthing, thing->info->deathsound);
S_StartSoundFromMobj(tmthing, thing->info->deathsound);
for (iter = thing->subsector->sector->thinglist; iter; iter = iter->snext)
if (iter->type == thing->type && iter->health > 0 && iter->flags & MF_SOLID && (iter == thing || P_AproxDistance(P_AproxDistance(thing->x - iter->x, thing->y - iter->y), thing->z - iter->z) < 56*thing->scale))//FixedMul(56*FRACUNIT, thing->scale))
P_KillMobj(iter, tmthing, tmthing, 0);
......@@ -837,7 +837,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
return CHECKTHING_NOCOLLIDE; // underneath
if (thing->flags & MF_SOLID)
S_StartSound(tmthing, thing->info->deathsound);
S_StartSoundFromMobj(tmthing, thing->info->deathsound);
for (iter = thing->subsector->sector->thinglist; iter; iter = iter->snext)
if (iter->type == thing->type && iter->health > 0 && iter->flags & MF_SOLID && (iter == thing || P_AproxDistance(P_AproxDistance(thing->x - iter->x, thing->y - iter->y), thing->z - iter->z) < 56*thing->scale))//FixedMul(56*FRACUNIT, thing->scale))
P_KillMobj(iter, tmthing, tmthing, 0);
......@@ -1004,7 +1004,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
fixed_t dm = min(FixedHypot(ref->momx, ref->momy), 16*FRACUNIT);
angle_t ang = R_PointToAngle2(0, 0, ref->momx, ref->momy) - thing->angle;
fixed_t s = FINESINE((ang >> ANGLETOFINESHIFT) & FINEMASK);
S_StartSound(tmthing, thing->info->activesound);
S_StartSoundFromMobj(tmthing, thing->info->activesound);
thing->extravalue2 += 2*FixedMul(s, dm)/3;
return CHECKTHING_COLLIDE;
}
......@@ -1070,7 +1070,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
thing->momy = tmthing->momy;
tmthing->momx = tempmomx;
tmthing->momy = tempmomy;
S_StartSound(thing, thing->info->painsound);
S_StartSoundFromMobj(thing, thing->info->painsound);
}
}
......@@ -1126,7 +1126,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
tmthing->momy /= -8;
tmthing->momz /= -8;
if (thing->info->activesound)
S_StartSound(thing, thing->info->activesound);
S_StartSoundFromMobj(thing, thing->info->activesound);
P_SetMobjState(thing, thing->info->meleestate);
P_SetTarget(&thing->tracer, tmthing->tracer);
return CHECKTHING_COLLIDE;
......@@ -1145,7 +1145,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
thing->momx = P_ReturnThrustX(tmthing, tmthing->angle, 2*tmthing->extravalue1*tmthing->scale/3);
thing->momy = P_ReturnThrustY(tmthing, tmthing->angle, 2*tmthing->extravalue1*tmthing->scale/3);
if (thing->info->activesound)
S_StartSound(thing, thing->info->activesound);
S_StartSoundFromMobj(thing, thing->info->activesound);
P_SetMobjState(thing, thing->info->meleestate);
if (tmthing->tracer)
P_SetTarget(&thing->tracer, tmthing->tracer->target);
......@@ -1183,7 +1183,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
if (!damagetype && thing->flags & MF_FIRE) // BURN!
damagetype = DMG_FIRE;
if (P_DamageMobj(tmthing, thing, thing, 1, damagetype) && (damagetype = (thing->info->mass>>8)))
S_StartSound(thing, damagetype);
S_StartSoundFromMobj(thing, damagetype);
return CHECKTHING_COLLIDE;
}
return CHECKTHING_NOCOLLIDE;
......@@ -1201,7 +1201,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
if (!damagetype && tmthing->flags & MF_FIRE) // BURN!
damagetype = DMG_FIRE;
if (P_DamageMobj(thing, tmthing, tmthing, 1, damagetype) && (damagetype = (tmthing->info->mass>>8)))
S_StartSound(tmthing, damagetype);
S_StartSoundFromMobj(tmthing, damagetype);
return CHECKTHING_COLLIDE;
}
return CHECKTHING_NOCOLLIDE;
......@@ -1426,7 +1426,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
}
if (thing->type != MT_GARGOYLE || P_IsObjectOnGround(thing))
S_StartSound(thing, thing->info->activesound);
S_StartSoundFromMobj(thing, thing->info->activesound);
P_SetTarget(&thing->target, tmthing);
}
......@@ -2262,7 +2262,7 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y)
for (bx = xl; bx <= xh; bx++)
for (by = yl; by <= yh; by++)
{
if (!P_BlockThingsIterator(bx, by, PIT_CheckThing))
if (!P_BlockThingsIterator(bx, by, PIT_CheckThing, tmthing))
blockval = false;
else
tmhitthing = tmfloorthing;
......@@ -2876,7 +2876,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
standx = x;
standy = y;
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_PushableMoved);
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_PushableMoved, stand);
}
// Link the thing into its new position
......@@ -3033,7 +3033,7 @@ static boolean P_ThingHeightClip(mobj_t *thing)
if (tmfloorz > oldfloorz+thing->height)
return true;
bouncing = thing->player && thing->state-states == S_PLAY_BOUNCE_LANDING && P_IsObjectOnGround(thing);
bouncing = thing->player && P_IsPlayerInState(thing->player, S_PLAY_BOUNCE_LANDING) && P_IsObjectOnGround(thing);
if ((onfloor || bouncing) && !(thing->flags & MF_NOGRAVITY) && floormoved)
{
......@@ -3476,12 +3476,12 @@ static void PTR_GlideClimbTraverse(line_t *li)
if (!slidemo->player->climbing)
{
S_StartSound(slidemo, sfx_s3k4a);
S_StartSoundFromMobj(slidemo, sfx_s3k4a);
slidemo->player->climbing = 5;
if (slidemo->player->powers[pw_super])
{
P_Earthquake(slidemo, slidemo, 256*FRACUNIT);
S_StartSound(slidemo, sfx_s3k49);
S_StartSoundFromMobj(slidemo, sfx_s3k49);
}
}
......@@ -4223,7 +4223,7 @@ void P_RadiusAttack(mobj_t *spot, mobj_t *source, fixed_t damagedist, UINT8 dama
bombdamagetype = damagetype;
bombsightcheck = sightcheck;
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_RadiusAttack);
P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_RadiusAttack, bombspot);
}
//
......@@ -4310,7 +4310,7 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush, boolean crunch
{
crumble_t *crumbler;
if (think->function.acp1 != (actionf_p1)T_StartCrumble)
if (think->function != (actionf_p1)T_StartCrumble)
continue;
crumbler = (crumble_t *)think;
......
......@@ -1050,10 +1050,14 @@ boolean P_BlockLinesIterator(INT32 x, INT32 y, boolean (*func)(line_t *))
//
// P_BlockThingsIterator
//
boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *))
boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *), mobj_t *thing)
{
blocknode_t *block, *next = NULL;
boolean checkthing = false;
if (thing)
checkthing = true;
if (x < 0 || y < 0 || x >= bmapwidth || y >= bmapheight)
return true;
......@@ -1065,20 +1069,20 @@ boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *))
if (!func(block->mobj))
return false;
if (P_MobjWasRemoved(tmthing)) // func just popped our tmthing, cannot continue.
if (checkthing && P_MobjWasRemoved(thing)) // func just popped our tmthing, cannot continue.
return true;
}
return true;
}
boolean P_DoBlockThingsIterate(int x1, int y1, int x2, int y2, boolean (*func)(mobj_t *))
boolean P_DoBlockThingsIterate(int x1, int y1, int x2, int y2, boolean (*func)(mobj_t *), mobj_t *thing)
{
boolean status = true;
for (INT32 bx = x1; bx <= x2; bx++)
for (INT32 by = y1; by <= y2; by++)
if (!P_BlockThingsIterator(bx, by, func))
if (!P_BlockThingsIterator(bx, by, func, thing))
status = false;
return status;
......@@ -1451,7 +1455,7 @@ boolean P_PathTraverse(fixed_t px1, fixed_t py1, fixed_t px2, fixed_t py2,
INT32 flags, traverser_t trav)
{
fixed_t xt1, yt1, xt2, yt2;
fixed_t xstep, ystep, partial, xintercept, yintercept;
fixed_t xstep, ystep, partialx, partialy, xintercept, yintercept;
INT32 mapx, mapy, mapxstep, mapystep, count;
earlyout = flags & PT_EARLYOUT;
......@@ -1470,56 +1474,82 @@ boolean P_PathTraverse(fixed_t px1, fixed_t py1, fixed_t px2, fixed_t py2,
trace.dx = px2 - px1;
trace.dy = py2 - py1;
px1 -= bmaporgx;
py1 -= bmaporgy;
xt1 = (unsigned)px1>>MAPBLOCKSHIFT;
yt1 = (unsigned)py1>>MAPBLOCKSHIFT;
xt1 = px1>>MAPBLOCKSHIFT;
yt1 = py1>>MAPBLOCKSHIFT;
px1 = (unsigned)(px1 - bmaporgx);
py1 = (unsigned)(py1 - bmaporgy);
px2 -= bmaporgx;
py2 -= bmaporgy;
xt2 = (unsigned)px2>>MAPBLOCKSHIFT;
yt2 = (unsigned)py2>>MAPBLOCKSHIFT;
xt2 = px2>>MAPBLOCKSHIFT;
yt2 = py2>>MAPBLOCKSHIFT;
px2 = (unsigned)(px2 - bmaporgx);
py2 = (unsigned)(py2 - bmaporgy);
if (xt2 > xt1)
{
mapxstep = 1;
partial = FRACUNIT - ((px1>>MAPBTOFRAC) & FRACMASK);
partialx = FRACUNIT - (((unsigned)px1>>MAPBTOFRAC) & FRACMASK);
ystep = FixedDiv(py2 - py1, abs(px2 - px1));
}
else if (xt2 < xt1)
{
mapxstep = -1;
partial = (px1>>MAPBTOFRAC) & FRACMASK;
partialx = ((unsigned)px1>>MAPBTOFRAC) & FRACMASK;
ystep = FixedDiv(py2 - py1, abs(px2 - px1));
}
else
{
mapxstep = 0;
partial = FRACUNIT;
partialx = FRACUNIT;
ystep = 256*FRACUNIT;
}
yintercept = (py1>>MAPBTOFRAC) + FixedMul(partial, ystep);
yintercept = ((unsigned)py1>>MAPBTOFRAC) + FixedMul(partialx, ystep);
if (yt2 > yt1)
{
mapystep = 1;
partial = FRACUNIT - ((py1>>MAPBTOFRAC) & FRACMASK);
partialy = FRACUNIT - (((unsigned)py1>>MAPBTOFRAC) & FRACMASK);
xstep = FixedDiv(px2 - px1, abs(py2 - py1));
}
else if (yt2 < yt1)
{
mapystep = -1;
partial = (py1>>MAPBTOFRAC) & FRACMASK;
partialy = ((unsigned)py1>>MAPBTOFRAC) & FRACMASK;
xstep = FixedDiv(px2 - px1, abs(py2 - py1));
}
else
{
mapystep = 0;
partial = FRACUNIT;
partialy = FRACUNIT;
xstep = 256*FRACUNIT;
}
xintercept = (px1>>MAPBTOFRAC) + FixedMul(partial, xstep);
xintercept = ((unsigned)px1>>MAPBTOFRAC) + FixedMul(partialy, xstep);
// [RH] Fix for traces that pass only through blockmap corners. In that case,
// xintercept and yintercept can both be set ahead of mapx and mapy, so the
// for loop would never advance anywhere.
if (abs(xstep) == 1 && abs(ystep) == 1)
{
if (ystep < 0)
{
partialx = FRACUNIT - partialx;
}
if (xstep < 0)
{
partialy = FRACUNIT - partialy;
}
if (partialx == partialy)
{
xintercept = xt1;
yintercept = yt1;
}
}
xt1 = (unsigned)px1>>MAPBLOCKSHIFT;
yt1 = (unsigned)py1>>MAPBLOCKSHIFT;
xt2 = (unsigned)px2>>MAPBLOCKSHIFT;
yt2 = (unsigned)py2>>MAPBLOCKSHIFT;
// Step through map blocks.
// Count is present to prevent a round off error
......@@ -1534,23 +1564,67 @@ boolean P_PathTraverse(fixed_t px1, fixed_t py1, fixed_t px2, fixed_t py2,
return false; // early out
if (flags & PT_ADDTHINGS)
if (!P_BlockThingsIterator(mapx, mapy, PIT_AddThingIntercepts))
if (!P_BlockThingsIterator(mapx, mapy, PIT_AddThingIntercepts, NULL))
return false; // early out
if (mapx == xt2 && mapy == yt2)
// both coordinates reached the end, so end the traversing.
if ((mapxstep | mapystep) == 0)
break;
if ((yintercept >> FRACBITS) == mapy)
// [RH] Handle corner cases properly instead of pretending they don't exist.
switch ((((yintercept >> FRACBITS) == mapy) << 1) | ((xintercept >> FRACBITS) == mapx))
{
case 0: // neither xintercept nor yintercept match!
count = 64; // Stop traversing, because somebody screwed up.
break;
case 1: // xintercept matches
xintercept += xstep;
mapy += mapystep;
if (mapy == yt2)
mapystep = 0;
break;
case 2: // yintercept matches
yintercept += ystep;
mapx += mapxstep;
if (mapx == xt2)
mapxstep = 0;
break;
case 3: // xintercept and yintercept both match
// The trace is exiting a block through its corner. Not only does the block
// being entered need to be checked (which will happen when this loop
// continues), but the other two blocks adjacent to the corner also need to
// be checked.
if (flags & PT_ADDLINES)
{
if (!P_BlockLinesIterator(mapx + mapxstep, mapy, PIT_AddLineIntercepts))
return false; // early out
if (!P_BlockLinesIterator(mapx, mapy + mapystep, PIT_AddLineIntercepts))
return false; // early out
}
else if ((xintercept >> FRACBITS) == mapx)
if (flags & PT_ADDTHINGS)
{
if (!P_BlockThingsIterator(mapx + mapxstep, mapy, PIT_AddThingIntercepts, NULL))
return false; // early out
if (!P_BlockThingsIterator(mapx, mapy + mapystep, PIT_AddThingIntercepts, NULL))
return false; // early out
}
xintercept += xstep;
yintercept += ystep;
mapx += mapxstep;
mapy += mapystep;
if (mapx == xt2)
mapxstep = 0;
if (mapy == yt2)
mapystep = 0;
break;
}
}
// Go through the sorted list
return P_TraverseIntercepts(trav, FRACUNIT);
}
......