diff --git a/src/d_player.h b/src/d_player.h index 4a4b85981..c09afe13a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -260,6 +260,10 @@ typedef enum // for kickstartaccel #define ACCEL_KICKSTART 35 +#define ITEMSCALE_NORMAL 0 +#define ITEMSCALE_GROW 1 +#define ITEMSCALE_SHRINK 2 + // player_t struct for all respawn variables typedef struct respawnvars_s { @@ -436,6 +440,7 @@ typedef struct player_s SINT8 itemtype; // KITEM_ constant for item number UINT8 itemamount; // Amount of said item 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 diff --git a/src/k_kart.c b/src/k_kart.c index 8fcd81b30..108501eb0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3824,24 +3824,56 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) #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) { mobj_t *th; fixed_t x, y, z; fixed_t finalspeed = speed; + fixed_t finalscale = mapobjectscale; mobj_t *throwmo; - if (source->player && source->player->speed > K_GetKartSpeed(source->player, false)) + if (source->player != NULL) { - angle_t input = source->angle - an; - boolean invert = (input > ANGLE_180); - if (invert) - input = InvAngle(input); + if (source->player->itemscale == ITEMSCALE_SHRINK) + { + // Nerf the base item speed a bit. + finalspeed = FixedMul(finalspeed, SHRINK_PHYSICS_SCALE); + } - 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<player->speed > K_GetKartSpeed(source->player, false)) + { + 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<player); + } + + if (type == MT_BUBBLESHIELDTRAP) + { + finalscale = source->scale; } x = source->x + source->momx + FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); @@ -3860,8 +3892,8 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I P_SetTarget(&th->target, source); - P_SetScale(th, source->scale); - th->destscale = source->destscale; + P_SetScale(th, finalscale); + th->destscale = finalscale; if (P_IsObjectOnGround(source)) { @@ -3887,6 +3919,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I th->momy = FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); th->momz = source->momz; + if (source->player != NULL) + { + th->cusval = source->player->itemscale; + } + switch (type) { case MT_ORBINAUT: @@ -4781,13 +4818,15 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, } else { + fixed_t finalscale = K_ItemScaleForPlayer(player); + player->bananadrag = 0; // RESET timer, for multiple bananas if (dir > 0) { // Shoot forward 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... if (player->mo->eflags & MFE_VERTICALFLIP) { @@ -4814,6 +4853,9 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, if (mo->eflags & MFE_UNDERWATER) 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: @@ -4828,6 +4870,9 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, } throwmo->movecount = 0; // above player + + P_SetScale(throwmo, finalscale); + throwmo->destscale = finalscale; } else { @@ -4865,8 +4910,8 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, mo->threshold = 10; P_SetTarget(&mo->target, player->mo); - P_SetScale(mo, player->mo->scale); - mo->destscale = player->mo->destscale; + P_SetScale(mo, finalscale); + mo->destscale = finalscale; if (P_IsObjectOnGround(player->mo)) { @@ -4936,6 +4981,10 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter) mine->floorz = origMine->floorz; mine->ceilingz = origMine->ceilingz; + P_SetScale(mine, origMine->scale); + mine->destscale = origMine->destscale; + mine->scalespeed = origMine->scalespeed; + // Copy interp data mine->old_angle = origMine->old_angle; mine->old_x = origMine->old_x; @@ -4944,8 +4993,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 P_SetTarget(&mineOwner->hnext, NULL); - mineOwner->player->bananadrag = 0; - mineOwner->player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(mineOwner->player); if (mineOwner->player->itemamount) { @@ -5102,7 +5150,7 @@ static void K_DoHyudoroSteal(player_t *player) player->itemtype = KITEM_KITCHENSINK; player->itemamount = 1; - player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(player); return; } else if ((gametype == GT_RACE && player->position == 1) || numplayers == 0) // No-one can be stolen from? Oh well... @@ -5128,11 +5176,11 @@ static void K_DoHyudoroSteal(player_t *player) player->itemtype = players[stealplayer].itemtype; player->itemamount = players[stealplayer].itemamount; - player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(player); players[stealplayer].itemtype = KITEM_NONE; players[stealplayer].itemamount = 0; - players[stealplayer].pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(&players[stealplayer]); if (P_IsDisplayPlayer(&players[stealplayer]) && !r_splitscreen) S_StartSound(NULL, sfx_s3k92); @@ -5455,7 +5503,7 @@ void K_DropHnextList(player_t *player, boolean keepshields) player->curshield = KSHIELD_NONE; player->itemtype = KITEM_NONE; player->itemamount = 0; - player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(player); } nextwork = work->hnext; @@ -5504,6 +5552,10 @@ void K_DropHnextList(player_t *player, boolean keepshields) dropwork->angle = work->angle; + P_SetScale(dropwork, work->scale); + dropwork->destscale = work->destscale; + dropwork->scalespeed = work->scalespeed; + dropwork->flags |= MF_NOCLIPTHING; dropwork->flags2 = work->flags2; dropwork->eflags = work->eflags; @@ -5593,7 +5645,7 @@ void K_DropHnextList(player_t *player, boolean keepshields) && (dropall || (--player->itemamount <= 0))) { player->itemamount = 0; - player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(player); player->itemtype = KITEM_NONE; } } @@ -5968,6 +6020,8 @@ static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z // Move the hnext chain! static void K_MoveHeldObjects(player_t *player) { + fixed_t finalscale = INT32_MAX; + if (!player->mo) return; @@ -5979,7 +6033,7 @@ static void K_MoveHeldObjects(player_t *player) else if (player->pflags & PF_ITEMOUT) { player->itemamount = 0; - player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(player); player->itemtype = KITEM_NONE; } return; @@ -5995,12 +6049,14 @@ static void K_MoveHeldObjects(player_t *player) else if (player->pflags & PF_ITEMOUT) { player->itemamount = 0; - player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(player); player->itemtype = KITEM_NONE; } return; } + finalscale = K_ItemScaleForPlayer(player); + switch (player->mo->hnext->type) { case MT_ORBINAUT_SHIELD: // Kart orbit items @@ -6039,7 +6095,7 @@ static void K_MoveHeldObjects(player_t *player) cur->eflags &= ~MFE_VERTICALFLIP; // 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) z = player->mo->z; @@ -6070,7 +6126,7 @@ static void K_MoveHeldObjects(player_t *player) } // 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->momx = cur->momy = 0; @@ -6132,7 +6188,7 @@ static void K_MoveHeldObjects(player_t *player) continue; // 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; targx = targ->x + P_ReturnThrustX(cur, ang + ANGLE_180, dist); @@ -8723,6 +8779,31 @@ static void K_trickPanelTimingVisual(player_t *player, fixed_t momz) #undef RADIUSSCALING #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 // @@ -8823,7 +8904,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (player->itemamount == 0) { - player->pflags &= ~PF_ITEMOUT; + K_UnsetItemOut(player); } else { @@ -8898,7 +8979,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mobj_t *prev = player->mo; //K_PlayAttackTaunt(player->mo); - player->pflags |= PF_ITEMOUT; + K_SetItemOut(player); S_StartSound(player->mo, sfx_s254); for (moloop = 0; moloop < player->itemamount; moloop++) @@ -8913,6 +8994,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo->threshold = 10; mo->movecount = player->itemamount; mo->movedir = moloop+1; + mo->cusval = player->itemscale; P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->hprev, prev); P_SetTarget(&prev->hnext, mo); @@ -8942,6 +9024,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo->threshold = 10; mo->movecount = 1; mo->movedir = 1; + mo->cusval = player->itemscale; P_SetTarget(&mo->target, player->mo); P_SetTarget(&player->mo->hnext, mo); } @@ -8956,7 +9039,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mobj_t *prev = player->mo; //K_PlayAttackTaunt(player->mo); - player->pflags |= PF_ITEMOUT; + K_SetItemOut(player); S_StartSound(player->mo, sfx_s3k3a); for (moloop = 0; moloop < player->itemamount; moloop++) @@ -8974,6 +9057,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo->movecount = player->itemamount; mo->movedir = mo->lastlook = moloop+1; mo->color = player->skincolor; + mo->cusval = player->itemscale; P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->hprev, prev); P_SetTarget(&prev->hnext, mo); @@ -8997,7 +9081,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mobj_t *prev = player->mo; //K_PlayAttackTaunt(player->mo); - player->pflags |= PF_ITEMOUT; + K_SetItemOut(player); S_StartSound(player->mo, sfx_s3k3a); for (moloop = 0; moloop < player->itemamount; moloop++) @@ -9014,6 +9098,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo->threshold = 10; mo->movecount = player->itemamount; mo->movedir = mo->lastlook = moloop+1; + mo->cusval = player->itemscale; P_SetTarget(&mo->target, player->mo); P_SetTarget(&mo->hprev, prev); P_SetTarget(&prev->hnext, mo); @@ -9035,7 +9120,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { mobj_t *mo; - player->pflags |= PF_ITEMOUT; + K_SetItemOut(player); S_StartSound(player->mo, sfx_s254); mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SSMINE_SHIELD); if (mo) @@ -9044,6 +9129,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo->threshold = 10; mo->movecount = 1; mo->movedir = 1; + mo->cusval = player->itemscale; P_SetTarget(&mo->target, player->mo); P_SetTarget(&player->mo->hnext, mo); } @@ -9293,7 +9379,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { mobj_t *mo; - player->pflags |= PF_ITEMOUT; + K_SetItemOut(player); S_StartSound(player->mo, sfx_s254); mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_SINK_SHIELD); if (mo) @@ -9302,6 +9388,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo->threshold = 10; mo->movecount = 1; mo->movedir = 1; + mo->cusval = player->itemscale; P_SetTarget(&mo->target, player->mo); P_SetTarget(&player->mo->hnext, mo); } diff --git a/src/k_kart.h b/src/k_kart.h index c05620b74..a8834397c 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -148,5 +148,9 @@ void K_PlayPainSound(mobj_t *source); void K_PlayHitEmSound(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__ diff --git a/src/p_enemy.c b/src/p_enemy.c index d9b1fd840..04e77bd8f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -14107,7 +14107,7 @@ void A_SSMineExplode(mobj_t *actor) INT32 d; INT32 locvar1 = var1; 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)) return;