From f00e3dfd5a96c0874ca9ac3e9e569c91779888e1 Mon Sep 17 00:00:00 2001 From: Sryder Date: Fri, 8 Jun 2018 21:05:45 +0100 Subject: [PATCH] New Drift dust Applies all the time as long as the object is turning tight enough New Sound Works on Red Shells too! --- src/dehacked.c | 11 ++++---- src/info.c | 21 +++++++-------- src/info.h | 13 +++++---- src/k_kart.c | 68 +++++++++++++++++++++++++++++++++++++++++++---- src/k_kart.h | 3 ++- src/lua_baselib.c | 15 +++++++++-- src/p_mobj.c | 7 +++++ src/p_user.c | 6 +++-- src/sounds.c | 1 + src/sounds.h | 1 + 10 files changed, 112 insertions(+), 34 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 71d1d8f4..50fef47f 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6235,11 +6235,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTSPARK6", // Drift Smoke - "S_DRIFTSMOKE1", - "S_DRIFTSMOKE2", - "S_DRIFTSMOKE3", - "S_DRIFTSMOKE4", - "S_DRIFTSMOKE5", + "S_DRIFTDUST1", + "S_DRIFTDUST2", + "S_DRIFTDUST3", + "S_DRIFTDUST4", // Magnet Burst @@ -7109,7 +7108,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_MUSHROOMTRAIL", "MT_DRIFT", - "MT_DRIFTSMOKE", + "MT_DRIFTDUST", "MT_FAKESHIELD", "MT_FAKEITEM", diff --git a/src/info.c b/src/info.c index 3c7e2894..8a1dd5a3 100644 --- a/src/info.c +++ b/src/info.c @@ -55,7 +55,7 @@ char sprnames[NUMSPRITES + 1][5] = "GWLR","SRBA","SRBB","SRBC","SRBD","SRBE","SRBF","SRBG","SRBH","SRBI", "SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO", //SRB2kart Sprites - "SPRG","BSPR","RNDM","RPOP","KFRE","DRIF","DSMO","FITM","DFAK","BANA", + "SPRG","BSPR","RNDM","RPOP","KFRE","DRIF","DUST","FITM","DFAK","BANA", "DBAN","GSHE","DGSH","RSHE","DRSH","BOMB","KRBM","BLIG","LIGH","SINK", "SITR","KBLN","LAKI","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS", "BUZB","CHOM","SACO","CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO", @@ -2578,11 +2578,10 @@ state_t states[NUMSTATES] = {SPR_DRIF, 4, 2, {NULL}, 0, 0, S_DRIFTSPARK6}, // S_DRIFTSPARK5 {SPR_DRIF, 5, 2, {NULL}, 0, 0, S_DRIFTSPARK4}, // S_DRIFTSPARK6 - {SPR_DSMO, FF_TRANS50|0, 2, {NULL}, 0, 0, S_DRIFTSMOKE2}, // S_DRIFTSMOKE1 - {SPR_DSMO, FF_TRANS50|1, 2, {NULL}, 0, 0, S_DRIFTSMOKE3}, // S_DRIFTSMOKE2 - {SPR_DSMO, FF_TRANS50|2, 2, {NULL}, 0, 0, S_DRIFTSMOKE4}, // S_DRIFTSMOKE3 - {SPR_DSMO, FF_TRANS50|3, 2, {NULL}, 0, 0, S_DRIFTSMOKE5}, // S_DRIFTSMOKE4 - {SPR_DSMO, FF_TRANS50|4, 2, {NULL}, 0, 0, S_NULL}, // S_DRIFTSMOKE5 + {SPR_DUST, 0, 3, {NULL}, 0, 0, S_DRIFTDUST2}, // S_DRIFTDUST1 + {SPR_DUST, 1, 3, {NULL}, 0, 0, S_DRIFTDUST3}, // S_DRIFTDUST2 + {SPR_DUST, FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTDUST4}, // S_DRIFTDUST3 + {SPR_DUST, FF_TRANS20|3, 3, {NULL}, 0, 0, S_NULL}, // S_DRIFTDUST4 {SPR_NULL, 0, 10, {NULL}, 0, 0, S_KARTFIRE2}, // S_KARTFIRE1 {SPR_KFRE, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARTFIRE3}, // S_KARTFIRE2 @@ -14355,9 +14354,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_DRIFTSMOKE + { // MT_DRIFTDUST -1, // doomednum - S_DRIFTSMOKE1, // spawnstate + S_DRIFTDUST1, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound @@ -14372,13 +14371,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 20*FRACUNIT, // radius - 16*FRACUNIT, // height + 8*FRACUNIT, // radius + 15*FRACUNIT, // height 0, // display offset 100, // mass 0, // damage sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_FLOAT|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/info.h b/src/info.h index f619b598..a223beca 100644 --- a/src/info.h +++ b/src/info.h @@ -582,7 +582,7 @@ typedef enum sprite SPR_RPOP, // Random Item Box Pop SPR_KFRE, // Mushroom fire trail SPR_DRIF, // Drift Sparks - SPR_DSMO, // Drift Smoke + SPR_DUST, // Drift Dust // Kart Items SPR_FITM, // Fake Item box @@ -3078,11 +3078,10 @@ typedef enum state S_DRIFTSPARK6, // Drift Smoke - S_DRIFTSMOKE1, - S_DRIFTSMOKE2, - S_DRIFTSMOKE3, - S_DRIFTSMOKE4, - S_DRIFTSMOKE5, + S_DRIFTDUST1, + S_DRIFTDUST2, + S_DRIFTDUST3, + S_DRIFTDUST4, // Magnet Burst @@ -3969,7 +3968,7 @@ typedef enum mobj_type MT_MUSHROOMTRAIL, MT_DRIFT, - MT_DRIFTSMOKE, + MT_DRIFTDUST, MT_FAKESHIELD, MT_FAKEITEM, diff --git a/src/k_kart.c b/src/k_kart.c index 9461cd46..627710dc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1834,7 +1834,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle return NULL; } -void K_SpawnDriftTrail(player_t *player) +void K_SpawnBoostTrail(player_t *player) { fixed_t newx; fixed_t newy; @@ -1874,10 +1874,7 @@ void K_SpawnDriftTrail(player_t *player) ground -= FixedMul(mobjinfo[MT_MUSHROOMTRAIL].height, player->mo->scale); } #endif - if (player->kartstuff[k_drift] != 0 && player->kartstuff[k_mushroomtimer] == 0) - flame = P_SpawnMobj(newx, newy, ground, MT_DRIFTSMOKE); - else - flame = P_SpawnMobj(newx, newy, ground, MT_MUSHROOMTRAIL); + flame = P_SpawnMobj(newx, newy, ground, MT_MUSHROOMTRAIL); P_SetTarget(&flame->target, player->mo); flame->angle = travelangle; @@ -1901,6 +1898,67 @@ void K_SpawnDriftTrail(player_t *player) } } +// K_DriftDustHandling +// Parameters: +// spawner: The map object that is spawning the drift dust +// Description: Spawns the drift dust for objects, players use rmomx/y, other objects use regular momx/y. +// Also plays the drift sound. +// Other objects should be angled towards where they're trying to go so they don't randomly spawn dust +// Do note that most of the function won't run in odd intervals of frames +void K_DriftDustHandling(mobj_t *spawner) +{ + angle_t anglediff; + const INT16 spawnrange = spawner->radius>>FRACBITS; + + if (!P_IsObjectOnGround(spawner) || leveltime % 2 != 0) + return; + + if (spawner->player) + { + angle_t playerangle; + + if (spawner->player->speed < 5<player->cmd.forwardmove < 0) + { + playerangle = spawner->angle+ANGLE_180; + } + else + { + playerangle = spawner->angle; + } + anglediff = abs(playerangle - R_PointToAngle2(0, 0, spawner->player->rmomx, spawner->player->rmomy)); + } + else + { + if (P_AproxDistance(spawner->momx, spawner->momy) < 5<angle - R_PointToAngle2(0, 0, spawner->momx, spawner->momy)); + } + + if (anglediff > ANGLE_180) + anglediff = InvAngle(anglediff); + + if (anglediff > ANG10*4) // Trying to turn further than 40 degrees + { + fixed_t spawnx = P_RandomRange(-spawnrange, spawnrange)<x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST); + dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange)<momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange)<momz = P_MobjFlip(spawner) * P_RandomRange(1, 4)<scale = spawner->scale/2; + dust->destscale = spawner->scale * 3; + if (leveltime % 6 == 0) + { + S_StartSound(spawner, sfx_screec); + } + } +} + static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, boolean bobombthrow) { mobj_t *mo; diff --git a/src/k_kart.h b/src/k_kart.h index f615e247..694450d8 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -29,7 +29,8 @@ void K_ExplodePlayer(player_t *player, mobj_t *source); void K_StealBalloon(player_t *player, player_t *victim, boolean force); void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); void K_SpawnBobombExplosion(mobj_t *source, UINT8 color); -void K_SpawnDriftTrail(player_t *player); +void K_SpawnBoostTrail(player_t *player); +void K_DriftDustHandling(mobj_t *spawner); void K_DoMushroom(player_t *player, boolean doPFlag); void K_DoBouncePad(mobj_t *mo, fixed_t vertispeed); boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 3aaf3b1d..b49cdd72 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2086,7 +2086,17 @@ static int lib_kSpawnDriftTrail(lua_State *L) NOHUD if (!player) return LUA_ErrInvalid(L, "player_t"); - K_SpawnDriftTrail(player); + K_SpawnBoostTrail(player); + return 0; +} + +static int lib_kDriftDustHandling(lua_State *L) +{ + mobj_t *spawner = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + NOHUD + if (!spawner) + return LUA_ErrInvalid(L, "mobj_t"); + K_DriftDustHandling(spawner); return 0; } @@ -2334,7 +2344,8 @@ static luaL_Reg lib[] = { {"K_ExplodePlayer",lib_kExplodePlayer}, {"K_StealBalloon",lib_kStealBalloon}, {"K_SpawnKartExplosion",lib_kSpawnKartExplosion}, - {"K_SpawnDriftTrail",lib_kSpawnDriftTrail}, + {"K_SpawnBoostTrail",lib_kSpawnDriftTrail}, + {"K_DriftDustHandling",lib_kDriftDustHandling}, {"K_DoMushroom",lib_kDoMushroom}, {"K_DoBouncePad",lib_kDoBouncePad}, {"K_MomentumToFacing",lib_kMomentumToFacing}, diff --git a/src/p_mobj.c b/src/p_mobj.c index a77b97b7..b363edc2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7902,6 +7902,13 @@ void P_MobjThinker(mobj_t *mobj) P_InstaThrust(mobj, R_PointToAngle2(0, 0, mobj->momx, mobj->momy), topspeed); + if (mobj->tracer) + mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->tracer->x, mobj->tracer->y); + else + mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + + K_DriftDustHandling(mobj); + sec2 = P_ThingOnSpecial3DFloor(mobj); if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) diff --git a/src/p_user.c b/src/p_user.c index 691ecee7..6d09bd5b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7093,8 +7093,10 @@ static void P_MovePlayer(player_t *player) //////////////////////////// // SRB2kart - Drifting smoke and fire - if ((player->kartstuff[k_drift] != 0 || player->kartstuff[k_mushroomtimer] > 0) && onground && (leveltime & 1)) - K_SpawnDriftTrail(player); + if (player->kartstuff[k_mushroomtimer] > 0 && onground && (leveltime & 1)) + K_SpawnBoostTrail(player); + + K_DriftDustHandling(player->mo); /* // SRB2kart - nadah // If the player isn't on the ground, make sure they aren't in a "starting dash" position. diff --git a/src/sounds.c b/src/sounds.c index 57d8852e..f5a7ee9b 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -805,6 +805,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"vroom", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"boing", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"smkinv", false, 140, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"screec", false, 52, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // SRB2kart - Skin sounds {"kwin", false, 64, 0, -1, NULL, 0, SKSWIN, -1, LUMPERROR}, diff --git a/src/sounds.h b/src/sounds.h index 28a288da..7954a5ef 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -877,6 +877,7 @@ typedef enum sfx_vroom, sfx_boing, sfx_smkinv, + sfx_screec, sfx_kwin, sfx_klose,