diff --git a/src/k_kart.c b/src/k_kart.c index 4e967ac00..a2edc297f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -33,6 +33,7 @@ #include "k_waypoint.h" #include "k_bot.h" #include "k_hud.h" +#include "k_terrain.h" // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // gamespeed is cc (0 for easy, 1 for normal, 2 for hard) @@ -1605,6 +1606,7 @@ static UINT8 K_CheckOffroadCollide(mobj_t *mo) } } + return 0; // couldn't find any offroad } @@ -1616,7 +1618,17 @@ static UINT8 K_CheckOffroadCollide(mobj_t *mo) */ static void K_UpdateOffroad(player_t *player) { - fixed_t offroadstrength = (K_CheckOffroadCollide(player->mo) << FRACBITS); + terrain_t *terrain = player->mo->terrain; + fixed_t offroadstrength = 0; + + if (terrain != NULL && terrain->offroad > 0) + { + offroadstrength = (terrain->offroad << FRACBITS); + } + else + { + offroadstrength = (K_CheckOffroadCollide(player->mo) << FRACBITS); + } // If you are in offroad, a timer starts. if (offroadstrength) diff --git a/src/k_terrain.c b/src/k_terrain.c index a2b09158d..b8edebf03 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -25,6 +25,8 @@ #include "w_wad.h" #include "z_zone.h" +#include "k_kart.h" // on the chopping block... + t_splash_t *splashDefs = NULL; UINT16 numSplashDefs = 0; @@ -119,20 +121,25 @@ terrain_t *K_GetTerrainForTextureNum(INT32 textureNum) return K_GetTerrainForTextureName(tex->name); } -void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID) +terrain_t *K_GetTerrainForFlatNum(INT32 flatID) { levelflat_t *levelFlat = NULL; - if (mo == NULL || P_MobjWasRemoved(mo) == true) - { - // Invalid object. - return; - } - if (flatID < 0 || flatID >= (signed)numlevelflats) { // Clearly invalid floor... - mo->terrain = NULL; + return NULL; + } + + levelFlat = &levelflats[flatID]; + return K_GetTerrainForTextureName(levelFlat->name); +} + +void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID) +{ + if (mo == NULL || P_MobjWasRemoved(mo) == true) + { + // Invalid object. return; } @@ -144,12 +151,84 @@ void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID) } // Update the object's terrain pointer. - levelFlat = &levelflats[flatID]; - mo->terrain = K_GetTerrainForTextureName(levelFlat->name); + mo->terrain = K_GetTerrainForFlatNum(flatID); +} + +void K_ProcessTerrainEffect(mobj_t *mo) +{ + player_t *player = NULL; + terrain_t *terrain = NULL; + + if (mo == NULL || P_MobjWasRemoved(mo) == true) + { + // Invalid object. + return; + } + + if (mo->terrain == NULL) + { + // No terrain type. + return; + } + + terrain = mo->terrain; + player = mo->player; + + if (player == NULL) + { + // maybe can support regualar mobjs later? :) + return; + } + + // Damage effects + if (terrain->damageType > 0) + { + UINT8 dmg = (terrain->damageType & 0xFF); + P_DamageMobj(mo, NULL, NULL, 1, dmg); + } + + // Sneaker panel + if (terrain->flags & TRF_SNEAKERPANEL) + { + if (!player->floorboost) + player->floorboost = 3; + else + player->floorboost = 2; + + K_DoSneaker(player, 0); + } + + // Trick panel + if (terrain->trickPanel > 0 && !(mo->eflags & MFE_SPRUNG)) + { + const fixed_t hscale = mapobjectscale + (mapobjectscale - mo->scale); + const fixed_t minspeed = 24*hscale; + fixed_t speed = FixedHypot(mo->momx, mo->momy); + fixed_t upwards = 16 * FRACUNIT * terrain->trickPanel; + + player->trickpanel = 1; + player->pflags |= PF_TRICKDELAY; + K_DoPogoSpring(mo, upwards, 1); + + if (speed < minspeed) + { + speed = minspeed; + } + + P_InstaThrust(mo, mo->angle, speed); + } + + // (Offroad is handled elsewhere!) } void K_SetDefaultFriction(mobj_t *mo) { + if (mo == NULL || P_MobjWasRemoved(mo) == true) + { + // Invalid object. + return; + } + mo->friction = ORIG_FRICTION; if (mo->player != NULL) diff --git a/src/k_terrain.h b/src/k_terrain.h index e42a2ada2..600656522 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -102,8 +102,10 @@ terrain_t *K_GetTerrainByName(const char *checkName); terrain_t *K_GetDefaultTerrain(void); terrain_t *K_GetTerrainForTextureName(const char *checkName); terrain_t *K_GetTerrainForTextureNum(INT32 textureNum); +terrain_t *K_GetTerrainForFlatNum(INT32 flatID); void K_UpdateMobjTerrain(mobj_t *mo, INT32 flatID); +void K_ProcessTerrainEffect(mobj_t *mo); void K_SetDefaultFriction(mobj_t *mo); void K_InitTerrain(UINT16 wadNum); diff --git a/src/p_spec.c b/src/p_spec.c index bf7784cd3..b58b8aa40 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -43,6 +43,7 @@ #include "k_kart.h" #include "console.h" // CON_LogMessage #include "k_respawn.h" +#include "k_terrain.h" #ifdef HW3SOUND #include "hardware/hw3sound.h" @@ -4333,7 +4334,9 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers // Conveyor stuff if (section3 == 2 || section3 == 4) + { player->onconveyor = section3; + } special = section1; @@ -5050,6 +5053,7 @@ void P_PlayerInSpecialSector(player_t *player) if (!player->mo) return; + K_ProcessTerrainEffect(player->mo); originalsector = player->mo->subsector->sector; P_PlayerOnSpecial3DFloor(player, originalsector); // Handle FOFs first. diff --git a/src/r_bsp.c b/src/r_bsp.c index e9d51c03a..6095f3739 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -23,6 +23,8 @@ #include "z_zone.h" // Check R_Prep3DFloors #include "taglist.h" +#include "k_terrain.h" + seg_t *curline; side_t *sidedef; line_t *linedef; @@ -67,11 +69,35 @@ boolean R_IsRipplePlane(sector_t *sector, ffloor_t *rover, int ceiling) static void R_PlaneLightOverride(sector_t *sector, boolean ceiling, INT32 *lightlevel) { - if (GETSECSPECIAL(sector->special, 4) == 6) // Fullbright sneaker panels + terrain_t *t = NULL; + + if (ceiling == true) { - if ((ceiling && (sector->flags & SF_FLIPSPECIAL_CEILING)) - || (!ceiling && (sector->flags & SF_FLIPSPECIAL_FLOOR))) + t = K_GetTerrainForFlatNum(sector->ceilingpic); + } + else + { + t = K_GetTerrainForFlatNum(sector->floorpic); + } + + if (t != NULL) + { + if (t->flags & TRF_SNEAKERPANEL) + { *lightlevel = 255; + } + } + else + { + // Sector effect sneaker panels (DEPRECATED) + if (GETSECSPECIAL(sector->special, 4) == 6) + { + if ((ceiling && (sector->flags & SF_FLIPSPECIAL_CEILING)) + || (!ceiling && (sector->flags & SF_FLIPSPECIAL_FLOOR))) + { + *lightlevel = 255; + } + } } }