get everything working exactly like the prototype

This commit is contained in:
minenice55 2025-12-09 00:38:57 -05:00
parent 4fd6e4987c
commit 6eb1a6688a
9 changed files with 112 additions and 76 deletions

View file

@ -94,7 +94,7 @@
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291
#define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b
#define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9
#define ASSET_HASH_MAIN_PK3 0x5b698b56d8ac5717
#define ASSET_HASH_MAIN_PK3 0xaf9562709f075a88
#define ASSET_HASH_MAPPATCH_PK3 0x0afd8afc6fc50175
#define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461
#ifdef USE_PATCH_FILE

View file

@ -1234,7 +1234,7 @@ void K_BotItemUsage(botdata_t *bd, const player_t *player)
{
K_BotItemEggmanExplosion(bd, player);
}
else if (player->itemflags & IF_EGGMANOUT)
else if ((!K_IsKartItemAlternate(KITEM_EGGMAN)) && (player->itemflags & IF_EGGMANOUT))
{
K_BotItemEggman(bd, player);
}
@ -1291,7 +1291,22 @@ void K_BotItemUsage(botdata_t *bd, const player_t *player)
}
break;
case KITEM_EGGMAN:
K_BotItemEggmanShield(bd, player);
if (K_IsKartItemAlternate(KITEM_EGGMAN))
{
if (!(player->itemflags & IF_ITEMOUT))
{
K_BotItemGenericOrbitShield(bd, player);
}
else if (player->position != 1) // Hold onto orbiting items when in 1st :)
{
// about the same usage (?), maybe a dedicated usage function one day
K_BotItemMine(bd, player);
}
}
else
{
K_BotItemEggmanShield(bd, player);
}
break;
case KITEM_ORBINAUT:
if (!(player->itemflags & IF_ITEMOUT))

View file

@ -296,8 +296,43 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2)
return true;
}
void K_EggMineBounce(mobj_t *t1, mobj_t *t2)
{
fixed_t zimpulse;
fixed_t impulse = min(max(FixedMul(R_PointToDist2(0, 0, t2->momx, t2->momy), 115*FRACUNIT/100), 15*mapobjectscale), 45*mapobjectscale);
fixed_t pointx = (t1->x + t2->x)/2;
fixed_t pointy = (t1->y + t2->y)/2;
fixed_t localspacex = t1->x - pointx;
fixed_t localspacey = t1->y - pointy;
angle_t impulseangle = R_PointToAngle2(0, 0, (localspacex + t2->momx)/2, (localspacey + t2->momy)/2);
P_InstaThrust(t1, impulseangle, impulse);
zimpulse = (P_MobjFlip(t1) * min((P_AproxDistance(t2->momx, t2->momy) + P_AproxDistance(t1->momx, t1->momy)), 28*mapobjectscale)) + t2->momz/2;
if (t2->type == MT_EGGMINE)
{
fixed_t zdiff = (t1->z + (t1->height*P_MobjFlip(t1)/2)) - (t2->z + (t2->height*P_MobjFlip(t2))/2);
zimpulse /= 2;
if (zdiff < 0)
{
zimpulse *= -1;
}
}
// doesn't this look familiar
t1->momz = zimpulse;
t1->z += t1->momz;
if (t1->extravalue1 == 0)
{
K_SpawnEggMineBumpEffect(t1);
t1->extravalue1 = 6;
}
}
boolean K_EggMineCollide(mobj_t *t1, mobj_t *t2)
{
boolean sprung;
if (t1->health <= 0 || t2->health <= 0)
return true;
@ -319,6 +354,7 @@ boolean K_EggMineCollide(mobj_t *t1, mobj_t *t2)
{
if (t1->health > 2)
{
K_DoEggMineStrip(t2, t1, t1->target);
S_StartSound(t2, sfx_bsnipe);
P_DamageMobj(t2, t1, t1->target, 1, DMG_FLIPOVER);
P_RemoveMobj(t1);
@ -335,18 +371,25 @@ boolean K_EggMineCollide(mobj_t *t1, mobj_t *t2)
}
K_EggMineBounce(t1, t2);
}
else if (t2->flags & MF_SPRING)
{
// Let thrown items hit springs!
sprung = P_DoSpring(t2, t1);
}
else if (K_IsMissileOrKartItem(t2))
{
if (t2->type == MT_SPB)
{
return false;
}
else
// eggmines don't kill eachother
if (!(t2->type == MT_SPB || t2->type == MT_EGGMINE || t2->type == MT_EGGMINE_SHIELD))
{
P_KillMobj(t2, t1, t1->target, DMG_INSTAKILL);
}
P_KillMobj(t1, t2, t2->target, DMG_INSTAKILL);
}
if (sprung)
{
return false;
}
return true;
}
@ -357,6 +400,7 @@ boolean K_EggMineShieldCollide(mobj_t *t1, mobj_t *t2)
if (K_IsMissileOrKartItem(t2))
{
// eggmines don't kill eachother
if (!(t2->type == MT_SPB || t2->type == MT_EGGMINE || t2->type == MT_EGGMINE_SHIELD))
{
P_KillMobj(t2, t1, t1->target, DMG_INSTAKILL);
@ -365,7 +409,7 @@ boolean K_EggMineShieldCollide(mobj_t *t1, mobj_t *t2)
return true;
}
return false;
return true;
}
boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
@ -468,6 +512,8 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2)
}
else
{
// these can only come from eggmines now
K_DoEggMineStrip(t2, t1, t1->target);
// Player Damage
P_DamageMobj(t2, t1, t1->target, 1, DMG_FLIPOVER);
}
@ -626,8 +672,8 @@ static void K_BubbleShieldCollideDrain(player_t *player, mobj_t *bubble, INT16 d
static boolean K_BubbleReflectingTrapItem(const mobj_t *t)
{
return t->type == MT_BANANA || (t->type == MT_ORBINAUT && t->flags2 & MF2_AMBUSH) || t->type == MT_JAWZ_DUD ||
t->type == MT_EGGMANITEM || t->type == MT_SSMINE || t->type == MT_SSMINE_SHIELD || t->type == MT_LANDMINE;// ||
// t->type == MT_EGGMINE_CAPSULE || t->type == MT_EGGMINE_SHIELD;
t->type == MT_EGGMANITEM || t->type == MT_SSMINE || t->type == MT_SSMINE_SHIELD || t->type == MT_LANDMINE ||
t->type == MT_EGGMINE;
}
static boolean K_StrongPlayerBump(const player_t *player)

View file

@ -13,6 +13,9 @@ void K_ItemDamage(mobj_t *t1, mobj_t *t2, boolean clash);
boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2);
boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2);
boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2);
void K_EggMineBounce(mobj_t *t1, mobj_t *t2);
boolean K_EggMineCollide(mobj_t *t1, mobj_t *t2);
boolean K_EggMineShieldCollide(mobj_t *t1, mobj_t *t2);
boolean K_MineCollide(mobj_t *t1, mobj_t *t2);
boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2);
boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2);

View file

@ -2050,7 +2050,6 @@ void K_PlayerItemThink(player_t *player, boolean onground)
player->itemamount = moloop;
break;
}
K_EggMineSetup(mo);
mo->flags |= MF_NOCLIPTHING;
mo->angle = newangle;
mo->movecount = player->itemamount;
@ -2071,7 +2070,6 @@ void K_PlayerItemThink(player_t *player, boolean onground)
if (player->throwdir == 1)
{
mo = K_ThrowKartItem(player, false, MT_EGGMINE, 1, 0);
K_EggMineSetup(mo);
mo->health = 3;
mo->whiteshadow = true;
mo->lastlook = 1;
@ -2079,7 +2077,6 @@ void K_PlayerItemThink(player_t *player, boolean onground)
else
{
mo = K_ThrowKartItem(player, true, MT_EGGMINE, 4, 0);
K_EggMineSetup(mo);
if (player->throwdir == 0)
{
mo->health = 2;
@ -2562,50 +2559,4 @@ void K_DoEggMineStrip(mobj_t *tmo, mobj_t *inflictor, mobj_t *source)
K_SetPlayerItemCooldown(tmo->player, TICRATE, false);
}
}
}
void K_EggMineSetup(mobj_t *mo)
{
mobj_t *overlay;
mo->movefactor = TICRATE;
mo->threshold = 6;
overlay = P_SpawnMobj(mo->x, mo->y, mo->z, MT_OVERLAY);
overlay->target = mo;
overlay->tracer = mo;
overlay->state = S_EGGMINE_OVERLAY;
overlay->flags2 |= MF2_LINKDRAW;
overlay->dispoffset = -1;
}
void K_EggMineBounce(mobj_t *t1, mobj_t *t2)
{
fixed_t zimpulse;
fixed_t impulse = min(max(FixedMul(R_PointToDist2(0, 0, t2->momx, t2->momy), 115*FRACUNIT/100), 15*mapobjectscale), 45*mapobjectscale);
fixed_t pointx = (t1->x + t2->x)/2;
fixed_t pointy = (t1->y + t2->y)/2;
fixed_t localspacex = t1->x - pointx;
fixed_t localspacey = t1->y - pointy;
angle_t impulseangle = R_PointToAngle2(0, 0, (localspacex + t2->momx)/2, (localspacey + t2->momy)/2);
P_InstaThrust(t1, impulseangle, impulse);
zimpulse = (P_MobjFlip(t1) * min((P_AproxDistance(t2->momx, t2->momy) + P_AproxDistance(t1->momx, t1->momy)), 28*mapobjectscale)) + t2->momz/2;
if (t2->type == MT_EGGMINE);
{
fixed_t zdiff = (t1->z + (t1->height*P_MobjFlip(t1)/2)) - (t2->z + (t2->height*P_MobjFlip(t2))/2);
zimpulse /= 2;
if (zdiff < 0)
{
zimpulse *= -1;
}
}
t1->momz = zimpulse;
if (t1->extravalue1 == 0)
{
K_SpawnEggMineBumpEffect(t1);
t1->extravalue1 = 6;
}
}

View file

@ -222,8 +222,6 @@ void K_AltShrinkPityIncrease(player_t *player);
void K_SpawnEggMineBumpEffect(mobj_t *mo);
void K_DoEggMineStrip(mobj_t *tmo, mobj_t *inflictor, mobj_t *source);
void K_EggMineSetup(mobj_t *mo);
void K_EggMineBounce(mobj_t *t1, mobj_t *t2);
void K_PlayerItemThink(player_t *player, boolean onground);

View file

@ -5065,6 +5065,13 @@ void K_DropHnextList(player_t *player)
orbit = false;
type = MT_EGGMANITEM;
break;
case MT_EGGMINE_SHIELD:
orbit = false;
dropall = true;
type = MT_EGGMINE;
work->lastlook = 0;
break;
// intentionally do nothing
case MT_ROCKETSNEAKER:
case MT_SINK_SHIELD:

View file

@ -3813,6 +3813,11 @@ void P_BounceMove(mobj_t *mo, TryMoveResult_t *result)
tmxmove = FixedMul(mmomx, (FRACUNIT - (FRACUNIT>>6) - (FRACUNIT>>5)));
tmymove = FixedMul(mmomy, (FRACUNIT - (FRACUNIT>>6) - (FRACUNIT>>5)));
}
else if (mo->type == MT_EGGMINE)
{
tmxmove = mmomx/3;
tmymove = mmomy/3;
}
else if (mo->type == MT_THROWNGRENADE || mo->type == MT_CYBRAKDEMON_NAPALM_BOMB_LARGE)
{
// Quickly decay speed as it bounces

View file

@ -1656,15 +1656,6 @@ void P_XYMovement(mobj_t *mo)
}
}
//}
else if (mo->type == MT_EGGMINE)
{
if (result.line != NULL)
{
mo->momx /= 3;
mo->momy /= 3;
K_SpawnEggMineBumpEffect(mo);
}
}
else if (mo->flags & MF_MISSILE)
{
// explode a missile
@ -1808,6 +1799,10 @@ void P_XYMovement(mobj_t *mo)
fx->eflags &= ~MFE_VERTICALFLIP;
fx->scale = mo->scale;
}
else if (mo->type == MT_EGGMINE)
{
K_SpawnEggMineBumpEffect(mo);
}
switch (mo->type)
{
@ -6538,6 +6533,7 @@ boolean P_IsKartItem(INT32 type)
case MT_JAWZ_SHIELD:
case MT_SSMINE_SHIELD:
case MT_SINK_SHIELD:
case MT_EGGMINE_SHIELD:
return true;
// Primarily for minimap data, handle with care
@ -8835,11 +8831,10 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
{
P_KillMobj(mobj, mobj, NULL, DMG_INSTAKILL);
}
else
if (S_SoundPlaying(mobj, sfx_s3kd2l))
{
S_StopSoundByID(mobj, sfx_s3kd2l);
}
}
else if (S_SoundPlaying(mobj, sfx_s3kd2l))
{
S_StopSoundByID(mobj, sfx_s3kd2l);
}
if (mobj->threshold > 0)
@ -11368,6 +11363,22 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
nummaprings++;
break;
// SRB2Kart
case MT_EGGMINE:
case MT_EGGMINE_SHIELD:
{
mobj_t *overlay = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_OVERLAY);
P_SetMobjState(overlay, S_EGGMINE_OVERLAY);
overlay->destscale = mobj->scale;
P_SetScale(overlay, mobj->scale);
P_SetTarget(&overlay->target, mobj);
P_SetTarget(&overlay->tracer, mobj);
overlay->flags2 |= MF2_LINKDRAW;
overlay->dispoffset = -1;
mobj->movefactor = TICRATE;
mobj->threshold = 6;
break;
}
case MT_BUBBLESHIELD:
{
// Spawn in the damage overlay