Keep your large items

This commit is contained in:
Sally Coolatta 2022-01-09 01:16:36 -05:00
parent 1ad82e7651
commit 7e76366fe8
4 changed files with 129 additions and 33 deletions

View file

@ -260,6 +260,10 @@ typedef enum
// for kickstartaccel // for kickstartaccel
#define ACCEL_KICKSTART 35 #define ACCEL_KICKSTART 35
#define ITEMSCALE_NORMAL 0
#define ITEMSCALE_GROW 1
#define ITEMSCALE_SHRINK 2
// player_t struct for all respawn variables // player_t struct for all respawn variables
typedef struct respawnvars_s typedef struct respawnvars_s
{ {
@ -428,6 +432,7 @@ typedef struct player_s
SINT8 itemtype; // KITEM_ constant for item number SINT8 itemtype; // KITEM_ constant for item number
UINT8 itemamount; // Amount of said item UINT8 itemamount; // Amount of said item
SINT8 throwdir; // Held dir of controls; 1 = forward, 0 = none, -1 = backward (was "player->heldDir") SINT8 throwdir; // Held dir of controls; 1 = forward, 0 = none, -1 = backward (was "player->heldDir")
UINT8 itemscale; // Item scale value, from when an item was taken out. (0 for normal, 1 for grow, 2 for shrink.)
UINT8 sadtimer; // How long you've been sad UINT8 sadtimer; // How long you've been sad

View file

@ -3816,24 +3816,56 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color)
#undef MINEQUAKEDIST #undef MINEQUAKEDIST
fixed_t K_ItemScaleForPlayer(player_t *player)
{
switch (player->itemscale)
{
case ITEMSCALE_GROW:
return FixedMul(GROW_SCALE, mapobjectscale);
case ITEMSCALE_SHRINK:
return FixedMul(SHRINK_SCALE, mapobjectscale);
default:
return mapobjectscale;
}
}
static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, INT32 flags2, fixed_t speed) static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, INT32 flags2, fixed_t speed)
{ {
mobj_t *th; mobj_t *th;
fixed_t x, y, z; fixed_t x, y, z;
fixed_t finalspeed = speed; fixed_t finalspeed = speed;
fixed_t finalscale = mapobjectscale;
mobj_t *throwmo; mobj_t *throwmo;
if (source->player && source->player->speed > K_GetKartSpeed(source->player, false)) if (source->player != NULL)
{ {
angle_t input = source->angle - an; if (source->player->itemscale == ITEMSCALE_SHRINK)
boolean invert = (input > ANGLE_180); {
if (invert) // Nerf the base item speed a bit.
input = InvAngle(input); finalspeed = FixedMul(finalspeed, SHRINK_PHYSICS_SCALE);
}
finalspeed = max(speed, FixedMul(speed, FixedMul( if (source->player->speed > K_GetKartSpeed(source->player, false))
FixedDiv(source->player->speed, K_GetKartSpeed(source->player, false)), // Multiply speed to be proportional to your own, boosted maxspeed. {
(((180<<FRACBITS) - AngleFixed(input)) / 180) // multiply speed based on angle diff... i.e: don't do this for firing backward :V angle_t input = source->angle - an;
))); boolean invert = (input > ANGLE_180);
if (invert)
input = InvAngle(input);
finalspeed = max(speed, FixedMul(speed, FixedMul(
FixedDiv(source->player->speed, K_GetKartSpeed(source->player, false)), // Multiply speed to be proportional to your own, boosted maxspeed.
(((180<<FRACBITS) - AngleFixed(input)) / 180) // multiply speed based on angle diff... i.e: don't do this for firing backward :V
)));
}
finalscale = K_ItemScaleForPlayer(source->player);
}
if (type == MT_BUBBLESHIELDTRAP)
{
finalscale = source->scale;
} }
x = source->x + source->momx + FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); x = source->x + source->momx + FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT));
@ -3852,8 +3884,8 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I
P_SetTarget(&th->target, source); P_SetTarget(&th->target, source);
P_SetScale(th, source->scale); P_SetScale(th, finalscale);
th->destscale = source->destscale; th->destscale = finalscale;
if (P_IsObjectOnGround(source)) if (P_IsObjectOnGround(source))
{ {
@ -3876,6 +3908,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I
th->momy = FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); th->momy = FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT));
th->momz = source->momz; th->momz = source->momz;
if (source->player != NULL)
{
th->cusval = source->player->itemscale;
}
switch (type) switch (type)
{ {
case MT_ORBINAUT: case MT_ORBINAUT:
@ -4769,13 +4806,15 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing,
} }
else else
{ {
fixed_t finalscale = K_ItemScaleForPlayer(player);
player->bananadrag = 0; // RESET timer, for multiple bananas player->bananadrag = 0; // RESET timer, for multiple bananas
if (dir > 0) if (dir > 0)
{ {
// Shoot forward // Shoot forward
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, mapthing); mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, mapthing);
//K_FlipFromObject(mo, player->mo);
// These are really weird so let's make it a very specific case to make SURE it works... // These are really weird so let's make it a very specific case to make SURE it works...
if (player->mo->eflags & MFE_VERTICALFLIP) if (player->mo->eflags & MFE_VERTICALFLIP)
{ {
@ -4802,6 +4841,9 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing,
if (mo->eflags & MFE_UNDERWATER) if (mo->eflags & MFE_UNDERWATER)
mo->momz = (117 * mo->momz) / 200; mo->momz = (117 * mo->momz) / 200;
P_SetScale(mo, finalscale);
mo->destscale = finalscale;
} }
// this is the small graphic effect that plops in you when you throw an item: // this is the small graphic effect that plops in you when you throw an item:
@ -4816,6 +4858,9 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing,
} }
throwmo->movecount = 0; // above player throwmo->movecount = 0; // above player
P_SetScale(throwmo, finalscale);
throwmo->destscale = finalscale;
} }
else else
{ {
@ -4853,8 +4898,8 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing,
mo->threshold = 10; mo->threshold = 10;
P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->target, player->mo);
P_SetScale(mo, player->mo->scale); P_SetScale(mo, finalscale);
mo->destscale = player->mo->destscale; mo->destscale = finalscale;
if (P_IsObjectOnGround(player->mo)) if (P_IsObjectOnGround(player->mo))
{ {
@ -4924,6 +4969,10 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter)
mine->floorz = origMine->floorz; mine->floorz = origMine->floorz;
mine->ceilingz = origMine->ceilingz; mine->ceilingz = origMine->ceilingz;
P_SetScale(mine, origMine->scale);
mine->destscale = origMine->destscale;
mine->scalespeed = origMine->scalespeed;
// Copy interp data // Copy interp data
mine->old_angle = origMine->old_angle; mine->old_angle = origMine->old_angle;
mine->old_x = origMine->old_x; mine->old_x = origMine->old_x;
@ -4932,8 +4981,7 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter)
// Since we aren't using P_KillMobj, we need to clean up the hnext reference // Since we aren't using P_KillMobj, we need to clean up the hnext reference
P_SetTarget(&mineOwner->hnext, NULL); P_SetTarget(&mineOwner->hnext, NULL);
mineOwner->player->bananadrag = 0; K_UnsetItemOut(mineOwner->player);
mineOwner->player->pflags &= ~PF_ITEMOUT;
if (mineOwner->player->itemamount) if (mineOwner->player->itemamount)
{ {
@ -5090,7 +5138,7 @@ static void K_DoHyudoroSteal(player_t *player)
player->itemtype = KITEM_KITCHENSINK; player->itemtype = KITEM_KITCHENSINK;
player->itemamount = 1; player->itemamount = 1;
player->pflags &= ~PF_ITEMOUT; K_UnsetItemOut(player);
return; return;
} }
else if ((gametype == GT_RACE && player->position == 1) || numplayers == 0) // No-one can be stolen from? Oh well... else if ((gametype == GT_RACE && player->position == 1) || numplayers == 0) // No-one can be stolen from? Oh well...
@ -5116,11 +5164,11 @@ static void K_DoHyudoroSteal(player_t *player)
player->itemtype = players[stealplayer].itemtype; player->itemtype = players[stealplayer].itemtype;
player->itemamount = players[stealplayer].itemamount; player->itemamount = players[stealplayer].itemamount;
player->pflags &= ~PF_ITEMOUT; K_UnsetItemOut(player);
players[stealplayer].itemtype = KITEM_NONE; players[stealplayer].itemtype = KITEM_NONE;
players[stealplayer].itemamount = 0; players[stealplayer].itemamount = 0;
players[stealplayer].pflags &= ~PF_ITEMOUT; K_UnsetItemOut(&players[stealplayer]);
if (P_IsDisplayPlayer(&players[stealplayer]) && !r_splitscreen) if (P_IsDisplayPlayer(&players[stealplayer]) && !r_splitscreen)
S_StartSound(NULL, sfx_s3k92); S_StartSound(NULL, sfx_s3k92);
@ -5440,7 +5488,7 @@ void K_DropHnextList(player_t *player, boolean keepshields)
player->curshield = KSHIELD_NONE; player->curshield = KSHIELD_NONE;
player->itemtype = KITEM_NONE; player->itemtype = KITEM_NONE;
player->itemamount = 0; player->itemamount = 0;
player->pflags &= ~PF_ITEMOUT; K_UnsetItemOut(player);
} }
nextwork = work->hnext; nextwork = work->hnext;
@ -5489,6 +5537,10 @@ void K_DropHnextList(player_t *player, boolean keepshields)
dropwork->angle = work->angle; dropwork->angle = work->angle;
P_SetScale(dropwork, work->scale);
dropwork->destscale = work->destscale;
dropwork->scalespeed = work->scalespeed;
dropwork->flags |= MF_NOCLIPTHING; dropwork->flags |= MF_NOCLIPTHING;
dropwork->flags2 = work->flags2; dropwork->flags2 = work->flags2;
dropwork->eflags = work->eflags; dropwork->eflags = work->eflags;
@ -5578,7 +5630,7 @@ void K_DropHnextList(player_t *player, boolean keepshields)
&& (dropall || (--player->itemamount <= 0))) && (dropall || (--player->itemamount <= 0)))
{ {
player->itemamount = 0; player->itemamount = 0;
player->pflags &= ~PF_ITEMOUT; K_UnsetItemOut(player);
player->itemtype = KITEM_NONE; player->itemtype = KITEM_NONE;
} }
} }
@ -5953,6 +6005,8 @@ static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z
// Move the hnext chain! // Move the hnext chain!
static void K_MoveHeldObjects(player_t *player) static void K_MoveHeldObjects(player_t *player)
{ {
fixed_t finalscale = INT32_MAX;
if (!player->mo) if (!player->mo)
return; return;
@ -5964,7 +6018,7 @@ static void K_MoveHeldObjects(player_t *player)
else if (player->pflags & PF_ITEMOUT) else if (player->pflags & PF_ITEMOUT)
{ {
player->itemamount = 0; player->itemamount = 0;
player->pflags &= ~PF_ITEMOUT; K_UnsetItemOut(player);
player->itemtype = KITEM_NONE; player->itemtype = KITEM_NONE;
} }
return; return;
@ -5980,12 +6034,14 @@ static void K_MoveHeldObjects(player_t *player)
else if (player->pflags & PF_ITEMOUT) else if (player->pflags & PF_ITEMOUT)
{ {
player->itemamount = 0; player->itemamount = 0;
player->pflags &= ~PF_ITEMOUT; K_UnsetItemOut(player);
player->itemtype = KITEM_NONE; player->itemtype = KITEM_NONE;
} }
return; return;
} }
finalscale = K_ItemScaleForPlayer(player);
switch (player->mo->hnext->type) switch (player->mo->hnext->type)
{ {
case MT_ORBINAUT_SHIELD: // Kart orbit items case MT_ORBINAUT_SHIELD: // Kart orbit items
@ -6024,7 +6080,7 @@ static void K_MoveHeldObjects(player_t *player)
cur->eflags &= ~MFE_VERTICALFLIP; cur->eflags &= ~MFE_VERTICALFLIP;
// Shrink your items if the player shrunk too. // Shrink your items if the player shrunk too.
P_SetScale(cur, (cur->destscale = FixedMul(FixedDiv(cur->extravalue1, radius), player->mo->scale))); P_SetScale(cur, (cur->destscale = FixedMul(FixedDiv(cur->extravalue1, radius), finalscale)));
if (P_MobjFlip(cur) > 0) if (P_MobjFlip(cur) > 0)
z = player->mo->z; z = player->mo->z;
@ -6055,7 +6111,7 @@ static void K_MoveHeldObjects(player_t *player)
} }
// Center it during the scale up animation // Center it during the scale up animation
z += (FixedMul(mobjinfo[cur->type].height, player->mo->scale - cur->scale)>>1) * P_MobjFlip(cur); z += (FixedMul(mobjinfo[cur->type].height, finalscale - cur->scale)>>1) * P_MobjFlip(cur);
cur->z = z; cur->z = z;
cur->momx = cur->momy = 0; cur->momx = cur->momy = 0;
@ -6117,7 +6173,7 @@ static void K_MoveHeldObjects(player_t *player)
continue; continue;
// Shrink your items if the player shrunk too. // Shrink your items if the player shrunk too.
P_SetScale(cur, (cur->destscale = FixedMul(FixedDiv(cur->extravalue1, radius), player->mo->scale))); P_SetScale(cur, (cur->destscale = FixedMul(FixedDiv(cur->extravalue1, radius), finalscale)));
ang = targ->angle; ang = targ->angle;
targx = targ->x + P_ReturnThrustX(cur, ang + ANGLE_180, dist); targx = targ->x + P_ReturnThrustX(cur, ang + ANGLE_180, dist);
@ -8708,6 +8764,31 @@ static void K_trickPanelTimingVisual(player_t *player, fixed_t momz)
#undef RADIUSSCALING #undef RADIUSSCALING
#undef MINRADIUS #undef MINRADIUS
void K_SetItemOut(player_t *player)
{
player->pflags |= PF_ITEMOUT;
if (player->mo->scale >= FixedMul(GROW_PHYSICS_SCALE, mapobjectscale))
{
player->itemscale = ITEMSCALE_GROW;
}
else if (player->mo->scale <= FixedMul(SHRINK_PHYSICS_SCALE, mapobjectscale))
{
player->itemscale = ITEMSCALE_SHRINK;
}
else
{
player->itemscale = ITEMSCALE_NORMAL;
}
}
void K_UnsetItemOut(player_t *player)
{
player->pflags &= ~PF_ITEMOUT;
player->itemscale = ITEMSCALE_NORMAL;
player->bananadrag = 0;
}
// //
// K_MoveKartPlayer // K_MoveKartPlayer
// //
@ -8808,7 +8889,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
} }
else if (player->itemamount == 0) else if (player->itemamount == 0)
{ {
player->pflags &= ~PF_ITEMOUT; K_UnsetItemOut(player);
} }
else else
{ {
@ -8883,7 +8964,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mobj_t *prev = player->mo; mobj_t *prev = player->mo;
//K_PlayAttackTaunt(player->mo); //K_PlayAttackTaunt(player->mo);
player->pflags |= PF_ITEMOUT; K_SetItemOut(player);
S_StartSound(player->mo, sfx_s254); S_StartSound(player->mo, sfx_s254);
for (moloop = 0; moloop < player->itemamount; moloop++) for (moloop = 0; moloop < player->itemamount; moloop++)
@ -8898,6 +8979,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mo->threshold = 10; mo->threshold = 10;
mo->movecount = player->itemamount; mo->movecount = player->itemamount;
mo->movedir = moloop+1; mo->movedir = moloop+1;
mo->cusval = player->itemscale;
P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->target, player->mo);
P_SetTarget(&mo->hprev, prev); P_SetTarget(&mo->hprev, prev);
P_SetTarget(&prev->hnext, mo); P_SetTarget(&prev->hnext, mo);
@ -8927,6 +9009,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mo->threshold = 10; mo->threshold = 10;
mo->movecount = 1; mo->movecount = 1;
mo->movedir = 1; mo->movedir = 1;
mo->cusval = player->itemscale;
P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->target, player->mo);
P_SetTarget(&player->mo->hnext, mo); P_SetTarget(&player->mo->hnext, mo);
} }
@ -8941,7 +9024,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mobj_t *prev = player->mo; mobj_t *prev = player->mo;
//K_PlayAttackTaunt(player->mo); //K_PlayAttackTaunt(player->mo);
player->pflags |= PF_ITEMOUT; K_SetItemOut(player);
S_StartSound(player->mo, sfx_s3k3a); S_StartSound(player->mo, sfx_s3k3a);
for (moloop = 0; moloop < player->itemamount; moloop++) for (moloop = 0; moloop < player->itemamount; moloop++)
@ -8959,6 +9042,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mo->movecount = player->itemamount; mo->movecount = player->itemamount;
mo->movedir = mo->lastlook = moloop+1; mo->movedir = mo->lastlook = moloop+1;
mo->color = player->skincolor; mo->color = player->skincolor;
mo->cusval = player->itemscale;
P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->target, player->mo);
P_SetTarget(&mo->hprev, prev); P_SetTarget(&mo->hprev, prev);
P_SetTarget(&prev->hnext, mo); P_SetTarget(&prev->hnext, mo);
@ -8982,7 +9066,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mobj_t *prev = player->mo; mobj_t *prev = player->mo;
//K_PlayAttackTaunt(player->mo); //K_PlayAttackTaunt(player->mo);
player->pflags |= PF_ITEMOUT; K_SetItemOut(player);
S_StartSound(player->mo, sfx_s3k3a); S_StartSound(player->mo, sfx_s3k3a);
for (moloop = 0; moloop < player->itemamount; moloop++) for (moloop = 0; moloop < player->itemamount; moloop++)
@ -8999,6 +9083,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mo->threshold = 10; mo->threshold = 10;
mo->movecount = player->itemamount; mo->movecount = player->itemamount;
mo->movedir = mo->lastlook = moloop+1; mo->movedir = mo->lastlook = moloop+1;
mo->cusval = player->itemscale;
P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->target, player->mo);
P_SetTarget(&mo->hprev, prev); P_SetTarget(&mo->hprev, prev);
P_SetTarget(&prev->hnext, mo); P_SetTarget(&prev->hnext, mo);
@ -9020,7 +9105,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
{ {
mobj_t *mo; mobj_t *mo;
player->pflags |= PF_ITEMOUT; K_SetItemOut(player);
S_StartSound(player->mo, sfx_s254); S_StartSound(player->mo, sfx_s254);
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SSMINE_SHIELD); mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SSMINE_SHIELD);
if (mo) if (mo)
@ -9029,6 +9114,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mo->threshold = 10; mo->threshold = 10;
mo->movecount = 1; mo->movecount = 1;
mo->movedir = 1; mo->movedir = 1;
mo->cusval = player->itemscale;
P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->target, player->mo);
P_SetTarget(&player->mo->hnext, mo); P_SetTarget(&player->mo->hnext, mo);
} }
@ -9278,7 +9364,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
{ {
mobj_t *mo; mobj_t *mo;
player->pflags |= PF_ITEMOUT; K_SetItemOut(player);
S_StartSound(player->mo, sfx_s254); S_StartSound(player->mo, sfx_s254);
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SINK_SHIELD); mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SINK_SHIELD);
if (mo) if (mo)
@ -9287,6 +9373,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
mo->threshold = 10; mo->threshold = 10;
mo->movecount = 1; mo->movecount = 1;
mo->movedir = 1; mo->movedir = 1;
mo->cusval = player->itemscale;
P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->target, player->mo);
P_SetTarget(&player->mo->hnext, mo); P_SetTarget(&player->mo->hnext, mo);
} }

View file

@ -148,5 +148,9 @@ void K_PlayPainSound(mobj_t *source);
void K_PlayHitEmSound(mobj_t *source); void K_PlayHitEmSound(mobj_t *source);
void K_PlayPowerGloatSound(mobj_t *source); void K_PlayPowerGloatSound(mobj_t *source);
fixed_t K_ItemScaleForPlayer(player_t *player);
void K_SetItemOut(player_t *player);
void K_UnsetItemOut(player_t *player);
// ========================================================================= // =========================================================================
#endif // __K_KART__ #endif // __K_KART__

View file

@ -14107,7 +14107,7 @@ void A_SSMineExplode(mobj_t *actor)
INT32 d; INT32 d;
INT32 locvar1 = var1; INT32 locvar1 = var1;
mobjtype_t type; mobjtype_t type;
explodedist = FixedMul((3*actor->info->painchance)/2, mapobjectscale); explodedist = FixedMul((3*actor->info->painchance)/2, actor->scale);
if (LUA_CallAction(A_SSMINEEXPLODE, actor)) if (LUA_CallAction(A_SSMINEEXPLODE, actor))
return; return;