From a85682983bc0dacc52af79d5e34f0ee5c6ae8ff7 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 25 Sep 2018 22:33:22 +0100 Subject: [PATCH 01/18] Manual has more pages and less terrible large-size support. --- src/m_menu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 5d0448ce..071fdc42 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -663,7 +663,8 @@ static menuitem_t MISC_HelpMenu[] = {IT_KEYHANDLER | IT_NOTHING, NULL, "MANUAL09", M_HandleImageDef, 1}, {IT_KEYHANDLER | IT_NOTHING, NULL, "MANUAL10", M_HandleImageDef, 1}, {IT_KEYHANDLER | IT_NOTHING, NULL, "MANUAL11", M_HandleImageDef, 1}, - {IT_KEYHANDLER | IT_NOTHING, NULL, "MANUAL12", M_HandleImageDef, 0}, + {IT_KEYHANDLER | IT_NOTHING, NULL, "MANUAL12", M_HandleImageDef, 1}, + {IT_KEYHANDLER | IT_NOTHING, NULL, "MANUAL99", M_HandleImageDef, 0}, }; // -------------------------------- @@ -4264,7 +4265,7 @@ static void M_DrawImageDef(void) else { patch_t *patch = W_CachePatchName(currentMenu->menuitems[itemOn].text,PU_CACHE); - if (patch->width <= BASEVIDWIDTH) + if (patch->height <= BASEVIDHEIGHT) V_DrawScaledPatch(0,0,0,patch); else V_DrawSmallScaledPatch(0,0,0,patch); From 8aff76b8c301861edb0f574b17d1d41b539fd6a0 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 25 Sep 2018 22:37:04 +0100 Subject: [PATCH 02/18] Just realised the inputwheel jittering in Sryder's videos was my fault, so fix this even better --- src/k_kart.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ed91616b..f4b9e93a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7096,10 +7096,7 @@ static void K_drawInput(void) } if (pn < 0) - { splitflags |= V_FLIP; // right turn - x--; - } target = abs(pn); if (target > 4) From e4f6015b50a3d9e8ef01f73340504364afd6692c Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 27 Sep 2018 18:11:43 +0100 Subject: [PATCH 03/18] Revamp flat alignment to be consistent across all renderer functions except for the software slope renderer, which me and fickle tried our best at but couldn't get to work. (This is a backport of 2.2 code that slightly postdates the improved flat alignment Kart's had for a while.) This fixes #11. --- src/hardware/hw_main.c | 18 ++++---- src/p_spec.c | 6 +-- src/r_bsp.c | 44 +++----------------- src/r_plane.c | 93 ++++++++++++++++++++++++++++++++++-------- 4 files changed, 94 insertions(+), 67 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 6a664d39..54362762 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -643,13 +643,13 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is { scrollx = FIXED_TO_FLOAT(FOFsector->floor_xoffs)/fflatsize; scrolly = FIXED_TO_FLOAT(FOFsector->floor_yoffs)/fflatsize; - angle = FOFsector->floorpic_angle>>ANGLETOFINESHIFT; + angle = FOFsector->floorpic_angle; } else // it's a ceiling { scrollx = FIXED_TO_FLOAT(FOFsector->ceiling_xoffs)/fflatsize; scrolly = FIXED_TO_FLOAT(FOFsector->ceiling_yoffs)/fflatsize; - angle = FOFsector->ceilingpic_angle>>ANGLETOFINESHIFT; + angle = FOFsector->ceilingpic_angle; } } else if (gr_frontsector) @@ -658,24 +658,26 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is { scrollx = FIXED_TO_FLOAT(gr_frontsector->floor_xoffs)/fflatsize; scrolly = FIXED_TO_FLOAT(gr_frontsector->floor_yoffs)/fflatsize; - angle = gr_frontsector->floorpic_angle>>ANGLETOFINESHIFT; + angle = gr_frontsector->floorpic_angle; } else // it's a ceiling { scrollx = FIXED_TO_FLOAT(gr_frontsector->ceiling_xoffs)/fflatsize; scrolly = FIXED_TO_FLOAT(gr_frontsector->ceiling_yoffs)/fflatsize; - angle = gr_frontsector->ceilingpic_angle>>ANGLETOFINESHIFT; + angle = gr_frontsector->ceilingpic_angle; } } if (angle) // Only needs to be done if there's an altered angle { + angle = InvAngle(angle)>>ANGLETOFINESHIFT; + // This needs to be done so that it scrolls in a different direction after rotation like software - tempxsow = FLOAT_TO_FIXED(scrollx); + /*tempxsow = FLOAT_TO_FIXED(scrollx); tempytow = FLOAT_TO_FIXED(scrolly); scrollx = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle)))); - scrolly = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle)))); + scrolly = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));*/ // This needs to be done so everything aligns after rotation // It would be done so that rotation is done, THEN the translation, but I couldn't get it to rotate AND scroll like software does @@ -689,7 +691,7 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is { // Hurdler: add scrolling texture on floor/ceiling v3d->sow = (float)((pv->x / fflatsize) - flatxref + scrollx); - v3d->tow = (float)(flatyref - (pv->y / fflatsize) + scrolly); + v3d->tow = (float)(-(pv->y / fflatsize) + flatyref + scrolly); //v3d->sow = (float)(pv->x / fflatsize); //v3d->tow = (float)(pv->y / fflatsize); @@ -700,7 +702,7 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is tempxsow = FLOAT_TO_FIXED(v3d->sow); tempytow = FLOAT_TO_FIXED(v3d->tow); v3d->sow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle)))); - v3d->tow = (FIXED_TO_FLOAT(-FixedMul(tempxsow, FINESINE(angle)) - FixedMul(tempytow, FINECOSINE(angle)))); + v3d->tow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle)))); } //v3d->sow = (float)(v3d->sow - flatxref + scrollx); diff --git a/src/p_spec.c b/src/p_spec.c index 17cd1f88..86ac8f00 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5821,10 +5821,8 @@ void P_SpawnSpecials(INT32 fromnetsave) } else // Otherwise, set calculated offsets such that line's v1 is the apparent origin { - fixed_t cosinecomponent = FINECOSINE(flatangle>>ANGLETOFINESHIFT); - fixed_t sinecomponent = FINESINE(flatangle>>ANGLETOFINESHIFT); - xoffs = (-FixedMul(lines[i].v1->x, cosinecomponent) % MAXFLATSIZE) + (FixedMul(lines[i].v1->y, sinecomponent) % MAXFLATSIZE); // No danger of overflow thanks to the strategically placed modulo operations. - yoffs = (FixedMul(lines[i].v1->x, sinecomponent) % MAXFLATSIZE) + (FixedMul(lines[i].v1->y, cosinecomponent) % MAXFLATSIZE); // Ditto. + xoffs = -lines[i].v1->x; + yoffs = lines[i].v1->y; } for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;) diff --git a/src/r_bsp.c b/src/r_bsp.c index 34b082ca..82a7624b 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -1126,30 +1126,12 @@ static void R_Subsector(size_t num, UINT8 viewnumber) && polysec->floorheight >= floorcenterz && (viewz < polysec->floorheight)) { - fixed_t xoff, yoff; - xoff = polysec->floor_xoffs; - yoff = polysec->floor_yoffs; - - if (po->angle != 0) { - angle_t fineshift = po->angle >> ANGLETOFINESHIFT; - - xoff -= FixedMul(FINECOSINE(fineshift), po->centerPt.x)+FixedMul(FINESINE(fineshift), po->centerPt.y); - yoff -= FixedMul(FINESINE(fineshift), po->centerPt.x)-FixedMul(FINECOSINE(fineshift), po->centerPt.y); - } else { - xoff -= po->centerPt.x; - yoff += po->centerPt.y; - } - light = R_GetPlaneLight(frontsector, polysec->floorheight, viewz < polysec->floorheight); light = 0; ffloor[numffloors].plane = R_FindPlane(polysec->floorheight, polysec->floorpic, - polysec->lightlevel, xoff, yoff, + polysec->lightlevel, polysec->floor_xoffs, polysec->floor_yoffs, polysec->floorpic_angle-po->angle, - NULL, - NULL -#ifdef POLYOBJECTS_PLANES - , po -#endif + NULL, NULL, po #ifdef ESLOPE , NULL // will ffloors be slopable eventually? #endif @@ -1174,28 +1156,12 @@ static void R_Subsector(size_t num, UINT8 viewnumber) && polysec->ceilingheight <= ceilingcenterz && (viewz > polysec->ceilingheight)) { - fixed_t xoff, yoff; - xoff = polysec->ceiling_xoffs; - yoff = polysec->ceiling_yoffs; - - if (po->angle != 0) { - angle_t fineshift = po->angle >> ANGLETOFINESHIFT; - - xoff -= FixedMul(FINECOSINE(fineshift), po->centerPt.x)+FixedMul(FINESINE(fineshift), po->centerPt.y); - yoff -= FixedMul(FINESINE(fineshift), po->centerPt.x)-FixedMul(FINECOSINE(fineshift), po->centerPt.y); - } else { - xoff -= po->centerPt.x; - yoff += po->centerPt.y; - } - light = R_GetPlaneLight(frontsector, polysec->ceilingheight, viewz < polysec->ceilingheight); light = 0; ffloor[numffloors].plane = R_FindPlane(polysec->ceilingheight, polysec->ceilingpic, - polysec->lightlevel, xoff, yoff, polysec->ceilingpic_angle-po->angle, - NULL, NULL -#ifdef POLYOBJECTS_PLANES - , po -#endif + polysec->lightlevel, polysec->ceiling_xoffs, polysec->ceiling_yoffs, + polysec->ceilingpic_angle-po->angle, + NULL, NULL, po #ifdef ESLOPE , NULL // will ffloors be slopable eventually? #endif diff --git a/src/r_plane.c b/src/r_plane.c index 0f0e2f7a..c884a9c3 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -450,19 +450,37 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, #ifdef ESLOPE if (slope); else // Don't mess with this right now if a slope is involved #endif - if (plangle != 0) - { - // Add the view offset, rotated by the plane angle. - angle_t angle = plangle>>ANGLETOFINESHIFT; - xoff += FixedMul(viewx,FINECOSINE(angle))-FixedMul(viewy,FINESINE(angle)); - yoff += -FixedMul(viewx,FINESINE(angle))-FixedMul(viewy,FINECOSINE(angle)); - } - else { xoff += viewx; yoff -= viewy; + if (plangle != 0) + { + // Add the view offset, rotated by the plane angle. + fixed_t cosinecomponent = FINECOSINE(plangle>>ANGLETOFINESHIFT); + fixed_t sinecomponent = FINESINE(plangle>>ANGLETOFINESHIFT); + fixed_t oldxoff = xoff; + xoff = FixedMul(xoff,cosinecomponent)+FixedMul(yoff,sinecomponent); + yoff = -FixedMul(oldxoff,sinecomponent)+FixedMul(yoff,cosinecomponent); + } } +#ifdef POLYOBJECTS_PLANES + if (polyobj) + { + if (polyobj->angle != 0) + { + angle_t fineshift = polyobj->angle >> ANGLETOFINESHIFT; + xoff -= FixedMul(FINECOSINE(fineshift), polyobj->centerPt.x)+FixedMul(FINESINE(fineshift), polyobj->centerPt.y); + yoff -= FixedMul(FINESINE(fineshift), polyobj->centerPt.x)-FixedMul(FINECOSINE(fineshift), polyobj->centerPt.y); + } + else + { + xoff -= polyobj->centerPt.x; + yoff += polyobj->centerPt.y; + } + } +#endif + // This appears to fix the Nimbus Ruins sky bug. if (picnum == skyflatnum && pfloor) { @@ -488,6 +506,7 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, && !pfloor && !check->ffloor && check->viewx == viewx && check->viewy == viewy && check->viewz == viewz && check->viewangle == viewangle + && check->plangle == plangle #ifdef ESLOPE && check->slope == slope #endif @@ -974,23 +993,65 @@ void R_DrawSinglePlane(visplane_t *pl) #ifdef ESLOPE if (pl->slope) { // Potentially override other stuff for now cus we're mean. :< But draw a slope plane! - // I copied ZDoom's code and adapted it to SRB2... -Red + // I copied ZDoom's code and adapted it to SRB2... -fickle floatv3_t p, m, n; float ang; float vx, vy, vz; - float fudge; // compiler complains when P_GetZAt is used in FLOAT_TO_FIXED directly // use this as a temp var to store P_GetZAt's return value each time fixed_t temp; + // Okay, look, don't ask me why this works, but without this setup there's a disgusting-looking misalignment with the textures. -fickle + const float fudge = ((1<plangle & (ANGLE_90-1)); - xoffs -= (pl->slope->o.x + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1); - yoffs += (pl->slope->o.y + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1); + if (hack) + { + /* + Essentially: We can't & the components along the regular axes when the plane is rotated. + This is because the distance on each regular axis in order to loop is different. + We rotate them, & the components, add them together, & them again, and then rotate them back. + These three seperate & operations are done per axis in order to prevent overflows. + toast 10/04/17 + --- + ...of coooourse, this still isn't perfect. but it looks... merely kind of grody, rather than + completely wrong? idk. i'm just backporting this to kart right now. if anyone else wants to + ever try dig around: it's drifting towards 0,0, and no, multiplying by fudge doesn't fix it. + toast 27/09/18 + */ - // Okay, look, don't ask me why this works, but without this setup there's a disgusting-looking misalignment with the textures. -Red - fudge = ((1<>ANGLETOFINESHIFT); + const fixed_t sinecomponent = FINESINE(hack>>ANGLETOFINESHIFT); + + const fixed_t modmask = ((1 << (32-nflatshiftup)) - 1); + + fixed_t ox = (FixedMul(pl->slope->o.x,cosinecomponent) & modmask) - (FixedMul(pl->slope->o.y,sinecomponent) & modmask); + fixed_t oy = (-FixedMul(pl->slope->o.x,sinecomponent) & modmask) - (FixedMul(pl->slope->o.y,cosinecomponent) & modmask); + + temp = ox & modmask; + oy &= modmask; + ox = FixedMul(temp,cosinecomponent)+FixedMul(oy,-sinecomponent); // negative sine for opposite direction + oy = -FixedMul(temp,-sinecomponent)+FixedMul(oy,cosinecomponent); + + temp = xoffs; + xoffs = (FixedMul(temp,cosinecomponent) & modmask) + (FixedMul(yoffs,sinecomponent) & modmask); + yoffs = (-FixedMul(temp,sinecomponent) & modmask) + (FixedMul(yoffs,cosinecomponent) & modmask); + + temp = xoffs & modmask; + yoffs &= modmask; + xoffs = FixedMul(temp,cosinecomponent)+FixedMul(yoffs,-sinecomponent); // ditto + yoffs = -FixedMul(temp,-sinecomponent)+FixedMul(yoffs,cosinecomponent); + + xoffs -= (pl->slope->o.x - ox); + yoffs += (pl->slope->o.y + oy); + } + else + { + xoffs &= ((1 << (32-nflatshiftup))-1); + yoffs &= ((1 << (32-nflatshiftup))-1); + xoffs -= (pl->slope->o.x + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1); + yoffs += (pl->slope->o.y + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1); + } xoffs = (fixed_t)(xoffs*fudge); yoffs = (fixed_t)(yoffs/fudge); From 7f5b5ecb60ee7c63da3de30f9000922388707c5c Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 27 Sep 2018 18:32:07 +0100 Subject: [PATCH 04/18] Spring *panels* now use `sfx_kc2f` again (but pogo spring *items* still do `sfx_kpogos`, in case you were worried). --- src/k_kart.c | 8 ++++---- src/k_kart.h | 2 +- src/lua_baselib.c | 4 ++-- src/p_map.c | 2 +- src/p_mobj.c | 6 +++--- src/p_spec.c | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f4b9e93a..20313da9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3031,7 +3031,7 @@ static void K_DoSPB(player_t *victim, player_t *source) P_DamageMobj(victim->mo, source->mo, source->mo, 65); } -void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, boolean mute) +void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) { const fixed_t vscale = mapheaderinfo[gamemap-1]->mobj_scale + (mo->scale - mapheaderinfo[gamemap-1]->mobj_scale); @@ -3083,8 +3083,8 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, boolean mute) else mo->momz = FixedMul(vertispeed, vscale); - if (!mute) - S_StartSound(mo, sfx_kpogos); + if (sound) + S_StartSound(mo, (sound == 1 ? sfx_kc2f : sfx_kpogos)); } void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source) @@ -4775,7 +4775,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) && !player->kartstuff[k_pogospring]) { K_PlayBoostTaunt(player->mo); - K_DoPogoSpring(player->mo, 32<mo, 32<kartstuff[k_pogospring] = 1; player->kartstuff[k_itemamount]--; } diff --git a/src/k_kart.h b/src/k_kart.h index 7c37ef67..7cab42a5 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -37,7 +37,7 @@ void K_SpawnSparkleTrail(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent); void K_DriftDustHandling(mobj_t *spawner); void K_DoSneaker(player_t *player, boolean doPFlag); -void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, boolean mute); +void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound); void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source); void K_UpdateHnextList(player_t *player, boolean clean); void K_DropHnextList(player_t *player); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 7c44c796..2d287d0f 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2231,11 +2231,11 @@ static int lib_kDoPogoSpring(lua_State *L) { mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); fixed_t vertispeed = luaL_checkfixed(L, 2); - boolean mute = luaL_checkboolean(L, 3); + UINT8 sound = luaL_checkinteger(L, 3); NOHUD if (!mo) return LUA_ErrInvalid(L, "mobj_t"); - K_DoPogoSpring(mo, vertispeed, mute); + K_DoPogoSpring(mo, vertispeed, sound); return 0; } diff --git a/src/p_map.c b/src/p_map.c index b249f362..f6f6b9b5 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -316,7 +316,7 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) break; if (object->player) object->player->kartstuff[k_pogospring] = 1; - K_DoPogoSpring(object, 0, true); + K_DoPogoSpring(object, 0, 0); return; } else diff --git a/src/p_mobj.c b/src/p_mobj.c index 0f065733..6058267d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8035,7 +8035,7 @@ void P_MobjThinker(mobj_t *mobj) if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) - K_DoPogoSpring(mobj, 0, false); + K_DoPogoSpring(mobj, 0, 1); } if (mobj->threshold > 0) @@ -8110,7 +8110,7 @@ void P_MobjThinker(mobj_t *mobj) if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) - K_DoPogoSpring(mobj, 0, false); + K_DoPogoSpring(mobj, 0, 1); break; } @@ -8139,7 +8139,7 @@ void P_MobjThinker(mobj_t *mobj) if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) - K_DoPogoSpring(mobj, 0, false); + K_DoPogoSpring(mobj, 0, 1); } if (mobj->threshold > 0) diff --git a/src/p_spec.c b/src/p_spec.c index 86ac8f00..ab47fec3 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3790,7 +3790,7 @@ DoneSection2: P_InstaThrust(player->mo, player->mo->angle, minspeed); player->kartstuff[k_pogospring] = 1; - K_DoPogoSpring(player->mo, 0, false); + K_DoPogoSpring(player->mo, 0, 1); } break; @@ -3813,7 +3813,7 @@ DoneSection2: P_InstaThrust(player->mo, player->mo->angle, minspeed); player->kartstuff[k_pogospring] = 2; - K_DoPogoSpring(player->mo, 0, false); + K_DoPogoSpring(player->mo, 0, 1); } break; From fb102f8131cf534898a04afb525694e239153f47 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 27 Sep 2018 18:39:54 +0100 Subject: [PATCH 05/18] Fix dash-dust spawning not happening when drop-dashing, despite its function being called. --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 20313da9..650a2149 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1277,7 +1277,7 @@ static void K_SpawnDashDustRelease(player_t *player) if (!P_IsObjectOnGround(player->mo)) return; - if (player->speed == 0) + if (!player->speed && !player->kartstuff[k_startboost]) return; travelangle = player->mo->angle; From 169411e3dac6f5c9fa4f9d4526ce0d0d39551e54 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 27 Sep 2018 21:38:19 +0100 Subject: [PATCH 06/18] Disable `cv_joinnextround` behind `#define VANILLAJOINNEXTROUND`. --- src/d_clisrv.c | 6 ++++++ src/d_clisrv.h | 6 +++++- src/m_menu.c | 4 +++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 63393690..97e6e700 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2920,7 +2920,9 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum) } consvar_t cv_allownewplayer = {"allowjoin", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL }; +#ifdef VANILLAJOINNEXTROUND consvar_t cv_joinnextround = {"joinnextround", "Off", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; /// \todo not done +#endif static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}}; consvar_t cv_maxplayers = {"maxplayers", "8", CV_SAVE, maxplayers_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t resynchattempts_cons_t[] = {{0, "MIN"}, {20, "MAX"}, {0, NULL}}; @@ -2966,7 +2968,9 @@ void D_ClientServerInit(void) RegisterNetXCmd(XD_ADDPLAYER, Got_AddPlayer); #ifndef NONET CV_RegisterVar(&cv_allownewplayer); +#ifdef VANILLAJOINNEXTROUND CV_RegisterVar(&cv_joinnextround); +#endif CV_RegisterVar(&cv_showjoinaddress); CV_RegisterVar(&cv_resynchattempts); CV_RegisterVar(&cv_blamecfail); @@ -3519,8 +3523,10 @@ static void HandleConnect(SINT8 node) // you get a free second before desynch checks. use it wisely. SV_InitResynchVars(node); +#ifdef VANILLAJOINNEXTROUND if (cv_joinnextround.value && gameaction == ga_nothing) G_SetGamestate(GS_WAITINGPLAYERS); +#endif if (!SV_SendServerConfig(node)) { G_SetGamestate(backupstate); diff --git a/src/d_clisrv.h b/src/d_clisrv.h index c8e8b008..e2a6ed7c 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -497,7 +497,11 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; #endif -extern consvar_t cv_joinnextround, cv_allownewplayer, cv_maxplayers, cv_resynchattempts, cv_blamecfail, cv_maxsend, cv_noticedownload, cv_downloadspeed; +extern consvar_t +#ifdef VANILLAJOINNEXTROUND + cv_joinnextround, +#endif + cv_allownewplayer, cv_maxplayers, cv_resynchattempts, cv_blamecfail, cv_maxsend, cv_noticedownload, cv_downloadspeed; // Used in d_net, the only dependence tic_t ExpandTics(INT32 low); diff --git a/src/m_menu.c b/src/m_menu.c index 071fdc42..bfb039c4 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1537,7 +1537,9 @@ static menuitem_t OP_ServerOptionsMenu[] = #ifndef NONET {IT_STRING | IT_CVAR, NULL, "Max. Player Count", &cv_maxplayers, 90}, {IT_STRING | IT_CVAR, NULL, "Allow Players to Join", &cv_allownewplayer, 100}, - //{IT_STRING | IT_CVAR, NULL, "Join on Map Change", &cv_joinnextround, 110}, +#ifdef VANILLAJOINNEXTROUND + {IT_STRING | IT_CVAR, NULL, "Join on Map Change", &cv_joinnextround, 110}, +#endif {IT_STRING | IT_CVAR, NULL, "Allow WAD Downloading", &cv_downloading, 110}, {IT_STRING | IT_CVAR, NULL, "Attempts to resynchronise", &cv_resynchattempts, 120}, From 21ba9921da532f2dee3cf55fd4f4125166579f8a Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 28 Sep 2018 20:10:22 +0100 Subject: [PATCH 07/18] Some credits tweaks (alphabetical ordering plus new names, plus slight downwards adjustment of `TYLER52`) --- src/f_finale.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 6fabcd96..1cfc1835 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -525,10 +525,13 @@ static const char *credits[] = { "\1Special Thanks", "Sonic Team Jr. & SRB2", "Bandit \"Bobby\" Cochenour", // i <3 my dog + "Bear", // i <3 MY dog too + "\"Chrispy\"", + "\"DirkTheHusky\"", + "\"fickle\"", // and my sharki "\"Nev3r\"", "\"Ritz\"", "\"Spherallic\"", - "\"DirkTheHusky\"", "", "\1Produced By", "Kart Krew", @@ -554,7 +557,7 @@ static struct { {112, 80+200* 7, "CREDIT10"}, {240, 80+200* 8, "CREDIT05"}, {120, 80+200* 9, "CREDIT06"},*/ - {112, 80+200*10, "TYLER52"}, + {112, 80+100+200*10, "TYLER52"}, {0, 0, NULL} }; From 0ec952d019aabc2db8ea45afeaf0c2acfd0ef907 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 12:12:48 +0100 Subject: [PATCH 08/18] Add a `SECTIONRACE` map flag. So far, all it does is prevent the number of laps from exceeding the map default, but it's a base to work off of if we want to add any other changes specifically for section races in future. --- src/dehacked.c | 8 ++++++++ src/doomstat.h | 1 + src/p_setup.c | 4 +++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index 99d95259..2efdb6bc 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1308,6 +1308,13 @@ static void readlevelheader(MYFILE *f, INT32 num) else mapheaderinfo[num-1]->levelflags &= ~LF_NOZONE; } + else if (fastcmp(word, "SECTIONRACE")) + { + if (i || word2[0] == 'T' || word2[0] == 'Y') + mapheaderinfo[num-1]->levelflags |= LF_SECTIONRACE; + else + mapheaderinfo[num-1]->levelflags &= ~LF_SECTIONRACE; + } // Individual triggers for menu flags else if (fastcmp(word, "HIDDEN")) @@ -7943,6 +7950,7 @@ struct { {"LF_NOSSMUSIC",LF_NOSSMUSIC}, {"LF_NORELOAD",LF_NORELOAD}, {"LF_NOZONE",LF_NOZONE}, + {"LF_SECTIONRACE",LF_SECTIONRACE}, // And map flags {"LF2_HIDEINMENU",LF2_HIDEINMENU}, {"LF2_HIDEINSTATS",LF2_HIDEINSTATS}, diff --git a/src/doomstat.h b/src/doomstat.h index fc13b0e8..296c11bf 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -272,6 +272,7 @@ typedef struct #define LF_NOSSMUSIC 4 ///< Disable Super Sonic music #define LF_NORELOAD 8 ///< Don't reload level on death #define LF_NOZONE 16 ///< Don't include "ZONE" on level title +#define LF_SECTIONRACE 32 ///< Section race level #define LF2_HIDEINMENU 1 ///< Hide in the multiplayer menu #define LF2_HIDEINSTATS 2 ///< Hide in the statistics screen diff --git a/src/p_setup.c b/src/p_setup.c index 6c7b6e92..e705a3f0 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2916,7 +2916,9 @@ boolean P_SetupLevel(boolean skipprecip) } else if (G_RaceGametype() && server) CV_StealthSetValue(&cv_numlaps, - ((netgame || multiplayer) && cv_basenumlaps.value) + ((netgame || multiplayer) && cv_basenumlaps.value + && (!(mapheaderinfo[gamemap - 1]->levelflags & LF_SECTIONRACE) + || (mapheaderinfo[gamemap - 1]->numlaps > cv_basenumlaps.value))) ? cv_basenumlaps.value : mapheaderinfo[gamemap - 1]->numlaps); From f1267f8ae1f23e72bda195bdbc767da6fc83b533 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 12:27:35 +0100 Subject: [PATCH 09/18] Don't allow a new driftboost of lesser magnitude to completely cancel an existing driftboost. --- src/k_kart.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 650a2149..d3abfcb5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4113,7 +4113,8 @@ static void K_KartDrift(player_t *player, boolean onground) && (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo) && onground) { - player->kartstuff[k_driftboost] = 20; + if (player->kartstuff[k_driftboost] < 20) + player->kartstuff[k_driftboost] = 20; S_StartSound(player->mo, sfx_s23c); //K_SpawnDashDustRelease(player); player->kartstuff[k_driftcharge] = 0; @@ -4123,7 +4124,8 @@ static void K_KartDrift(player_t *player, boolean onground) && player->kartstuff[k_driftcharge] < dsthree && onground) { - player->kartstuff[k_driftboost] = 50; + if (player->kartstuff[k_driftboost] < 50) + player->kartstuff[k_driftboost] = 50; S_StartSound(player->mo, sfx_s23c); //K_SpawnDashDustRelease(player); player->kartstuff[k_driftcharge] = 0; @@ -4133,7 +4135,8 @@ static void K_KartDrift(player_t *player, boolean onground) && player->kartstuff[k_driftcharge] >= dsthree && onground) { - player->kartstuff[k_driftboost] = 125; + if (player->kartstuff[k_driftboost] < 125) + player->kartstuff[k_driftboost] = 125; S_StartSound(player->mo, sfx_s23c); //K_SpawnDashDustRelease(player); player->kartstuff[k_driftcharge] = 0; From 14a5ffbfd81e75505c8a7824c2141ca69ca03e91 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 12:52:54 +0100 Subject: [PATCH 10/18] Based on netgame comments last night, update the tab rankings info to show less information in race. --- src/hu_stuff.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index ab427b48..fe2eb359 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2226,22 +2226,13 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (G_RaceGametype()) { -#define timestring(time) va("%i:%02i.%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time)) +#define timestring(time) va("%i'%02i\"%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time)) if (players[tab[i].num].exiting) - { - V_DrawRightAlignedString(x, y-4, hilicol, "FIN"); V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[tab[i].num].realtime)); - } else if (players[tab[i].num].pflags & PF_TIMEOVER) - V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "TIME OVER..."); + V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST."); else if (circuitmap) - { - V_DrawRightAlignedString(x, y-4, 0, "Lap"); - V_DrawRightAlignedString(x, y+4, 0, va("%d", tab[i].count)); - V_DrawRightAlignedString(x+rightoffset, y, 0, timestring(players[tab[i].num].starposttime)); - } - else - V_DrawRightAlignedString(x+rightoffset, y, 0, timestring(tab[i].count)); + V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count)); #undef timestring } else From 379772e5aa941c17e7105d953413b2d09365a7d8 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 13:25:13 +0100 Subject: [PATCH 11/18] Allow respawning spectators before starttime is up because they no longer spawn in a condition that allows them to get an unfair advantage (drop dash or its ghetto 2.0-esque predecessor) Also, some camera tweaks: * Force chasecam when exiting, just like it's forced when you're dead and not a spectator. * Force a horizontal camera angle aiming when spectator and dead, to avoid skybox bugs. --- src/p_user.c | 7 ++++--- src/r_main.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index d3407bd6..7646ca6d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7915,7 +7915,7 @@ static void P_DeathThink(player_t *player) /*if (player->deadtimer > 30*TICRATE && !G_RaceGametype()) player->playerstate = PST_REBORN; else if (player->lives > 0 && !G_IsSpecialStage(gamemap)*/ - if (player->lives > 0 && leveltime >= starttime) // *could* you respawn? + if (player->lives > 0 /*&& leveltime >= starttime*/) // *could* you respawn? { // SRB2kart - spawn automatically after 1 second if (player->deadtimer > ((netgame || multiplayer) @@ -8681,9 +8681,10 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall { // Don't let the camera match your movement. thiscam->momz = 0; - + if (player->spectator) + thiscam->aiming = 0; // Only let the camera go a little bit downwards. - if (!(mo->eflags & MFE_VERTICALFLIP) && thiscam->aiming < ANGLE_337h && thiscam->aiming > ANGLE_180) + else if (!(mo->eflags & MFE_VERTICALFLIP) && thiscam->aiming < ANGLE_337h && thiscam->aiming > ANGLE_180) thiscam->aiming = ANGLE_337h; else if (mo->eflags & MFE_VERTICALFLIP && thiscam->aiming > ANGLE_22h && thiscam->aiming < ANGLE_180) thiscam->aiming = ANGLE_22h; diff --git a/src/r_main.c b/src/r_main.c index 5990224c..5da98c8e 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1094,7 +1094,7 @@ void R_SetupFrame(player_t *player, boolean skybox) chasecam = (cv_chasecam.value != 0); } - if (player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD) + if (player->playerstate == PST_DEAD || player->exiting) chasecam = true; // force chasecam on else if (player->spectator) // no spectator chasecam chasecam = false; // force chasecam off From d0e629a8e284d811b68f1296bbb148b52028b3a7 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 13:51:23 +0100 Subject: [PATCH 12/18] Correct some inconsistencies I missed in the previous commit. --- src/p_user.c | 2 +- src/r_main.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 7646ca6d..f34b1a2e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8188,7 +8188,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall || (leveltime < introtime)); // Kart intro cam #endif - if (!(player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD)) + if (!(player->playerstate == PST_DEAD || player->exiting)) { if (player->spectator) // force cam off for spectators return true; diff --git a/src/r_main.c b/src/r_main.c index 5da98c8e..d83ce8d0 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1094,10 +1094,10 @@ void R_SetupFrame(player_t *player, boolean skybox) chasecam = (cv_chasecam.value != 0); } - if (player->playerstate == PST_DEAD || player->exiting) - chasecam = true; // force chasecam on - else if (player->spectator) // no spectator chasecam + if (player->spectator) // no spectator chasecam chasecam = false; // force chasecam off + else if (player->playerstate == PST_DEAD || player->exiting) + chasecam = true; // force chasecam on if (chasecam && !thiscam->chase) { From c9da6cd8562191391e7a730519429e381bffb8e5 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 18:10:12 +0100 Subject: [PATCH 13/18] Minor HUD offset tweak for splitscreen eggnum. --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index d3abfcb5..5c99a040 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5929,7 +5929,7 @@ static void K_drawKartItem(void) // Quick Eggman numbers if (stplyr->kartstuff[k_eggmanexplode] > 1 /*&& stplyr->kartstuff[k_eggmanexplode] <= 3*TICRATE*/) - V_DrawScaledPatch(ITEM_X+17, ITEM_Y+13, V_HUDTRANS|splitflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); + V_DrawScaledPatch(ITEM_X+17-offset, ITEM_Y+13-offset, V_HUDTRANS|splitflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); } void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, boolean playing) From d42736fe3d871de36b7f50c56b561cfb3f75ad44 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 21:23:00 +0100 Subject: [PATCH 14/18] Include srb2.org in the credits per Rob's wishes. --- src/f_finale.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/f_finale.c b/src/f_finale.c index 1cfc1835..484ffcff 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -523,7 +523,7 @@ static const char *credits[] = { "\"VirtAnderson\"", "", "\1Special Thanks", - "Sonic Team Jr. & SRB2", + "Sonic Team Jr. & SRB2 (www.srb2.org)", "Bandit \"Bobby\" Cochenour", // i <3 my dog "Bear", // i <3 MY dog too "\"Chrispy\"", From 147b7a5786c14ad4426888253041d3de9e111fab Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 21:48:52 +0100 Subject: [PATCH 15/18] Modified SPB to not route through P_DamageMobj (so wehave more control over the shield dropping/item obliteration, given Sryder picking up his own Thundershield...) --- src/k_kart.c | 25 +++++++++++++++++++++---- src/p_inter.c | 13 ------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5c99a040..f51abb1a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3016,7 +3016,7 @@ static void K_DoShrink(player_t *player) } } -static void K_DoSPB(player_t *victim, player_t *source) +static void K_DoSPB(player_t *victim) { //INT32 i; S_StartSound(victim->mo, sfx_bkpoof); // Sound the BANG! @@ -3027,8 +3027,25 @@ static void K_DoSPB(player_t *victim, player_t *source) P_FlashPal(&players[i], PAL_NUKE, 10); }*/ - if (victim->mo && !victim->spectator) - P_DamageMobj(victim->mo, source->mo, source->mo, 65); + if (!victim->mo || !victim->mo->health || victim->spectator) + return; + + { + mobj_t *spbexplode; + + if (!victim->kartstuff[k_invincibilitytimer] && !victim->kartstuff[k_growshrinktimer]) + { + K_DropHnextList(victim); + K_StripItems(victim); + } + + victim->powers[pw_flashing] = 0; + + spbexplode = P_SpawnMobj(victim->mo->x, victim->mo->y, victim->mo->z, MT_BLUEEXPLOSION); + + if (playeringame[spbplayer] && !players[spbplayer].spectator && players[spbplayer].mo) + P_SetTarget(&spbexplode->target, players[spbplayer].mo); + } } void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) @@ -3820,7 +3837,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_deathsentence]) { if (player->kartstuff[k_deathsentence] == 1) - K_DoSPB(player, &players[spbplayer]); + K_DoSPB(player); player->kartstuff[k_deathsentence]--; } diff --git a/src/p_inter.c b/src/p_inter.c index 4a120a42..bd02da42 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3385,19 +3385,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da S_StartSound(player->mo, sfx_kc59); return true; } - - // Self-Propelled Bomb - if (damage == 65) - { - mobj_t *spbexplode; - if (player == source->player) - return false; - // Just need to do this now! Being thrown upwards is done by the explosion. - //P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUELIGHTNING); - spbexplode = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); - P_SetTarget(&spbexplode->target, source); - return true; - } //} // Sudden-Death mode From 445013b0f91730e934c4be722dfc1f023d846147 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 1 Oct 2018 22:44:17 +0100 Subject: [PATCH 16/18] Wrong bracket level for flashing-set. --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f51abb1a..6d1ef8af 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3037,9 +3037,9 @@ static void K_DoSPB(player_t *victim) { K_DropHnextList(victim); K_StripItems(victim); - } - victim->powers[pw_flashing] = 0; + victim->powers[pw_flashing] = 0; + } spbexplode = P_SpawnMobj(victim->mo->x, victim->mo->y, victim->mo->z, MT_BLUEEXPLOSION); From 4b9d5f251e0eba8168f54784f608f51d76fad693 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 2 Oct 2018 16:51:17 +0100 Subject: [PATCH 17/18] Fix incorrect alignment of selected-level Ruby in vote drawer. --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index e26d4973..46e15e39 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1137,7 +1137,7 @@ void Y_VoteDrawer(void) else { V_DrawFixedPatch((x+40)< Date: Tue, 2 Oct 2018 16:52:02 +0100 Subject: [PATCH 18/18] Revert "Just realised the inputwheel jittering in Sryder's videos was my fault, so fix this even better" This reverts commit 8aff76b8c301861edb0f574b17d1d41b539fd6a0. --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 6d1ef8af..ef909b5f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7116,7 +7116,10 @@ static void K_drawInput(void) } if (pn < 0) + { splitflags |= V_FLIP; // right turn + x--; + } target = abs(pn); if (target > 4)