From 043bb208b318e4ce793568fce334a538de05378a Mon Sep 17 00:00:00 2001 From: terminx Date: Fri, 25 Feb 2011 21:50:19 +0000 Subject: [PATCH] Multiplayer improvements git-svn-id: https://svn.eduke32.com/eduke32@1802 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/Makefile.msvc | 4 +- polymer/eduke32/build/Makefile.shared | 5 +- polymer/eduke32/build/src/engine.c | 2 +- polymer/eduke32/eduke32.vcxproj | 1 + polymer/eduke32/eduke32.vcxproj.filters | 3 + polymer/eduke32/source/actors.c | 67 +- polymer/eduke32/source/demo.c | 20 +- polymer/eduke32/source/duke3d.h | 10 +- .../eduke32/source/enet/include/enet/enet.h | 2 +- polymer/eduke32/source/enet/src/protocol.c | 99 +- polymer/eduke32/source/game.c | 330 ++-- polymer/eduke32/source/game.h | 32 +- polymer/eduke32/source/gamedef.c | 5 +- polymer/eduke32/source/gameexec.c | 79 +- polymer/eduke32/source/gamestructures.c | 18 +- polymer/eduke32/source/global.c | 2 +- polymer/eduke32/source/macros.h | 4 +- polymer/eduke32/source/menus.c | 4 +- polymer/eduke32/source/net.c | 1419 +++++++++++++++-- polymer/eduke32/source/net.h | 100 +- polymer/eduke32/source/osdcmds.c | 6 +- polymer/eduke32/source/player.c | 154 +- polymer/eduke32/source/player.h | 16 +- polymer/eduke32/source/premap.c | 59 +- polymer/eduke32/source/premap.h | 6 +- polymer/eduke32/source/quotes.h | 96 ++ polymer/eduke32/source/savegame.c | 12 +- polymer/eduke32/source/sector.c | 56 +- polymer/eduke32/source/sector.h | 8 +- 29 files changed, 2027 insertions(+), 592 deletions(-) create mode 100644 polymer/eduke32/source/quotes.h diff --git a/polymer/eduke32/Makefile.msvc b/polymer/eduke32/Makefile.msvc index 02a4afba7..4a8fbd8d5 100644 --- a/polymer/eduke32/Makefile.msvc +++ b/polymer/eduke32/Makefile.msvc @@ -20,8 +20,8 @@ EDITORLIB=build.lib # the WDK allows us to link against msvcrt.dll instead of msvcrxxx.dll # this path should match build\Makefile.msvc -WDKROOT="C:\WinDDK\7600.16385.1" -DXROOT="C:\Program Files\Microsoft DirectX SDK (February 2010)" +WDKROOT="H:\WinDDK\7600.16385.1" +DXROOT="H:\Microsoft DirectX SDK (February 2010)" !ifdef DEBUG # debugging options diff --git a/polymer/eduke32/build/Makefile.shared b/polymer/eduke32/build/Makefile.shared index c43060d35..0003731e1 100644 --- a/polymer/eduke32/build/Makefile.shared +++ b/polymer/eduke32/build/Makefile.shared @@ -3,13 +3,12 @@ ENGINELIB=libengine.a EDITORLIB=libbuild.a -# SDLCONFIG = /usr/local/bin/sdl-config -SDLCONFIG = /usr/bin/sdl-config +SDLCONFIG = /usr/local/bin/sdl-configinvalid ifeq ($(wildcard $(SDLCONFIG)),$(SDLCONFIG)) SDLROOT = /usr/local else - SDLCONFIG = sdl-config + SDLCONFIG = /usr/bin/sdl-config endif SDL_FRAMEWORK = 0 diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index baaa5f0f5..abe450911 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -6152,7 +6152,7 @@ static void sighandler(int32_t sig, const siginfo_t *info, void *ctx) // static int32_t preinitcalled = 0; -#define DYNALLOC_ARRAYS +// #define DYNALLOC_ARRAYS #ifndef DYNALLOC_ARRAYS static spriteext_t spriteext_s[MAXSPRITES+MAXUNIQHUDID]; diff --git a/polymer/eduke32/eduke32.vcxproj b/polymer/eduke32/eduke32.vcxproj index d32e84b1b..49ecf215a 100644 --- a/polymer/eduke32/eduke32.vcxproj +++ b/polymer/eduke32/eduke32.vcxproj @@ -120,6 +120,7 @@ + diff --git a/polymer/eduke32/eduke32.vcxproj.filters b/polymer/eduke32/eduke32.vcxproj.filters index a2e13546f..0a92d2d8e 100644 --- a/polymer/eduke32/eduke32.vcxproj.filters +++ b/polymer/eduke32/eduke32.vcxproj.filters @@ -354,6 +354,9 @@ eduke32\headers + + eduke32\headers + diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index 2d8280f81..af475f51a 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -894,16 +894,16 @@ int32_t A_IncurDamage(int32_t sn) if (A_CheckSpriteTileFlags(actor[sn].picnum,SPRITE_PROJECTILE) && (SpriteProjectile[sn].workslike & PROJECTILE_RPG)) { - g_player[p].ps->posvel.x += + g_player[p].ps->vel.x += actor[sn].extra*(sintable[(actor[sn].ang+512)&2047])<<2; - g_player[p].ps->posvel.y += + g_player[p].ps->vel.y += actor[sn].extra*(sintable[actor[sn].ang&2047])<<2; } else if (A_CheckSpriteTileFlags(actor[sn].picnum,SPRITE_PROJECTILE)) { - g_player[p].ps->posvel.x += + g_player[p].ps->vel.x += actor[sn].extra*(sintable[(actor[sn].ang+512)&2047])<<1; - g_player[p].ps->posvel.y += + g_player[p].ps->vel.y += actor[sn].extra*(sintable[actor[sn].ang&2047])<<1; } @@ -916,15 +916,15 @@ int32_t A_IncurDamage(int32_t sn) case SEENINE__STATIC: case OOZFILTER__STATIC: case EXPLODINGBARREL__STATIC: - g_player[p].ps->posvel.x += + g_player[p].ps->vel.x += actor[sn].extra*(sintable[(actor[sn].ang+512)&2047])<<2; - g_player[p].ps->posvel.y += + g_player[p].ps->vel.y += actor[sn].extra*(sintable[actor[sn].ang&2047])<<2; break; default: - g_player[p].ps->posvel.x += + g_player[p].ps->vel.x += actor[sn].extra*(sintable[(actor[sn].ang+512)&2047])<<1; - g_player[p].ps->posvel.y += + g_player[p].ps->vel.y += actor[sn].extra*(sintable[actor[sn].ang&2047])<<1; break; } @@ -1282,7 +1282,7 @@ ACTOR_STATIC void G_MoveFallers(void) s->z -= (16<<8); T2 = s->ang; x = s->extra; - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { if (j == FIREEXT || j == RPG || j == RADIUSEXPLOSION || j == SEENINE || j == OOZFILTER) { @@ -1540,7 +1540,7 @@ ACTOR_STATIC void G_MoveStandables(void) { p = A_FindPlayer(s,&x); - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { if (s->owner == -2) if (g_player[p].ps->on_crane == i) @@ -1692,7 +1692,7 @@ ACTOR_STATIC void G_MoveStandables(void) x = s->extra; s->extra = 1; l = s->ang; - IFHIT { actor[i].t_data[6] = 3; + if ((j = A_IncurDamage(i)) >= 0) { actor[i].t_data[6] = 3; T3 = 16; } s->extra = x; @@ -2061,7 +2061,7 @@ DETONATE: case TRASH__STATIC: if (s->xvel == 0) s->xvel = 1; - IFMOVING + if (A_SetSprite(i, CLIPMASK0)) { A_Fall(i); if (krand()&1) s->zvel -= 256; @@ -2283,7 +2283,7 @@ CLEAR_THE_BOLT: case CANWITHSOMETHING3__STATIC: case CANWITHSOMETHING4__STATIC: A_Fall(i); - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { A_PlaySound(VENT_BUST,i); @@ -3215,7 +3215,7 @@ ACTOR_STATIC void G_MoveTransports(void) if (onfloorz && sectlotag == 1 && g_player[p].ps->on_ground && g_player[p].ps->pos.z >= sector[sect].floorz && - (TEST_SYNC_KEY(g_player[p].sync->bits, SK_CROUCH) || g_player[p].ps->posvel.z > 2048)) + (TEST_SYNC_KEY(g_player[p].sync->bits, SK_CROUCH) || g_player[p].ps->vel.z > 2048)) // if( onfloorz && sectlotag == 1 && g_player[p].ps->pos.z > (sector[sect].floorz-(6<<8)) ) { k = 1; @@ -3230,14 +3230,14 @@ ACTOR_STATIC void G_MoveTransports(void) sector[sprite[OW].sectnum].ceilingz; /* - g_player[p].ps->posvel.x = 4096-(krand()&8192); - g_player[p].ps->posvel.y = 4096-(krand()&8192); + g_player[p].ps->vel.x = 4096-(krand()&8192); + g_player[p].ps->vel.y = 4096-(krand()&8192); */ if (TEST_SYNC_KEY(g_player[p].sync->bits, SK_CROUCH)) - g_player[p].ps->posvel.z += 512; + g_player[p].ps->vel.z += 512; } - if (onfloorz && sectlotag == 2 && g_player[p].ps->pos.z <= sector[sect].ceilingz /*&& g_player[p].ps->posvel.z == 0*/) + if (onfloorz && sectlotag == 2 && g_player[p].ps->pos.z <= sector[sect].ceilingz /*&& g_player[p].ps->vel.z == 0*/) { k = 1; // if( sprite[j].extra <= 0) break; @@ -3253,8 +3253,8 @@ ACTOR_STATIC void G_MoveTransports(void) g_player[p].ps->jumping_toggle = 1; g_player[p].ps->jumping_counter = 0; - g_player[p].ps->posvel.z = 0; - // g_player[p].ps->posvel.z += 1024; + g_player[p].ps->vel.z = 0; + // g_player[p].ps->vel.z += 1024; } if (k == 1) @@ -3575,7 +3575,7 @@ ACTOR_STATIC void G_MoveActors(void) break; case RAT__STATIC: A_Fall(i); - IFMOVING + if (A_SetSprite(i, CLIPMASK0)) { if ((krand()&255) < 3) A_PlaySound(RATTY,i); s->ang += (krand()&31)-15+(sintable[(t[0]<<8)&2047]>>11); @@ -3767,7 +3767,7 @@ ACTOR_STATIC void G_MoveActors(void) } else if (g_noEnemies == 2) s->cstat = 257; } - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { if (s->extra < 0 && t[0] != -1) { @@ -4005,7 +4005,7 @@ ACTOR_STATIC void G_MoveActors(void) s->picnum = GREENSLIME+2; s->extra = 1; s->pal = 1; - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { if (j == FREEZEBLAST) goto BOLT; for (j=16; j >= 0 ; j--) @@ -4138,7 +4138,7 @@ ACTOR_STATIC void G_MoveActors(void) } } - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { A_PlaySound(SLIM_DYING,i); @@ -4744,7 +4744,7 @@ DETONATEB: } else { - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { for (x=0; x<32; x++) RANDOMSCRAP; @@ -4761,7 +4761,7 @@ DETONATEB: t[1]+=8; if (g_damageCameras) { - IFHIT + if ((j = A_IncurDamage(i)) >= 0) { t[0] = 1; // static s->cstat = (int16_t)32768; @@ -6195,17 +6195,16 @@ ACTOR_STATIC void G_MoveEffectors(void) //STATNUM 3 } else { - t[2] += - G_GetAngleDelta(t[2]+512,getangle(g_player[p].ps->pos.x-s->x,g_player[p].ps->pos.y-s->y))>>2; + t[2] += G_GetAngleDelta(t[2]+512,getangle(g_player[p].ps->pos.x-s->x,g_player[p].ps->pos.y-s->y))>>2; sc->ceilingshade = 0; } - IFHIT + + if ((j = A_IncurDamage(i)) >= 0) { - t[3]++; - if (t[3] == 5) + if (++t[3] == 5) { s->zvel += 1024; - P_DoQuote(7,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_WASTED, g_player[myconnectindex].ps); } } @@ -6312,7 +6311,7 @@ ACTOR_STATIC void G_MoveEffectors(void) //STATNUM 3 if (GetAnimationGoal(§or[s->sectnum].ceilingz) >= 0) break; default: - activatebysector(s->sectnum,i); + G_ActivateBySector(s->sectnum,i); t[0] = 0; break; } @@ -6821,7 +6820,7 @@ ACTOR_STATIC void G_MoveEffectors(void) //STATNUM 3 { IFHITSECT { - P_DoQuote(8,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_UNLOCKED,g_player[myconnectindex].ps); l = headspritestat[STAT_EFFECTOR]; while (l >= 0) diff --git a/polymer/eduke32/source/demo.c b/polymer/eduke32/source/demo.c index 01328108e..b81cba178 100644 --- a/polymer/eduke32/source/demo.c +++ b/polymer/eduke32/source/demo.c @@ -138,8 +138,8 @@ void G_OpenDemoWrite(void) if ((g_player[myconnectindex].ps->gm&MODE_GAME) && g_player[myconnectindex].ps->dead_flag) { - Bstrcpy(ScriptQuotes[122], "CANNOT START DEMO RECORDING WHEN DEAD!"); - P_DoQuote(122, g_player[myconnectindex].ps); + Bstrcpy(ScriptQuotes[QUOTE_RESERVED4], "CANNOT START DEMO RECORDING WHEN DEAD!"); + P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps); ud.recstat = ud.m_recstat = 0; return; } @@ -156,8 +156,8 @@ void G_OpenDemoWrite(void) OSD_Printf("contain a RESIZEARRAY command, you can force recording with the\n"); OSD_Printf("`demorec_force' cvar. Alternatively, you can disable diff recording\n"); OSD_Printf("with the `demorec_diffs' cvar.\n\n"); - Bstrcpy(ScriptQuotes[122], "FAILED STARTING DEMO RECORDING. SEE OSD FOR DETAILS."); - P_DoQuote(122, g_player[myconnectindex].ps); + Bstrcpy(ScriptQuotes[QUOTE_RESERVED4], "FAILED STARTING DEMO RECORDING. SEE OSD FOR DETAILS."); + P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps); ud.recstat = ud.m_recstat = 0; return; } @@ -178,8 +178,8 @@ void G_OpenDemoWrite(void) demorec_synccompress_cvar|(demorec_seeds_cvar<<1)); if (i) { - Bstrcpy(ScriptQuotes[122], "FAILED STARTING DEMO RECORDING. SEE OSD FOR DETAILS."); - P_DoQuote(122, g_player[myconnectindex].ps); + Bstrcpy(ScriptQuotes[QUOTE_RESERVED4], "FAILED STARTING DEMO RECORDING. SEE OSD FOR DETAILS."); + P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps); Bfclose(g_demo_filePtr), g_demo_filePtr=NULL; ud.recstat = ud.m_recstat = 0; return; @@ -189,8 +189,8 @@ void G_OpenDemoWrite(void) demo_synccompress = demorec_synccompress_cvar; demorec_difftics = demorec_difftics_cvar; - Bstrcpy(ScriptQuotes[122], "DEMO RECORDING STARTED"); - P_DoQuote(122, g_player[myconnectindex].ps); + Bstrcpy(ScriptQuotes[QUOTE_RESERVED4], "DEMO RECORDING STARTED"); + P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps); ud.reccnt = 0; ud.recstat = ud.m_recstat = 1; // @@ -269,8 +269,8 @@ void G_CloseDemoWrite(void) sv_freemem(); - Bstrcpy(ScriptQuotes[122], "DEMO RECORDING STOPPED"); - P_DoQuote(122, g_player[myconnectindex].ps); + Bstrcpy(ScriptQuotes[QUOTE_RESERVED4], "DEMO RECORDING STOPPED"); + P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps); } #if KRANDDEBUG krd_print("krandrec.log"); diff --git a/polymer/eduke32/source/duke3d.h b/polymer/eduke32/source/duke3d.h index eed42678c..c5edf7c81 100644 --- a/polymer/eduke32/source/duke3d.h +++ b/polymer/eduke32/source/duke3d.h @@ -64,7 +64,7 @@ extern "C" { #define WW2GI (g_gameType & 2) // increase by 3, because atomic GRP adds 1, and Shareware adds 2 -#define BYTEVERSION_JF 195 +#define BYTEVERSION_JF 198 #define BYTEVERSION_13 27 #define BYTEVERSION_14 116 #define BYTEVERSION_15 117 @@ -86,15 +86,10 @@ extern "C" { #define TICSPERFRAME 4 #define TICRATE 120 -#define MAXQUOTES 16384 -#define MAXQUOTELEN 128 -#define OBITQUOTEINDEX MAXQUOTES-128 -#define SUICIDEQUOTEINDEX MAXQUOTES-32 - #define NO 0 #define YES 1 -#define PACKBUF_SIZE 65535 +#define PACKBUF_SIZE 2048 #define TILE_SAVESHOT (MAXTILES-1) #define TILE_LOADSHOT (MAXTILES-3) @@ -118,6 +113,7 @@ extern "C" { #include "music.h" #include "player.h" #include "actors.h" +#include "quotes.h" #include "global.h" #include "sector.h" #include "net.h" diff --git a/polymer/eduke32/source/enet/include/enet/enet.h b/polymer/eduke32/source/enet/include/enet/enet.h index 2f656d6cb..b572590ec 100644 --- a/polymer/eduke32/source/enet/include/enet/enet.h +++ b/polymer/eduke32/source/enet/include/enet/enet.h @@ -25,7 +25,7 @@ extern "C" #define ENET_VERSION_MAJOR 1 #define ENET_VERSION_MINOR 3 -#define ENET_VERSION_PATCH 0 +#define ENET_VERSION_PATCH 1 #define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch)) #define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH) diff --git a/polymer/eduke32/source/enet/src/protocol.c b/polymer/eduke32/source/enet/src/protocol.c index d267de564..39d95bc52 100644 --- a/polymer/eduke32/source/enet/src/protocol.c +++ b/polymer/eduke32/source/enet/src/protocol.c @@ -9,9 +9,9 @@ #include "enet/time.h" #include "enet/enet.h" -#ifndef UNREFERENCED_PARAMETER -# define UNREFERENCED_PARAMETER(x) x=x -#endif +#ifndef UNREFERENCED_PARAMETER +# define UNREFERENCED_PARAMETER(x) x=x +#endif static size_t commandSizes [ENET_PROTOCOL_COMMAND_COUNT] = { @@ -178,6 +178,7 @@ enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliabl ENetOutgoingCommand * outgoingCommand; ENetListIterator currentCommand; ENetProtocolCommand commandNumber; + int wasSent = 1; for (currentCommand = enet_list_begin (& peer -> sentReliableCommands); currentCommand != enet_list_end (& peer -> sentReliableCommands); @@ -207,6 +208,8 @@ enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliabl if (currentCommand == enet_list_end (& peer -> outgoingReliableCommands)) return ENET_PROTOCOL_COMMAND_NONE; + + wasSent = 0; } if (channelID < peer -> channelCount) @@ -227,7 +230,8 @@ enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliabl if (outgoingCommand -> packet != NULL) { - peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; + if (wasSent) + peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; -- outgoingCommand -> packet -> referenceCount; @@ -256,6 +260,7 @@ enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENet size_t channelCount; ENetPeer * currentPeer; ENetProtocol verifyCommand; + UNREFERENCED_PARAMETER(header); channelCount = ENET_NET_TO_HOST_32 (command -> connect.channelCount); @@ -611,9 +616,10 @@ enet_protocol_handle_send_fragment (ENetHost * host, ENetPeer * peer, const ENet static int enet_protocol_handle_ping (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) { - UNREFERENCED_PARAMETER(host); - UNREFERENCED_PARAMETER(peer); - UNREFERENCED_PARAMETER(command); + UNREFERENCED_PARAMETER(host); + UNREFERENCED_PARAMETER(peer); + UNREFERENCED_PARAMETER(command); + return 0; } @@ -642,7 +648,7 @@ static int enet_protocol_handle_throttle_configure (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) { UNREFERENCED_PARAMETER(host); - + peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleInterval); peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleAcceleration); peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleDeceleration); @@ -758,7 +764,7 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * enet_peer_disconnect (peer, peer -> eventData); break; default: - break; + break; } return 0; @@ -1266,7 +1272,7 @@ enet_protocol_check_timeouts (ENetHost * host, ENetPeer * peer, ENetEvent * even return 0; } -static void +static int enet_protocol_send_reliable_outgoing_commands (ENetHost * host, ENetPeer * peer) { ENetProtocol * command = & host -> commands [host -> commandCount]; @@ -1276,6 +1282,7 @@ enet_protocol_send_reliable_outgoing_commands (ENetHost * host, ENetPeer * peer) ENetChannel *channel; enet_uint16 reliableWindow; size_t commandSize; + int windowExceeded = 0, windowWrap = 0, canPing = 1; currentCommand = enet_list_begin (& peer -> outgoingReliableCommands); @@ -1285,39 +1292,54 @@ enet_protocol_send_reliable_outgoing_commands (ENetHost * host, ENetPeer * peer) channel = outgoingCommand -> command.header.channelID < peer -> channelCount ? & peer -> channels [outgoingCommand -> command.header.channelID] : NULL; reliableWindow = outgoingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; - if (channel != NULL && - outgoingCommand -> sendAttempts < 1 && - ! (outgoingCommand -> reliableSequenceNumber % ENET_PEER_RELIABLE_WINDOW_SIZE) && - (channel -> reliableWindows [(reliableWindow + ENET_PEER_RELIABLE_WINDOWS - 1) % ENET_PEER_RELIABLE_WINDOWS] >= ENET_PEER_RELIABLE_WINDOW_SIZE || - channel -> usedReliableWindows & ((((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) << reliableWindow) | - (((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) >> (ENET_PEER_RELIABLE_WINDOW_SIZE - reliableWindow))))) - break; - + if (channel != NULL) + { + if (! windowWrap && + outgoingCommand -> sendAttempts < 1 && + ! (outgoingCommand -> reliableSequenceNumber % ENET_PEER_RELIABLE_WINDOW_SIZE) && + (channel -> reliableWindows [(reliableWindow + ENET_PEER_RELIABLE_WINDOWS - 1) % ENET_PEER_RELIABLE_WINDOWS] >= ENET_PEER_RELIABLE_WINDOW_SIZE || + channel -> usedReliableWindows & ((((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) << reliableWindow) | + (((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) >> (ENET_PEER_RELIABLE_WINDOW_SIZE - reliableWindow))))) + windowWrap = 1; + if (windowWrap) + { + currentCommand = enet_list_next (currentCommand); + + continue; + } + } + + if (outgoingCommand -> packet != NULL) + { + if (! windowExceeded) + { + enet_uint32 windowSize = (peer -> packetThrottle * peer -> windowSize) / ENET_PEER_PACKET_THROTTLE_SCALE; + + if (peer -> reliableDataInTransit + outgoingCommand -> fragmentLength > ENET_MAX (windowSize, peer -> mtu)) + windowExceeded = 1; + } + if (windowExceeded) + { + currentCommand = enet_list_next (currentCommand); + + continue; + } + } + + canPing = 0; + commandSize = commandSizes [outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK]; if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || buffer + 1 >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || - peer -> mtu - host -> packetSize < commandSize) + peer -> mtu - host -> packetSize < commandSize || + (outgoingCommand -> packet != NULL && + (enet_uint16) (peer -> mtu - host -> packetSize) < (enet_uint16) (commandSize + outgoingCommand -> fragmentLength))) { host -> continueSending = 1; break; } - if (outgoingCommand -> packet != NULL) - { - enet_uint32 windowSize = (peer -> packetThrottle * peer -> windowSize) / ENET_PEER_PACKET_THROTTLE_SCALE; - - if (peer -> reliableDataInTransit + outgoingCommand -> fragmentLength > ENET_MAX (windowSize, peer -> mtu)) - break; - - if ((enet_uint16) (peer -> mtu - host -> packetSize) < (enet_uint16) (commandSize + outgoingCommand -> fragmentLength)) - { - host -> continueSending = 1; - - break; - } - } - currentCommand = enet_list_next (currentCommand); if (channel != NULL && outgoingCommand -> sendAttempts < 1) @@ -1370,6 +1392,8 @@ enet_protocol_send_reliable_outgoing_commands (ENetHost * host, ENetPeer * peer) host -> commandCount = command - host -> commands; host -> bufferCount = buffer - host -> buffers; + + return canPing; } static int @@ -1407,10 +1431,9 @@ enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch enet_protocol_check_timeouts (host, currentPeer, event) == 1) return 1; - if (! enet_list_empty (& currentPeer -> outgoingReliableCommands)) - enet_protocol_send_reliable_outgoing_commands (host, currentPeer); - else - if (enet_list_empty (& currentPeer -> sentReliableCommands) && + if ((enet_list_empty (& currentPeer -> outgoingReliableCommands) || + enet_protocol_send_reliable_outgoing_commands (host, currentPeer)) && + enet_list_empty (& currentPeer -> sentReliableCommands) && ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> lastReceiveTime) >= ENET_PEER_PING_INTERVAL && currentPeer -> mtu - host -> packetSize >= sizeof (ENetProtocolPing)) { diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index b5e203985..82e283366 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -67,10 +67,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define WIN32_LEAN_AND_MEAN #include #include +#include extern int32_t G_GetVersionFromWebsite(char *buffer); #define UPDATEINTERVAL 604800 // 1w #else static int32_t usecwd = 0; +#include #endif /* _WIN32 */ int32_t g_quitDeadline = 0; @@ -528,7 +530,7 @@ void G_HandleSpecialKeys(void) // CONTROL_ProcessBinds(); - if (ALT_IS_PRESSED && KB_KeyPressed(sc_Enter)) + if (g_networkMode != NET_DEDICATED_SERVER && ALT_IS_PRESSED && KB_KeyPressed(sc_Enter)) { if (setgamemode(!ud.config.ScreenMode,ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP)) { @@ -546,7 +548,7 @@ void G_HandleSpecialKeys(void) { KB_ClearKeyDown(sc_F12); screencapture("duke0000.tga",0); - P_DoQuote(103,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SCREEN_SAVED,g_player[myconnectindex].ps); } // only dispatch commands here when not in a game @@ -1695,7 +1697,7 @@ static void G_PrintCoords(int32_t snum) printext256(250L,y,31,-1,tempbuf,0); Bsprintf(tempbuf,"A/H= %d,%d",g_player[snum].ps->ang,g_player[snum].ps->horiz); printext256(250L,y+9L,31,-1,tempbuf,0); - Bsprintf(tempbuf,"ZV= %d",g_player[snum].ps->posvel.z); + Bsprintf(tempbuf,"ZV= %d",g_player[snum].ps->vel.z); printext256(250L,y+18L,31,-1,tempbuf,0); Bsprintf(tempbuf,"OG= %d",g_player[snum].ps->on_ground); printext256(250L,y+27L,31,-1,tempbuf,0); @@ -1727,7 +1729,7 @@ void G_PrintGameQuotes(void) else if (j > 12) k += 24; } - if (g_player[screenpeek].ps->fta > 1 && (g_player[screenpeek].ps->ftq < 115 || g_player[screenpeek].ps->ftq > 117)) + if (g_player[screenpeek].ps->fta > 1 && (g_player[screenpeek].ps->ftq < QUOTE_RESERVED || g_player[screenpeek].ps->ftq > QUOTE_RESERVED3)) { if (g_player[screenpeek].ps->fta > 6) k += 7; @@ -1778,7 +1780,7 @@ void G_PrintGameQuotes(void) k = 0; - if (g_player[screenpeek].ps->ftq == 115 || g_player[screenpeek].ps->ftq == 116 || g_player[screenpeek].ps->ftq == 117) + if (g_player[screenpeek].ps->ftq >= QUOTE_RESERVED && g_player[screenpeek].ps->ftq <= QUOTE_RESERVED3) { k = 140;//quotebot-8-4; } @@ -1826,8 +1828,8 @@ void P_DoQuote(int32_t q, DukePlayer_t *p) if (ud.fta_on == 0) return; - if (p->fta > 0 && q != 115 && q != 116) - if (p->ftq == 115 || p->ftq == 116) return; + if (p->fta > 0 && q != QUOTE_RESERVED && q != QUOTE_RESERVED2) + if (p->ftq == QUOTE_RESERVED || p->ftq == QUOTE_RESERVED2) return; p->fta = 100; @@ -3220,6 +3222,8 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio) int32_t tmpyx=yxaspect, tmpvr=viewingrange; + if (g_networkMode == NET_DEDICATED_SERVER) return; + if (pub > 0 || getrendermode() >= 3) // JBF 20040101: redraw background always { if (getrendermode() >= 3 || ud.screen_size > 8 || (ud.screen_size == 8 && ud.statusbarscale<100)) @@ -6661,7 +6665,7 @@ GAME_STATIC void G_DoCheats(void) if (!((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9'))) { g_player[myconnectindex].ps->cheat_phase = 0; - // P_DoQuote(46,g_player[myconnectindex].ps); + // P_DoQuote(QUOTE_46,g_player[myconnectindex].ps); return; } @@ -6709,14 +6713,14 @@ FOUNDCHEAT: KB_FlushKeyBoardQueue(); g_player[myconnectindex].ps->cheat_phase = 0; - P_DoQuote(119,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_ALL_WEAPONS, g_player[myconnectindex].ps); return; case CHEAT_INVENTORY: KB_FlushKeyBoardQueue(); g_player[myconnectindex].ps->cheat_phase = 0; G_CheatGetInv(); - P_DoQuote(120,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_ALL_INV, g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; return; @@ -6724,7 +6728,7 @@ FOUNDCHEAT: g_player[myconnectindex].ps->got_access = 7; KB_FlushKeyBoardQueue(); g_player[myconnectindex].ps->cheat_phase = 0; - P_DoQuote(121,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_ALL_KEYS, g_player[myconnectindex].ps); return; case CHEAT_DEBUG: @@ -6743,7 +6747,7 @@ FOUNDCHEAT: ud.clipping = 1-ud.clipping; KB_FlushKeyBoardQueue(); g_player[myconnectindex].ps->cheat_phase = 0; - P_DoQuote(112+ud.clipping,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_NOCLIP-ud.clipping, g_player[myconnectindex].ps); return; case CHEAT_RESERVED2: @@ -6753,7 +6757,7 @@ FOUNDCHEAT: return; case CHEAT_ALLEN: - P_DoQuote(79,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_ALLEN,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; KB_ClearKeyDown(sc_N); return; @@ -6779,7 +6783,7 @@ FOUNDCHEAT: sprite[g_player[myconnectindex].ps->i].lotag = 0; sprite[g_player[myconnectindex].ps->i].pal = g_player[myconnectindex].ps->palookup; - P_DoQuote(17,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_GODMODE_ON,g_player[myconnectindex].ps); } else { @@ -6787,7 +6791,7 @@ FOUNDCHEAT: sprite[g_player[myconnectindex].ps->i].extra = g_player[myconnectindex].ps->max_player_health; actor[g_player[myconnectindex].ps->i].extra = -1; g_player[myconnectindex].ps->last_extra = g_player[myconnectindex].ps->max_player_health; - P_DoQuote(18,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_GODMODE_OFF,g_player[myconnectindex].ps); } sprite[g_player[myconnectindex].ps->i].extra = g_player[myconnectindex].ps->max_player_health; @@ -6816,9 +6820,9 @@ FOUNDCHEAT: sprite[g_player[myconnectindex].ps->i].hitag = 0; sprite[g_player[myconnectindex].ps->i].lotag = 0; sprite[g_player[myconnectindex].ps->i].pal = g_player[myconnectindex].ps->palookup; - Bstrcpy(ScriptQuotes[122],"COME GET SOME!"); + Bstrcpy(ScriptQuotes[QUOTE_RESERVED4],"COME GET SOME!"); S_PlaySound(DUKE_GETWEAPON2); - P_DoQuote(122,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps); G_CheatGetInv(); for (weapon = PISTOL_WEAPON; weapon < MAX_WEAPONS; weapon++) g_player[myconnectindex].ps->gotweapon |= (1<i].extra = g_player[myconnectindex].ps->max_player_health; actor[g_player[myconnectindex].ps->i].extra = -1; g_player[myconnectindex].ps->last_extra = g_player[myconnectindex].ps->max_player_health; - P_DoQuote(18,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_GODMODE_OFF, g_player[myconnectindex].ps); } sprite[g_player[myconnectindex].ps->i].extra = g_player[myconnectindex].ps->max_player_health; @@ -6859,10 +6863,10 @@ FOUNDCHEAT: P_AddAmmo(weapon, g_player[myconnectindex].ps, g_player[myconnectindex].ps->max_ammo_amount[weapon]); G_CheatGetInv(); g_player[myconnectindex].ps->got_access = 7; - P_DoQuote(5,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_EVERYTHING, g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; - // P_DoQuote(21,g_player[myconnectindex].ps); + // P_DoQuote(QUOTE_21,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); g_player[myconnectindex].ps->inven_icon = 1; @@ -6937,14 +6941,14 @@ FOUNDCHEAT: g_cameraDistance = 0; g_cameraClock = totalclock; } - P_DoQuote(22,g_player[myconnectindex].ps); +// P_DoQuote(QUOTE_CHEATS_DISABLED,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); return; case CHEAT_TIME: - P_DoQuote(21,g_player[myconnectindex].ps); +// P_DoQuote(QUOTE_21,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); return; @@ -6965,7 +6969,7 @@ FOUNDCHEAT: } G_OperateForceFields(g_player[myconnectindex].ps->i,-1); - P_DoQuote(100,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_UNLOCK,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); return; @@ -6979,7 +6983,7 @@ FOUNDCHEAT: case CHEAT_ITEMS: G_CheatGetInv(); g_player[myconnectindex].ps->got_access = 7; - P_DoQuote(5,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_EVERYTHING,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); return; @@ -6992,7 +6996,7 @@ FOUNDCHEAT: show2dsector[i] = 255; for (i=0; i<(MAXWALLS>>3); i++) show2dwall[i] = 255; - P_DoQuote(111,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SHOW_MAP_ON, g_player[myconnectindex].ps); } else { @@ -7000,14 +7004,14 @@ FOUNDCHEAT: show2dsector[i] = 0; for (i=0; i<(MAXWALLS>>3); i++) show2dwall[i] = 0; - P_DoQuote(1,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SHOW_MAP_OFF, g_player[myconnectindex].ps); } g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); return; case CHEAT_TODD: - P_DoQuote(99,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_TODD,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); return; @@ -7019,7 +7023,7 @@ FOUNDCHEAT: return; case CHEAT_BETA: - P_DoQuote(105,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_BETA,g_player[myconnectindex].ps); KB_ClearKeyDown(sc_H); g_player[myconnectindex].ps->cheat_phase = 0; KB_FlushKeyBoardQueue(); @@ -7029,19 +7033,22 @@ FOUNDCHEAT: g_player[myconnectindex].ps->inv_amount[GET_STEROIDS] = 399; g_player[myconnectindex].ps->inv_amount[GET_HEATS] = 1200; g_player[myconnectindex].ps->cheat_phase = 0; - P_DoQuote(37,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEAT_STEROIDS,g_player[myconnectindex].ps); KB_FlushKeyBoardQueue(); return; case CHEAT_MONSTERS: { - char *s[] = { "ON", "OFF", "ON" }; + char *s[] = { "ON", "OFF" }; + + if (++g_noEnemies == 3) + g_noEnemies = 0; - g_noEnemies++; - if (g_noEnemies == 3) g_noEnemies = 0; g_player[screenpeek].ps->cheat_phase = 0; - Bsprintf(ScriptQuotes[122],"MONSTERS: %s",s[(uint8_t)g_noEnemies]); - P_DoQuote(122,g_player[myconnectindex].ps); + + Bsprintf(ScriptQuotes[QUOTE_RESERVED4], "MONSTERS: %s", s[g_noEnemies%1]); + P_DoQuote(QUOTE_RESERVED4,g_player[myconnectindex].ps); + KB_FlushKeyBoardQueue(); return; } @@ -7073,13 +7080,13 @@ FOUNDCHEAT: { if (ud.player_skill == 4) { - P_DoQuote(22,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_CHEATS_DISABLED,g_player[myconnectindex].ps); g_player[myconnectindex].ps->cheat_phase = 0; } else { g_player[myconnectindex].ps->cheat_phase = 1; - // P_DoQuote(25,g_player[myconnectindex].ps); + // P_DoQuote(QUOTE_25,g_player[myconnectindex].ps); cheatbuflen = 0; } KB_FlushKeyboardQueue(); @@ -7192,14 +7199,14 @@ void G_HandleLocalKeys(void) { CONTROL_ClearButton(gamefunc_Show_Opponents_Weapon); ud.config.ShowOpponentWeapons = ud.showweapons = 1-ud.showweapons; - P_DoQuote(82-ud.showweapons,g_player[screenpeek].ps); + P_DoQuote(QUOTE_WEAPON_MODE_OFF-ud.showweapons,g_player[screenpeek].ps); } if (BUTTON(gamefunc_Toggle_Crosshair)) { CONTROL_ClearButton(gamefunc_Toggle_Crosshair); ud.crosshair = !ud.crosshair; - P_DoQuote(21-ud.crosshair,g_player[screenpeek].ps); + P_DoQuote(QUOTE_CROSSHAIR_OFF-ud.crosshair,g_player[screenpeek].ps); } if (ud.overhead_on && BUTTON(gamefunc_Map_Follow_Mode)) @@ -7212,7 +7219,7 @@ void G_HandleLocalKeys(void) ud.foly = g_player[screenpeek].ps->opos.y; ud.fola = g_player[screenpeek].ps->oang; } - P_DoQuote(83+ud.scrollmode,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_MAP_FOLLOW_OFF+ud.scrollmode,g_player[myconnectindex].ps); } if (KB_UnBoundKeyPressed(sc_ScrollLock)) @@ -7338,7 +7345,7 @@ void G_HandleLocalKeys(void) { if (SHIFTS_IS_PRESSED) { - if (i == 5 && g_player[myconnectindex].ps->fta > 0 && g_player[myconnectindex].ps->ftq == 26) + if (i == 5 && g_player[myconnectindex].ps->fta > 0 && g_player[myconnectindex].ps->ftq == QUOTE_MUSIC) { i = (VOLUMEALL?MAXVOLUMES*MAXLEVELS:6); g_musicIndex = (g_musicIndex+1)%i; @@ -7351,10 +7358,10 @@ void G_HandleLocalKeys(void) if (MapInfo[(uint8_t)g_musicIndex].musicfn != NULL) { if (S_PlayMusic(&MapInfo[(uint8_t)g_musicIndex].musicfn[0],g_musicIndex)) - Bsprintf(ScriptQuotes[26],"PLAYING %s",&MapInfo[(uint8_t)g_musicIndex].alt_musicfn[0]); + Bsprintf(ScriptQuotes[QUOTE_MUSIC],"PLAYING %s",&MapInfo[(uint8_t)g_musicIndex].alt_musicfn[0]); else - Bsprintf(ScriptQuotes[26],"PLAYING %s",&MapInfo[(uint8_t)g_musicIndex].musicfn[0]); - P_DoQuote(26,g_player[myconnectindex].ps); + Bsprintf(ScriptQuotes[QUOTE_MUSIC],"PLAYING %s",&MapInfo[(uint8_t)g_musicIndex].musicfn[0]); + P_DoQuote(QUOTE_MUSIC,g_player[myconnectindex].ps); } return; } @@ -7473,7 +7480,7 @@ void G_HandleLocalKeys(void) FAKE_F2: if (sprite[g_player[myconnectindex].ps->i].extra <= 0) { - P_DoQuote(118,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SAVE_DEAD,g_player[myconnectindex].ps); return; } ChangeToMenu(350); @@ -7542,7 +7549,7 @@ FAKE_F3: if (sprite[g_player[myconnectindex].ps->i].extra <= 0) { - P_DoQuote(118,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SAVE_DEAD,g_player[myconnectindex].ps); return; } g_screenCapture = 1; @@ -7571,32 +7578,32 @@ FAKE_F3: g_cameraDistance = 0; g_cameraClock = totalclock; } - P_DoQuote(109+g_player[myconnectindex].ps->over_shoulder_on,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_VIEW_MODE_OFF+g_player[myconnectindex].ps->over_shoulder_on,g_player[myconnectindex].ps); } if (KB_UnBoundKeyPressed(sc_F5) && ud.config.MusicDevice >= 0) { KB_ClearKeyDown(sc_F5); if (MapInfo[(uint8_t)g_musicIndex].alt_musicfn != NULL) - Bstrcpy(ScriptQuotes[26],&MapInfo[(uint8_t)g_musicIndex].alt_musicfn[0]); + Bstrcpy(ScriptQuotes[QUOTE_MUSIC],&MapInfo[(uint8_t)g_musicIndex].alt_musicfn[0]); else if (MapInfo[(uint8_t)g_musicIndex].musicfn != NULL) { - Bstrcpy(ScriptQuotes[26],&MapInfo[(uint8_t)g_musicIndex].musicfn[0]); - Bstrcat(ScriptQuotes[26],". USE SHIFT-F5 TO CHANGE."); + Bstrcpy(ScriptQuotes[QUOTE_MUSIC],&MapInfo[(uint8_t)g_musicIndex].musicfn[0]); + Bstrcat(ScriptQuotes[QUOTE_MUSIC],". USE SHIFT-F5 TO CHANGE."); } - else ScriptQuotes[26][0] = '\0'; - P_DoQuote(26,g_player[myconnectindex].ps); + else ScriptQuotes[QUOTE_MUSIC][0] = '\0'; + P_DoQuote(QUOTE_MUSIC, g_player[myconnectindex].ps); } if (KB_UnBoundKeyPressed(sc_F8)) { KB_ClearKeyDown(sc_F8); ud.fta_on = !ud.fta_on; - if (ud.fta_on) P_DoQuote(23,g_player[myconnectindex].ps); + if (ud.fta_on) P_DoQuote(QUOTE_MESSAGES_ON,g_player[myconnectindex].ps); else { ud.fta_on = 1; - P_DoQuote(24,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_MESSAGES_OFF,g_player[myconnectindex].ps); ud.fta_on = 0; } } @@ -7673,7 +7680,7 @@ FAKE_F3: { CONTROL_ClearButton(gamefunc_AutoRun); ud.auto_run = 1-ud.auto_run; - P_DoQuote(85+ud.auto_run,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_RUN_MODE_OFF+ud.auto_run,g_player[myconnectindex].ps); } if (BUTTON(gamefunc_Map)) @@ -7809,7 +7816,7 @@ static int32_t getfilenames(const char *path, char kind[]) } static char *autoloadmasks[] = { "*.grp", "*.zip", "*.pk3" }; -#define NUMAUTOLOADMASKS 3 +#define NUMAUTOLOADMASKS (int32_t)(sizeof(autoloadmasks)/sizeof(autoloadmasks[0])) static void G_DoAutoload(const char *fn) { @@ -7829,7 +7836,7 @@ static void G_DoAutoload(const char *fn) } } -static char *makename(char *destname, char *OGGname, const char *origname) +static char *S_OggifyFilename(char *destname, char *OGGname, const char *origname) { if (!origname) return destname; @@ -7859,7 +7866,7 @@ static int32_t S_DefineSound(int32_t ID,char *name) { if (ID >= MAXSOUNDS) return 1; - g_sounds[ID].filename1 =makename(g_sounds[ID].filename1,name,g_sounds[ID].filename); + g_sounds[ID].filename1 =S_OggifyFilename(g_sounds[ID].filename1,name,g_sounds[ID].filename); // initprintf("(%s)(%s)(%s)\n",g_sounds[ID].filename1,name,g_sounds[ID].filename); // S_LoadSound(ID); return 0; @@ -7899,7 +7906,7 @@ static int32_t S_DefineMusic(char *ID,char *name) ID = MapInfo[sel].musicfn; } - MapInfo[sel].alt_musicfn = makename(MapInfo[sel].alt_musicfn,name,ID); + MapInfo[sel].alt_musicfn = S_OggifyFilename(MapInfo[sel].alt_musicfn,name,ID); // initprintf("%-15s | ",ID); // initprintf("%3d %2d %2d | %s\n",sel,ep,lev,MapInfo[sel].alt_musicfn); // S_PlayMusic(ID,sel); @@ -8190,14 +8197,14 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) initprintf("\n"); i = 1; - while (i < argc) + do { c = (char *)argv[i]; if ((*c == '-') #ifdef _WIN32 - || (*c == '/') + || (*c == '/') #endif - ) + ) { if (!Bstrcasecmp(c+1,"?") || !Bstrcasecmp(c+1,"help") || !Bstrcasecmp(c+1,"-help")) { @@ -8318,7 +8325,14 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) } if (!Bstrcasecmp(c+1,"server")) { - g_netServerMode = 1; + g_networkMode = NET_SERVER; + g_noSetup = g_noLogo = TRUE; + i++; + continue; + } + if (!Bstrcasecmp(c+1,"dedicated")) + { + g_networkMode = NET_DEDICATED_SERVER; g_noSetup = g_noLogo = TRUE; i++; continue; @@ -8430,9 +8444,9 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) if ((*c == '-') #ifdef _WIN32 - || (*c == '/') + || (*c == '/') #endif - ) + ) { c++; switch (Btolower(*c)) @@ -8648,6 +8662,7 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) } i++; } + while (i < argc); } } @@ -9305,6 +9320,7 @@ int32_t app_main(int32_t argc,const char **argv) break; } } + if (i == argc && win_checkinstance()) { if (!wm_ynbox("EDuke32","Another Build game is currently running. " @@ -9747,7 +9763,7 @@ CLEAN_DIRECTORY: if (g_scriptDebug) initprintf("CON debugging activated (level %d).\n",g_scriptDebug); - if (g_netServerMode) + if (g_networkMode == NET_SERVER || g_networkMode == NET_DEDICATED_SERVER) { ENetAddress address = { ENET_HOST_ANY, g_netPort }; g_netServer = enet_host_create(&address, MAXPLAYERS, CHAN_MAX, 0, 0); @@ -9842,24 +9858,27 @@ CLEAN_DIRECTORY: OSD_SetVersion(tempbuf, 10,0); registerosdcommands(); - if (CONTROL_Startup(1, &GetTime, TICRATE)) + if (g_networkMode != NET_DEDICATED_SERVER) { - fprintf(stderr, "There was an error initializing the CONTROL system.\n"); - uninitengine(); - exit(5); + if (CONTROL_Startup(1, &GetTime, TICRATE)) + { + fprintf(stderr, "There was an error initializing the CONTROL system.\n"); + uninitengine(); + exit(5); + } + + G_SetupGameButtons(); + CONFIG_SetupMouse(); + CONFIG_SetupJoystick(); + + CONTROL_JoystickEnabled = (ud.config.UseJoystick && CONTROL_JoyPresent); + CONTROL_MouseEnabled = (ud.config.UseMouse && CONTROL_MousePresent); + + // JBF 20040215: evil and nasty place to do this, but joysticks are evil and nasty too + for (i=0; i0) + if ((i = clipmapinfo_load("_clipshape0.map")) > 0) initprintf("There was an error loading the sprite clipping map (status %d).\n", i); OSD_Exec("autoexec.cfg"); - if (setgamemode(ud.config.ScreenMode,ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP) < 0) + if (g_networkMode != NET_DEDICATED_SERVER) { - int32_t i = 0; - int32_t xres[] = {ud.config.ScreenWidth,800,640,320}; - int32_t yres[] = {ud.config.ScreenHeight,600,480,240}; - int32_t bpp[] = {32,16,8}; + if (setgamemode(ud.config.ScreenMode,ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP) < 0) + { + int32_t i = 0; + int32_t xres[] = {ud.config.ScreenWidth,800,640,320}; + int32_t yres[] = {ud.config.ScreenHeight,600,480,240}; + int32_t bpp[] = {32,16,8}; - initprintf("Failure setting video mode %dx%dx%d %s! Attempting safer mode...\n", - ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP,ud.config.ScreenMode?"fullscreen":"windowed"); + initprintf("Failure setting video mode %dx%dx%d %s! Attempting safer mode...\n", + ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP,ud.config.ScreenMode?"fullscreen":"windowed"); #if defined(POLYMOST) && defined(USE_OPENGL) - { - int32_t j = 0; - while (setgamemode(0,xres[i],yres[i],bpp[j]) < 0) { - initprintf("Failure setting video mode %dx%dx%d windowed! Attempting safer mode...\n",xres[i],yres[i],bpp[i]); - - if (++j == 3) + int32_t j = 0; + while (setgamemode(0,xres[i],yres[i],bpp[j]) < 0) { - if (++i == 4) - G_GameExit("Unable to set failsafe video mode!"); - j = 0; + initprintf("Failure setting video mode %dx%dx%d windowed! Attempting safer mode...\n",xres[i],yres[i],bpp[i]); + + if (++j == 3) + { + if (++i == 4) + G_GameExit("Unable to set failsafe video mode!"); + j = 0; + } } } - } #else - while (setgamemode(0,xres[i],yres[i],8) < 0) - { - initprintf("Failure setting video mode %dx%dx%d windowed! Attempting safer mode...\n",xres[i],yres[i],8); - i++; - } + while (setgamemode(0,xres[i],yres[i],8) < 0) + { + initprintf("Failure setting video mode %dx%dx%d windowed! Attempting safer mode...\n",xres[i],yres[i],8); + i++; + } #endif - ud.config.ScreenWidth = xres[i]; - ud.config.ScreenHeight = yres[i]; - ud.config.ScreenBPP = bpp[i]; + ud.config.ScreenWidth = xres[i]; + ud.config.ScreenHeight = yres[i]; + ud.config.ScreenBPP = bpp[i]; + } + + setbrightness(ud.brightness>>2,g_player[myconnectindex].ps->palette,0); + + S_MusicStartup(); + S_SoundStartup(); } - - setbrightness(ud.brightness>>2,g_player[myconnectindex].ps->palette,0); - - S_MusicStartup(); - S_SoundStartup(); // loadtmb(); if (ud.warp_on > 1 && (!g_netServer && ud.multimode < 2)) @@ -9939,8 +9960,11 @@ CLEAN_DIRECTORY: MAIN_LOOP_RESTART: - G_GetCrosshairColor(); - G_SetCrosshairColor(CrosshairColors.r, CrosshairColors.g, CrosshairColors.b); + if (g_networkMode != NET_DEDICATED_SERVER) + { + G_GetCrosshairColor(); + G_SetCrosshairColor(CrosshairColors.r, CrosshairColors.g, CrosshairColors.b); + } if (ud.warp_on == 0) { @@ -9965,14 +9989,18 @@ MAIN_LOOP_RESTART: Net_WaitForServer(); } - else G_DisplayLogo(); + else if (g_networkMode != NET_DEDICATED_SERVER) + G_DisplayLogo(); - if (G_PlaybackDemo()) + if (g_networkMode != NET_DEDICATED_SERVER) { - FX_StopAllSounds(); - S_ClearSoundLocks(); - g_noLogoAnim = 1; - goto MAIN_LOOP_RESTART; + if (G_PlaybackDemo()) + { + FX_StopAllSounds(); + S_ClearSoundLocks(); + g_noLogoAnim = 1; + goto MAIN_LOOP_RESTART; + } } } else if (ud.warp_on == 1) @@ -10015,19 +10043,49 @@ MAIN_LOOP_RESTART: } sampletimer(); - MUSIC_Update(); Net_GetPackets(); - G_HandleLocalKeys(); // only allow binds to function if the player is actually in a game (not in a menu, typing, et cetera) or demo bindsenabled = g_player[myconnectindex].ps->gm & (MODE_GAME|MODE_DEMO); + // stdin -> OSD input for dedicated server + if (g_networkMode == NET_DEDICATED_SERVER) + { + int32_t nb, flag = 1; + char ch; + static uint32_t bufpos = 0; + static char buf[128]; + + ioctl(0, FIONBIO, &flag); + + if ((nb = read(0, &ch, 1)) > 0 && bufpos < sizeof(buf)) + { + if (ch != '\n') + buf[bufpos++] = ch; + + if (ch == '\n' || bufpos >= sizeof(buf)) + { + buf[bufpos] = 0; + OSD_Dispatch(buf); + bufpos = 0; + } + } + } + else + { + MUSIC_Update(); + G_HandleLocalKeys(); + } + OSD_DispatchQueued(); - if (!(g_player[myconnectindex].ps->gm & (MODE_MENU|MODE_DEMO)) && totalclock >= ototalclock+TICSPERFRAME) + if (((g_netClient || g_netServer) || !(g_player[myconnectindex].ps->gm & (MODE_MENU|MODE_DEMO))) && totalclock >= ototalclock+TICSPERFRAME) { - CONTROL_ProcessBinds(); - getinput(myconnectindex); + if (g_networkMode != NET_DEDICATED_SERVER) + { + CONTROL_ProcessBinds(); + getinput(myconnectindex); + } avg.fvel += loc.fvel; avg.svel += loc.svel; @@ -10065,7 +10123,7 @@ MAIN_LOOP_RESTART: (g_player[myconnectindex].ps->gm&MODE_GAME) && G_MoveLoop()) j++; } - while (!(g_player[myconnectindex].ps->gm & (MODE_MENU|MODE_DEMO)) && totalclock >= ototalclock+TICSPERFRAME); + while (((g_netClient || g_netServer) || !(g_player[myconnectindex].ps->gm & (MODE_MENU|MODE_DEMO))) && totalclock >= ototalclock+TICSPERFRAME); if (j) continue; } @@ -10094,6 +10152,12 @@ MAIN_LOOP_RESTART: g_multiMapState = NULL; } + if (g_networkMode == NET_DEDICATED_SERVER) + { + idle(); + goto skipframe; + } + if (framewaiting) { framewaiting--; @@ -10128,6 +10192,7 @@ MAIN_LOOP_RESTART: framewaiting++; } +skipframe: if (g_player[myconnectindex].ps->gm&MODE_DEMO) goto MAIN_LOOP_RESTART; } @@ -10184,12 +10249,12 @@ int32_t G_DoMoveThings(void) sprite[hitinfo.hitsprite].picnum == APLAYER && sprite[hitinfo.hitsprite].yvel != screenpeek && g_player[sprite[hitinfo.hitsprite].yvel].ps->dead_flag == 0) { - if (g_player[screenpeek].ps->fta == 0 || g_player[screenpeek].ps->ftq == 117) + if (g_player[screenpeek].ps->fta == 0 || g_player[screenpeek].ps->ftq == QUOTE_RESERVED3) { if (ldist(&sprite[g_player[screenpeek].ps->i],&sprite[hitinfo.hitsprite]) < 9216) { - Bsprintf(ScriptQuotes[117],"%s",&g_player[sprite[hitinfo.hitsprite].yvel].user_name[0]); - g_player[screenpeek].ps->fta = 12, g_player[screenpeek].ps->ftq = 117; + Bsprintf(ScriptQuotes[QUOTE_RESERVED3],"%s",&g_player[sprite[hitinfo.hitsprite].yvel].user_name[0]); + g_player[screenpeek].ps->fta = 12, g_player[screenpeek].ps->ftq = QUOTE_RESERVED3; } } else if (g_player[screenpeek].ps->fta > 2) g_player[screenpeek].ps->fta -= 3; @@ -10301,7 +10366,7 @@ int32_t G_DoMoveThings(void) Bmemcpy(&packbuf[j], &g_player[myconnectindex].ps->pos.x, sizeof(vec3_t) * 2); j += sizeof(vec3_t) * 2; - Bmemcpy(&packbuf[j], &g_player[myconnectindex].ps->posvel.x, sizeof(vec3_t)); + Bmemcpy(&packbuf[j], &g_player[myconnectindex].ps->vel.x, sizeof(vec3_t)); j += sizeof(vec3_t); *(int16_t *)&packbuf[j] = g_player[myconnectindex].ps->ang; @@ -10403,6 +10468,9 @@ void G_BonusScreen(int32_t bonusonly) 350, 380,VICTORY1+8,86,59 }; + if (g_networkMode == NET_DEDICATED_SERVER) + return; + Bsprintf(tempbuf, "%s - " APPNAME, g_gameNamePtr); wm_setapptitle(tempbuf); @@ -11190,7 +11258,7 @@ void A_SpawnGlass(int32_t i,int32_t n) for (; n>0; n--) { int32_t k = A_InsertSprite(SECT,SX,SY,SZ-((krand()&16)<<8),GLASSPIECES+(n%3), - krand()&15,36,36,krand()&2047,32+(krand()&63),-512-(krand()&2047),i,5); + krand()&15,36,36,krand()&2047,32+(krand()&63),-512-(krand()&2047),i,5); sprite[k].pal = sprite[i].pal; } } diff --git a/polymer/eduke32/source/game.h b/polymer/eduke32/source/game.h index 509d922bd..7875aef06 100644 --- a/polymer/eduke32/source/game.h +++ b/polymer/eduke32/source/game.h @@ -64,6 +64,17 @@ enum LogoFlags_t { LOGO_TENSCREEN = 0x00000200 }; +typedef enum basepal_ { + BASEPAL = 0, + WATERPAL, + SLIMEPAL, + DREALMSPAL, + TITLEPAL, + ENDINGPAL, + ANIMPAL, + BASEPALCOUNT +} basepal_t; + #define deletesprite A_DeleteSprite void A_DeleteSprite(int32_t s); @@ -227,23 +238,9 @@ extern palette_t DefaultCrosshairColors; extern uint32_t g_frameDelay; -// Watch out for MAXBASEPALS in the engine before increasing this -#define BASEPALCOUNT 7 - extern uint8_t water_pal[768],slime_pal[768],title_pal[768],dre_alms[768],ending_pal[768],*anim_pal; - extern uint8_t *basepaltable[BASEPALCOUNT]; -typedef enum basepal_ { - BASEPAL = 0, - WATERPAL, - SLIMEPAL, - DREALMSPAL, - TITLEPAL, - ENDINGPAL, - ANIMPAL -} basepal_t; - extern user_defs ud; int32_t A_CheckInventorySprite(spritetype *s); @@ -313,12 +310,11 @@ static inline int32_t G_GetTeamPalette(int32_t team) int32_t G_GetVersionFromWebsite(char *buffer); #endif -#if defined(RENDERTYPEWIN) && defined(USE_OPENGL) +#ifdef RENDERTYPEWIN +void app_crashhandler(void); +#ifdef USE_OPENGL extern char forcegl; #endif - -#if defined(RENDERTYPEWIN) -void app_crashhandler(void); #endif #if KRANDDEBUG diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index 8774b15b7..d2eac042d 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -5552,8 +5552,8 @@ repeatcase: tempbuf[i] = '\0'; - if (MapInfo[j *MAXLEVELS+k].name == NULL) - MapInfo[j *MAXLEVELS+k].name = Bcalloc(Bstrlen(tempbuf)+1,sizeof(uint8_t)); + if (MapInfo[j*MAXLEVELS+k].name == NULL) + MapInfo[j*MAXLEVELS+k].name = Bcalloc(Bstrlen(tempbuf)+1,sizeof(uint8_t)); else if ((Bstrlen(tempbuf)+1) > sizeof(MapInfo[j*MAXLEVELS+k].name)) MapInfo[j *MAXLEVELS+k].name = Brealloc(MapInfo[j*MAXLEVELS+k].name,(Bstrlen(tempbuf)+1)); @@ -5582,6 +5582,7 @@ repeatcase: if (ScriptQuotes[k] == NULL) ScriptQuotes[k] = Bcalloc(MAXQUOTELEN,sizeof(uint8_t)); + if (!ScriptQuotes[k]) { ScriptQuotes[k] = NULL; diff --git a/polymer/eduke32/source/gameexec.c b/polymer/eduke32/source/gameexec.c index 9d0fd5534..68397f810 100644 --- a/polymer/eduke32/source/gameexec.c +++ b/polymer/eduke32/source/gameexec.c @@ -83,56 +83,47 @@ void VM_ScriptInfo(void) void VM_OnEvent(register int32_t iEventID, register int32_t iActor, register int32_t iPlayer, register int32_t lDist) { - if (iEventID < 0 || iEventID >= MAXGAMEEVENTS || apScriptGameEvent[iEventID] == 0) + if (!apScriptGameEvent[iEventID]) return; + insptr = apScriptGameEvent[iEventID]; + { intptr_t *oinsptr=insptr; vmstate_t vm_backup; vmstate_t tempvm = { iActor, iPlayer, lDist, &actor[iActor].t_data[0], - &sprite[iActor], 0 - }; + &sprite[iActor], 0 }; Bmemcpy(&vm_backup, &vm, sizeof(vmstate_t)); Bmemcpy(&vm, &tempvm, sizeof(vmstate_t)); - insptr = apScriptGameEvent[iEventID]; - VM_Execute(0); if (vm.g_flags & VM_KILL) { // if player was set to squish, first stop that... - if (vm.g_p >= 0) - { - if (g_player[vm.g_p].ps->actorsqu == vm.g_i) - g_player[vm.g_p].ps->actorsqu = -1; - } + if (vm.g_p >= 0 && g_player[vm.g_p].ps->actorsqu == vm.g_i) + g_player[vm.g_p].ps->actorsqu = -1; + deletesprite(vm.g_i); } Bmemcpy(&vm, &vm_backup, sizeof(vmstate_t)); - insptr=oinsptr; + insptr = oinsptr; } } -static int32_t VM_CheckSquished(void) +static inline int32_t VM_CheckSquished(void) { sectortype *sc = §or[vm.g_sp->sectnum]; - int32_t squishme = 0; - if ((vm.g_sp->picnum == APLAYER && ud.clipping) || sc->lotag == 23) + if ((vm.g_sp->picnum == APLAYER && ud.clipping) || sc->lotag == 23 || + (vm.g_sp->pal == 1 ? + !(sc->floorz - sc->ceilingz < (32<<8) && (sc->lotag&32768) == 0) : + !(sc->floorz - sc->ceilingz < (12<<8)))) return 0; - squishme = (sc->floorz - sc->ceilingz < (12<<8)); // && (sc->lotag&32768) == 0; - - if (vm.g_sp->pal == 1) - squishme = (sc->floorz - sc->ceilingz < (32<<8) && (sc->lotag&32768) == 0); - - if (!squishme) - return 0; - - P_DoQuote(10, g_player[vm.g_p].ps); + P_DoQuote(QUOTE_SQUISHED, g_player[vm.g_p].ps); if (A_CheckEnemySprite(vm.g_sp)) vm.g_sp->xvel = 0; @@ -152,13 +143,12 @@ GAMEEXEC_STATIC GAMEEXEC_INLINE void P_ForceAngle(DukePlayer_t *p) p->horiz += 64; p->return_to_center = 9; - p->look_ang = n>>1; - p->rotscrnang = n>>1; + p->look_ang = p->rotscrnang = n>>1; } GAMEEXEC_STATIC int32_t A_Dodge(spritetype *s) { - int32_t bx,by,bxvect,byvect,d,i; + int32_t bx,by,bxvect,byvect,i; int32_t mx = s->x, my = s->y; int32_t mxvect = sintable[(s->ang+512)&2047]; int32_t myvect = sintable[s->ang&2047]; @@ -168,7 +158,7 @@ GAMEEXEC_STATIC int32_t A_Dodge(spritetype *s) for (i=headspritestat[STAT_PROJECTILE]; i>=0; i=nextspritestat[i]) //weapons list { - if (OW == i/* || SECT != s->sectnum*/) + if (OW == i) continue; bx = SX-mx; @@ -176,16 +166,14 @@ GAMEEXEC_STATIC int32_t A_Dodge(spritetype *s) bxvect = sintable[(SA+512)&2047]; byvect = sintable[SA&2047]; - if (mxvect *bx + myvect *by >= 0) - if (bxvect*bx + byvect*by < 0) + if ((mxvect * bx) + (myvect * by) >= 0 && (bxvect * bx) + (byvect * by) < 0) + { + if (klabs((bxvect * by) - (byvect * bx)) < 65536<<6) { - d = bxvect*by - byvect*bx; - if (klabs(d) < 65536*64) - { - s->ang -= 512+(krand()&1024); - return 1; - } + s->ang -= 512+(krand()&1024); + return 1; } + } } return 0; } @@ -508,8 +496,8 @@ GAMEEXEC_STATIC void VM_Move(void) if (a&face_player_smart && !deadflag) { - int32_t newx = g_player[vm.g_p].ps->pos.x+(g_player[vm.g_p].ps->posvel.x/768); - int32_t newy = g_player[vm.g_p].ps->pos.y+(g_player[vm.g_p].ps->posvel.y/768); + int32_t newx = g_player[vm.g_p].ps->pos.x+(g_player[vm.g_p].ps->vel.x/768); + int32_t newy = g_player[vm.g_p].ps->pos.y+(g_player[vm.g_p].ps->vel.y/768); goalang = getangle(newx-vm.g_sp->x,newy-vm.g_sp->y); angdif = G_GetAngleDelta(vm.g_sp->ang,goalang)>>2; @@ -613,13 +601,13 @@ GAMEEXEC_STATIC void VM_Move(void) if (vm.g_x < 512) { - g_player[vm.g_p].ps->posvel.x = 0; - g_player[vm.g_p].ps->posvel.y = 0; + g_player[vm.g_p].ps->vel.x = 0; + g_player[vm.g_p].ps->vel.y = 0; } else { - g_player[vm.g_p].ps->posvel.x = mulscale(g_player[vm.g_p].ps->posvel.x,g_player[vm.g_p].ps->runspeed-0x2000,16); - g_player[vm.g_p].ps->posvel.y = mulscale(g_player[vm.g_p].ps->posvel.y,g_player[vm.g_p].ps->runspeed-0x2000,16); + g_player[vm.g_p].ps->vel.x = mulscale(g_player[vm.g_p].ps->vel.x,g_player[vm.g_p].ps->runspeed-0x2000,16); + g_player[vm.g_p].ps->vel.y = mulscale(g_player[vm.g_p].ps->vel.y,g_player[vm.g_p].ps->runspeed-0x2000,16); } } else if (vm.g_sp->picnum != DRONE && vm.g_sp->picnum != SHARK && vm.g_sp->picnum != COMMANDER) @@ -1437,7 +1425,7 @@ skip_check: { case CON_ACTIVATEBYSECTOR: if ((var1<0 || var1>=numsectors)) {OSD_Printf(CON_ERROR "Invalid sector %d\n",g_errorLineNum,keyw[g_tw],var1); break;} - activatebysector(var1, var2); + G_ActivateBySector(var1, var2); break; case CON_OPERATESECTORS: if ((var1<0 || var1>=numsectors)) {OSD_Printf(CON_ERROR "Invalid sector %d\n",g_errorLineNum,keyw[g_tw],var1); break;} @@ -3048,7 +3036,7 @@ nullquote: if ((l&8) && g_player[vm.g_p].ps->on_ground && TEST_SYNC_KEY(g_player[vm.g_p].sync->bits, SK_CROUCH)) j = 1; else if ((l&16) && g_player[vm.g_p].ps->jumping_counter == 0 && !g_player[vm.g_p].ps->on_ground && - g_player[vm.g_p].ps->posvel.z > 2048) + g_player[vm.g_p].ps->vel.z > 2048) j = 1; else if ((l&32) && g_player[vm.g_p].ps->jumping_counter > 348) j = 1; @@ -4853,8 +4841,9 @@ void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist) if (vm.g_flags & VM_KILL) { // if player was set to squish, first stop that... - if (g_player[vm.g_p].ps->actorsqu == vm.g_i) + if (vm.g_p >= 0 && g_player[vm.g_p].ps->actorsqu == vm.g_i) g_player[vm.g_p].ps->actorsqu = -1; + deletesprite(vm.g_i); return; } @@ -5195,7 +5184,7 @@ void G_RestoreMapState(mapstate_t *save) Net_ResetPrediction(); - clearfifo(); + G_ClearFIFO(); G_ResetTimers(); } } diff --git a/polymer/eduke32/source/gamestructures.c b/polymer/eduke32/source/gamestructures.c index 99e611fef..f9795776b 100644 --- a/polymer/eduke32/source/gamestructures.c +++ b/polymer/eduke32/source/gamestructures.c @@ -1256,11 +1256,11 @@ static void __fastcall VM_GetPlayer(register int32_t lVar1, register int32_t lLa case PLAYER_OPYOFF: Gv_SetVar(lVar2, g_player[iPlayer].ps->opyoff, vm.g_i, vm.g_p); return; case PLAYER_POSXV: - Gv_SetVar(lVar2, g_player[iPlayer].ps->posvel.x, vm.g_i, vm.g_p); return; + Gv_SetVar(lVar2, g_player[iPlayer].ps->vel.x, vm.g_i, vm.g_p); return; case PLAYER_POSYV: - Gv_SetVar(lVar2, g_player[iPlayer].ps->posvel.y, vm.g_i, vm.g_p); return; + Gv_SetVar(lVar2, g_player[iPlayer].ps->vel.y, vm.g_i, vm.g_p); return; case PLAYER_POSZV: - Gv_SetVar(lVar2, g_player[iPlayer].ps->posvel.z, vm.g_i, vm.g_p); return; + Gv_SetVar(lVar2, g_player[iPlayer].ps->vel.z, vm.g_i, vm.g_p); return; case PLAYER_LAST_PISSED_TIME: Gv_SetVar(lVar2, g_player[iPlayer].ps->last_pissed_time, vm.g_i, vm.g_p); return; case PLAYER_TRUEFZ: @@ -1589,11 +1589,11 @@ static void __fastcall VM_SetPlayer(int32_t lVar1, int32_t lLabelID, int32_t lVa case PLAYER_OPYOFF: g_player[iPlayer].ps->opyoff=lVar1; return; case PLAYER_POSXV: - g_player[iPlayer].ps->posvel.x=lVar1; return; + g_player[iPlayer].ps->vel.x=lVar1; return; case PLAYER_POSYV: - g_player[iPlayer].ps->posvel.y=lVar1; return; + g_player[iPlayer].ps->vel.y=lVar1; return; case PLAYER_POSZV: - g_player[iPlayer].ps->posvel.z=lVar1; return; + g_player[iPlayer].ps->vel.z=lVar1; return; case PLAYER_LAST_PISSED_TIME: g_player[iPlayer].ps->last_pissed_time=lVar1; return; case PLAYER_TRUEFZ: @@ -3513,11 +3513,11 @@ static int32_t __fastcall VM_AccessPlayerX(int32_t iPlayer, int32_t lLabelID, in case PLAYER_OPYOFF: return g_player[iPlayer].ps->opyoff; case PLAYER_POSXV: - return g_player[iPlayer].ps->posvel.x; + return g_player[iPlayer].ps->vel.x; case PLAYER_POSYV: - return g_player[iPlayer].ps->posvel.y; + return g_player[iPlayer].ps->vel.y; case PLAYER_POSZV: - return g_player[iPlayer].ps->posvel.z; + return g_player[iPlayer].ps->vel.z; case PLAYER_LAST_PISSED_TIME: return g_player[iPlayer].ps->last_pissed_time; case PLAYER_TRUEFZ: diff --git a/polymer/eduke32/source/global.c b/polymer/eduke32/source/global.c index 103bf3fea..339b39328 100644 --- a/polymer/eduke32/source/global.c +++ b/polymer/eduke32/source/global.c @@ -25,7 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "duke3d.h" -const char *s_buildDate = "20100727"; +const char *s_buildDate = "20110109"; char *MusicPtr = NULL; int32_t g_musicSize; diff --git a/polymer/eduke32/source/macros.h b/polymer/eduke32/source/macros.h index 53f18a10b..a964670ea 100644 --- a/polymer/eduke32/source/macros.h +++ b/polymer/eduke32/source/macros.h @@ -44,9 +44,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define TEST_SYNC_KEY(bits, sync_num) TEST(bits, BIT(sync_num)) -#define IFWITHIN(B,E) if((PN)>=(B) && (PN)<=(E)) -#define IFMOVING if(A_SetSprite(i,CLIPMASK0)) -#define IFHIT j=A_IncurDamage(i);if(j >= 0) +#define IFWITHIN(B,E) if ((PN)>=(B) && (PN)<=(E)) #define AFLAMABLE(X) (X==BOX||X==TREE1||X==TREE2||X==TIRE||X==CONE) #define rnd(X) ((krand()>>8)>=(255-(X))) diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index 6ae70fd40..6dbee5512 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -5150,8 +5150,8 @@ VOLUME_ALL_40x: else if (g_netServer) enet_host_broadcast(g_netServer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE)); - Bsprintf(ScriptQuotes[116],"VOTE FAILED"); - P_DoQuote(116,g_player[myconnectindex].ps); + Bsprintf(ScriptQuotes[QUOTE_RESERVED2],"VOTE FAILED"); + P_DoQuote(QUOTE_RESERVED2,g_player[myconnectindex].ps); g_player[myconnectindex].ps->gm &= ~MODE_MENU; } } diff --git a/polymer/eduke32/source/net.c b/polymer/eduke32/source/net.c index 1be9a8eb5..6e92ae72a 100644 --- a/polymer/eduke32/source/net.c +++ b/polymer/eduke32/source/net.c @@ -34,7 +34,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. this should be lower than the MTU size by at least the size of the UDP and ENet headers or else fragmentation will occur */ -#define SYNCPACKETSIZE 1366 +#define SYNCPACKETSIZE 1344 ENetHost *g_netServer = NULL; ENetHost *g_netClient = NULL; @@ -44,15 +44,15 @@ int32_t g_netDisconnect = 0; char g_netPassword[32]; int32_t g_netSync = 0; int32_t g_netPlayersWaiting = 0; -int32_t g_netServerMode = 0; +int32_t g_networkMode = NET_CLIENT; static char recbuf[180]; static int32_t g_chatPlayer = -1; // sprites of these statnums are synced to clients by the server -int8_t g_netStatnums[8] = { STAT_PROJECTILE, STAT_STANDABLE, STAT_ACTIVATOR, STAT_TRANSPORT, - STAT_EFFECTOR, STAT_ACTOR, STAT_ZOMBIEACTOR, STAT_MISC - }; +int16_t g_netStatnums[10] = { STAT_PROJECTILE, STAT_PLAYER, STAT_STANDABLE, STAT_ACTIVATOR, STAT_TRANSPORT, + STAT_EFFECTOR, STAT_ACTOR, STAT_ZOMBIEACTOR, STAT_MISC, MAXSTATUS + }; int32_t lastupdate[MAXSPRITES]; int32_t lastsectupdate[MAXSECTORS]; @@ -328,8 +328,8 @@ static void P_RemovePlayer(int32_t i) voting = -1; } - Bstrcpy(ScriptQuotes[116],buf); - g_player[myconnectindex].ps->ftq = 116; + Bstrcpy(ScriptQuotes[QUOTE_RESERVED2],buf); + g_player[myconnectindex].ps->ftq = QUOTE_RESERVED2; g_player[myconnectindex].ps->fta = 180; } } @@ -367,8 +367,9 @@ void Net_SyncPlayer(ENetEvent *event) packbuf[2] = playerswhenstarted; packbuf[3] = ++ud.multimode; packbuf[4] = i; - packbuf[5] = myconnectindex; - enet_host_broadcast(g_netServer, CHAN_GAMESTATE, enet_packet_create(packbuf, 6, ENET_PACKET_FLAG_RELIABLE)); + packbuf[5] = g_networkMode; + packbuf[6] = myconnectindex; + enet_host_broadcast(g_netServer, CHAN_GAMESTATE, enet_packet_create(packbuf, 7, ENET_PACKET_FLAG_RELIABLE)); packbuf[0] = PACKET_PLAYER_INDEX; packbuf[1] = i; @@ -417,34 +418,160 @@ void Net_SyncPlayer(ENetEvent *event) int32_t Net_UnpackSprite(int32_t i, uint8_t *pbuf) { - int16_t sect, statnum, osect, ostatnum, jj, opicnum, j = 0; + int16_t sect = sprite[i].sectnum, statnum = sprite[i].statnum; + int16_t opicnum, j = 0; #ifdef POLYMER int16_t lightid = -1; _prlight *mylight = NULL; #endif - osect = sprite[i].sectnum; - ostatnum = sprite[i].statnum; + uint32_t flags = *(uint32_t *)&pbuf[j]; + j += sizeof(uint32_t); + opicnum = sprite[i].picnum; - Bmemcpy(&sprite[i], &pbuf[j], sizeof(spritetype)); - j += sizeof(spritetype); + if (flags & NET_SPRITE_X) + { + sprite[i].x = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } - sect = sprite[i].sectnum; - statnum = sprite[i].statnum; + if (flags & NET_SPRITE_Y) + { + sprite[i].y = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_SPRITE_Z) + { + sprite[i].z = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_SPRITE_SHADE) + { + sprite[i].shade = *(int8_t *)&pbuf[j]; + j += sizeof(int8_t); + } + + if (flags & NET_SPRITE_PAL) + { + sprite[i].pal = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SPRITE_CLIPDIST) + { + sprite[i].clipdist = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SPRITE_XREPEAT) + { + sprite[i].xrepeat = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SPRITE_YREPEAT) + { + sprite[i].yrepeat = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SPRITE_XOFFSET) + { + sprite[i].xoffset = *(int8_t *)&pbuf[j]; + j += sizeof(int8_t); + } + + if (flags & NET_SPRITE_YOFFSET) + { + sprite[i].yoffset = *(int8_t *)&pbuf[j]; + j += sizeof(int8_t); + } + + if (flags & NET_SPRITE_SECTNUM) + { + sect = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_STATNUM) + { + statnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_ANG) + { + sprite[i].ang = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_OWNER) + { + sprite[i].owner = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_XVEL) + { + sprite[i].xvel = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_YVEL) + { + sprite[i].yvel = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_ZVEL) + { + sprite[i].zvel = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_LOTAG) + { + sprite[i].lotag = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_HITAG) + { + sprite[i].hitag = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_EXTRA) + { + sprite[i].extra = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_CSTAT) + { + sprite[i].cstat = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SPRITE_PICNUM) + { + sprite[i].picnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } if (sect == MAXSECTORS || statnum == MAXSTATUS) { - j += sizeof(netactor_t); - deletesprite(i); +// j += sizeof(netactor_t); + if (sprite[i].sectnum != MAXSECTORS && sprite[i].statnum != MAXSTATUS) + deletesprite(i); return j; } - sprite[i].sectnum = osect; - sprite[i].statnum = ostatnum; - // doesn't exist on the client yet - if (ostatnum == MAXSTATUS || osect == MAXSECTORS) + if (sprite[i].statnum == MAXSTATUS || sprite[i].sectnum == MAXSECTORS) { int16_t sprs[MAXSPRITES], z = 0; while ((sprs[z++] = insertsprite(sect, statnum)) != i); @@ -453,8 +580,8 @@ int32_t Net_UnpackSprite(int32_t i, uint8_t *pbuf) } else { - if (sect != osect) changespritesect(i, sect); - if (statnum != ostatnum) changespritestat(i, statnum); + if (sect != sprite[i].sectnum) changespritesect(i, sect); + if (statnum != sprite[i].statnum) changespritestat(i, statnum); } #ifdef POLYMER if (sprite[i].picnum == opicnum) @@ -472,10 +599,122 @@ int32_t Net_UnpackSprite(int32_t i, uint8_t *pbuf) /*initprintf("updating sprite %d (%d)\n",i,sprite[i].picnum);*/ - jj = j++; + flags = *(uint32_t *)&pbuf[j]; + j += sizeof(uint32_t); - Bmemcpy(&actor[i], &pbuf[j], sizeof(netactor_t)); - j += sizeof(netactor_t); + if (flags & NET_ACTOR_T1) + { + actor[i].t_data[0] = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T2) + { + actor[i].t_data[1] = *(int32_t *)&pbuf[j]; + if (flags & NET_ACTOR_PTR1) + actor[i].t_data[1] += (intptr_t)&script[0]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T3) + { + actor[i].t_data[2] = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T4) + { + actor[i].t_data[3] = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T5) + { + actor[i].t_data[4] = *(int32_t *)&pbuf[j]; + if (flags & NET_ACTOR_PTR2) + actor[i].t_data[4] += (intptr_t)&script[0]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T6) + { + actor[i].t_data[5] = *(int32_t *)&pbuf[j]; + if (flags & NET_ACTOR_PTR3) + actor[i].t_data[5] += (intptr_t)&script[0]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T7) + { + actor[i].t_data[6] = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T8) + { + actor[i].t_data[7] = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T9) + { + actor[i].t_data[8] = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_T10) + { + actor[i].t_data[9] = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_ACTOR_PICNUM) + { + actor[i].picnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_ACTOR_ANG) + { + actor[i].ang = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_ACTOR_EXTRA) + { + actor[i].extra = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_ACTOR_OWNER) + { + actor[i].owner = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_ACTOR_MOVFLAG) + { + actor[i].movflag = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_ACTOR_TEMPANG) + { + actor[i].tempang = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_ACTOR_TIMETOSLEEP) + { + actor[i].timetosleep = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_ACTOR_FLAGS) + { + actor[i].flags = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } actor[i].projectile = &SpriteProjectile[i]; #ifdef POLYMER @@ -485,10 +724,6 @@ int32_t Net_UnpackSprite(int32_t i, uint8_t *pbuf) actor[i].flags &= ~SPRITE_NULL; - if (pbuf[jj] & 1) T2 += (intptr_t)&script[0]; - if (pbuf[jj] & 2) T5 += (intptr_t)&script[0]; - if (pbuf[jj] & 4) T6 += (intptr_t)&script[0]; - do { int16_t var_id = *(int16_t *)&pbuf[j]; @@ -508,44 +743,345 @@ int32_t Net_UnpackSprite(int32_t i, uint8_t *pbuf) int32_t Net_PackSprite(int32_t i, uint8_t *pbuf) { - int32_t j = 0, jj; + int32_t j = 0; + uint32_t *flags; + static spritetype netsprite[MAXSPRITES]; + static netactor_t netactor[MAXSPRITES]; + + if (lastupdate[i] && !Bmemcmp(&sprite[i], &netsprite[i], sizeof(spritetype))) + return 0; *(int16_t *)&pbuf[j] = i; j += sizeof(int16_t); - Bmemcpy(&pbuf[j], &sprite[i], sizeof(spritetype)); - j += sizeof(spritetype); - pbuf[(jj = j++)] = 0; + flags = (uint32_t *)&pbuf[j]; + *flags = 0; + j += sizeof(uint32_t); - if (T2 >= (intptr_t)&script[0] && T2 < (intptr_t)(&script[g_scriptSize])) + if (sprite[i].sectnum == MAXSECTORS || sprite[i].statnum == MAXSTATUS) { - pbuf[jj] |= 1; - T2 -= (intptr_t)&script[0]; + *flags = NET_SPRITE_SECTNUM; + *(int16_t *)&pbuf[j] = MAXSECTORS; + j += sizeof(int16_t); + + Bmemcpy(&netsprite[i], &sprite[i], sizeof(spritetype)); + return j; } - if (T5 >= (intptr_t)&script[0] && T5 < (intptr_t)(&script[g_scriptSize])) + if (!lastupdate[i] || sprite[i].x != netsprite[i].x) { - pbuf[jj] |= 2; - T5 -= (intptr_t)&script[0]; + *flags |= NET_SPRITE_X; + *(int32_t *)&pbuf[j] = sprite[i].x; + j += sizeof(int32_t); } - if (T6 >= (intptr_t)&script[0] && T6 < (intptr_t)(&script[g_scriptSize])) + if (!lastupdate[i] || sprite[i].y != netsprite[i].y) { - pbuf[jj] |= 4; - T6 -= (intptr_t)&script[0]; + *flags |= NET_SPRITE_Y; + *(int32_t *)&pbuf[j] = sprite[i].y; + j += sizeof(int32_t); } - Bmemcpy(&pbuf[j], &actor[i], sizeof(netactor_t)); - j += sizeof(netactor_t); + if (!lastupdate[i] || sprite[i].z != netsprite[i].z) + { + *flags |= NET_SPRITE_Z; + *(int32_t *)&pbuf[j] = sprite[i].z; + j += sizeof(int32_t); + } - if (pbuf[jj] & 1) T2 += (intptr_t)&script[0]; - if (pbuf[jj] & 2) T5 += (intptr_t)&script[0]; - if (pbuf[jj] & 4) T6 += (intptr_t)&script[0]; + if (!lastupdate[i] || sprite[i].shade != netsprite[i].shade) + { + *flags |= NET_SPRITE_SHADE; + *(int8_t *)&pbuf[j] = sprite[i].shade; + j += sizeof(int8_t); + } + + if (!lastupdate[i] || sprite[i].pal != netsprite[i].pal) + { + *flags |= NET_SPRITE_PAL; + *(uint8_t *)&pbuf[j] = sprite[i].pal; + j += sizeof(uint8_t); + } + + if (!lastupdate[i] || sprite[i].clipdist != netsprite[i].clipdist) + { + *flags |= NET_SPRITE_CLIPDIST; + *(uint8_t *)&pbuf[j] = sprite[i].clipdist; + j += sizeof(uint8_t); + } + + if (!lastupdate[i] || sprite[i].xrepeat != netsprite[i].xrepeat) + { + *flags |= NET_SPRITE_XREPEAT; + *(uint8_t *)&pbuf[j] = sprite[i].xrepeat; + j += sizeof(uint8_t); + } + + if (!lastupdate[i] || sprite[i].yrepeat != netsprite[i].yrepeat) + { + *flags |= NET_SPRITE_YREPEAT; + *(uint8_t *)&pbuf[j] = sprite[i].yrepeat; + j += sizeof(uint8_t); + } + + if (!lastupdate[i] || sprite[i].xoffset != netsprite[i].xoffset) + { + *flags |= NET_SPRITE_XOFFSET; + *(int8_t *)&pbuf[j] = sprite[i].xoffset; + j += sizeof(int8_t); + } + + if (!lastupdate[i] || sprite[i].yoffset != netsprite[i].yoffset) + { + *flags |= NET_SPRITE_YOFFSET; + *(int8_t *)&pbuf[j] = sprite[i].yoffset; + j += sizeof(int8_t); + } + + if (!lastupdate[i] || sprite[i].sectnum != netsprite[i].sectnum || sprite[i].sectnum == MAXSECTORS) + { + *flags |= NET_SPRITE_SECTNUM; + *(int16_t *)&pbuf[j] = sprite[i].sectnum; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].statnum != netsprite[i].statnum || sprite[i].statnum == MAXSTATUS) + { + *flags |= NET_SPRITE_STATNUM; + *(int16_t *)&pbuf[j] = sprite[i].statnum; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].ang != netsprite[i].ang) + { + *flags |= NET_SPRITE_ANG; + *(int16_t *)&pbuf[j] = sprite[i].ang; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].owner != netsprite[i].owner) + { + *flags |= NET_SPRITE_OWNER; + *(int16_t *)&pbuf[j] = sprite[i].owner; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].xvel != netsprite[i].xvel) + { + *flags |= NET_SPRITE_XVEL; + *(int16_t *)&pbuf[j] = sprite[i].xvel; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].yvel != netsprite[i].yvel) + { + *flags |= NET_SPRITE_YVEL; + *(int16_t *)&pbuf[j] = sprite[i].yvel; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].zvel != netsprite[i].zvel) + { + *flags |= NET_SPRITE_ZVEL; + *(int16_t *)&pbuf[j] = sprite[i].zvel; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].lotag != netsprite[i].lotag) + { + *flags |= NET_SPRITE_LOTAG; + *(int16_t *)&pbuf[j] = sprite[i].lotag; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].hitag != netsprite[i].hitag) + { + *flags |= NET_SPRITE_HITAG; + *(int16_t *)&pbuf[j] = sprite[i].hitag; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].extra != netsprite[i].extra) + { + *flags |= NET_SPRITE_EXTRA; + *(int16_t *)&pbuf[j] = sprite[i].extra; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].cstat != netsprite[i].cstat) + { + *flags |= NET_SPRITE_CSTAT; + *(int16_t *)&pbuf[j] = sprite[i].cstat; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || sprite[i].picnum != netsprite[i].picnum) + { + *flags |= NET_SPRITE_PICNUM; + *(int16_t *)&pbuf[j] = sprite[i].picnum; + j += sizeof(int16_t); + } + + if (lastupdate[i]) + Bmemcpy(&netsprite[i], &sprite[i], sizeof(spritetype)); + + flags = (uint32_t *)&pbuf[j]; + *flags = 0; + j += sizeof(uint32_t); + + if (!lastupdate[i] || actor[i].t_data[0] != netactor[i].t_data[0]) + { + *flags |= NET_ACTOR_T1; + *(int32_t *)&pbuf[j] = actor[i].t_data[0]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[1] != netactor[i].t_data[1]) + { + *flags |= NET_ACTOR_T2; + + if (T2 >= (intptr_t)&script[0] && T2 < (intptr_t)(&script[g_scriptSize])) + { + *flags |= NET_ACTOR_PTR1; + *(int32_t *)&pbuf[j] = (int32_t)(actor[i].t_data[1] - (intptr_t)&script[0]); + } + else *(int32_t *)&pbuf[j] = actor[i].t_data[1]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[2] != netactor[i].t_data[2]) + { + *flags |= NET_ACTOR_T3; + *(int32_t *)&pbuf[j] = actor[i].t_data[2]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[3] != netactor[i].t_data[3]) + { + *flags |= NET_ACTOR_T4; + *(int32_t *)&pbuf[j] = actor[i].t_data[3]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[4] != netactor[i].t_data[4]) + { + *flags |= NET_ACTOR_T5; + + if (T5 >= (intptr_t)&script[0] && T5 < (intptr_t)(&script[g_scriptSize])) + { + *flags |= NET_ACTOR_PTR2; + *(int32_t *)&pbuf[j] = (int32_t)(actor[i].t_data[4] - (intptr_t)&script[0]); + } + else *(int32_t *)&pbuf[j] = actor[i].t_data[4]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[5] != netactor[i].t_data[5]) + { + *flags |= NET_ACTOR_T6; + if (T6 >= (intptr_t)&script[0] && T6 < (intptr_t)(&script[g_scriptSize])) + { + *flags |= NET_ACTOR_PTR3; + *(int32_t *)&pbuf[j] = (int32_t)(actor[i].t_data[5] - (intptr_t)&script[0]); + } + else *(int32_t *)&pbuf[j] = actor[i].t_data[5]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[6] != netactor[i].t_data[6]) + { + *flags |= NET_ACTOR_T7; + *(int32_t *)&pbuf[j] = actor[i].t_data[6]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[7] != netactor[i].t_data[7]) + { + *flags |= NET_ACTOR_T8; + *(int32_t *)&pbuf[j] = actor[i].t_data[7]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[8] != netactor[i].t_data[8]) + { + *flags |= NET_ACTOR_T9; + *(int32_t *)&pbuf[j] = actor[i].t_data[8]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].t_data[9] != netactor[i].t_data[9]) + { + *flags |= NET_ACTOR_T10; + *(int32_t *)&pbuf[j] = actor[i].t_data[9]; + j += sizeof(int32_t); + } + + if (!lastupdate[i] || actor[i].picnum != netactor[i].picnum) + { + *flags |= NET_ACTOR_PICNUM; + *(int16_t *)&pbuf[j] = actor[i].picnum; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || actor[i].ang != netactor[i].ang) + { + *flags |= NET_ACTOR_ANG; + *(int16_t *)&pbuf[j] = actor[i].ang; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || actor[i].extra != netactor[i].extra) + { + *flags |= NET_ACTOR_EXTRA; + *(int16_t *)&pbuf[j] = actor[i].extra; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || actor[i].owner!= netactor[i].owner) + { + *flags |= NET_ACTOR_OWNER; + *(int16_t *)&pbuf[j] = actor[i].owner; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || actor[i].movflag != netactor[i].movflag) + { + *flags |= NET_ACTOR_MOVFLAG; + *(int16_t *)&pbuf[j] = actor[i].movflag; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || actor[i].tempang != netactor[i].tempang) + { + *flags |= NET_ACTOR_TEMPANG; + *(int16_t *)&pbuf[j] = actor[i].tempang; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || actor[i].timetosleep != netactor[i].timetosleep) + { + *flags |= NET_ACTOR_TIMETOSLEEP; + *(int16_t *)&pbuf[j] = actor[i].timetosleep; + j += sizeof(int16_t); + } + + if (!lastupdate[i] || actor[i].flags != netactor[i].flags) + { + *flags |= NET_ACTOR_FLAGS; + *(int32_t *)&pbuf[j] = actor[i].flags; + j += sizeof(int32_t); + } + + if (lastupdate[i]) + Bmemcpy(&netactor[i], &actor[i], sizeof(netactor_t)); + + if (*flags == 0) + return 0; { - int16_t ii=g_gameVarCount-1, kk = 0; + int16_t ii=g_gameVarCount-1; - for (; ii>=0 && kk <= 64; ii--) + for (; ii>=0; ii--) { if ((aGameVars[ii].dwFlags & (GAMEVAR_PERACTOR|GAMEVAR_NOMULTI)) == GAMEVAR_PERACTOR && aGameVars[ii].val.plValues) { @@ -555,10 +1091,10 @@ int32_t Net_PackSprite(int32_t i, uint8_t *pbuf) j += sizeof(int16_t); *(int32_t *)&pbuf[j] = aGameVars[ii].val.plValues[i]; j += sizeof(int32_t); - kk++; } } } + *(int16_t *)&pbuf[j] = MAXGAMEVARS; j += sizeof(int16_t); } @@ -566,11 +1102,584 @@ int32_t Net_PackSprite(int32_t i, uint8_t *pbuf) return j; } +int32_t Net_UnpackSect(int32_t i, uint8_t *pbuf) +{ + int32_t j = 0; + uint32_t flags = *(uint32_t *)&pbuf[j]; + + j += sizeof(uint32_t); + + if (flags & NET_SECTOR_WALLPTR) + { + sector[i].wallptr = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_WALLNUM) + { + sector[i].wallnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_CEILINGZ) + { + sector[i].ceilingz = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_SECTOR_FLOORZ) + { + sector[i].floorz = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_SECTOR_CEILINGSTAT) + { + sector[i].ceilingstat = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_FLOORSTAT) + { + sector[i].floorstat = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_CEILINGPIC) + { + sector[i].ceilingpicnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_CEILINGSLOPE) + { + sector[i].ceilingheinum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_CEILINGSHADE) + { + sector[i].ceilingshade = *(int8_t *)&pbuf[j]; + j += sizeof(int8_t); + } + + if (flags & NET_SECTOR_CEILINGPAL) + { + sector[i].ceilingpal = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SECTOR_CEILINGXPAN) + { + sector[i].ceilingxpanning = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SECTOR_CEILINGYPAN) + { + sector[i].ceilingypanning = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SECTOR_FLOORPIC) + { + sector[i].floorpicnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_FLOORSLOPE) + { + sector[i].floorheinum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_FLOORSHADE) + { + sector[i].floorshade = *(int8_t *)&pbuf[j]; + j += sizeof(int8_t); + } + + if (flags & NET_SECTOR_FLOORPAL) + { + sector[i].floorpal = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SECTOR_FLOORXPAN) + { + sector[i].floorxpanning = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SECTOR_FLOORYPAN) + { + sector[i].floorypanning = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SECTOR_VISIBILITY) + { + sector[i].visibility = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_SECTOR_LOTAG) + { + sector[i].lotag = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_HITAG) + { + sector[i].hitag = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_SECTOR_EXTRA) + { + sector[i].extra = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + return j; +} + +int32_t Net_PackSect(int32_t i, uint8_t *pbuf) +{ + int32_t j = 0; + uint32_t *flags; + static sectortype netsect[MAXSECTORS]; + + if (lastsectupdate[i] && !Bmemcmp(§or[i], &netsect[i], sizeof(sectortype))) + return 0; + + *(int16_t *)&pbuf[j] = i; + j += sizeof(int16_t); + + flags = (uint32_t *)&pbuf[j]; + *flags = 0; + j += sizeof(uint32_t); + + if (!lastsectupdate[i] || sector[i].wallptr != netsect[i].wallptr) + { + *flags |= NET_SECTOR_WALLPTR; + *(int16_t *)&pbuf[j] = sector[i].wallptr; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].wallnum != netsect[i].wallnum) + { + *flags |= NET_SECTOR_WALLNUM; + *(int16_t *)&pbuf[j] = sector[i].wallnum; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingz != netsect[i].ceilingz) + { + *flags |= NET_SECTOR_CEILINGZ; + *(int32_t *)&pbuf[j] = sector[i].ceilingz; + j += sizeof(int32_t); + } + + if (!lastsectupdate[i] || sector[i].floorz != netsect[i].floorz) + { + *flags |= NET_SECTOR_FLOORZ; + *(int32_t *)&pbuf[j] = sector[i].floorz; + j += sizeof(int32_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingstat != netsect[i].ceilingstat) + { + *flags |= NET_SECTOR_CEILINGSTAT; + *(int16_t *)&pbuf[j] = sector[i].ceilingstat; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].floorstat != netsect[i].floorstat) + { + *flags |= NET_SECTOR_FLOORSTAT; + *(int16_t *)&pbuf[j] = sector[i].floorstat; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingpicnum != netsect[i].ceilingpicnum) + { + *flags |= NET_SECTOR_CEILINGPIC; + *(int16_t *)&pbuf[j] = sector[i].ceilingpicnum; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingheinum != netsect[i].ceilingheinum) + { + *flags |= NET_SECTOR_CEILINGSLOPE; + *(int16_t *)&pbuf[j] = sector[i].ceilingheinum; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingshade != netsect[i].ceilingshade) + { + *flags |= NET_SECTOR_CEILINGSHADE; + *(int8_t *)&pbuf[j] = sector[i].ceilingshade; + j += sizeof(int8_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingpal != netsect[i].ceilingpal) + { + *flags |= NET_SECTOR_CEILINGPAL; + *(uint8_t *)&pbuf[j] = sector[i].ceilingpal; + j += sizeof(uint8_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingxpanning != netsect[i].ceilingxpanning) + { + *flags |= NET_SECTOR_CEILINGXPAN; + *(uint8_t *)&pbuf[j] = sector[i].ceilingxpanning; + j += sizeof(uint8_t); + } + + if (!lastsectupdate[i] || sector[i].ceilingypanning != netsect[i].ceilingypanning) + { + *flags |= NET_SECTOR_CEILINGYPAN; + *(uint8_t *)&pbuf[j] = sector[i].ceilingypanning; + j += sizeof(uint8_t); + } + + if (!lastsectupdate[i] || sector[i].floorpicnum != netsect[i].floorpicnum) + { + *flags |= NET_SECTOR_FLOORPIC; + *(int16_t *)&pbuf[j] = sector[i].floorpicnum; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].floorheinum != netsect[i].floorheinum) + { + *flags |= NET_SECTOR_FLOORSLOPE; + *(int16_t *)&pbuf[j] = sector[i].floorheinum; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].floorshade != netsect[i].floorshade) + { + *flags |= NET_SECTOR_FLOORSHADE; + *(int8_t *)&pbuf[j] = sector[i].floorshade; + j += sizeof(int8_t); + } + + if (!lastsectupdate[i] || sector[i].floorpal != netsect[i].floorpal) + { + *flags |= NET_SECTOR_FLOORPAL; + *(uint8_t *)&pbuf[j] = sector[i].floorpal; + j += sizeof(uint8_t); + } + + if (!lastsectupdate[i] || sector[i].floorxpanning != netsect[i].floorxpanning) + { + *flags |= NET_SECTOR_FLOORXPAN; + *(uint8_t *)&pbuf[j] = sector[i].floorxpanning; + j += sizeof(uint8_t); + } + + if (!lastsectupdate[i] || sector[i].floorypanning != netsect[i].floorypanning) + { + *flags |= NET_SECTOR_FLOORYPAN; + *(uint8_t *)&pbuf[j] = sector[i].floorypanning; + j += sizeof(uint8_t); + } + + if (!lastsectupdate[i] || sector[i].visibility != netsect[i].visibility) + { + *flags |= NET_SECTOR_VISIBILITY; + *(uint8_t *)&pbuf[j] = sector[i].visibility; + j += sizeof(uint8_t); + } + + if (!lastsectupdate[i] || sector[i].lotag != netsect[i].lotag) + { + *flags |= NET_SECTOR_LOTAG; + *(int16_t *)&pbuf[j] = sector[i].lotag; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].hitag != netsect[i].hitag) + { + *flags |= NET_SECTOR_HITAG; + *(int16_t *)&pbuf[j] = sector[i].hitag; + j += sizeof(int16_t); + } + + if (!lastsectupdate[i] || sector[i].extra != netsect[i].extra) + { + *flags |= NET_SECTOR_EXTRA; + *(int16_t *)&pbuf[j] = sector[i].extra; + j += sizeof(int16_t); + } + + if (lastsectupdate[i]) + Bmemcpy(&netsect[i], §or[i], sizeof(sectortype)); + + return *flags ? j : 0; +} + + +int32_t Net_UnpackWall(int32_t i, uint8_t *pbuf) +{ + int32_t j = 0; + uint32_t flags = *(uint32_t *)&pbuf[j]; + + j += sizeof(uint32_t); + + if (flags & NET_WALL_X) + { + wall[i].x = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_WALL_Y) + { + wall[i].y = *(int32_t *)&pbuf[j]; + j += sizeof(int32_t); + } + + if (flags & NET_WALL_POINT2) + { + wall[i].point2 = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_NEXTWALL) + { + wall[i].nextwall = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_NEXTSECTOR) + { + wall[i].nextsector = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_CSTAT) + { + wall[i].cstat = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_PICNUM) + { + wall[i].picnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_OVERPICNUM) + { + wall[i].overpicnum = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_SHADE) + { + wall[i].shade = *(int8_t *)&pbuf[j]; + j += sizeof(int8_t); + } + + if (flags & NET_WALL_PAL) + { + wall[i].pal = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_WALL_XREPEAT) + { + wall[i].xrepeat = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_WALL_YREPEAT) + { + wall[i].yrepeat = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_WALL_XPANNING) + { + wall[i].xpanning = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_WALL_YPANNING) + { + wall[i].ypanning = *(uint8_t *)&pbuf[j]; + j += sizeof(uint8_t); + } + + if (flags & NET_WALL_LOTAG) + { + wall[i].lotag = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_HITAG) + { + wall[i].hitag = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + if (flags & NET_WALL_EXTRA) + { + wall[i].extra = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + } + + return j; +} + +int32_t Net_PackWall(int32_t i, uint8_t *pbuf) +{ + int32_t j = 0; + uint32_t *flags; + static walltype netwall[MAXWALLS]; + + if (lastwallupdate[i] && !Bmemcmp(&wall[i], &netwall[i], sizeof(walltype))) + return 0; + + *(int16_t *)&pbuf[j] = i; + j += sizeof(int16_t); + + flags = (uint32_t *)&pbuf[j]; + *flags = 0; + j += sizeof(uint32_t); + + if (!lastwallupdate[i] || wall[i].x != netwall[i].x) + { + *flags |= NET_WALL_X; + *(int32_t *)&pbuf[j] = wall[i].x; + j += sizeof(int32_t); + } + + if (!lastwallupdate[i] || wall[i].y != netwall[i].y) + { + *flags |= NET_WALL_Y; + *(int32_t *)&pbuf[j] = wall[i].y; + j += sizeof(int32_t); + } + + if (!lastwallupdate[i] || wall[i].point2 != netwall[i].point2) + { + *flags |= NET_WALL_POINT2; + *(int16_t *)&pbuf[j] = wall[i].point2; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].nextwall != netwall[i].nextwall) + { + *flags |= NET_WALL_NEXTWALL; + *(int16_t *)&pbuf[j] = wall[i].nextwall; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].nextsector != netwall[i].nextsector) + { + *flags |= NET_WALL_NEXTSECTOR; + *(int16_t *)&pbuf[j] = wall[i].nextsector; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].cstat != netwall[i].cstat) + { + *flags |= NET_WALL_CSTAT; + *(int16_t *)&pbuf[j] = wall[i].cstat; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].picnum != netwall[i].picnum) + { + *flags |= NET_WALL_PICNUM; + *(int16_t *)&pbuf[j] = wall[i].picnum; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].overpicnum != netwall[i].overpicnum) + { + *flags |= NET_WALL_OVERPICNUM; + *(int16_t *)&pbuf[j] = wall[i].overpicnum; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].shade != netwall[i].shade) + { + *flags |= NET_WALL_SHADE; + *(int8_t *)&pbuf[j] = wall[i].shade; + j += sizeof(int8_t); + } + + if (!lastwallupdate[i] || wall[i].pal != netwall[i].pal) + { + *flags |= NET_WALL_PAL; + *(uint8_t *)&pbuf[j] = wall[i].pal; + j += sizeof(uint8_t); + } + + if (!lastwallupdate[i] || wall[i].xrepeat != netwall[i].xrepeat) + { + *flags |= NET_WALL_XREPEAT; + *(uint8_t *)&pbuf[j] = wall[i].xrepeat; + j += sizeof(uint8_t); + } + + if (!lastwallupdate[i] || wall[i].yrepeat != netwall[i].yrepeat) + { + *flags |= NET_WALL_YREPEAT; + *(uint8_t *)&pbuf[j] = wall[i].yrepeat; + j += sizeof(uint8_t); + } + + if (!lastwallupdate[i] || wall[i].xpanning != netwall[i].xpanning) + { + *flags |= NET_WALL_XPANNING; + *(uint8_t *)&pbuf[j] = wall[i].xpanning; + j += sizeof(uint8_t); + } + + if (!lastwallupdate[i] || wall[i].ypanning != netwall[i].ypanning) + { + *flags |= NET_WALL_YPANNING; + *(uint8_t *)&pbuf[j] = wall[i].ypanning; + j += sizeof(uint8_t); + } + + if (!lastwallupdate[i] || wall[i].lotag != netwall[i].lotag) + { + *flags |= NET_WALL_LOTAG; + *(int16_t *)&pbuf[j] = wall[i].lotag; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].hitag != netwall[i].hitag) + { + *flags |= NET_WALL_HITAG; + *(int16_t *)&pbuf[j] = wall[i].hitag; + j += sizeof(int16_t); + } + + if (!lastwallupdate[i] || wall[i].extra != netwall[i].extra) + { + *flags |= NET_WALL_EXTRA; + *(int16_t *)&pbuf[j] = wall[i].extra; + j += sizeof(int16_t); + } + + if (lastwallupdate[i]) + Bmemcpy(&netwall[i], &wall[i], sizeof(walltype)); + + return *flags ? j : 0; +} + + void Net_ParseServerPacket(ENetEvent *event) { uint8_t *pbuf = event->packet->data; int32_t packbufleng = event->packet->dataLength; - int16_t i, j, l; + int32_t i, j, l; int32_t other = pbuf[--packbufleng]; input_t *nsyn; @@ -601,33 +1710,31 @@ void Net_ParseServerPacket(ENetEvent *event) if (g_player[i].playerquitflag == 0) continue; - if (i == myconnectindex && !g_player[i].ps->dead_flag) - { - j += offsetof(input_t, filler) + - (sizeof(vec3_t) * 3) + // position and velocity - (sizeof(int16_t) * 3); // ang and horiz - goto process; - } + /* if (i == myconnectindex && !g_player[i].ps->dead_flag) + { + j += offsetof(input_t, filler) + + (sizeof(vec3_t) * 3) + // position and velocity + (sizeof(int16_t) * 3); // ang and horiz + goto process; + } + */ nsyn = (input_t *)&inputfifo[0][0]; - Bmemcpy(&nsyn[i], &pbuf[j], offsetof(input_t, filler)); + if (i != myconnectindex || g_player[i].ps->dead_flag) + Bmemcpy(&nsyn[i], &pbuf[j], offsetof(input_t, filler)); + j += offsetof(input_t, filler); // Bmemcpy(&g_player[i].ps->opos.x, &g_player[i].ps->pos.x, sizeof(vec3_t)); Bmemcpy(&g_player[i].ps->pos.x, &pbuf[j], sizeof(vec3_t) * 2); - if (g_player[i].ps->cursectnum >= 0 && g_player[i].ps->cursectnum < numsectors) - { - updatesectorz(g_player[i].ps->pos.x, g_player[i].ps->pos.y, g_player[i].ps->pos.z, - &g_player[i].ps->cursectnum); - changespritesect(g_player[i].ps->i, g_player[i].ps->cursectnum); - } + Bmemcpy(&sprite[g_player[i].ps->i], &pbuf[j], sizeof(vec3_t)); sprite[g_player[i].ps->i].z += PHEIGHT; j += sizeof(vec3_t) * 2; - Bmemcpy(&g_player[i].ps->posvel.x, &pbuf[j], sizeof(vec3_t)); + Bmemcpy(&g_player[i].ps->vel.x, &pbuf[j], sizeof(vec3_t)); j += sizeof(vec3_t); g_player[i].ps->oang = g_player[i].ps->ang; @@ -638,7 +1745,7 @@ void Net_ParseServerPacket(ENetEvent *event) Bmemcpy(&g_player[i].ps->horiz, &pbuf[j], sizeof(int16_t) * 2); j += sizeof(int16_t) * 2; -process: +//process: g_player[i].ps->gotweapon = *(uint16_t *)&pbuf[j]; j += sizeof(uint16_t); @@ -679,8 +1786,19 @@ process: g_player[i].ping = *(int16_t *)&pbuf[j]; j += sizeof(int16_t); + g_player[i].ps->newowner = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + + if (g_player[i].ps->newowner == -1 && g_player[i].ps->cursectnum >= 0 && g_player[i].ps->cursectnum < numsectors) + { + updatesectorz(g_player[i].ps->pos.x, g_player[i].ps->pos.y, g_player[i].ps->pos.z, + &g_player[i].ps->cursectnum); + changespritesect(g_player[i].ps->i, g_player[i].ps->cursectnum); + } + sprite[g_player[i].ps->i].pal = (uint8_t)pbuf[j++]; + l = i; i = g_player[l].ps->i; @@ -726,13 +1844,21 @@ process: { // sprite/sector/wall updates tacked on to the end of the packet - l = pbuf[j++]; + l = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + +// if (l) initprintf("unpacking %d sprites\n", l); + while (l--) { - int32_t i = *(int16_t *)&pbuf[j]; + int32_t spriteid = *(int16_t *)&pbuf[j]; j += sizeof(int16_t); - j += Net_UnpackSprite(i, &pbuf[j]); +/* + initprintf("unpacking sprite %d at %d/%d\n", spriteid, j, packbufleng); + initprintf("flags: %d\n", *(uint32_t *)&pbuf[j]); +*/ + j += Net_UnpackSprite(spriteid, &pbuf[j]); } } @@ -741,39 +1867,48 @@ process: break; case PACKET_MAP_STREAM: - if (!(g_player[myconnectindex].ps->gm & MODE_GAME) || g_netSync) return; + if (!(g_player[myconnectindex].ps->gm & MODE_GAME) || g_netSync) + return; j = 0; packbufleng = qlz_size_decompressed((char *)&pbuf[1]); - pbuf = (uint8_t *)Bcalloc(1, packbufleng+1); + pbuf = (uint8_t *)Bmalloc(packbufleng); packbufleng = qlz_decompress((char *)&event->packet->data[1], (char *)(pbuf), state_decompress); - l = pbuf[j++]; + l = *(uint16_t *)&pbuf[j]; + j += sizeof(uint16_t); + +// if (l) initprintf("unpacking %d sprites\n", l); + while (l--) { - int32_t i = *(int16_t *)&pbuf[j]; + int32_t spriteid = *(int16_t *)&pbuf[j]; j += sizeof(int16_t); - - j += Net_UnpackSprite(i, &pbuf[j]); +// initprintf("unpacking msprite %d at %d/%d\n", spriteid, j, packbufleng); + j += Net_UnpackSprite(spriteid, &pbuf[j]); } - l = pbuf[j++]; + l = *(uint16_t *)&pbuf[j]; + j += sizeof(uint16_t); + while (l--) { int16_t secid = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); - Bmemcpy(§or[secid], &pbuf[j + sizeof(int16_t)], sizeof(sectortype)); - j += sizeof(int16_t) + sizeof(sectortype); + j += Net_UnpackSect(secid, &pbuf[j]); } - l = pbuf[j++]; + l = *(uint16_t *)&pbuf[j]; + j += sizeof(uint16_t); while (l--) { int16_t wallid = *(int16_t *)&pbuf[j]; + j += sizeof(int16_t); + + j += Net_UnpackWall(wallid, &pbuf[j]); - Bmemcpy(&wall[wallid], &pbuf[j + sizeof(int16_t)], sizeof(walltype)); - j += sizeof(int16_t) + sizeof(walltype); // we call dragpoint() to make sure the nextwall position gets updated too dragpoint(wallid, wall[wallid].x, wall[wallid].y); } @@ -846,6 +1981,9 @@ process: if (!g_player[pbuf[4]].sync) g_player[pbuf[4]].sync = (input_t *) Bcalloc(1,sizeof(input_t)); } + if (pbuf[5] == NET_DEDICATED_SERVER) + g_networkMode = NET_DEDICATED_CLIENT; + for (i=0; iopos.x, &g_player[other].ps->pos.x, sizeof(vec3_t)); - Bmemcpy(&g_player[other].ps->pos.x, &pbuf[j], sizeof(vec3_t) * 2); - updatesectorz(g_player[other].ps->pos.x, g_player[other].ps->pos.y, g_player[other].ps->pos.z, - &g_player[other].ps->cursectnum); - Bmemcpy(&sprite[g_player[other].ps->i], &pbuf[j], sizeof(vec3_t)); - sprite[g_player[other].ps->i].z += PHEIGHT; - changespritesect(g_player[other].ps->i, g_player[other].ps->cursectnum); +// Bmemcpy(&g_player[other].ps->pos.x, &pbuf[j], sizeof(vec3_t) * 2); +// updatesectorz(g_player[other].ps->pos.x, g_player[other].ps->pos.y, g_player[other].ps->pos.z, +// &g_player[other].ps->cursectnum); +// Bmemcpy(&sprite[g_player[other].ps->i], &pbuf[j], sizeof(vec3_t)); +// sprite[g_player[other].ps->i].z += PHEIGHT; +// changespritesect(g_player[other].ps->i, g_player[other].ps->cursectnum); +// Bmemcpy(&g_player[other].ps->npos.x, &pbuf[j], sizeof(vec3_t)); j += sizeof(vec3_t) * 2; - Bmemcpy(&g_player[other].ps->posvel.x, &pbuf[j], sizeof(vec3_t)); +// Bmemcpy(&g_player[other].ps->vel.x, &pbuf[j], sizeof(vec3_t)); j += sizeof(vec3_t); g_player[other].ps->oang = g_player[other].ps->ang; @@ -1500,7 +2639,7 @@ void Net_UpdateClients(void) Bmemcpy(&packbuf[j], &g_player[i].ps->pos.x, sizeof(vec3_t) * 2); j += sizeof(vec3_t) * 2; - Bmemcpy(&packbuf[j], &g_player[i].ps->posvel.x, sizeof(vec3_t)); + Bmemcpy(&packbuf[j], &g_player[i].ps->vel.x, sizeof(vec3_t)); j += sizeof(vec3_t); *(int16_t *)&packbuf[j] = g_player[i].ps->ang; @@ -1547,6 +2686,9 @@ void Net_UpdateClients(void) *(int16_t *)&packbuf[j] = g_player[i].ping; j += sizeof(int16_t); + *(int16_t *)&packbuf[j] = g_player[i].ps->newowner; + j += sizeof(int16_t); + packbuf[j++] = sprite[g_player[i].ps->i].pal; l = i; @@ -1576,7 +2718,7 @@ void Net_UpdateClients(void) { int16_t ii=g_gameVarCount-1, kk = 0; - for (; ii>=0 && kk <= 64; ii--) + for (; ii>=0 && j <= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3)); ii--) { if ((aGameVars[ii].dwFlags & (GAMEVAR_PERACTOR|GAMEVAR_NOMULTI)) == GAMEVAR_PERACTOR && aGameVars[ii].val.plValues) { @@ -1587,6 +2729,9 @@ void Net_UpdateClients(void) *(int32_t *)&packbuf[j] = aGameVars[ii].val.plValues[i]; j += sizeof(int32_t); kk++; + + if (j >= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3))) + break; } } } @@ -1599,7 +2744,7 @@ void Net_UpdateClients(void) { int16_t ii=g_gameVarCount-1, kk = 0; - for (; ii>=0 && kk <= 64; ii--) + for (; ii>=0 && j <= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3)); ii--) { if ((aGameVars[ii].dwFlags & (GAMEVAR_PERPLAYER|GAMEVAR_NOMULTI)) == GAMEVAR_PERPLAYER && aGameVars[ii].val.plValues) { @@ -1610,6 +2755,9 @@ void Net_UpdateClients(void) *(int32_t *)&packbuf[j] = aGameVars[ii].val.plValues[i]; j += sizeof(int32_t); kk++; + + if (j >= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3))) + break; } } } @@ -1623,23 +2771,29 @@ void Net_UpdateClients(void) { int32_t zz, zj; - packbuf[(zj = j++)] = 0; + packbuf[(zj = j)] = 0; + j += sizeof(int16_t); - for (zz = 0; (unsigned)zz < (sizeof(g_netStatnums)/sizeof(g_netStatnums[0])) /*&& k <= 3*/; zz++) + for (zz = 0; (unsigned)zz < (sizeof(g_netStatnums)/sizeof(g_netStatnums[0])) && j <= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3)); zz++) TRAVERSE_SPRITE_STAT(headspritestat[g_netStatnums[zz]], i, nexti) { // only send newly spawned sprites - if (!lastupdate[i]) + if (!lastupdate[i] && sprite[i].statnum != MAXSTATUS) { + int32_t ii; + + j += (ii = Net_PackSprite(i, (uint8_t *)&packbuf[j])); + if (ii) k++; + lastupdate[i] = totalclock; - j += Net_PackSprite(i, (uint8_t *)&packbuf[j]); - k++; + if (j >= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3))) + break; } } - packbuf[zj] = k; - j++; + *(int16_t *)&packbuf[zj] = k; + j += sizeof(int16_t); } { @@ -1662,19 +2816,19 @@ void Net_UpdateClients(void) void Net_StreamLevel(void) { - int16_t i, nexti, k = 0, l; - int32_t j; - int32_t zz, zj; + int16_t i, nexti; + int32_t j = 0; + int32_t zz, zj, k = 0, l; if (!g_netServer || numplayers < 2) return; - packbuf[0] = PACKET_MAP_STREAM; - j = 1; + packbuf[j++] = PACKET_MAP_STREAM; - packbuf[(zj = j++)] = 0; + *(uint16_t *)&packbuf[(zj = j)] = 0; + j += sizeof(uint16_t); - for (zz = 0; (unsigned)zz < (sizeof(g_netStatnums)/sizeof(g_netStatnums[0])) /*&& k <= 3*/; zz++) + for (zz = 0; (unsigned)zz < (sizeof(g_netStatnums)/sizeof(g_netStatnums[0])) && j <= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3)); zz++) TRAVERSE_SPRITE_STAT(headspritestat[g_netStatnums[zz]], i, nexti) { // only send STAT_MISC sprites at spawn time and let the client handle it from there @@ -1684,21 +2838,30 @@ void Net_StreamLevel(void) if (!lastupdate[i] || spritecrc[i] != l) { + int32_t ii; /*initprintf("updating sprite %d (%d)\n",i,sprite[i].picnum);*/ spritecrc[i] = l; + + j += (ii = Net_PackSprite(i, (uint8_t *)&packbuf[j])); + if (ii) k++; + lastupdate[i] = totalclock; - j += Net_PackSprite(i, (uint8_t *)&packbuf[j]); - k++; + if (j >= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3))) + break; } } } - packbuf[zj] = k; + *(uint16_t *)&packbuf[zj] = k; +// j += sizeof(uint16_t); + k = 0; - packbuf[(zj = j++)] = 0; - for (i = numsectors-1; i >= 0 && k <= 6; i--) + *(uint16_t *)&packbuf[(zj = j)] = 0; + j += sizeof(uint16_t); + + for (i = numsectors-1; i >= 0 && j <= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3)); i--) { if (totalclock > (lastsectupdate[i] + TICRATE)) { @@ -1708,19 +2871,22 @@ void Net_StreamLevel(void) { sectcrc[i] = l; lastsectupdate[i] = totalclock; - *(int16_t *)&packbuf[j] = i; - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], §or[i], sizeof(sectortype)); - j += sizeof(sectortype); + j += Net_PackSect(i, (uint8_t *)&packbuf[j]); k++; + + if (j >= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3))) + break; } } } - packbuf[zj] = k; + *(uint16_t *)&packbuf[zj] = k; +// j += sizeof(uint16_t); k = 0; - packbuf[(zj = j++)] = 0; - for (i = numwalls-1; i >= 0 && k <= 6; i--) + *(uint16_t *)&packbuf[(zj = j)] = 0; + j += sizeof(uint16_t); + + for (i = numwalls-1; i >= 0 && j <= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3)); i--) { if (totalclock > (lastwallupdate[i] + TICRATE)) { @@ -1730,17 +2896,16 @@ void Net_StreamLevel(void) { wallcrc[i] = l; lastwallupdate[i] = totalclock; - *(int16_t *)&packbuf[j] = i; - j += sizeof(int16_t); - Bmemcpy(&packbuf[j], &wall[i], sizeof(walltype)); - j += sizeof(walltype); + j += Net_PackWall(i, (uint8_t *)&packbuf[j]); k++; + + if (j >= (SYNCPACKETSIZE-(SYNCPACKETSIZE>>3))) + break; } } } - packbuf[zj] = k; - - j++; + *(uint16_t *)&packbuf[zj] = k; +// j += sizeof(uint16_t); { char buf[PACKBUF_SIZE]; diff --git a/polymer/eduke32/source/net.h b/polymer/eduke32/source/net.h index 1879e03ff..f1ee01322 100644 --- a/polymer/eduke32/source/net.h +++ b/polymer/eduke32/source/net.h @@ -25,6 +25,92 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "enet/enet.h" +#define NET_SECTOR_WALLPTR 0x00000001 +#define NET_SECTOR_WALLNUM 0x00000002 +#define NET_SECTOR_CEILINGZ 0x00000004 +#define NET_SECTOR_FLOORZ 0x00000008 +#define NET_SECTOR_CEILINGSTAT 0x00000010 +#define NET_SECTOR_FLOORSTAT 0x00000020 +#define NET_SECTOR_CEILINGPIC 0x00000040 +#define NET_SECTOR_CEILINGSLOPE 0x00000080 +#define NET_SECTOR_CEILINGSHADE 0x00000100 +#define NET_SECTOR_CEILINGPAL 0x00000200 +#define NET_SECTOR_CEILINGXPAN 0x00000400 +#define NET_SECTOR_CEILINGYPAN 0x00000800 +#define NET_SECTOR_FLOORPIC 0x00001000 +#define NET_SECTOR_FLOORSLOPE 0x00002000 +#define NET_SECTOR_FLOORSHADE 0x00004000 +#define NET_SECTOR_FLOORPAL 0x00008000 +#define NET_SECTOR_FLOORXPAN 0x00010000 +#define NET_SECTOR_FLOORYPAN 0x00020000 +#define NET_SECTOR_VISIBILITY 0x00040000 +#define NET_SECTOR_LOTAG 0x00080000 +#define NET_SECTOR_HITAG 0x00100000 +#define NET_SECTOR_EXTRA 0x00200000 + +#define NET_WALL_X 0x00000001 +#define NET_WALL_Y 0x00000002 +#define NET_WALL_POINT2 0x00000004 +#define NET_WALL_NEXTWALL 0x00000008 +#define NET_WALL_NEXTSECTOR 0x00000010 +#define NET_WALL_CSTAT 0x00000020 +#define NET_WALL_PICNUM 0x00000040 +#define NET_WALL_OVERPICNUM 0x00000080 +#define NET_WALL_SHADE 0x00000100 +#define NET_WALL_PAL 0x00000200 +#define NET_WALL_XREPEAT 0x00000400 +#define NET_WALL_YREPEAT 0x00000800 +#define NET_WALL_XPANNING 0x00001000 +#define NET_WALL_YPANNING 0x00002000 +#define NET_WALL_LOTAG 0x00004000 +#define NET_WALL_HITAG 0x00008000 +#define NET_WALL_EXTRA 0x00010000 + +#define NET_SPRITE_X 0x00000001 +#define NET_SPRITE_Y 0x00000002 +#define NET_SPRITE_Z 0x00000004 +#define NET_SPRITE_SHADE 0x00000008 +#define NET_SPRITE_PAL 0x00000010 +#define NET_SPRITE_CLIPDIST 0x00000020 +#define NET_SPRITE_XREPEAT 0x00000040 +#define NET_SPRITE_YREPEAT 0x00000080 +#define NET_SPRITE_XOFFSET 0x00000100 +#define NET_SPRITE_YOFFSET 0x00000200 +#define NET_SPRITE_SECTNUM 0x00000400 +#define NET_SPRITE_STATNUM 0x00000800 +#define NET_SPRITE_ANG 0x00001000 +#define NET_SPRITE_OWNER 0x00002000 +#define NET_SPRITE_XVEL 0x00004000 +#define NET_SPRITE_YVEL 0x00008000 +#define NET_SPRITE_ZVEL 0x00010000 +#define NET_SPRITE_LOTAG 0x00020000 +#define NET_SPRITE_HITAG 0x00040000 +#define NET_SPRITE_EXTRA 0x00080000 +#define NET_SPRITE_CSTAT 0x00100000 +#define NET_SPRITE_PICNUM 0x00200000 + +#define NET_ACTOR_T1 0x00000001 +#define NET_ACTOR_T2 0x00000002 +#define NET_ACTOR_T3 0x00000004 +#define NET_ACTOR_T4 0x00000008 +#define NET_ACTOR_T5 0x00000010 +#define NET_ACTOR_T6 0x00000020 +#define NET_ACTOR_T7 0x00000040 +#define NET_ACTOR_T8 0x00000080 +#define NET_ACTOR_T9 0x00000100 +#define NET_ACTOR_T10 0x00000200 +#define NET_ACTOR_PICNUM 0x00000400 +#define NET_ACTOR_ANG 0x00000800 +#define NET_ACTOR_EXTRA 0x00001000 +#define NET_ACTOR_OWNER 0x00002000 +#define NET_ACTOR_MOVFLAG 0x00004000 +#define NET_ACTOR_TEMPANG 0x00008000 +#define NET_ACTOR_TIMETOSLEEP 0x00010000 +#define NET_ACTOR_FLAGS 0x00020000 +#define NET_ACTOR_PTR1 0x00040000 +#define NET_ACTOR_PTR2 0x00080000 +#define NET_ACTOR_PTR3 0x00100000 + enum netchan_t { CHAN_MOVE, // unreliable movement packets @@ -69,13 +155,21 @@ enum DukePacket_t PACKET_MAP_VOTE_CANCEL, }; -enum NetDisconnect_t +enum netdisconnect_t { DISC_BAD_PASSWORD = 1, DISC_KICKED, DISC_BANNED }; +enum netmode_t +{ + NET_CLIENT = 0, + NET_SERVER, + NET_DEDICATED_CLIENT, // client on dedicated server + NET_DEDICATED_SERVER +}; + extern ENetHost *g_netClient; extern ENetHost *g_netServer; extern ENetPeer *g_netClientPeer; @@ -83,12 +177,12 @@ extern char g_netPassword[32]; extern int32_t g_netDisconnect; extern int32_t g_netPlayersWaiting; extern int32_t g_netPort; -extern int32_t g_netServerMode; +extern int32_t g_networkMode; extern int32_t g_netSync; extern int32_t lastsectupdate[MAXSECTORS]; extern int32_t lastupdate[MAXSPRITES]; extern int32_t lastwallupdate[MAXWALLS]; -extern int8_t g_netStatnums[8]; +extern int16_t g_netStatnums[10]; extern mapstate_t *g_multiMapState; int32_t Net_PackSprite(int32_t i,uint8_t *pbuf); diff --git a/polymer/eduke32/source/osdcmds.c b/polymer/eduke32/source/osdcmds.c index 112e96a2f..1001c0206 100644 --- a/polymer/eduke32/source/osdcmds.c +++ b/polymer/eduke32/source/osdcmds.c @@ -1165,7 +1165,7 @@ static int32_t osdcmd_listplayers(const osdfuncparm_t *parm) ENetPeer *currentPeer; char ipaddr[32]; - if (parm->numparms != 0) + if (parm && parm->numparms != 0) return OSDCMD_SHOWHELP; if (!g_netServer) @@ -1174,6 +1174,8 @@ static int32_t osdcmd_listplayers(const osdfuncparm_t *parm) return OSDCMD_OK; } + initprintf("Connected clients:\n"); + for (currentPeer = g_netServer -> peers; currentPeer < & g_netServer -> peers [g_netServer -> peerCount]; ++ currentPeer) @@ -1222,6 +1224,7 @@ static int32_t osdcmd_kick(const osdfuncparm_t *parm) } initprintf("Player %s not found!\n", parm->parms[0]); + osdcmd_listplayers(NULL); return OSDCMD_OK; } @@ -1264,6 +1267,7 @@ static int32_t osdcmd_kickban(const osdfuncparm_t *parm) } initprintf("Player %s not found!\n", parm->parms[0]); + osdcmd_listplayers(NULL); return OSDCMD_OK; } diff --git a/polymer/eduke32/source/player.c b/polymer/eduke32/source/player.c index cf40117be..59ef7b88a 100644 --- a/polymer/eduke32/source/player.c +++ b/polymer/eduke32/source/player.c @@ -2958,7 +2958,7 @@ void P_DisplayWeapon(int32_t snum) int32_t g_myAimMode = 0, g_myAimStat = 0, g_oldAimStat = 0; int32_t mouseyaxismode = -1; -int32_t jump_timer = 0; +int32_t g_emuJumpTics = 0; void getinput(int32_t snum) { @@ -2996,7 +2996,7 @@ void getinput(int32_t snum) if (g_myAimStat > g_oldAimStat) { g_myAimMode ^= 1; - P_DoQuote(44+g_myAimMode,p); + P_DoQuote(QUOTE_MOUSE_AIMING_OFF+g_myAimMode,p); } } @@ -3166,12 +3166,12 @@ void getinput(int32_t snum) j = 12; if (BUTTON(gamefunc_Jump) && p->on_ground) - jump_timer = 4; + g_emuJumpTics = 4; - loc.bits = (jump_timer > 0 || BUTTON(gamefunc_Jump))< 0 || BUTTON(gamefunc_Jump))< 0) - jump_timer--; + if (g_emuJumpTics > 0) + g_emuJumpTics--; loc.bits |= BUTTON(gamefunc_Crouch)<scuba_on = 1; p->inven_icon = 6; - P_DoQuote(76,p); + P_DoQuote(QUOTE_SCUBA_ON,p); } else { @@ -3665,8 +3665,8 @@ void P_CheckTouchDamage(DukePlayer_t *p,int32_t j) p->pals.g = 0; p->pals.b = 0; - p->posvel.x = -(sintable[(p->ang+512)&2047]<<8); - p->posvel.y = -(sintable[(p->ang)&2047]<<8); + p->vel.x = -(sintable[(p->ang+512)&2047]<<8); + p->vel.y = -(sintable[(p->ang)&2047]<<8); A_PlaySound(DUKE_LONGTERM_PAIN,p->i); { @@ -3848,13 +3848,13 @@ void P_FragPlayer(int32_t snum) if (snum == screenpeek) { - Bsprintf(ScriptQuotes[115],"KILLED BY %s",&g_player[p->frag_ps].user_name[0]); - P_DoQuote(115,p); + Bsprintf(ScriptQuotes[QUOTE_RESERVED],"KILLED BY %s",&g_player[p->frag_ps].user_name[0]); + P_DoQuote(QUOTE_RESERVED,p); } else { - Bsprintf(ScriptQuotes[116],"KILLED %s",&g_player[snum].user_name[0]); - P_DoQuote(116,g_player[p->frag_ps].ps); + Bsprintf(ScriptQuotes[QUOTE_RESERVED2],"KILLED %s",&g_player[snum].user_name[0]); + P_DoQuote(QUOTE_RESERVED2,g_player[p->frag_ps].ps); } if (ud.obituaries) @@ -3941,13 +3941,13 @@ void P_ProcessWeapon(int32_t snum) { p->holster_weapon = 1; p->weapon_pos = -1; - P_DoQuote(73,p); + P_DoQuote(QUOTE_WEAPON_LOWERED,p); } else if (p->holster_weapon == 1 && p->weapon_pos == -9) { p->holster_weapon = 0; p->weapon_pos = 10; - P_DoQuote(74,p); + P_DoQuote(QUOTE_WEAPON_RAISED,p); } } @@ -4027,7 +4027,7 @@ void P_ProcessWeapon(int32_t snum) { p->holster_weapon = 0; p->weapon_pos = 10; - P_DoQuote(74,p); + P_DoQuote(QUOTE_WEAPON_RAISED,p); } } else @@ -4110,7 +4110,7 @@ void P_ProcessWeapon(int32_t snum) (hitinfo.pos.y-p->pos.y)*(hitinfo.pos.y-p->pos.y)) < (290*290)) { p->pos.z = p->opos.z; - p->posvel.z = 0; + p->vel.z = 0; (*kb) = 1; if (aplWeaponInitialSound[p->curr_weapon][snum] > 0) { @@ -4290,7 +4290,7 @@ void P_ProcessWeapon(int32_t snum) && *kb < (aplWeaponFireDelay[p->curr_weapon][snum]+1)) { p->pos.z = p->opos.z; - p->posvel.z = 0; + p->vel.z = 0; } if (*kb == aplWeaponSound2Time[p->curr_weapon][snum]) @@ -4567,8 +4567,8 @@ void P_ProcessInput(int32_t snum) { // I think this is what makes the player slide off enemies... might be a good sprite flag to add later j = getangle(sprite[j].x-p->pos.x,sprite[j].y-p->pos.y); - p->posvel.x -= sintable[(j+512)&2047]<<4; - p->posvel.y -= sintable[j&2047]<<4; + p->vel.x -= sintable[(j+512)&2047]<<4; + p->vel.y -= sintable[j&2047]<<4; } } @@ -4597,7 +4597,7 @@ void P_ProcessInput(int32_t snum) if (p->customexitsound >= 0) { S_PlaySound(p->customexitsound); - P_DoQuote(102,p); + P_DoQuote(QUOTE_WEREGONNAFRYYOURASS,p); } } else if (p->timebeforeexit == 1) @@ -4689,7 +4689,7 @@ void P_ProcessInput(int32_t snum) p->pos.y = SY; p->pos.z = SZ; p->ang = SA; - p->posvel.x = p->posvel.y = s->xvel = 0; + p->vel.x = p->vel.y = s->xvel = 0; p->look_ang = 0; p->rotscrnang = 0; @@ -4802,9 +4802,9 @@ void P_ProcessInput(int32_t snum) if (aGameVars[g_iReturnVarID].val.lValue == 0) { // jump - if (p->posvel.z > 0) p->posvel.z = 0; - p->posvel.z -= 348; - if (p->posvel.z < -(256*6)) p->posvel.z = -(256*6); + if (p->vel.z > 0) p->vel.z = 0; + p->vel.z -= 348; + if (p->vel.z < -(256*6)) p->vel.z = -(256*6); } } else if (TEST_SYNC_KEY(sb_snum, SK_CROUCH)) @@ -4814,32 +4814,32 @@ void P_ProcessInput(int32_t snum) if (aGameVars[g_iReturnVarID].val.lValue == 0) { // crouch - if (p->posvel.z < 0) p->posvel.z = 0; - p->posvel.z += 348; - if (p->posvel.z > (256*6)) p->posvel.z = (256*6); + if (p->vel.z < 0) p->vel.z = 0; + p->vel.z += 348; + if (p->vel.z > (256*6)) p->vel.z = (256*6); } } else { // normal view - if (p->posvel.z < 0) + if (p->vel.z < 0) { - p->posvel.z += 256; - if (p->posvel.z > 0) - p->posvel.z = 0; + p->vel.z += 256; + if (p->vel.z > 0) + p->vel.z = 0; } - if (p->posvel.z > 0) + if (p->vel.z > 0) { - p->posvel.z -= 256; - if (p->posvel.z < 0) - p->posvel.z = 0; + p->vel.z -= 256; + if (p->vel.z < 0) + p->vel.z = 0; } } - if (p->posvel.z > 2048) - p->posvel.z >>= 1; + if (p->vel.z > 2048) + p->vel.z >>= 1; - p->pos.z += p->posvel.z; + p->pos.z += p->vel.z; if (p->pos.z > (fz-(15<<8))) p->pos.z += ((fz-(15<<8))-p->pos.z)>>1; @@ -4847,7 +4847,7 @@ void P_ProcessInput(int32_t snum) if (p->pos.z < cz) { p->pos.z = cz; - p->posvel.z = 0; + p->vel.z = 0; } if (p->scuba_on && (krand()&255) < 8) @@ -5004,16 +5004,16 @@ void P_ProcessInput(int32_t snum) else { p->on_ground = 0; - p->posvel.z += (g_spriteGravity+80); // (TICSPERFRAME<<6); - if (p->posvel.z >= (4096+2048)) p->posvel.z = (4096+2048); - if (p->posvel.z > 2400 && p->falling_counter < 255) + p->vel.z += (g_spriteGravity+80); // (TICSPERFRAME<<6); + if (p->vel.z >= (4096+2048)) p->vel.z = (4096+2048); + if (p->vel.z > 2400 && p->falling_counter < 255) { p->falling_counter++; if (p->falling_counter >= 38 && p->scream_voice <= FX_Ok) p->scream_voice = A_PlaySound(DUKE_SCREAM,p->i); } - if ((p->pos.z+p->posvel.z) >= (fz-(i<<8)) && p->cursectnum >= 0) // hit the ground + if ((p->pos.z+p->vel.z) >= (fz-(i<<8)) && p->cursectnum >= 0) // hit the ground if (sector[p->cursectnum].lotag != 1) { if (p->falling_counter > 62) @@ -5040,7 +5040,7 @@ void P_ProcessInput(int32_t snum) p->pals.b = 0; p->pals.f = 32; } - else if (p->posvel.z > 2048) + else if (p->vel.z > 2048) A_PlaySound(DUKE_LAND,p->i); } } @@ -5057,8 +5057,8 @@ void P_ProcessInput(int32_t snum) p->scream_voice = -1; } - if (psectlotag != 1 && psectlotag != 2 && p->on_ground == 0 && p->posvel.z > (6144>>1)) - p->hard_landing = p->posvel.z>>10; + if (psectlotag != 1 && psectlotag != 2 && p->on_ground == 0 && p->vel.z > (6144>>1)) + p->hard_landing = p->vel.z>>10; p->on_ground = 1; @@ -5069,8 +5069,8 @@ void P_ProcessInput(int32_t snum) k = ((fz-(i<<8))-p->pos.z)>>1; if (klabs(k) < 256) k = 0; p->pos.z += k; - p->posvel.z -= 768; - if (p->posvel.z < 0) p->posvel.z = 0; + p->vel.z -= 768; + if (p->vel.z < 0) p->vel.z = 0; } else if (p->jumping_counter == 0) { @@ -5078,7 +5078,7 @@ void P_ProcessInput(int32_t snum) if (p->on_warping_sector == 0 && p->pos.z > fz-(16<<8)) { p->pos.z = fz-(16<<8); - p->posvel.z >>= 1; + p->vel.z >>= 1; } } @@ -5128,11 +5128,11 @@ void P_ProcessInput(int32_t snum) if (psectlotag == 1 && p->jumping_counter > 768) { p->jumping_counter = 0; - p->posvel.z = -512; + p->vel.z = -512; } else { - p->posvel.z -= (sintable[(2048-128+p->jumping_counter)&2047])/12; + p->vel.z -= (sintable[(2048-128+p->jumping_counter)&2047])/12; p->jumping_counter += 180; p->on_ground = 0; } @@ -5140,18 +5140,18 @@ void P_ProcessInput(int32_t snum) else { p->jumping_counter = 0; - p->posvel.z = 0; + p->vel.z = 0; } } - p->pos.z += p->posvel.z; + p->pos.z += p->vel.z; if ((psectlotag != 2 || cz != sector[p->cursectnum].ceilingz) && p->pos.z < (cz+(4<<8))) { p->jumping_counter = 0; - if (p->posvel.z < 0) - p->posvel.x = p->posvel.y = 0; - p->posvel.z = 128; + if (p->vel.z < 0) + p->vel.x = p->vel.y = 0; + p->vel.z = 128; p->pos.z = cz+(4<<8); } } @@ -5161,8 +5161,8 @@ void P_ProcessInput(int32_t snum) *kb > 1 && *kb < *aplWeaponFireDelay[p->curr_weapon])) { doubvel = 0; - p->posvel.x = 0; - p->posvel.y = 0; + p->vel.x = 0; + p->vel.y = 0; } else if (g_player[snum].sync->avel) //p->ang += syncangvel * constant { @@ -5203,7 +5203,7 @@ void P_ProcessInput(int32_t snum) if (p->on_ground && truefdist <= PHEIGHT+(16<<8) && P_CheckFloorDamage(p, j)) { - P_DoQuote(75, p); + P_DoQuote(QUOTE_BOOTS_ON, p); p->inv_amount[GET_BOOTS] -= 2; if (p->inv_amount[GET_BOOTS] <= 0) { @@ -5231,7 +5231,7 @@ void P_ProcessInput(int32_t snum) if (g_player[snum].sync->extbits&(1<<5) || g_player[snum].sync->avel > 0) VM_OnEvent(EVENT_TURNRIGHT,p->i,snum, -1); - if (p->posvel.x || p->posvel.y || g_player[snum].sync->fvel || g_player[snum].sync->svel) + if (p->vel.x || p->vel.y || g_player[snum].sync->fvel || g_player[snum].sync->svel) { p->crack_time = 777; @@ -5275,8 +5275,8 @@ void P_ProcessInput(int32_t snum) if (p->jetpack_on == 0 && p->inv_amount[GET_STEROIDS] > 0 && p->inv_amount[GET_STEROIDS] < 400) doubvel <<= 1; - p->posvel.x += ((g_player[snum].sync->fvel*doubvel)<<6); - p->posvel.y += ((g_player[snum].sync->svel*doubvel)<<6); + p->vel.x += ((g_player[snum].sync->fvel*doubvel)<<6); + p->vel.y += ((g_player[snum].sync->svel*doubvel)<<6); j = 0; @@ -5285,16 +5285,16 @@ void P_ProcessInput(int32_t snum) else if (p->on_ground && (TEST_SYNC_KEY(sb_snum, SK_CROUCH) || (*kb > 10 && aplWeaponWorksLike[p->curr_weapon][snum] == KNEE_WEAPON))) j = 0x2000; - p->posvel.x = mulscale16(p->posvel.x,p->runspeed-j); - p->posvel.y = mulscale16(p->posvel.y,p->runspeed-j); + p->vel.x = mulscale16(p->vel.x,p->runspeed-j); + p->vel.y = mulscale16(p->vel.y,p->runspeed-j); - if (klabs(p->posvel.x) < 2048 && klabs(p->posvel.y) < 2048) - p->posvel.x = p->posvel.y = 0; + if (klabs(p->vel.x) < 2048 && klabs(p->vel.y) < 2048) + p->vel.x = p->vel.y = 0; if (shrunk) { - p->posvel.x = mulscale16(p->posvel.x,p->runspeed-(p->runspeed>>1)+(p->runspeed>>2)); - p->posvel.y = mulscale16(p->posvel.y,p->runspeed-(p->runspeed>>1)+(p->runspeed>>2)); + p->vel.x = mulscale16(p->vel.x,p->runspeed-(p->runspeed>>1)+(p->runspeed>>2)); + p->vel.y = mulscale16(p->vel.y,p->runspeed-(p->runspeed>>1)+(p->runspeed>>2)); } } @@ -5307,12 +5307,12 @@ HORIZONLY: if (ud.clipping) { - p->pos.x += p->posvel.x>>14; - p->pos.y += p->posvel.y>>14; + p->pos.x += p->vel.x>>14; + p->pos.y += p->vel.y>>14; updatesector(p->pos.x,p->pos.y,&p->cursectnum); changespritesect(p->i,p->cursectnum); } - else if ((j = clipmove((vec3_t *)p,&p->cursectnum, p->posvel.x,p->posvel.y,164L,(4L<<8),i,CLIPMASK0))) + else if ((j = clipmove((vec3_t *)p,&p->cursectnum, p->vel.x,p->vel.y,164L,(4L<<8),i,CLIPMASK0))) P_CheckTouchDamage(p, j); if (p->jetpack_on == 0 && psectlotag != 2 && psectlotag != 1 && shrunk) @@ -5369,7 +5369,7 @@ HORIZONLY: { if (!(sector[s->sectnum].lotag&0x8000) && (isanunderoperator(sector[s->sectnum].lotag) || isanearoperator(sector[s->sectnum].lotag))) - activatebysector(s->sectnum,p->i); + G_ActivateBySector(s->sectnum,p->i); if (j) { P_QuickKill(p); @@ -5377,7 +5377,7 @@ HORIZONLY: } } else if (klabs(fz-cz) < (32<<8) && isanunderoperator(sector[p->cursectnum].lotag)) - activatebysector(p->cursectnum,p->i); + G_ActivateBySector(p->cursectnum,p->i); } i = 0; @@ -5809,7 +5809,7 @@ void computergetinput(int32_t snum, input_t *syn) if (fightdist < 128) fightdist = 128; dist = ksqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); if (dist == 0) dist = 1; - daang = getangle(x2+(g_player[goalplayer[snum]].ps->posvel.x>>14)-x1,y2+(g_player[goalplayer[snum]].ps->posvel.y>>14)-y1); + daang = getangle(x2+(g_player[goalplayer[snum]].ps->vel.x>>14)-x1,y2+(g_player[goalplayer[snum]].ps->vel.y>>14)-y1); zang = 100-((z2-z1)*8)/dist; fightdist = max(fightdist,(klabs(z2-z1)>>4)); @@ -6048,13 +6048,13 @@ void computergetinput(int32_t snum, input_t *syn) int16_t dasect = p->cursectnum; Bmemcpy(&vect,p,sizeof(vec3_t)); - i = clipmove(&vect,&dasect,p->posvel.x,p->posvel.y,164L,4L<<8,4L<<8,CLIPMASK0); + i = clipmove(&vect,&dasect,p->vel.x,p->vel.y,164L,4L<<8,4L<<8,CLIPMASK0); if (!i) { Bmemcpy(&vect,p,sizeof(vec3_t)); vect.z += (24<<8); dasect = p->cursectnum; - i = clipmove(&vect,&dasect,p->posvel.x,p->posvel.y,164L,4L<<8,4L<<8,CLIPMASK0); + i = clipmove(&vect,&dasect,p->vel.x,p->vel.y,164L,4L<<8,4L<<8,CLIPMASK0); } } if (i) diff --git a/polymer/eduke32/source/player.h b/polymer/eduke32/source/player.h index f47b31b70..8aa0107d9 100644 --- a/polymer/eduke32/source/player.h +++ b/polymer/eduke32/source/player.h @@ -33,6 +33,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define AUTO_AIM_ANGLE 48 #define PHEIGHT (38<<8) +#define TRIPBOMB_TRIPWIRE 0x00000001 +#define TRIPBOMB_TIMER 0x00000002 + +#define PIPEBOMB_REMOTE 0x00000001 +#define PIPEBOMB_TIMER 0x00000002 + enum dukeinv_t { GET_STEROIDS, GET_SHIELD, @@ -116,12 +122,6 @@ enum playeraction_t { pfacing = 0x00010000 }; -#define TRIPBOMB_TRIPWIRE 0x00000001 -#define TRIPBOMB_TIMER 0x00000002 - -#define PIPEBOMB_REMOTE 0x00000001 -#define PIPEBOMB_TIMER 0x00000002 - #pragma pack(push,1) typedef struct { int32_t ox,oy,oz; @@ -137,7 +137,7 @@ typedef struct { } DukeStatus_t; typedef struct { - vec3_t pos, opos, posvel; + vec3_t pos, opos, vel, npos; int32_t bobposx, bobposy; int32_t truefz, truecz, player_par; int32_t randomflamex, exitx, exity; @@ -261,7 +261,7 @@ extern int32_t g_numObituaries; extern int32_t g_numSelfObituaries; extern int32_t g_weapon_offset; extern int32_t g_weapon_xoffset; -extern int32_t jump_timer; +extern int32_t g_emuJumpTics; extern int32_t lastvisinc; extern int32_t mouseyaxismode; extern int32_t ticrandomseed; diff --git a/polymer/eduke32/source/premap.c b/polymer/eduke32/source/premap.c index fd52df11b..43347b13c 100644 --- a/polymer/eduke32/source/premap.c +++ b/polymer/eduke32/source/premap.c @@ -544,7 +544,7 @@ void G_CacheMapData(void) OSD_Printf("Cache time: %dms\n", endtime-starttime); } -void xyzmirror(int32_t i,int32_t wn) +void G_SetupCamTile(int32_t i,int32_t wn) { //if (waloff[wn] == 0) loadtile(wn); setviewtotile(wn,tilesizy[wn],tilesizx[wn]); @@ -678,7 +678,7 @@ void P_ResetPlayer(int32_t snum) g_player[snum].ps->weapreccnt = 0; g_player[snum].ps->fta = 0; g_player[snum].ps->ftq = 0; - g_player[snum].ps->posvel.x = g_player[snum].ps->posvel.y = 0; + g_player[snum].ps->vel.x = g_player[snum].ps->vel.y = 0; g_player[snum].ps->rotscrnang = 0; g_player[snum].ps->runspeed = g_playerFriction; g_player[snum].ps->falling_counter = 0; @@ -782,9 +782,9 @@ void P_ResetStatus(int32_t snum) p->newowner =-1; p->jumping_counter = 0; p->hard_landing = 0; - p->posvel.x = 0; - p->posvel.y = 0; - p->posvel.z = 0; + p->vel.x = 0; + p->vel.y = 0; + p->vel.z = 0; fricxv = 0; fricyv = 0; p->somethingonplayer =-1; @@ -1560,31 +1560,26 @@ void G_ResetTimers(void) g_moveThingsCount = 0; } -void clearfifo(void) +void G_ClearFIFO(void) { - int32_t i = 0; - extern int32_t jump_timer; + int32_t i = MAXPLAYERS-1; + + g_emuJumpTics = 0; - jump_timer = 0; - avg.fvel = avg.svel = avg.avel = avg.horz = avg.bits = avg.extbits = 0; + Bmemset(&avg, 0, sizeof(input_t)); clearbufbyte(&loc,sizeof(input_t),0L); clearbufbyte(&inputfifo,sizeof(input_t)*MOVEFIFOSIZ*MAXPLAYERS,0L); - for (; i= 0; i--) { -// Bmemset(g_player[i].inputfifo,0,sizeof(g_player[i].inputfifo)); if (g_player[i].sync != NULL) - Bmemset(g_player[i].sync,0,sizeof(input_t)); - g_player[i].vote = 0; - g_player[i].gotvote = 0; + Bmemset(g_player[i].sync, 0, sizeof(input_t)); + g_player[i].vote = g_player[i].gotvote = 0; } - // clearbufbyte(playerquitflag,MAXPLAYERS,0x01); } -extern int32_t voting, vote_map, vote_episode; - -int32_t G_FindLevelForFilename(const char *fn) +int32_t G_FindLevelByFile(const char *fn) { int32_t volume, level; @@ -1637,8 +1632,10 @@ static void G_LoadMapHack(char *outbuf, const char *filename) if (filename != NULL) Bstrcpy(outbuf, filename); + p = Bstrrchr(outbuf,'.'); - if (!p) Bstrcat(outbuf,".mhk"); + if (!p) + Bstrcat(outbuf,".mhk"); else { p[1]='m'; @@ -1646,7 +1643,9 @@ static void G_LoadMapHack(char *outbuf, const char *filename) p[3]='k'; p[4]=0; } - if (!loadmaphack(outbuf)) initprintf("Loaded map hack file '%s'\n",outbuf); + + if (!loadmaphack(outbuf)) + initprintf("Loaded map hack file '%s'\n",outbuf); } int32_t G_EnterLevel(int32_t g) @@ -1671,18 +1670,21 @@ int32_t G_EnterLevel(int32_t g) if ((g&MODE_DEMO) == 0 && ud.recstat == 2) ud.recstat = 0; - FX_StopAllSounds(); - S_ClearSoundLocks(); - FX_SetReverb(0); + if (g_networkMode != NET_DEDICATED_SERVER) + { + FX_StopAllSounds(); + S_ClearSoundLocks(); + FX_SetReverb(0); + setgamemode(ud.config.ScreenMode,ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP); + } - setgamemode(ud.config.ScreenMode,ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP); if (boardfilename[0] != 0 && ud.m_level_number == 7 && ud.m_volume_number == 0) { int32_t volume, level; Bcorrectfilename(boardfilename,0); - volume = level = G_FindLevelForFilename(boardfilename); + volume = level = G_FindLevelByFile(boardfilename); if (level != MAXLEVELS*MAXVOLUMES) { @@ -1811,7 +1813,6 @@ int32_t G_EnterLevel(int32_t g) } else { - i = strlen(MapInfo[(ud.volume_number*MAXLEVELS)+ud.level_number].filename); copybufbyte(MapInfo[(ud.volume_number*MAXLEVELS)+ud.level_number].filename,&levname[0],i); levname[i] = 255; @@ -1871,7 +1872,7 @@ int32_t G_EnterLevel(int32_t g) G_OpenDemoWrite(); if (VOLUMEONE && ud.level_number == 0 && ud.recstat != 2) - P_DoQuote(40,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_F1HELP,g_player[myconnectindex].ps); TRAVERSE_CONNECT(i) switch (DynamicTileMap[sector[sprite[g_player[i].ps->i].sectnum].floorpicnum]) @@ -1904,7 +1905,7 @@ int32_t G_EnterLevel(int32_t g) ud.last_level = ud.level_number+1; - clearfifo(); + G_ClearFIFO(); for (i=g_numInterpolations-1; i>=0; i--) bakipos[i] = *curipos[i]; diff --git a/polymer/eduke32/source/premap.h b/polymer/eduke32/source/premap.h index 81fbf3abf..0b45aee1d 100644 --- a/polymer/eduke32/source/premap.h +++ b/polymer/eduke32/source/premap.h @@ -32,7 +32,7 @@ extern int32_t g_numRealPalettes; extern int32_t voting,vote_map,vote_episode; extern palette_t CrosshairColors; int32_t G_EnterLevel(int32_t g); -int32_t G_FindLevelForFilename(const char *fn); +int32_t G_FindLevelByFile(const char *fn); void G_CacheMapData(void); void G_FadeLoad(int32_t r,int32_t g,int32_t b,int32_t start,int32_t end,int32_t step); void G_FreeMapState(int32_t mapnum); @@ -45,7 +45,7 @@ void P_ResetInventory(int32_t snum); void P_ResetPlayer(int32_t snum); void P_ResetStatus(int32_t snum); void P_ResetWeapons(int32_t snum); -void clearfifo(void); -void xyzmirror(int32_t i,int32_t wn); +void G_ClearFIFO(void); +void G_SetupCamTile(int32_t i,int32_t wn); #endif diff --git a/polymer/eduke32/source/quotes.h b/polymer/eduke32/source/quotes.h new file mode 100644 index 000000000..d5a1ad436 --- /dev/null +++ b/polymer/eduke32/source/quotes.h @@ -0,0 +1,96 @@ +//------------------------------------------------------------------------- +/* +Copyright (C) 2011 EDuke32 developers and contributors + +This file is part of EDuke32. + +EDuke32 is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 2 +as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +//------------------------------------------------------------------------- + +#ifndef __quotes_h__ +#define __quotes_h__ + +#define MAXQUOTES 16384 +#define MAXQUOTELEN 128 +#define OBITQUOTEINDEX MAXQUOTES-128 +#define SUICIDEQUOTEINDEX MAXQUOTES-32 + +#define QUOTE_SHOW_MAP_OFF 1 +#define QUOTE_ACTIVATED 2 +#define QUOTE_MEDKIT 3 +#define QUOTE_LOCKED 4 +#define QUOTE_CHEAT_EVERYTHING 5 +#define QUOTE_BOOTS 6 +#define QUOTE_WASTED 7 +#define QUOTE_UNLOCKED 8 +#define QUOTE_FOUND_SECRET 9 +#define QUOTE_SQUISHED 10 +#define QUOTE_USED_STEROIDS 12 +#define QUOTE_DEACTIVATED 15 +#define QUOTE_CHEAT_GODMODE_ON 17 +#define QUOTE_CHEAT_GODMODE_OFF 18 +#define QUOTE_CROSSHAIR_OFF 21 +#define QUOTE_CHEATS_DISABLED 22 +#define QUOTE_MESSAGES_ON 23 +#define QUOTE_MESSAGES_OFF 24 +#define QUOTE_MUSIC 26 +#define QUOTE_CHEAT_STEROIDS 37 +#define QUOTE_F1HELP 40 +#define QUOTE_MOUSE_AIMING_OFF 44 +#define QUOTE_HOLODUKE_ON 47 +#define QUOTE_HOLODUKE_OFF 48 +#define QUOTE_HOLODUKE_NOT_FOUND 49 +#define QUOTE_JETPACK_NOT_FOUND 50 +#define QUOTE_JETPACK_ON 52 +#define QUOTE_JETPACK_OFF 53 +#define QUOTE_NEED_BLUE_KEY 70 +#define QUOTE_NEED_RED_KEY 71 +#define QUOTE_NEED_YELLOW_KEY 72 +#define QUOTE_WEAPON_LOWERED 73 +#define QUOTE_WEAPON_RAISED 74 +#define QUOTE_BOOTS_ON 75 +#define QUOTE_SCUBA_ON 76 +#define QUOTE_CHEAT_ALLEN 79 +#define QUOTE_MIGHTY_FOOT 80 +#define QUOTE_WEAPON_MODE_OFF 82 +#define QUOTE_MAP_FOLLOW_OFF 83 +#define QUOTE_RUN_MODE_OFF 85 +#define QUOTE_JETPACK 88 +#define QUOTE_SCUBA 89 +#define QUOTE_STEROIDS 90 +#define QUOTE_HOLODUKE 91 +#define QUOTE_CHEAT_TODD 99 +#define QUOTE_CHEAT_UNLOCK 100 +#define QUOTE_NVG 101 +#define QUOTE_WEREGONNAFRYYOURASS 102 +#define QUOTE_SCREEN_SAVED 103 +#define QUOTE_CHEAT_BETA 105 +#define QUOTE_NVG_OFF 107 +#define QUOTE_VIEW_MODE_OFF 109 +#define QUOTE_SHOW_MAP_ON 111 +#define QUOTE_CHEAT_NOCLIP 113 +#define QUOTE_SAVE_BAD_VERSION 114 +#define QUOTE_RESERVED 115 +#define QUOTE_RESERVED2 116 +#define QUOTE_RESERVED3 117 +#define QUOTE_SAVE_DEAD 118 +#define QUOTE_CHEAT_ALL_WEAPONS 119 +#define QUOTE_CHEAT_ALL_INV 120 +#define QUOTE_CHEAT_ALL_KEYS 121 +#define QUOTE_RESERVED4 122 +#define QUOTE_SAVE_BAD_PLAYERS 124 + +#endif diff --git a/polymer/eduke32/source/savegame.c b/polymer/eduke32/source/savegame.c index d55248c87..77a222f94 100644 --- a/polymer/eduke32/source/savegame.c +++ b/polymer/eduke32/source/savegame.c @@ -99,7 +99,7 @@ int32_t G_LoadSaveHeader(char spot,struct savehead *saveh) if (kdfread(&bv,sizeof(bv),1,fil) != 1) goto corrupt; /* if (bv != BYTEVERSION) { - P_DoQuote(114,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SAVE_BAD_VERSION,g_player[myconnectindex].ps); kclose(fil); return 1; }*/ @@ -154,7 +154,7 @@ int32_t G_LoadPlayer(int32_t spot) if (kdfread(&bv,sizeof(bv),1,fil) != 1) return -1; if (bv != BYTEVERSION) { - P_DoQuote(114,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SAVE_BAD_VERSION,g_player[myconnectindex].ps); kclose(fil); ototalclock = totalclock; ready2send = 1; @@ -167,7 +167,7 @@ int32_t G_LoadPlayer(int32_t spot) kclose(fil); ototalclock = totalclock; ready2send = 1; - P_DoQuote(124,g_player[myconnectindex].ps); + P_DoQuote(QUOTE_SAVE_BAD_PLAYERS,g_player[myconnectindex].ps); return 1; } else ud.multimode = nump; @@ -590,7 +590,7 @@ int32_t G_LoadPlayer(int32_t spot) ready2send = 1; - clearfifo(); + G_ClearFIFO(); Net_WaitForServer(); G_ResetTimers(); @@ -895,8 +895,8 @@ int32_t G_SavePlayer(int32_t spot) if ((!g_netServer && ud.multimode < 2)) { - strcpy(ScriptQuotes[122],"GAME SAVED"); - P_DoQuote(122,g_player[myconnectindex].ps); + strcpy(ScriptQuotes[QUOTE_RESERVED4],"GAME SAVED"); + P_DoQuote(QUOTE_RESERVED4,g_player[myconnectindex].ps); } ready2send = 1; diff --git a/polymer/eduke32/source/sector.c b/polymer/eduke32/source/sector.c index 856564236..28c72cef4 100644 --- a/polymer/eduke32/source/sector.c +++ b/polymer/eduke32/source/sector.c @@ -307,7 +307,7 @@ void G_DoSectorAnimations(void) if (sprite[g_player[p].ps->i].owner >= 0) { g_player[p].ps->pos.z += v; - g_player[p].ps->posvel.z = 0; + g_player[p].ps->vel.z = 0; if (p == myconnectindex) { my.z += v; @@ -381,7 +381,7 @@ void G_AnimateCamSprite(void) if (waloff[TILE_VIEWSCR] == 0) allocatepermanenttile(TILE_VIEWSCR,tilesizx[PN],tilesizy[PN]); else walock[TILE_VIEWSCR] = 255; - xyzmirror(OW,/*PN*/TILE_VIEWSCR); + G_SetupCamTile(OW,/*PN*/TILE_VIEWSCR); } } else T1++; @@ -1046,8 +1046,8 @@ void G_OperateActivators(int32_t low,int32_t snum) if (snum >= 0 && snum < ud.multimode) { if (sector[SECT].lotag&16384) - P_DoQuote(4,g_player[snum].ps); - else P_DoQuote(8,g_player[snum].ps); + P_DoQuote(QUOTE_LOCKED,g_player[snum].ps); + else P_DoQuote(QUOTE_UNLOCKED,g_player[snum].ps); } } else @@ -1222,21 +1222,21 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype) { if ((g_player[snum].ps->got_access&1)) g_player[snum].ps->access_incs = 1; - else P_DoQuote(70,g_player[snum].ps); + else P_DoQuote(QUOTE_NEED_BLUE_KEY,g_player[snum].ps); } else if (switchpal == 21) { if (g_player[snum].ps->got_access&2) g_player[snum].ps->access_incs = 1; - else P_DoQuote(71,g_player[snum].ps); + else P_DoQuote(QUOTE_NEED_RED_KEY,g_player[snum].ps); } else if (switchpal == 23) { if (g_player[snum].ps->got_access&4) g_player[snum].ps->access_incs = 1; - else P_DoQuote(72,g_player[snum].ps); + else P_DoQuote(QUOTE_NEED_YELLOW_KEY,g_player[snum].ps); } if (g_player[snum].ps->access_incs == 1) @@ -1565,11 +1565,11 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype) case 25: actor[x].t_data[4] = !actor[x].t_data[4]; if (actor[x].t_data[4]) - P_DoQuote(15,g_player[snum].ps); - else P_DoQuote(2,g_player[snum].ps); + P_DoQuote(QUOTE_DEACTIVATED,g_player[snum].ps); + else P_DoQuote(QUOTE_ACTIVATED,g_player[snum].ps); break; case 21: - P_DoQuote(2,g_player[screenpeek].ps); + P_DoQuote(QUOTE_ACTIVATED,g_player[screenpeek].ps); break; } } @@ -1603,7 +1603,7 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype) } -void activatebysector(int32_t sect,int32_t j) +void G_ActivateBySector(int32_t sect,int32_t j) { int32_t i = headspritesect[sect]; int32_t didit = 0; @@ -2521,7 +2521,7 @@ void G_HandleSharedKeys(int32_t snum) { p->quick_kick = 14; if (p->fta == 0 || p->ftq == 80) - P_DoQuote(80,p); + P_DoQuote(QUOTE_MIGHTY_FOOT,p); } } @@ -2597,7 +2597,7 @@ void G_HandleSharedKeys(int32_t snum) P_UpdateScreenPal(p); p->inven_icon = 5; A_PlaySound(NITEVISION_ONOFF,p->i); - P_DoQuote(106+(!p->heat_on),p); + P_DoQuote(QUOTE_NVG_OFF-p->heat_on,p); } } @@ -2611,7 +2611,7 @@ void G_HandleSharedKeys(int32_t snum) { p->inv_amount[GET_STEROIDS]--; A_PlaySound(DUKE_TAKEPILLS,p->i); - P_DoQuote(12,p); + P_DoQuote(QUOTE_USED_STEROIDS,p); } if (p->inv_amount[GET_STEROIDS] > 0) p->inven_icon = 2; @@ -2710,7 +2710,8 @@ CHECKINV1: if (dainv || p->inv_amount[GET_FIRSTAID]) { - static const int32_t i[8] = { 3, 90, 91, 88, 101, 89, 6, 0 }; + static const int32_t i[8] = { QUOTE_MEDKIT, QUOTE_STEROIDS, QUOTE_HOLODUKE, + QUOTE_JETPACK, QUOTE_NVG, QUOTE_SCUBA, QUOTE_BOOTS, 0 }; P_DoQuote(i[dainv-1], p); } } @@ -2919,11 +2920,11 @@ CHECKINV1: T4 = T5 = 0; SP = snum; sprite[i].extra = 0; - P_DoQuote(47,p); + P_DoQuote(QUOTE_HOLODUKE_ON,p); A_PlaySound(TELEPORTER,p->holoduke_on); } } - else P_DoQuote(49,p); + else P_DoQuote(QUOTE_HOLODUKE_NOT_FOUND,p); } } else @@ -2934,7 +2935,7 @@ CHECKINV1: { A_PlaySound(TELEPORTER,p->holoduke_on); p->holoduke_on = -1; - P_DoQuote(48,p); + P_DoQuote(QUOTE_HOLODUKE_OFF,p); } } } @@ -2966,7 +2967,7 @@ CHECKINV1: } } - if (TEST_SYNC_KEY(sb_snum, SK_JETPACK) && p->newowner == -1) + if (p->newowner == -1 && TEST_SYNC_KEY(sb_snum, SK_JETPACK)) { aGameVars[g_iReturnVarID].val.lValue = 0; VM_OnEvent(EVENT_USEJETPACK,g_player[snum].ps->i,snum, -1); @@ -2986,19 +2987,19 @@ CHECKINV1: A_PlaySound(DUKE_JETPACK_ON,p->i); - P_DoQuote(52,p); + P_DoQuote(QUOTE_JETPACK_ON,p); } else { p->hard_landing = 0; - p->posvel.z = 0; + p->vel.z = 0; A_PlaySound(DUKE_JETPACK_OFF,p->i); S_StopEnvSound(DUKE_JETPACK_IDLE,p->i); S_StopEnvSound(DUKE_JETPACK_ON,p->i); - P_DoQuote(53,p); + P_DoQuote(QUOTE_JETPACK_OFF,p); } } - else P_DoQuote(50,p); + else P_DoQuote(QUOTE_JETPACK_NOT_FOUND,p); } } @@ -3031,13 +3032,14 @@ int32_t A_CheckHitSprite(int32_t i, int16_t *hitsp) SZ += zoff; *hitsp = hitinfo.hitsprite; + if (hitinfo.hitwall >= 0 && (wall[hitinfo.hitwall].cstat&16) && A_CheckEnemySprite(&sprite[i])) return((1<<30)); return (FindDistance2D(hitinfo.pos.x-SX,hitinfo.pos.y-SY)); } -static int32_t hitawall(DukePlayer_t *p,int16_t *hitw) +static int32_t P_FindWall(DukePlayer_t *p,int16_t *hitw) { hitdata_t hitinfo; @@ -3064,7 +3066,7 @@ void P_CheckSectors(int32_t snum) case 32767: sector[p->cursectnum].lotag = 0; - P_DoQuote(9,p); + P_DoQuote(QUOTE_FOUND_SECRET,p); p->secret_rooms++; return; case -1: @@ -3144,7 +3146,7 @@ void P_CheckSectors(int32_t snum) p->toggle_key_flag = 1; hitscanwall = -1; - i = hitawall(p,&hitscanwall); + i = P_FindWall(p,&hitscanwall); if (i < 1280 && hitscanwall >= 0 && wall[hitscanwall].overpicnum == MIRROR) if (wall[hitscanwall].lotag > 0 && !A_CheckSoundPlaying(p->i,wall[hitscanwall].lotag) && snum == screenpeek) @@ -3247,7 +3249,7 @@ void P_CheckSectors(int32_t snum) return; case NUKEBUTTON__STATIC: - hitawall(p,&j); + P_FindWall(p,&j); if (j >= 0 && wall[j].overpicnum == 0) if (actor[neartagsprite].t_data[0] == 0) { diff --git a/polymer/eduke32/source/sector.h b/polymer/eduke32/source/sector.h index 8fac935b5..9770db1d7 100644 --- a/polymer/eduke32/source/sector.h +++ b/polymer/eduke32/source/sector.h @@ -25,9 +25,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "gamevars.h" -#define MAXCYCLERS 1024 -#define MAXANIMATES 256 -#define MAXANIMWALLS 512 +#define MAXCYCLERS 1024 +#define MAXANIMATES 256 +#define MAXANIMWALLS 512 typedef struct { int16_t wallnum, tag; @@ -85,7 +85,7 @@ typedef struct { extern map_t MapInfo[(MAXVOLUMES+1)*MAXLEVELS]; // +1 volume for "intro", "briefing" music -void activatebysector(int32_t sect,int32_t j); +void G_ActivateBySector(int32_t sect,int32_t j); int32_t A_CallSound(int32_t sn,int32_t whatsprite); int32_t A_CheckHitSprite(int32_t i,int16_t *hitsp); void A_DamageObject(int32_t i,int32_t sn);