diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 8ba88acb1..c4a85bfad 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -6482,7 +6482,7 @@ static void CheckPresentPlayers(void) } // Handle "client-to-client" auth challenge flow. -static void UpdateChallenges(void) +void UpdateChallenges(void) { if (!(Playing() && netgame)) return; @@ -6501,7 +6501,7 @@ static void UpdateChallenges(void) } else // client { - if (leveltime <= CHALLENGEALL_START) + if (leveltime < CHALLENGEALL_START) expectChallenge = true; if (leveltime == CHALLENGEALL_START) @@ -6663,8 +6663,6 @@ void NetUpdate(void) UpdatePingTable(); - UpdateChallenges(); - if (client) maketic = neededtic; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 06391f159..aff074f51 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -620,6 +620,9 @@ void CL_TimeoutServerList(void); // Is there a game running boolean Playing(void); +// Advance client-to-client pubkey verification flow +void UpdateChallenges(void); + // Broadcasts special packets to other players // to notify of game exit void D_QuitNetGame(void); diff --git a/src/d_main.cpp b/src/d_main.cpp index 732a4e82b..2070f9a09 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -330,8 +330,9 @@ gamestate_t wipegamestate = GS_LEVEL; INT16 wipetypepre = -1; INT16 wipetypepost = -1; -static void D_Display(void) +static bool D_Display(void) { + bool ranwipe = false; boolean forcerefresh = false; static boolean wipe = false; INT32 wipedefindex = 0; @@ -342,7 +343,7 @@ static void D_Display(void) if (!dedicated) { if (nodrawers) - return; // for comparative timing/profiling + return false; // for comparative timing/profiling // Lactozilla: Switching renderers works by checking // if the game has to do it right when the frame @@ -411,6 +412,7 @@ static void D_Display(void) F_WipeColorFill(31); F_WipeEndScreen(); F_RunWipe(wipedefindex, wipetypepre, gamestate != GS_MENU, "FADEMAP0", false, false); + ranwipe = true; } if (G_GamestateUsesLevel() == false && rendermode != render_none) @@ -424,6 +426,7 @@ static void D_Display(void) else //dedicated servers { F_RunWipe(wipedefindex, wipedefs[wipedefindex], gamestate != GS_MENU, "FADEMAP0", false, false); + ranwipe = true; wipegamestate = gamestate; } @@ -433,7 +436,7 @@ static void D_Display(void) wipetypepre = -1; if (dedicated) //bail out after wipe logic - return; + return false; // Catch runaway clipping rectangles. V_ClearClipRect(); @@ -710,6 +713,7 @@ static void D_Display(void) F_WipeEndScreen(); F_RunWipe(wipedefindex, wipedefs[wipedefindex], gamestate != GS_MENU && gamestate != GS_TITLESCREEN, "FADEMAP0", true, false); + ranwipe = true; } // reset counters so timedemo doesn't count the wipe duration @@ -765,6 +769,8 @@ static void D_Display(void) I_FinishUpdate(); // page flip or blit buffer ps_swaptime = I_GetPreciseTime() - ps_swaptime; } + + return ranwipe; } // ========================================================================= @@ -781,6 +787,7 @@ void D_SRB2Loop(void) boolean interp = false; boolean doDisplay = false; + int frameskip = 0; if (dedicated) server = true; @@ -831,6 +838,8 @@ void D_SRB2Loop(void) capbudget = (precise_t) budget; } + bool ranwipe = false; + I_UpdateTime(cv_timescale.value); if (lastwipetic) @@ -927,9 +936,9 @@ void D_SRB2Loop(void) rendertimefrac_unpaused = FRACUNIT; } - if (interp || doDisplay) + if ((interp || doDisplay) && !frameskip) { - D_Display(); + ranwipe = D_Display(); } #ifdef HWRENDER @@ -980,6 +989,23 @@ void D_SRB2Loop(void) finishprecise = I_GetPreciseTime(); deltasecs = (double)((INT64)(finishprecise - enterprecise)) / I_GetPrecisePrecision(); deltatics = deltasecs * NEWTICRATE; + + // If time spent this game loop exceeds a single tic, + // it's probably because of rendering. + // + // Skip rendering the next frame, up to a limit of 3 + // frames before a frame is rendered no matter what. + // + // Wipes run an inner loop and artificially increase + // the measured time. + if (!ranwipe && frameskip < 3 && deltatics > 1.0) + { + frameskip++; + } + else + { + frameskip = 0; + } } } diff --git a/src/d_player.h b/src/d_player.h index 1a82272e3..593b3fee3 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -71,7 +71,7 @@ typedef enum { PF_GODMODE = 1<<0, // Immortal. No lightsnake from pits either - // free: 1<<1 + PF_UPDATEMYRESPAWN = 1<<1, // Scripted sequences / fastfall can set this to force a respawn waypoint update PF_AUTOROULETTE = 1<<2, // Accessibility: Non-deterministic item box, no manual stop. @@ -886,6 +886,8 @@ struct player_t UINT8 sliptideZipDelay; // How long since the last sliptide? Only boost once you've been straightened out for a bit. UINT16 sliptideZipBoost; // The actual boost granted from sliptideZip. + UINT8 lastsafelap; + mobj_t *stumbleIndicator; mobj_t *sliptideZipIndicator; mobj_t *whip; diff --git a/src/deh_soc.c b/src/deh_soc.c index bf9d4a9a0..c3c67bcac 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3411,8 +3411,6 @@ void readmaincfg(MYFILE *f, boolean mainfile) } else if (fastcmp(word2, "RINGRACERS")) ttmode = TTMODE_RINGRACERS; - else if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) - ttmode = TTMODE_OLD; titlechanged = true; } else if (fastcmp(word, "TITLEPICSNAME")) diff --git a/src/deh_tables.c b/src/deh_tables.c index 31f45d6f9..458c3aed0 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -6016,7 +6016,7 @@ const char *const MAPTHINGFLAG_LIST[4] = { const char *const PLAYERFLAG_LIST[] = { "GODMODE", - "\x01", // free: 1<<1 (name un-matchable) + "UPDATEMYRESPAWN", // Scripted sequences / fastfall can set this to force a respawn waypoint update "AUTOROULETTE", // Item box accessibility diff --git a/src/f_finale.c b/src/f_finale.c index 5ded47495..95fb2a53b 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1316,7 +1316,7 @@ static void F_InitMenuPresValues(void) curbgcolor = -1; curbgxspeed = titlescrollxspeed; curbgyspeed = titlescrollyspeed; - curbghide = false; + curbghide = true; curhidepics = hidetitlepics; curttmode = ttmode; @@ -1426,15 +1426,13 @@ static void F_CacheTitleScreen(void) { UINT16 i; - switch(curttmode) + switch (curttmode) { case TTMODE_NONE: break; - case TTMODE_OLD: - break; // idk do we still want this? - case TTMODE_RINGRACERS: + { if (!M_SecretUnlocked(SECRET_ALTTITLE, true)) { CV_StealthSetValue(&cv_alttitle, 0); @@ -1452,6 +1450,7 @@ static void F_CacheTitleScreen(void) } kts_copyright = W_CachePatchName("KTSCR", PU_PATCH_LOWPRIORITY); break; + } case TTMODE_USER: { @@ -1593,36 +1592,34 @@ void F_TitleScreenDrawer(void) { boolean hidepics = false; +#if 0 if (modeattacking) return; // We likely came here from retrying. Don't do a damn thing. +#endif // Draw that sky! if (curbgcolor >= 0) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor); else if (!curbghide || !titlemapinaction || gamestate == GS_WAITINGPLAYERS) F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); - else - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Don't draw outside of the title screen, or if the patch isn't there. if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) return; - // Don't draw if title mode is set to Old/None and the patch isn't there - /* - if (!ttwing && (curttmode == TTMODE_OLD || curttmode == TTMODE_NONE)) - return; - */ - // rei|miru: use title pics? hidepics = curhidepics; if (hidepics) + { goto luahook; + } - switch(curttmode) + switch (curttmode) { case TTMODE_NONE: + { break; + } case TTMODE_RINGRACERS: { @@ -1657,64 +1654,11 @@ void F_TitleScreenDrawer(void) V_DrawFixedPatch(0, 0, FRACUNIT, 0, kts_bumper, NULL); V_DrawFixedPatch(0, 0, FRACUNIT, 0, kts_copyright, NULL); - - F_VersionDrawer(); break; } - case TTMODE_OLD: -/* - if (finalecount < 50) - { - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - - V_DrawSmallScaledPatch(84, 36, 0, ttbanner); - - if (finalecount >= 20) - V_DrawSmallScaledPatch(84, 87, 0, ttkart); - else if (finalecount >= 10) - V_DrawSciencePatch((84<>1; - - V_DrawSciencePatch(0, 0 - FixedMul(40< -1 && ttuser[curttloop]) @@ -1728,8 +1672,11 @@ void F_TitleScreenDrawer(void) V_DrawSciencePatch(curttx< 0) M_DrawMenuMessage(); } diff --git a/src/f_finale.h b/src/f_finale.h index 517b59ce3..b3e4b4545 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -81,7 +81,6 @@ typedef enum { TTMODE_NONE = 0, TTMODE_RINGRACERS, - TTMODE_OLD, TTMODE_USER } ttmode_enum; diff --git a/src/g_game.c b/src/g_game.c index 4193ffe86..94f1b6a77 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1201,8 +1201,11 @@ void G_StartTitleCard(void) return; } + // start the title card + WipeStageTitle = (gamestate == GS_LEVEL); + // play the sound - if (gamestate != GS_CEREMONY) + if (WipeStageTitle) { sfxenum_t kstart = sfx_kstart; if (K_CheckBossIntro() == true) @@ -1211,9 +1214,6 @@ void G_StartTitleCard(void) kstart = sfx_ruby2; S_StartSound(NULL, kstart); } - - // start the title card - WipeStageTitle = (gamestate == GS_LEVEL); } // diff --git a/src/k_hud.c b/src/k_hud.c index 8077cc294..b56ed1b02 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -5106,7 +5106,7 @@ void K_drawKartFreePlay(void) if (((leveltime-lt_endtime) % TICRATE) < TICRATE/2) return; - INT32 h_snap = (r_splitscreen < 2 || R_GetViewNumber() & 1) ? V_SNAPTORIGHT : V_SNAPTOLEFT; + INT32 h_snap = r_splitscreen < 2 ? V_SNAPTORIGHT | V_SLIDEIN : V_HUDTRANS; fixed_t x = ((r_splitscreen > 1 ? BASEVIDWIDTH/4 : BASEVIDWIDTH - (LAPS_X+6)) * FRACUNIT); fixed_t y = ((r_splitscreen ? BASEVIDHEIGHT/2 : BASEVIDHEIGHT) - 20) * FRACUNIT; @@ -5114,7 +5114,7 @@ void K_drawKartFreePlay(void) FRACUNIT, FRACUNIT, FRACUNIT, - V_HUDTRANS|V_SLIDEIN|V_SNAPTOBOTTOM|h_snap|V_SPLITSCREEN, + V_SNAPTOBOTTOM|h_snap|V_SPLITSCREEN, KART_FONT, "FREE PLAY" ) / (r_splitscreen > 1 ? 2 : 1); @@ -5125,7 +5125,7 @@ void K_drawKartFreePlay(void) FRACUNIT, FRACUNIT, FRACUNIT, - V_HUDTRANS|V_SLIDEIN|V_SNAPTOBOTTOM|h_snap|V_SPLITSCREEN, + V_SNAPTOBOTTOM|h_snap|V_SPLITSCREEN, NULL, KART_FONT, "FREE PLAY" @@ -5244,11 +5244,12 @@ static void K_DrawWaypointDebugger(void) if (netgame) { - V_DrawString(8, 146, 0, va("Online griefing: [%u, %u]", stplyr->griefValue/TICRATE, stplyr->griefStrikes)); + V_DrawString(8, 136, 0, va("Online griefing: [%u, %u]", stplyr->griefValue/TICRATE, stplyr->griefStrikes)); } - V_DrawString(8, 156, 0, va("Current Waypoint ID: %d", K_GetWaypointID(stplyr->currentwaypoint))); - V_DrawString(8, 166, 0, va("Next Waypoint ID: %d%s", K_GetWaypointID(stplyr->nextwaypoint), ((stplyr->pflags & PF_WRONGWAY) ? " (WRONG WAY)" : ""))); + V_DrawString(8, 146, 0, va("Current Waypoint ID: %d", K_GetWaypointID(stplyr->currentwaypoint))); + V_DrawString(8, 156, 0, va("Next Waypoint ID: %d%s", K_GetWaypointID(stplyr->nextwaypoint), ((stplyr->pflags & PF_WRONGWAY) ? " (WRONG WAY)" : ""))); + V_DrawString(8, 166, 0, va("Respawn Waypoint ID: %d", K_GetWaypointID(stplyr->respawn.wp))); V_DrawString(8, 176, 0, va("Finishline Distance: %d", stplyr->distancetofinish)); if (numcheatchecks > 0) diff --git a/src/k_kart.c b/src/k_kart.c index 00bc70862..405e9ff70 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8990,6 +8990,12 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player) updaterespawn = false; } + if (player->pflags & PF_UPDATEMYRESPAWN) + { + updaterespawn = true; + player->pflags &= ~PF_UPDATEMYRESPAWN; + } + // Respawn point should only be updated when we're going to a nextwaypoint if ((updaterespawn) && (player->respawn.state == RESPAWNST_NONE) && @@ -8999,6 +9005,7 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player) (K_GetWaypointIsEnabled(bestwaypoint) == true)) { player->respawn.wp = bestwaypoint; + player->lastsafelap = player->laps; } } @@ -10725,6 +10732,8 @@ boolean K_FastFallBounce(player_t *player) if (player->mo->eflags & MFE_UNDERWATER) bounce = (117 * bounce) / 200; + player->pflags |= PF_UPDATEMYRESPAWN; + player->mo->momz = bounce * P_MobjFlip(player->mo); player->fastfall = 0; diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 16974dc85..5b3a97550 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -795,17 +795,7 @@ void M_Drawer(void) // ... but only in the MAIN MENU. I'm a picky bastard. if (currentMenu == &MainDef) { - if (customversionstring[0] != '\0') - { - V_DrawThinString(vid.dupx, vid.height - 20*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT, "Mod version:"); - V_DrawThinString(vid.dupx, vid.height - 10*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT, customversionstring); - } - else - { - F_VersionDrawer(); - } - - + F_VersionDrawer(); } // Draw message overlay when needed @@ -2680,12 +2670,20 @@ void M_DrawCupSelect(void) if (monitor == '2') { - icony = 5; + icony = 5; // by default already 7px down, so this is really 2px further up } + else if (monitor == '3') + { + icony = 6; + } } else { monitor = 'A' + (templevelsearch.cup->monitor - 10); + if (monitor == 'X') + { + icony = 11; + } } } diff --git a/src/k_respawn.c b/src/k_respawn.c index 128f0a198..c3804ffae 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -291,6 +291,7 @@ void K_DoIngameRespawn(player_t *player) player->respawn.init = true; player->respawn.fast = true; player->respawn.returnspeed = 0; + player->laps = player->lastsafelap; player->respawn.airtimer = player->airtime; player->respawn.truedeath = !!(player->pflags & PF_FAULT); @@ -405,7 +406,8 @@ static void K_MovePlayerToRespawnPoint(player_t *player) P_SetThingPosition(player->mo); // We are no longer traveling from death location to 1st waypoint, so use standard timings - player->respawn.fast = false; + if (player->respawn.fast) + player->respawn.fast = false; // At the first valid waypoint, permit extra player control options. player->respawn.init = false; @@ -415,7 +417,7 @@ static void K_MovePlayerToRespawnPoint(player_t *player) { size_t nwp = K_NextRespawnWaypointIndex(player->respawn.wp); - if (nwp == SIZE_MAX) + if (nwp == SIZE_MAX || player->respawn.wp->nextwaypoints[nwp]->mobj->movefactor) // movefactor: Block Lightsnake { player->respawn.state = RESPAWNST_DROP; return; diff --git a/src/k_tally.cpp b/src/k_tally.cpp index 36f5ed0d1..eba1452c8 100644 --- a/src/k_tally.cpp +++ b/src/k_tally.cpp @@ -909,10 +909,13 @@ void level_tally_t::Draw(void) { fade = (5 * transition_f); } + V_DrawFadeFill( - 0, 0, - v_width, v_height, - V_SPLITSCREEN, + (vid.width / 2) * (r_splitscreen > 1 && R_GetViewNumber() & 1), + (vid.height / 2) * (R_GetViewNumber() > (r_splitscreen > 1)), + vid.width / (r_splitscreen > 1 ? 2 : 1), + vid.height / (r_splitscreen ? 2 : 1), + V_NOSCALESTART, 31, fade ); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 65844d2f0..6fe1e325d 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -329,6 +329,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->sliptideZipDelay); else if (fastcmp(field,"sliptideZipBoost")) lua_pushinteger(L, plr->sliptideZipBoost); + else if (fastcmp(field,"lastsafelap")) + lua_pushinteger(L, plr->lastsafelap); else if (fastcmp(field,"instaWhipCharge")) lua_pushinteger(L, plr->instaWhipCharge); else if (fastcmp(field,"instaWhipCooldown")) @@ -809,6 +811,8 @@ static int player_set(lua_State *L) plr->sliptideZipDelay = luaL_checkinteger(L, 3); else if (fastcmp(field,"sliptideZipBoost")) plr->sliptideZipBoost = luaL_checkinteger(L, 3); + else if (fastcmp(field,"lastsafelap")) + plr->lastsafelap = luaL_checkinteger(L, 3); else if (fastcmp(field,"instaWhipCharge")) plr->instaWhipCharge = luaL_checkinteger(L, 3); else if (fastcmp(field,"instaWhipCooldown")) diff --git a/src/objects/random-item.c b/src/objects/random-item.c index ecd5ee27f..b2dcc31fe 100644 --- a/src/objects/random-item.c +++ b/src/objects/random-item.c @@ -125,10 +125,7 @@ void Obj_RandomItemVisuals(mobj_t *mobj) { mobj->extravalue1++; - if (specialstageinfo.valid) // Setting the timer in this case probably looks kinda goofy, but P_ItemPop checks xval1, not states. - mobj->extravalue1 = max(mobj->extravalue1, RINGBOX_TIME); // I will change this if this logic ever becomes even slightly more complicated. - - if (mobj->extravalue1 == RINGBOX_TIME) + if (mobj->extravalue1 == RINGBOX_TIME || specialstageinfo.valid) { // Sync the position in RINGBOX and RANDOMITEM animations. statenum_t animDelta = mobj->state - states - S_RINGBOX1; diff --git a/src/p_inter.c b/src/p_inter.c index c6a2eea6c..d487bd20e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -421,7 +421,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_SetTarget(&special->target, toucher); P_UpdateLastPickup(player, cheesetype); // P_KillMobj(special, toucher, toucher, DMG_NORMAL); - if (special->extravalue1 >= RINGBOX_TIME) + + statenum_t specialstate = special->state - states; + + if (specialstate >= S_RANDOMITEM1 && specialstate <= S_RANDOMITEM12) K_StartItemRoulette(player, false); else K_StartItemRoulette(player, true); diff --git a/src/p_mobj.c b/src/p_mobj.c index 524c0f8a8..e04cd2c5d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13717,6 +13717,14 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj) { mobj->extravalue2 = 0; } + if (mthing->thing_args[2] & TMWPF_BLOCKLIGHTSNAKE) + { + mobj->movefactor = 1; // If a lightsnaking player reaches here, drop instantly. + } + else + { + mobj->movefactor = 0; + } // Sryder 2018-12-7: Grabbed this from the old MT_BOSS3WAYPOINT section so they'll be in the waypointcap instead P_SetTarget(&mobj->tracer, waypointcap); diff --git a/src/p_saveg.c b/src/p_saveg.c index 29229935f..86baa506e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -539,6 +539,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].sliptideZipDelay); WRITEUINT16(save->p, players[i].sliptideZipBoost); + WRITEUINT8(save->p, players[i].lastsafelap); + WRITEMEM(save->p, players[i].public_key, PUBKEYLENGTH); WRITEUINT8(save->p, players[i].instaWhipCharge); @@ -1052,6 +1054,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].sliptideZipDelay = READUINT8(save->p); players[i].sliptideZipBoost = READUINT16(save->p); + players[i].lastsafelap = READUINT8(save->p); + READMEM(save->p, players[i].public_key, PUBKEYLENGTH); players[i].instaWhipCharge = READUINT8(save->p); diff --git a/src/p_setup.c b/src/p_setup.c index 1ebebb383..e7759aa1b 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3338,7 +3338,7 @@ static void P_ProcessLinedefsAfterSidedefs(void) if (ld->tripwire) { - ld->blendmode = (subtractTripwire ? AST_SUBTRACT : AST_ADD); + ld->blendmode = (subtractTripwire ? AST_COPY : AST_ADD); ld->alpha = FRACUNIT; } diff --git a/src/p_spec.c b/src/p_spec.c index 33609787a..5071735a8 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2142,6 +2142,8 @@ static void K_HandleLapDecrement(player_t *player) { if (player) { + if (player->respawn.state == RESPAWNST_MOVE) + return; if ((player->cheatchecknum == 0) && (player->laps > 0)) { player->cheatchecknum = numcheatchecks; diff --git a/src/p_spec.h b/src/p_spec.h index af0b8e7fe..f1f611213 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -129,10 +129,11 @@ typedef enum typedef enum { - TMWPF_DISABLED = 1, - TMWPF_SHORTCUT = 1<<1, - TMWPF_NORESPAWN = 1<<2, - TMWPF_FINISHLINE = 1<<3, + TMWPF_DISABLED = 1, + TMWPF_SHORTCUT = 1<<1, + TMWPF_NORESPAWN = 1<<2, + TMWPF_FINISHLINE = 1<<3, + TMWPF_BLOCKLIGHTSNAKE = 1<<4 } textmapwaypointflags_t; typedef enum diff --git a/src/p_tick.c b/src/p_tick.c index 957dc93f0..1ad1c8dd2 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -28,6 +28,7 @@ #include "i_video.h" // rendermode #include "r_main.h" #include "r_fps.h" +#include "d_clisrv.h" // UpdateChallenges // Object place #include "m_cheat.h" @@ -966,6 +967,9 @@ void P_Ticker(boolean run) ps_lua_thinkframe_time = I_GetPreciseTime() - ps_lua_thinkframe_time; } + if (run) + UpdateChallenges(); + // Run shield positioning P_RunOverlays(); diff --git a/src/st_stuff.c b/src/st_stuff.c index 451de0f16..305f50266 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1351,7 +1351,7 @@ void ST_DrawServerSplash(boolean timelimited) V_DrawFixedPatch( gridX, gridY, FRACUNIT, - (V_SNAPTOLEFT|V_SNAPTOBOTTOM) | V_SUBTRACT | V_VFLIP | gridOpacity, + (V_SNAPTOLEFT|V_SNAPTOTOP) | V_SUBTRACT | V_VFLIP | gridOpacity, gridPatch, NULL ); @@ -1369,7 +1369,7 @@ void ST_DrawServerSplash(boolean timelimited) V_DrawFixedPatch( iconX, iconY, FRACUNIT, - (V_SNAPTORIGHT|V_SNAPTOBOTTOM) | opacityFlag, + (V_SNAPTORIGHT|V_SNAPTOTOP) | opacityFlag, iconPatch, NULL ); @@ -1379,7 +1379,7 @@ void ST_DrawServerSplash(boolean timelimited) V_DrawRightAlignedStringAtFixed( textX, textY, - (V_SNAPTORIGHT|V_SNAPTOBOTTOM) | opacityFlag, + (V_SNAPTORIGHT|V_SNAPTOTOP) | opacityFlag, connectedservername );