diff --git a/game-music-emu/game-music-emu.vcproj b/game-music-emu/game-music-emu.vcproj index 8ded6444a..45de9ebfb 100644 --- a/game-music-emu/game-music-emu.vcproj +++ b/game-music-emu/game-music-emu.vcproj @@ -180,6 +180,7 @@ WarningLevel="3" Detect64BitPortabilityProblems="true" DebugInformationFormat="3" + CallingConvention="1" /> 0) { @@ -657,7 +659,7 @@ void C_Ticker () { if (ConsoleState == c_falling) { - ConBottom += (gametic - lasttic) * (SCREENHEIGHT*2/25); + ConBottom += (consoletic - lasttic) * (SCREENHEIGHT * 2 / 25); if (ConBottom >= SCREENHEIGHT / 2) { ConBottom = SCREENHEIGHT / 2; @@ -666,7 +668,7 @@ void C_Ticker () } else if (ConsoleState == c_rising) { - ConBottom -= (gametic - lasttic) * (SCREENHEIGHT*2/25); + ConBottom -= (consoletic - lasttic) * (SCREENHEIGHT * 2 / 25); if (ConBottom <= 0) { ConsoleState = c_up; @@ -681,7 +683,7 @@ void C_Ticker () CursorTicker = C_BLINKRATE; } - lasttic = gametic; + lasttic = consoletic; if (NotifyTopGoal > NotifyTop) { diff --git a/src/d_main.cpp b/src/d_main.cpp index 29a12c9c2..90391433a 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -422,7 +422,7 @@ CVAR (Flag, sv_fastmonsters, dmflags, DF_FAST_MONSTERS); CVAR (Flag, sv_nojump, dmflags, DF_NO_JUMP); CVAR (Flag, sv_allowjump, dmflags, DF_YES_JUMP); CVAR (Flag, sv_nofreelook, dmflags, DF_NO_FREELOOK); -CVAR (Flag, sv_respawnsuper, dmflags, DF_RESPAWN_SUPER); +CVAR (Flag, sv_allowfreelook, dmflags, DF_YES_FREELOOK); CVAR (Flag, sv_nofov, dmflags, DF_NO_FOV); CVAR (Flag, sv_noweaponspawn, dmflags, DF_NO_COOP_WEAPON_SPAWN); CVAR (Flag, sv_nocrouch, dmflags, DF_NO_CROUCH); @@ -439,6 +439,7 @@ CVAR (Flag, sv_coophalveammo, dmflags, DF_COOP_HALVE_AMMO); CVAR (Mask, sv_crouch, dmflags, DF_NO_CROUCH|DF_YES_CROUCH); CVAR (Mask, sv_jump, dmflags, DF_NO_JUMP|DF_YES_JUMP); CVAR (Mask, sv_fallingdamage, dmflags, DF_FORCE_FALLINGHX|DF_FORCE_FALLINGZD); +CVAR (Mask, sv_freelook, dmflags, DF_NO_FREELOOK|DF_YES_FREELOOK); //========================================================================== // @@ -510,6 +511,8 @@ CVAR (Flag, sv_noautoaim, dmflags2, DF2_NOAUTOAIM); CVAR (Flag, sv_dontcheckammo, dmflags2, DF2_DONTCHECKAMMO); CVAR (Flag, sv_killbossmonst, dmflags2, DF2_KILLBOSSMONST); CVAR (Flag, sv_nocountendmonst, dmflags2, DF2_NOCOUNTENDMONST); +CVAR (Flag, sv_respawnsuper, dmflags2, DF2_RESPAWN_SUPER); + //========================================================================== // // CVAR compatflags @@ -1319,7 +1322,7 @@ void D_DoAdvanceDemo (void) break; } - if (pagename) + if (pagename.IsNotEmpty()) { if (Page != NULL) { @@ -1987,8 +1990,6 @@ static void D_DoomInit() Args->CollectFiles("-playdemo", ".lmp"); Args->CollectFiles("-file", NULL); // anything left goes after -file - atterm (C_DeinitConsole); - gamestate = GS_STARTUP; SetLanguageIDs (); @@ -2237,7 +2238,7 @@ void D_DoomMain (void) // +logfile gets checked too late to catch the full startup log in the logfile so do some extra check for it here. FString logfile = Args->TakeValue("+logfile"); - if (logfile != NULL) + if (logfile.IsNotEmpty()) { execLogfile(logfile); } @@ -2275,7 +2276,7 @@ void D_DoomMain (void) // The IWAD selection dialogue does not show in fullscreen so if the // restart is initiated without a defined IWAD assume for now that it's not going to change. - if (iwad.Len() == 0) iwad = lastIWAD; + if (iwad.IsEmpty()) iwad = lastIWAD; FIWadManager *iwad_man = new FIWadManager; const FIWADInfo *iwad_info = iwad_man->FindIWAD(allwads, iwad, basewad); diff --git a/src/d_net.cpp b/src/d_net.cpp index 2cf13173f..0daf010c6 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -1275,6 +1275,55 @@ void NetUpdate (void) // listen for other packets GetPackets (); + + if (!demoplayback) + { + // ideally nettics[0] should be 1 - 3 tics above lowtic + // if we are consistantly slower, speed up time + + // [RH] I had erroneously assumed frameskip[] had 4 entries + // because there were 4 players, but that's not the case at + // all. The game is comparing the lag behind the master for + // four runs of TryRunTics. If our tic count is ahead of the + // master all 4 times, the next run of NetUpdate will not + // process any new input. If we have less input than the + // master, the next run of NetUpdate will process extra tics + // (because gametime gets decremented here). + + // the key player does not adapt + if (consoleplayer != Net_Arbitrator) + { + // I'm not sure about this when using a packet server, because + // if left unmodified from the P2P version, it can make the game + // very jerky. The way I have it written right now basically means + // that it won't adapt. Fortunately, player prediction helps + // alleviate the lag somewhat. + + if (NetMode != NET_PacketServer) + { + mastertics = nettics[nodeforplayer[Net_Arbitrator]]; + } + if (nettics[0] <= mastertics) + { + gametime--; + if (debugfile) fprintf(debugfile, "-"); + } + if (NetMode != NET_PacketServer) + { + frameskip[(maketic / ticdup) & 3] = (oldnettics > mastertics); + } + else + { + frameskip[(maketic / ticdup) & 3] = (oldnettics - mastertics) > 3; + } + if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3]) + { + skiptics = 1; + if (debugfile) fprintf(debugfile, "+"); + } + oldnettics = nettics[0]; + } + }// !demoplayback } @@ -1751,72 +1800,27 @@ void TryRunTics (void) else counts = availabletics; + // Uncapped framerate needs seprate checks if (counts == 0 && !doWait) { // Check possible stall conditions Net_CheckLastRecieved(counts); + if (realtics >= 1) + { + C_Ticker(); + M_Ticker(); + } return; } if (counts < 1) counts = 1; - frameon++; - if (debugfile) fprintf (debugfile, "=======real: %i avail: %i game: %i\n", realtics, availabletics, counts); - if (!demoplayback) - { - // ideally nettics[0] should be 1 - 3 tics above lowtic - // if we are consistantly slower, speed up time - - // [RH] I had erroneously assumed frameskip[] had 4 entries - // because there were 4 players, but that's not the case at - // all. The game is comparing the lag behind the master for - // four runs of TryRunTics. If our tic count is ahead of the - // master all 4 times, the next run of NetUpdate will not - // process any new input. If we have less input than the - // master, the next run of NetUpdate will process extra tics - // (because gametime gets decremented here). - - // the key player does not adapt - if (consoleplayer != Net_Arbitrator) - { - // I'm not sure about this when using a packet server, because - // if left unmodified from the P2P version, it can make the game - // very jerky. The way I have it written right now basically means - // that it won't adapt. Fortunately, player prediction helps - // alleviate the lag somewhat. - - if (NetMode != NET_PacketServer) - { - mastertics = nettics[nodeforplayer[Net_Arbitrator]]; - } - if (nettics[0] <= mastertics) - { - gametime--; - if (debugfile) fprintf (debugfile, "-"); - } - if (NetMode != NET_PacketServer) - { - frameskip[frameon&3] = (oldnettics > mastertics); - } - else - { - frameskip[frameon&3] = (oldnettics - mastertics) > 3; - } - if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3]) - { - skiptics = 1; - if (debugfile) fprintf (debugfile, "+"); - } - oldnettics = nettics[0]; - } - }// !demoplayback - // wait for new tics if needed while (lowtic < gametic + counts) { @@ -1836,7 +1840,7 @@ void TryRunTics (void) Net_CheckLastRecieved (counts); // don't stay in here forever -- give the menu a chance to work - if (I_GetTime (false) - entertic >= TICRATE/3) + if (I_GetTime (false) - entertic >= 1) { C_Ticker (); M_Ticker (); diff --git a/src/doomdef.h b/src/doomdef.h index 6ef9fcd04..3e00975cf 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -254,7 +254,7 @@ enum DF_NO_JUMP = 1 << 16, // Don't allow jumping DF_YES_JUMP = 2 << 16, DF_NO_FREELOOK = 1 << 18, // Don't allow freelook - DF_RESPAWN_SUPER = 1 << 19, // Respawn invulnerability and invisibility + DF_YES_FREELOOK = 2 << 18, DF_NO_FOV = 1 << 20, // Only let the arbitrator set FOV (for all players) DF_NO_COOP_WEAPON_SPAWN = 1 << 21, // Don't spawn multiplayer weapons in coop games DF_NO_CROUCH = 1 << 22, // Don't allow crouching @@ -298,6 +298,7 @@ enum DF2_DONTCHECKAMMO = 1 << 24, // Don't Check ammo when switching weapons. DF2_KILLBOSSMONST = 1 << 25, // Kills all monsters spawned by a boss cube when the boss dies DF2_NOCOUNTENDMONST = 1 << 26, // Do not count monsters in 'end level when dying' sectors towards kill count + DF2_RESPAWN_SUPER = 1 << 27, // Respawn invulnerability and invisibility }; // [RH] Compatibility flags. diff --git a/src/g_game.cpp b/src/g_game.cpp index b84ac890d..2058c2df0 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1835,6 +1835,13 @@ void G_DoLoadGame () BYTE *vars_p = (BYTE *)text; C_ReadCVars (&vars_p); delete[] text; + if (SaveVersion <= 4509) + { + // account for the flag shuffling for making freelook a 3-state option + INTBOOL flag = dmflags & DF_YES_FREELOOK; + dmflags = dmflags & ~DF_YES_FREELOOK; + if (flag) dmflags2 = dmflags2 | DF2_RESPAWN_SUPER; + } } // dearchive all the modifications diff --git a/src/g_level.cpp b/src/g_level.cpp index c4aafda4b..69bee5de1 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1320,11 +1320,11 @@ bool FLevelLocals::IsCrouchingAllowed() const bool FLevelLocals::IsFreelookAllowed() const { - if (level.flags & LEVEL_FREELOOK_NO) + if (dmflags & DF_NO_FREELOOK) return false; - if (level.flags & LEVEL_FREELOOK_YES) + if (dmflags & DF_YES_FREELOOK) return true; - return !(dmflags & DF_NO_FREELOOK); + return !(level.flags & LEVEL_FREELOOK_NO); } //========================================================================== diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index f14e7f4c7..acb6224a3 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -497,7 +497,7 @@ bool AInventory::SpecialDropAction (AActor *dropper) bool AInventory::ShouldRespawn () { - if ((ItemFlags & IF_BIGPOWERUP) && !(dmflags & DF_RESPAWN_SUPER)) return false; + if ((ItemFlags & IF_BIGPOWERUP) && !(dmflags2 & DF2_RESPAWN_SUPER)) return false; if (ItemFlags & IF_NEVERRESPAWN) return false; return !!(dmflags & DF_ITEMS_RESPAWN); } diff --git a/src/p_acs.cpp b/src/p_acs.cpp index feecbb0aa..87e65cac3 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3542,14 +3542,14 @@ static const int LegacyRenderStyleIndices[] = 3, // STYLE_SoulTrans, 4, // STYLE_OptFuzzy, 5, // STYLE_Stencil, - 6, // STYLE_AddStencil - 7, // STYLE_AddShaded 64, // STYLE_Translucent 65, // STYLE_Add, 66, // STYLE_Shaded, 67, // STYLE_TranslucentStencil, 68, // STYLE_Shadow, 69, // STYLE_Subtract, + 6, // STYLE_AddStencil + 7, // STYLE_AddShaded -1 }; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 076d106eb..cdc511d11 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -4724,7 +4724,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) // [RH] don't spawn extra weapons in coop if so desired if (multiplayer && !deathmatch && (dmflags & DF_NO_COOP_WEAPON_SPAWN)) { - if (i->IsDescendantOf (RUNTIME_CLASS(AWeapon))) + if (GetDefaultByType(i)->flags7 & MF7_WEAPONSPAWN) { if ((mthing->flags & (MTF_DEATHMATCH|MTF_SINGLE)) == MTF_DEATHMATCH) return NULL; diff --git a/src/p_spec.cpp b/src/p_spec.cpp index e66dc2ab4..5068cd575 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -252,7 +252,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType) if (buttonSuccess) { - if (activationType == SPAC_Use || activationType == SPAC_Impact) + if (activationType == SPAC_Use || activationType == SPAC_Impact || activationType == SPAC_Push) { P_ChangeSwitchTexture (line->sidedef[0], repeat, special); } diff --git a/src/p_terrain.cpp b/src/p_terrain.cpp index fdd98c96a..a1a9ea25b 100644 --- a/src/p_terrain.cpp +++ b/src/p_terrain.cpp @@ -189,41 +189,38 @@ static const char *TerrainKeywords[] = NULL }; -// Alternate offsetof macro to shut GCC up -#define theoffsetof(type,field) ((size_t)&((type*)1)->field - 1) - static FGenericParse SplashParser[] = { { GEN_End, {0} }, - { GEN_Sound, {theoffsetof(FSplashDef, SmallSplashSound)} }, - { GEN_Fixed, {theoffsetof(FSplashDef, SmallSplashClip)} }, - { GEN_Sound, {theoffsetof(FSplashDef, NormalSplashSound)} }, - { GEN_Class, {theoffsetof(FSplashDef, SmallSplash)} }, - { GEN_Class, {theoffsetof(FSplashDef, SplashBase)} }, - { GEN_Class, {theoffsetof(FSplashDef, SplashChunk)} }, - { GEN_Byte, {theoffsetof(FSplashDef, ChunkXVelShift)} }, - { GEN_Byte, {theoffsetof(FSplashDef, ChunkYVelShift)} }, - { GEN_Byte, {theoffsetof(FSplashDef, ChunkZVelShift)} }, - { GEN_Fixed, {theoffsetof(FSplashDef, ChunkBaseZVel)} }, - { GEN_Bool, {theoffsetof(FSplashDef, NoAlert)} } + { GEN_Sound, {myoffsetof(FSplashDef, SmallSplashSound)} }, + { GEN_Fixed, {myoffsetof(FSplashDef, SmallSplashClip)} }, + { GEN_Sound, {myoffsetof(FSplashDef, NormalSplashSound)} }, + { GEN_Class, {myoffsetof(FSplashDef, SmallSplash)} }, + { GEN_Class, {myoffsetof(FSplashDef, SplashBase)} }, + { GEN_Class, {myoffsetof(FSplashDef, SplashChunk)} }, + { GEN_Byte, {myoffsetof(FSplashDef, ChunkXVelShift)} }, + { GEN_Byte, {myoffsetof(FSplashDef, ChunkYVelShift)} }, + { GEN_Byte, {myoffsetof(FSplashDef, ChunkZVelShift)} }, + { GEN_Fixed, {myoffsetof(FSplashDef, ChunkBaseZVel)} }, + { GEN_Bool, {myoffsetof(FSplashDef, NoAlert)} } }; static FGenericParse TerrainParser[] = { { GEN_End, {0} }, - { GEN_Splash, {theoffsetof(FTerrainDef, Splash)} }, - { GEN_Int, {theoffsetof(FTerrainDef, DamageAmount)} }, + { GEN_Splash, {myoffsetof(FTerrainDef, Splash)} }, + { GEN_Int, {myoffsetof(FTerrainDef, DamageAmount)} }, { GEN_Custom, {(size_t)ParseDamage} }, - { GEN_Int, {theoffsetof(FTerrainDef, DamageTimeMask)} }, - { GEN_Fixed, {theoffsetof(FTerrainDef, FootClip)} }, - { GEN_Float, {theoffsetof(FTerrainDef, StepVolume)} }, - { GEN_Time, {theoffsetof(FTerrainDef, WalkStepTics)} }, - { GEN_Time, {theoffsetof(FTerrainDef, RunStepTics)} }, - { GEN_Sound, {theoffsetof(FTerrainDef, LeftStepSound)} }, - { GEN_Sound, {theoffsetof(FTerrainDef, RightStepSound)} }, - { GEN_Bool, {theoffsetof(FTerrainDef, IsLiquid)} }, + { GEN_Int, {myoffsetof(FTerrainDef, DamageTimeMask)} }, + { GEN_Fixed, {myoffsetof(FTerrainDef, FootClip)} }, + { GEN_Float, {myoffsetof(FTerrainDef, StepVolume)} }, + { GEN_Time, {myoffsetof(FTerrainDef, WalkStepTics)} }, + { GEN_Time, {myoffsetof(FTerrainDef, RunStepTics)} }, + { GEN_Sound, {myoffsetof(FTerrainDef, LeftStepSound)} }, + { GEN_Sound, {myoffsetof(FTerrainDef, RightStepSound)} }, + { GEN_Bool, {myoffsetof(FTerrainDef, IsLiquid)} }, { GEN_Custom, {(size_t)ParseFriction} }, - { GEN_Bool, {theoffsetof(FTerrainDef, AllowProtection)} }, + { GEN_Bool, {myoffsetof(FTerrainDef, AllowProtection)} }, }; diff --git a/src/sdl/i_system.cpp b/src/sdl/i_system.cpp index 88850d9fe..9b3027a7d 100644 --- a/src/sdl/i_system.cpp +++ b/src/sdl/i_system.cpp @@ -353,6 +353,8 @@ void I_Quit (void) if (demorecording) G_CheckDemoStatus(); + + C_DeinitConsole(); } diff --git a/src/thingdef/thingdef_data.cpp b/src/thingdef/thingdef_data.cpp index bf0bf2e13..013415cc7 100644 --- a/src/thingdef/thingdef_data.cpp +++ b/src/thingdef/thingdef_data.cpp @@ -240,6 +240,7 @@ static FFlagDef ActorFlags[]= DEFINE_FLAG(MF7, NEVERTARGET, AActor, flags7), DEFINE_FLAG(MF7, NOTELESTOMP, AActor, flags7), DEFINE_FLAG(MF7, ALWAYSTELEFRAG, AActor, flags7), + DEFINE_FLAG(MF7, WEAPONSPAWN, AActor, flags7), // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), diff --git a/src/version.h b/src/version.h index 6b6361d26..6d24c3fe8 100644 --- a/src/version.h +++ b/src/version.h @@ -51,7 +51,7 @@ const char *GetVersionString(); // Version identifier for network games. // Bump it every time you do a release unless you're certain you // didn't change anything that will affect sync. -#define NETGAMEVERSION 229 +#define NETGAMEVERSION 230 // Version stored in the ini's [LastRun] section. // Bump it if you made some configuration change that you want to @@ -61,11 +61,11 @@ const char *GetVersionString(); // Protocol version used in demos. // Bump it if you change existing DEM_ commands or add new ones. // Otherwise, it should be safe to leave it alone. -#define DEMOGAMEVERSION 0x21A +#define DEMOGAMEVERSION 0x21B // Minimum demo version we can play. // Bump it whenever you change or remove existing DEM_ commands. -#define MINDEMOVERSION 0x215 +#define MINDEMOVERSION 0x21B // SAVEVER is the version of the information stored in level snapshots. // Note that SAVEVER is not directly comparable to VERSION. @@ -76,7 +76,7 @@ const char *GetVersionString(); // Use 4500 as the base git save version, since it's higher than the // SVN revision ever got. -#define SAVEVER 4509 +#define SAVEVER 4510 #define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x) diff --git a/src/win32/i_system.cpp b/src/win32/i_system.cpp index 4690c253d..4248df274 100644 --- a/src/win32/i_system.cpp +++ b/src/win32/i_system.cpp @@ -781,6 +781,8 @@ void I_Quit() { G_CheckDemoStatus(); } + + C_DeinitConsole(); } diff --git a/wadsrc/static/actors/shared/inventory.txt b/wadsrc/static/actors/shared/inventory.txt index ed113c4df..e293282b8 100644 --- a/wadsrc/static/actors/shared/inventory.txt +++ b/wadsrc/static/actors/shared/inventory.txt @@ -335,6 +335,7 @@ Actor Weapon : Inventory native Weapon.BobSpeed 1.0 Weapon.BobRangeX 1.0 Weapon.BobRangeY 1.0 + +WEAPONSPAWN States { LightDone: @@ -362,4 +363,7 @@ Actor WeaponHolder : Inventory native +INVENTORY.UNDROPPABLE } -Actor WeaponPiece : Inventory native {} +Actor WeaponPiece : Inventory native +{ + +WEAPONSPAWN +} diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 52a77475c..a251ede44 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1157,7 +1157,7 @@ OptionValue FallingDM 3, "Strife" } -OptionValue JumpCrouch +OptionValue JumpCrouchFreeLook { 0, "Default" 1, "Off" @@ -1189,9 +1189,9 @@ OptionMenu GameplayOptions Option "Degeneration", "sv_degeneration", "YesNo" Option "Allow Autoaim", "sv_noautoaim", "NoYes" Option "Allow Suicide", "sv_disallowsuicide", "NoYes" - Option "Allow jump", "sv_jump", "JumpCrouch" - Option "Allow crouch", "sv_crouch", "JumpCrouch" - Option "Allow freelook", "sv_nofreelook", "NoYes" + Option "Allow jump", "sv_jump", "JumpCrouchFreeLook" + Option "Allow crouch", "sv_crouch", "JumpCrouchFreeLook" + Option "Allow freelook", "sv_freelook", "JumpCrouchFreeLook" Option "Allow FOV", "sv_nofov", "NoYes" Option "Allow BFG aiming", "sv_nobfgaim", "NoYes" Option "Allow automap", "sv_noautomap", "NoYes" diff --git a/zdoom.vcproj b/zdoom.vcproj index 8f9834b85..8f5ffd242 100644 --- a/zdoom.vcproj +++ b/zdoom.vcproj @@ -522,6 +522,10 @@ RelativePath=".\src\c_console.cpp" > + +