From c8124a6c949a94b06a5ca7fff91ee9929350dc2c Mon Sep 17 00:00:00 2001 From: SteelT Date: Sun, 28 Mar 2021 17:19:47 -0400 Subject: [PATCH 01/13] Some invincbility changes --- src/dehacked.c | 35 ++++++++++++++++++++++++----------- src/info.c | 41 ++++++++++++++++++++++++++++------------- src/info.h | 38 ++++++++++++++++++++++++++------------ src/k_kart.c | 49 +++++++++++++++++++++++++++++++++++++++++-------- src/k_kart.h | 1 + src/p_inter.c | 8 ++++++++ 6 files changed, 128 insertions(+), 44 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index fb3608849..e0b4d10e0 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8433,17 +8433,30 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_KARTAIZDRIFTSTRAT", // Invincibility Sparks - "S_KARTINVULN_SMALL1", - "S_KARTINVULN_SMALL2", - "S_KARTINVULN_SMALL3", - "S_KARTINVULN_SMALL4", - "S_KARTINVULN_SMALL5", - - "S_KARTINVULN_LARGE1", - "S_KARTINVULN_LARGE2", - "S_KARTINVULN_LARGE3", - "S_KARTINVULN_LARGE4", - "S_KARTINVULN_LARGE5", + "S_KARTINVULN1", + "S_KARTINVULN2", + "S_KARTINVULN3", + "S_KARTINVULN4", + "S_KARTINVULN5", + "S_KARTINVULN6", + "S_KARTINVULN7", + "S_KARTINVULN8", + "S_KARTINVULN9", + "S_KARTINVULN10", + "S_KARTINVULN11", + "S_KARTINVULN12", + "S_KARTINVULNB1", + "S_KARTINVULNB2", + "S_KARTINVULNB3", + "S_KARTINVULNB4", + "S_KARTINVULNB5", + "S_KARTINVULNB6", + "S_KARTINVULNB7", + "S_KARTINVULNB8", + "S_KARTINVULNB9", + "S_KARTINVULNB10", + "S_KARTINVULNB11", + "S_KARTINVULNB12", // Invincibility flash overlay "S_INVULNFLASH1", diff --git a/src/info.c b/src/info.c index 32bb5fb17..3a33634c9 100644 --- a/src/info.c +++ b/src/info.c @@ -532,7 +532,8 @@ char sprnames[NUMSPRITES + 1][5] = "BOST", // Sneaker booster flame "BOSM", // Sneaker booster smoke "KFRE", // Sneaker fire trail - "KINV", // Invincibility sparkle trail + "KINV", // Fullbright invincibility sparkle trail + "KINB", // Invincibility sparkle trail "KINF", // Invincibility flash "WIPD", // Wipeout dust trail "DRIF", // Drift Sparks @@ -4158,17 +4159,31 @@ state_t states[NUMSTATES] = {SPR_AIDU, FF_ANIMATE|FF_PAPERSPRITE, 5*2, {NULL}, 5, 2, S_NULL}, // S_KARTAIZDRIFTSTRAT - {SPR_KINV, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL2}, // S_KARTINVULN_SMALL1 - {SPR_KINV, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL3}, // S_KARTINVULN_SMALL2 - {SPR_KINV, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL4}, // S_KARTINVULN_SMALL3 - {SPR_KINV, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL5}, // S_KARTINVULN_SMALL4 - {SPR_KINV, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULN_SMALL5 + {SPR_KINV, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULN2}, // S_KARTINVULN1 + {SPR_KINV, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULN3}, // S_KARTINVULN2 + {SPR_KINV, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULN4}, // S_KARTINVULN3 + {SPR_KINV, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULN5}, // S_KARTINVULN4 + {SPR_KINV, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_KARTINVULN6}, // S_KARTINVULN5 + {SPR_KINV, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULN7}, // S_KARTINVULN6 + {SPR_KINV, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULN8}, // S_KARTINVULN7 + {SPR_KINV, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_KARTINVULN9}, // S_KARTINVULN8 + {SPR_KINV, FF_FULLBRIGHT|8, 1, {NULL}, 0, 0, S_KARTINVULN10}, // S_KARTINVULN9 + {SPR_KINV, FF_FULLBRIGHT|9, 1, {NULL}, 0, 0, S_KARTINVULN11}, // S_KARTINVULN10 + {SPR_KINV, FF_FULLBRIGHT|10, 1, {NULL}, 0, 0, S_KARTINVULN12}, // S_KARTINVULN11 + {SPR_KINV, FF_FULLBRIGHT|11, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULN12 - {SPR_KINV, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE2}, // S_KARTINVULN_LARGE1 - {SPR_KINV, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE3}, // S_KARTINVULN_LARGE2 - {SPR_KINV, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE4}, // S_KARTINVULN_LARGE3 - {SPR_KINV, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE5}, // S_KARTINVULN_LARGE4 - {SPR_KINV, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULN_LARGE5 + {SPR_KINB, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULNB2}, // S_KARTINVULNB1 + {SPR_KINB, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULNB3}, // S_KARTINVULNB2 + {SPR_KINB, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULNB4}, // S_KARTINVULNB3 + {SPR_KINB, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULNB5}, // S_KARTINVULNB4 + {SPR_KINB, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_KARTINVULNB6}, // S_KARTINVULNB5 + {SPR_KINB, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULNB7}, // S_KARTINVULNB6 + {SPR_KINB, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULNB8}, // S_KARTINVULNB7 + {SPR_KINB, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_KARTINVULNB9}, // S_KARTINVULNB8 + {SPR_KINB, FF_FULLBRIGHT|8, 1, {NULL}, 0, 0, S_KARTINVULNB10}, // S_KARTINVULNB9 + {SPR_KINB, FF_FULLBRIGHT|9, 1, {NULL}, 0, 0, S_KARTINVULNB11}, // S_KARTINVULNB10 + {SPR_KINB, FF_FULLBRIGHT|10, 1, {NULL}, 0, 0, S_KARTINVULNB12}, // S_KARTINVULNB11 + {SPR_KINB, FF_FULLBRIGHT|11, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULNB12 {SPR_KINF, FF_FULLBRIGHT|FF_TRANS90, 1, {NULL}, 0, 0, S_INVULNFLASH2}, // S_INVULNFLASH1 {SPR_NULL, FF_FULLBRIGHT|FF_TRANS90, 1, {NULL}, 0, 0, S_INVULNFLASH3}, // S_INVULNFLASH2 @@ -4206,7 +4221,7 @@ state_t states[NUMSTATES] = {SPR_ORBN, 0, 1, {NULL}, 0, 0, S_ORBINAUT2}, // S_ORBINAUT1 {SPR_ORBN, 1, 1, {NULL}, 0, 0, S_ORBINAUT3}, // S_ORBINAUT2 {SPR_ORBN, 2, 1, {NULL}, 0, 0, S_ORBINAUT4}, // S_ORBINAUT3 - {SPR_ORBN, 3, 1, {NULL}, 0, 0, S_ORBINAUT5}, // S_ORBINAUT4 + {SPR_ORBN, 3, 1, {NULL}, 0, 0, S_ORBINAUT5}, // S_ORBINAUT4S_ORBINAUT4 {SPR_ORBN, 4, 1, {NULL}, 0, 0, S_ORBINAUT6}, // S_ORBINAUT5 {SPR_ORBN, 5, 1, {NULL}, 0, 0, S_ORBINAUT1}, // S_ORBINAUT6 {SPR_ORBN, 0, 175, {NULL}, 0, 0, S_NULL}, // S_ORBINAUT_DEAD @@ -23276,7 +23291,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_SPARKLETRAIL -1, // doomednum - S_KARTINVULN_SMALL1, // spawnstate + S_INVISIBLE, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound diff --git a/src/info.h b/src/info.h index 3fc3e718b..7903af0c6 100644 --- a/src/info.h +++ b/src/info.h @@ -803,7 +803,8 @@ typedef enum sprite SPR_BOST, // Sneaker booster flame SPR_BOSM, // Sneaker booster smoke SPR_KFRE, // Sneaker fire trail - SPR_KINV, // Invincibility sparkle trail + SPR_KINV, // Fullbright invincibility sparkle trail + SPR_KINB, // Fullbright invincibility sparkle trail SPR_KINF, // Invincibility flash SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks @@ -4287,17 +4288,30 @@ typedef enum state S_KARTAIZDRIFTSTRAT, // Invincibility Sparks - S_KARTINVULN_SMALL1, - S_KARTINVULN_SMALL2, - S_KARTINVULN_SMALL3, - S_KARTINVULN_SMALL4, - S_KARTINVULN_SMALL5, - - S_KARTINVULN_LARGE1, - S_KARTINVULN_LARGE2, - S_KARTINVULN_LARGE3, - S_KARTINVULN_LARGE4, - S_KARTINVULN_LARGE5, + S_KARTINVULN1, + S_KARTINVULN2, + S_KARTINVULN3, + S_KARTINVULN4, + S_KARTINVULN5, + S_KARTINVULN6, + S_KARTINVULN7, + S_KARTINVULN8, + S_KARTINVULN9, + S_KARTINVULN10, + S_KARTINVULN11, + S_KARTINVULN12, + S_KARTINVULNB1, + S_KARTINVULNB2, + S_KARTINVULNB3, + S_KARTINVULNB4, + S_KARTINVULNB5, + S_KARTINVULNB6, + S_KARTINVULNB7, + S_KARTINVULNB8, + S_KARTINVULNB9, + S_KARTINVULNB10, + S_KARTINVULNB11, + S_KARTINVULNB12, // Invincibility flash S_INVULNFLASH1, diff --git a/src/k_kart.c b/src/k_kart.c index 91335cdcb..76001c4d2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -401,6 +401,21 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] = #define DISTVAR (2048) // Magic number distance for use with item roulette tiers +static INT32 K_SparkleTrailStartStates[NUMKARTSPARKLESTATES][2] = { + {S_KARTINVULN12, S_KARTINVULNB12}, + {S_KARTINVULN11, S_KARTINVULNB11}, + {S_KARTINVULN10, S_KARTINVULNB10}, + {S_KARTINVULN9, S_KARTINVULNB9}, + {S_KARTINVULN8, S_KARTINVULNB8}, + {S_KARTINVULN7, S_KARTINVULNB7}, + {S_KARTINVULN6, S_KARTINVULNB6}, + {S_KARTINVULN5, S_KARTINVULNB5}, + {S_KARTINVULN4, S_KARTINVULNB4}, + {S_KARTINVULN3, S_KARTINVULNB3}, + {S_KARTINVULN2, S_KARTINVULNB2}, + {S_KARTINVULN1, S_KARTINVULNB1} +}; + INT32 K_GetShieldFromItem(INT32 item) { switch (item) @@ -3749,20 +3764,34 @@ void K_SpawnBoostTrail(player_t *player) void K_SpawnSparkleTrail(mobj_t *mo) { - const INT32 rad = (mo->radius*2)>>FRACBITS; + const INT32 rad = (mo->radius*3)>>FRACBITS; mobj_t *sparkle; + angle_t newangle; INT32 i; + UINT8 frame; + UINT8 invanimnum; + UINT8 index = 1; I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); - for (i = 0; i < 3; i++) + invanimnum = mo->player->kartstuff[k_invincibilitytimer]/TICRATE+1; + + if (leveltime & 2) + index = 2; + + CONS_Printf("%d\n", index); + CONS_Printf("%d\n", invanimnum); + + for (i = 0; i < 8; i++) { - fixed_t newx = mo->x + mo->momx + (P_RandomRange(-rad, rad)<y + mo->momy + (P_RandomRange(-rad, rad)<z + mo->momz + (P_RandomRange(0, mo->height>>FRACBITS)<angle + ANGLE_157h) + FixedAngle(((360 / 8) * i) << FRACBITS) + ANGLE_90; + fixed_t newx = mo->x + (mo->momx*4)/5 + (P_RandomRange(-rad, rad)<y + mo->momy + (P_RandomRange(-rad, rad*2)<z + (mo->momz*4)/5 + (P_RandomRange(0, mo->height>>FRACBITS)<angle = newangle; K_FlipFromObject(sparkle, mo); //if (i == 0) @@ -3771,11 +3800,15 @@ void K_SpawnSparkleTrail(mobj_t *mo) P_SetTarget(&sparkle->target, mo); sparkle->destscale = mo->destscale; P_SetScale(sparkle, mo->scale); - sparkle->color = mo->color; - //sparkle->colorized = mo->colorized; } - P_SetMobjState(sparkle, S_KARTINVULN_LARGE1); + P_SetMobjState(sparkle, K_SparkleTrailStartStates[invanimnum][index]); + sparkle->colorized = true; + sparkle->color = mo->color; + + //CONS_Printf("%d\n", (mo->player->kartstuff[k_invincibilitytimer]/TICRATE)); + + //invanimnum = (mo->player->kartstuff[k_invincibilitytimer]/TICRATE > 11) ? 11 : mo->player->kartstuff[k_invincibilitytimer]/TICRATE; } void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) diff --git a/src/k_kart.h b/src/k_kart.h index bde845a22..18b354efc 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -11,6 +11,7 @@ #include "command.h" // Need for player_t #define KART_FULLTURN 800 +#define NUMKARTSPARKLESTATES 12 player_t *K_GetItemBoxPlayer(mobj_t *mobj); angle_t K_ReflectAngle(angle_t angle, angle_t against, fixed_t maxspeed, fixed_t yourspeed); diff --git a/src/p_inter.c b/src/p_inter.c index 541d1a890..1c07a5a90 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1826,6 +1826,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da boolean force = false; INT32 laglength = 10; + INT32 kinvextend = 0; if (objectplacing) return false; @@ -1981,6 +1982,13 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (source && source != player->mo && source->player) { + if (source->player->kartstuff[k_invincibilitytimer]) + { + kinvextend = (source->player->kartstuff[k_invincibilitytimer])+2*TICRATE; + CONS_Printf("extend k_invincibilitytimer for %s - old value %d new value %d\n", player_names[source->player - players], source->player->kartstuff[k_invincibilitytimer]/TICRATE, kinvextend/TICRATE); + source->player->kartstuff[k_invincibilitytimer] = kinvextend; + } + K_PlayHitEmSound(source); K_BattleAwardHit(source->player, player, inflictor, takeBumpers); From 3b617337ee818339f71a767dc26fc03205766f68 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Mon, 29 Mar 2021 00:27:56 +0200 Subject: [PATCH 02/13] Fancy rotating sparkles --- src/info.c | 48 ++++++++++++++++++++++++------------------------ src/info.h | 1 + src/k_kart.c | 28 +++++++++++++++++----------- src/p_enemy.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 35 deletions(-) diff --git a/src/info.c b/src/info.c index 3a33634c9..01d949383 100644 --- a/src/info.c +++ b/src/info.c @@ -4159,31 +4159,31 @@ state_t states[NUMSTATES] = {SPR_AIDU, FF_ANIMATE|FF_PAPERSPRITE, 5*2, {NULL}, 5, 2, S_NULL}, // S_KARTAIZDRIFTSTRAT - {SPR_KINV, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULN2}, // S_KARTINVULN1 - {SPR_KINV, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULN3}, // S_KARTINVULN2 - {SPR_KINV, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULN4}, // S_KARTINVULN3 - {SPR_KINV, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULN5}, // S_KARTINVULN4 - {SPR_KINV, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_KARTINVULN6}, // S_KARTINVULN5 - {SPR_KINV, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULN7}, // S_KARTINVULN6 - {SPR_KINV, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULN8}, // S_KARTINVULN7 - {SPR_KINV, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_KARTINVULN9}, // S_KARTINVULN8 - {SPR_KINV, FF_FULLBRIGHT|8, 1, {NULL}, 0, 0, S_KARTINVULN10}, // S_KARTINVULN9 - {SPR_KINV, FF_FULLBRIGHT|9, 1, {NULL}, 0, 0, S_KARTINVULN11}, // S_KARTINVULN10 - {SPR_KINV, FF_FULLBRIGHT|10, 1, {NULL}, 0, 0, S_KARTINVULN12}, // S_KARTINVULN11 - {SPR_KINV, FF_FULLBRIGHT|11, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULN12 + {SPR_KINV, FF_FULLBRIGHT, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN2}, // S_KARTINVULN1 + {SPR_KINV, FF_FULLBRIGHT|1, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN3}, // S_KARTINVULN2 + {SPR_KINV, FF_FULLBRIGHT|2, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN4}, // S_KARTINVULN3 + {SPR_KINV, FF_FULLBRIGHT|3, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN5}, // S_KARTINVULN4 + {SPR_KINV, FF_FULLBRIGHT|4, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN6}, // S_KARTINVULN5 + {SPR_KINV, FF_FULLBRIGHT|5, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN7}, // S_KARTINVULN6 + {SPR_KINV, FF_FULLBRIGHT|6, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN8}, // S_KARTINVULN7 + {SPR_KINV, FF_FULLBRIGHT|7, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN9}, // S_KARTINVULN8 + {SPR_KINV, FF_FULLBRIGHT|8, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN10}, // S_KARTINVULN9 + {SPR_KINV, FF_FULLBRIGHT|9, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN11}, // S_KARTINVULN10 + {SPR_KINV, FF_FULLBRIGHT|10, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN12}, // S_KARTINVULN11 + {SPR_KINV, FF_FULLBRIGHT|11, 1, {A_InvincSparkleRotate}, 0, 0, S_NULL}, // S_KARTINVULN12 - {SPR_KINB, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULNB2}, // S_KARTINVULNB1 - {SPR_KINB, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULNB3}, // S_KARTINVULNB2 - {SPR_KINB, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULNB4}, // S_KARTINVULNB3 - {SPR_KINB, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULNB5}, // S_KARTINVULNB4 - {SPR_KINB, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_KARTINVULNB6}, // S_KARTINVULNB5 - {SPR_KINB, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULNB7}, // S_KARTINVULNB6 - {SPR_KINB, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULNB8}, // S_KARTINVULNB7 - {SPR_KINB, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_KARTINVULNB9}, // S_KARTINVULNB8 - {SPR_KINB, FF_FULLBRIGHT|8, 1, {NULL}, 0, 0, S_KARTINVULNB10}, // S_KARTINVULNB9 - {SPR_KINB, FF_FULLBRIGHT|9, 1, {NULL}, 0, 0, S_KARTINVULNB11}, // S_KARTINVULNB10 - {SPR_KINB, FF_FULLBRIGHT|10, 1, {NULL}, 0, 0, S_KARTINVULNB12}, // S_KARTINVULNB11 - {SPR_KINB, FF_FULLBRIGHT|11, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULNB12 + {SPR_KINB, FF_FULLBRIGHT, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB2}, // S_KARTINVULNB1 + {SPR_KINB, FF_FULLBRIGHT|1, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB3}, // S_KARTINVULNB2 + {SPR_KINB, FF_FULLBRIGHT|2, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB4}, // S_KARTINVULNB3 + {SPR_KINB, FF_FULLBRIGHT|3, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB5}, // S_KARTINVULNB4 + {SPR_KINB, FF_FULLBRIGHT|4, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB6}, // S_KARTINVULNB5 + {SPR_KINB, FF_FULLBRIGHT|5, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB7}, // S_KARTINVULNB6 + {SPR_KINB, FF_FULLBRIGHT|6, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB8}, // S_KARTINVULNB7 + {SPR_KINB, FF_FULLBRIGHT|7, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB9}, // S_KARTINVULNB8 + {SPR_KINB, FF_FULLBRIGHT|8, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB10}, // S_KARTINVULNB9 + {SPR_KINB, FF_FULLBRIGHT|9, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB11}, // S_KARTINVULNB10 + {SPR_KINB, FF_FULLBRIGHT|10, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB12}, // S_KARTINVULNB11 + {SPR_KINB, FF_FULLBRIGHT|11, 1, {A_InvincSparkleRotate}, 0, 0, S_NULL}, // S_KARTINVULNB12 {SPR_KINF, FF_FULLBRIGHT|FF_TRANS90, 1, {NULL}, 0, 0, S_INVULNFLASH2}, // S_INVULNFLASH1 {SPR_NULL, FF_FULLBRIGHT|FF_TRANS90, 1, {NULL}, 0, 0, S_INVULNFLASH3}, // S_INVULNFLASH2 diff --git a/src/info.h b/src/info.h index 7903af0c6..73c4da345 100644 --- a/src/info.h +++ b/src/info.h @@ -183,6 +183,7 @@ void A_MayonakaArrow(); //SRB2kart: midnight channel arrow sign void A_ReaperThinker(); //SRB2kart: mementos reaper void A_MementosTPParticles(); //SRB2kart: mementos teleporter particles. Man that's a lot of actions for my shite. void A_FlameShieldPaper(); +void A_InvincSparkleRotate(); // SRB2kart: invinc sparkle rotation void A_OrbitNights(); void A_GhostMe(); void A_SetObjectState(); diff --git a/src/k_kart.c b/src/k_kart.c index 76001c4d2..5070de4ff 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2494,7 +2494,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_draftpower] > 0) // Drafting { // 30% - 44%, each point of speed adds 1.75% - fixed_t draftspeed = ((3*FRACUNIT)/10) + ((player->kartspeed-1) * ((7*FRACUNIT)/400)); + fixed_t draftspeed = ((3*FRACUNIT)/10) + ((player->kartspeed-1) * ((7*FRACUNIT)/400)); speedboost += FixedMul(draftspeed, player->kartstuff[k_draftpower]); // (Drafting suffers no boost stack penalty.) numboosts++; } @@ -3764,13 +3764,14 @@ void K_SpawnBoostTrail(player_t *player) void K_SpawnSparkleTrail(mobj_t *mo) { - const INT32 rad = (mo->radius*3)>>FRACBITS; + const INT32 rad = (mo->radius*3)/FRACUNIT; mobj_t *sparkle; - angle_t newangle; + //angle_t newangle; INT32 i; - UINT8 frame; + //UINT8 frame; UINT8 invanimnum; UINT8 index = 1; + fixed_t newx, newy, newz; I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); @@ -3780,18 +3781,23 @@ void K_SpawnSparkleTrail(mobj_t *mo) if (leveltime & 2) index = 2; - CONS_Printf("%d\n", index); - CONS_Printf("%d\n", invanimnum); + //CONS_Printf("%d\n", index); + //CONS_Printf("%d\n", invanimnum); for (i = 0; i < 8; i++) { - newangle = (mo->angle + ANGLE_157h) + FixedAngle(((360 / 8) * i) << FRACBITS) + ANGLE_90; - fixed_t newx = mo->x + (mo->momx*4)/5 + (P_RandomRange(-rad, rad)<y + mo->momy + (P_RandomRange(-rad, rad*2)<z + (mo->momz*4)/5 + (P_RandomRange(0, mo->height>>FRACBITS)<angle + ANGLE_157h) + FixedAngle(((360 / 8) * i) << FRACBITS) + ANGLE_90; + newx = mo->x + (P_RandomRange(-rad, rad)*FRACUNIT); + newy = mo->y + (P_RandomRange(-rad, rad)*FRACUNIT); + newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); - sparkle->angle = newangle; + sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); + sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. + CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); + sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. + sparkle->extravalue2 = P_RandomRange(0, 1) ? 1 : -1; // Rotation direction? + sparkle->cvmem = P_RandomRange(-25, 25)*mo->scale; // Vertical "angle" K_FlipFromObject(sparkle, mo); //if (i == 0) diff --git a/src/p_enemy.c b/src/p_enemy.c index ce3186442..696a247e3 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -211,6 +211,7 @@ void A_MayonakaArrow(mobj_t *actor); //SRB2kart void A_ReaperThinker(mobj_t *actor); //SRB2kart void A_MementosTPParticles(mobj_t *actor); //SRB2kart void A_FlameShieldPaper(mobj_t *actor); // SRB2kart +void A_InvincSparkleRotate(mobj_t *actor); // SRB2kart void A_OrbitNights(mobj_t *actor); void A_GhostMe(mobj_t *actor); void A_SetObjectState(mobj_t *actor); @@ -9810,6 +9811,39 @@ void A_FlameShieldPaper(mobj_t *actor) } } + +// Rotation thinker for invinc sparkles. + +// actor->movefactor: fixed_t distance away from the target (not updated with the target's scale since our actor will barely last 12 frames lmao) +// actor->angle: angle_t to rotate from. Updates itself each call of this action. +// actor->extravalue1: z diff between the actor and its target when spawned. Used to know the Z position to teleport to each frame. +// actor->extravalue2: -1 or 1 to tell if we should rotate clockwise or counterclockwise respectively. + +void A_InvincSparkleRotate(mobj_t *actor) +{ + + fixed_t sx, sy, sz; // Teleport dests. + + if (LUA_CallAction("A_InvincSparkleRotate", actor)) + return; + + if (!actor->target || P_MobjWasRemoved(actor->target)) + return; + + CONS_Printf("%d\n", actor->movefactor/FRACUNIT); + sx = actor->target->x + FixedMul((actor->movefactor), FINECOSINE((actor->angle)>>ANGLETOFINESHIFT)); + sy = actor->target->y + FixedMul((actor->movefactor), FINESINE((actor->angle)>>ANGLETOFINESHIFT)); + sz = actor->target->z + (actor->extravalue1) + FixedMul((actor->cvmem), FINECOSINE((leveltime*ANG1*10 + actor->angle)>>ANGLETOFINESHIFT)); + P_TeleportMove(actor, sx, sy, sz); + + actor->momx = actor->target->momx; + actor->momy = actor->target->momy; + actor->momz = actor->target->momz; // Give momentum for eventual interp builds idk. + + actor->angle += ANG1*10*(actor->extravalue2); // Arbitrary value, change this if you want, I suppose. +} + + //} // Function: A_OrbitNights From 4f7aafe654367c40cf36f57a627e93f2beb11a77 Mon Sep 17 00:00:00 2001 From: SteelT Date: Sun, 28 Mar 2021 22:05:18 -0400 Subject: [PATCH 03/13] Fancy invincibility speed lines --- src/dehacked.c | 13 +++++++++++++ src/info.c | 14 ++++++++++++++ src/info.h | 18 ++++++++++++++++-- src/k_kart.c | 32 ++++++++++++++++++++++++++------ src/k_kart.h | 1 + src/p_user.c | 6 +++++- 6 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index e0b4d10e0..a7f1b00c3 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8464,6 +8464,19 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_INVULNFLASH3", "S_INVULNFLASH4", + "S_KARTINVLINES1", + "S_KARTINVLINES2", + "S_KARTINVLINES3", + "S_KARTINVLINES4", + "S_KARTINVLINES5", + "S_KARTINVLINES6", + "S_KARTINVLINES7", + "S_KARTINVLINES8", + "S_KARTINVLINES9", + "S_KARTINVLINES10", + "S_KARTINVLINES11", + "S_KARTINVLINES12", + // Wipeout dust trail "S_WIPEOUTTRAIL1", "S_WIPEOUTTRAIL2", diff --git a/src/info.c b/src/info.c index 01d949383..937658ac9 100644 --- a/src/info.c +++ b/src/info.c @@ -535,6 +535,7 @@ char sprnames[NUMSPRITES + 1][5] = "KINV", // Fullbright invincibility sparkle trail "KINB", // Invincibility sparkle trail "KINF", // Invincibility flash + "INVI", // Invincibility speedlines "WIPD", // Wipeout dust trail "DRIF", // Drift Sparks "BDRF", // Brake drift sparks @@ -4190,6 +4191,19 @@ state_t states[NUMSTATES] = {SPR_KINF, FF_FULLBRIGHT|FF_TRANS90|1, 1, {NULL}, 0, 0, S_INVULNFLASH4}, // S_INVULNFLASH3 {SPR_NULL, FF_FULLBRIGHT|FF_TRANS90, 1, {NULL}, 0, 0, S_INVULNFLASH1}, // S_INVULNFLASH4 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE, 1, {NULL}, 0, 0, S_KARTINVLINES2}, // S_KARTINVLINES1 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|1, 1, {NULL}, 0, 0, S_KARTINVLINES3}, // S_KARTINVLINES2 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|2, 1, {NULL}, 0, 0, S_KARTINVLINES4}, // S_KARTINVLINES3 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|3, 1, {NULL}, 0, 0, S_KARTINVLINES5}, // S_KARTINVLINES4 + {SPR_INVI, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE|4, 4, {NULL}, 2, 1, S_KARTINVLINES6}, // S_KARTINVLINES5 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|5, 1, {NULL}, 0, 0, S_KARTINVLINES7}, // S_KARTINVLINES6 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|6, 3, {NULL}, 0, 0, S_KARTINVLINES8}, // S_KARTINVLINES7 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|7, 1, {NULL}, 0, 0, S_KARTINVLINES9}, // S_KARTINVLINES8 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|8, 1, {NULL}, 0, 0, S_KARTINVLINES10}, // S_KARTINVLINES9 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|9, 1, {NULL}, 0, 0, S_KARTINVLINES11}, // S_KARTINVLINES10 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|10, 1, {NULL}, 0, 0, S_KARTINVLINES12}, // S_KARTINVLINES11 + {SPR_INVI, FF_FULLBRIGHT|FF_PAPERSPRITE|11, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVLINES12 + {SPR_WIPD, 0, 3, {NULL}, 0, 0, S_WIPEOUTTRAIL2}, // S_WIPEOUTTRAIL1 {SPR_WIPD, 1, 3, {NULL}, 0, 0, S_WIPEOUTTRAIL3}, // S_WIPEOUTTRAIL2 {SPR_WIPD, 2, 3, {NULL}, 0, 0, S_WIPEOUTTRAIL4}, // S_WIPEOUTTRAIL3 diff --git a/src/info.h b/src/info.h index 73c4da345..f91925f84 100644 --- a/src/info.h +++ b/src/info.h @@ -804,9 +804,10 @@ typedef enum sprite SPR_BOST, // Sneaker booster flame SPR_BOSM, // Sneaker booster smoke SPR_KFRE, // Sneaker fire trail - SPR_KINV, // Fullbright invincibility sparkle trail - SPR_KINB, // Fullbright invincibility sparkle trail + SPR_KINV, // Lighter invincibility sparkle trail + SPR_KINB, // Darker invincibility sparkle trail SPR_KINF, // Invincibility flash + SPR_INVI, // Invincibility speedlines SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks SPR_BDRF, // Brake drift sparks @@ -4320,6 +4321,19 @@ typedef enum state S_INVULNFLASH3, S_INVULNFLASH4, + S_KARTINVLINES1, + S_KARTINVLINES2, + S_KARTINVLINES3, + S_KARTINVLINES4, + S_KARTINVLINES5, + S_KARTINVLINES6, + S_KARTINVLINES7, + S_KARTINVLINES8, + S_KARTINVLINES9, + S_KARTINVLINES10, + S_KARTINVLINES11, + S_KARTINVLINES12, + // Wipeout dust trail S_WIPEOUTTRAIL1, S_WIPEOUTTRAIL2, diff --git a/src/k_kart.c b/src/k_kart.c index 5070de4ff..623955413 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3766,24 +3766,23 @@ void K_SpawnSparkleTrail(mobj_t *mo) { const INT32 rad = (mo->radius*3)/FRACUNIT; mobj_t *sparkle; - //angle_t newangle; INT32 i; - //UINT8 frame; UINT8 invanimnum; + INT32 invtime; UINT8 index = 1; fixed_t newx, newy, newz; I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); - invanimnum = mo->player->kartstuff[k_invincibilitytimer]/TICRATE+1; - if (leveltime & 2) index = 2; //CONS_Printf("%d\n", index); //CONS_Printf("%d\n", invanimnum); + invtime = mo->player->kartstuff[k_invincibilitytimer]/TICRATE+1; + for (i = 0; i < 8; i++) { //newangle = (mo->angle + ANGLE_157h) + FixedAngle(((360 / 8) * i) << FRACBITS) + ANGLE_90; @@ -3808,13 +3807,34 @@ void K_SpawnSparkleTrail(mobj_t *mo) P_SetScale(sparkle, mo->scale); } + invanimnum = (invtime > 11) ? 11 : invtime; P_SetMobjState(sparkle, K_SparkleTrailStartStates[invanimnum][index]); sparkle->colorized = true; sparkle->color = mo->color; +} - //CONS_Printf("%d\n", (mo->player->kartstuff[k_invincibilitytimer]/TICRATE)); +void K_SpawnInvincibilitySpeedLines(mobj_t *mo) +{ + INT32 i = 0; + INT32 nl = 2; + for (i = 0; i < nl ; i++) + { + mobj_t *fast = P_SpawnMobj(mo->x + (P_RandomRange(-24,64) * mo->scale), + mo->y + (P_RandomRange(-16,16) * mo->scale), + mo->z + (mo->height/2) + (P_RandomRange(-16,16) * mo->scale), + MT_FASTLINE); - //invanimnum = (mo->player->kartstuff[k_invincibilitytimer]/TICRATE > 11) ? 11 : mo->player->kartstuff[k_invincibilitytimer]/TICRATE; + fast->momx = 3*mo->momx/4; + fast->momy = 3*mo->momy/4; + fast->momz = 3*mo->momz/4; + + P_SetTarget(&fast->target, mo); + fast->angle = K_MomentumAngle(mo); + fast->color = mo->color; + fast->colorized = true; + K_MatchGenericExtraFlags(fast, mo); + P_SetMobjState(fast, S_KARTINVLINES1); + } } void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) diff --git a/src/k_kart.h b/src/k_kart.h index 18b354efc..95896f348 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -59,6 +59,7 @@ void K_RunFinishLineBeam(void); UINT16 K_DriftSparkColor(player_t *player, INT32 charge); void K_SpawnBoostTrail(player_t *player); void K_SpawnSparkleTrail(mobj_t *mo); +void K_SpawnInvincibilitySpeedLines(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent); void K_SpawnDraftDust(mobj_t *mo); void K_DriftDustHandling(mobj_t *spawner); diff --git a/src/p_user.c b/src/p_user.c index 10cb61335..eba9a1fcd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2374,8 +2374,12 @@ void P_MovePlayer(player_t *player) && onground && (leveltime & 1)) K_SpawnBoostTrail(player); - if (player->kartstuff[k_invincibilitytimer] > 0) + if (player->kartstuff[k_invincibilitytimer] > 0) + { K_SpawnSparkleTrail(player->mo); + if (player->kartstuff[k_invincibilitytimer] > 10*TICRATE && player->speed > 10*player->mo->scale && (leveltime & 5)) + K_SpawnInvincibilitySpeedLines(player->mo); + } if (player->kartstuff[k_wipeoutslow] > 1 && (leveltime & 1)) K_SpawnWipeoutTrail(player->mo, false); From ffc5469e9f7654c86a772d8c568142d6599525d8 Mon Sep 17 00:00:00 2001 From: SteelT Date: Sun, 28 Mar 2021 22:35:08 -0400 Subject: [PATCH 04/13] Minor invincibility speedlines tweaks --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index eba9a1fcd..0f060295b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2377,7 +2377,7 @@ void P_MovePlayer(player_t *player) if (player->kartstuff[k_invincibilitytimer] > 0) { K_SpawnSparkleTrail(player->mo); - if (player->kartstuff[k_invincibilitytimer] > 10*TICRATE && player->speed > 10*player->mo->scale && (leveltime & 5)) + if (player->kartstuff[k_invincibilitytimer] > 5*TICRATE && player->speed > 10*player->mo->scale && (leveltime & 8)) K_SpawnInvincibilitySpeedLines(player->mo); } From 106afa9ace3f5a7b6dd21bcc8b587a812212c797 Mon Sep 17 00:00:00 2001 From: SteelT Date: Mon, 29 Mar 2021 00:15:52 -0400 Subject: [PATCH 05/13] Make spawning look less squished --- src/k_kart.c | 33 +++++++++++++++------------------ src/p_inter.c | 2 +- src/p_user.c | 2 +- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 623955413..f272f98d9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3815,26 +3815,23 @@ void K_SpawnSparkleTrail(mobj_t *mo) void K_SpawnInvincibilitySpeedLines(mobj_t *mo) { - INT32 i = 0; - INT32 nl = 2; - for (i = 0; i < nl ; i++) - { - mobj_t *fast = P_SpawnMobj(mo->x + (P_RandomRange(-24,64) * mo->scale), - mo->y + (P_RandomRange(-16,16) * mo->scale), - mo->z + (mo->height/2) + (P_RandomRange(-16,16) * mo->scale), - MT_FASTLINE); - fast->momx = 3*mo->momx/4; - fast->momy = 3*mo->momy/4; - fast->momz = 3*mo->momz/4; + mobj_t *fast = P_SpawnMobjFromMobj(mo, + P_RandomRange(-48, 48) * FRACUNIT, + P_RandomRange(-48, 48) * FRACUNIT, + P_RandomRange(0, 64) * FRACUNIT, + MT_FASTLINE); - P_SetTarget(&fast->target, mo); - fast->angle = K_MomentumAngle(mo); - fast->color = mo->color; - fast->colorized = true; - K_MatchGenericExtraFlags(fast, mo); - P_SetMobjState(fast, S_KARTINVLINES1); - } + fast->momx = 3*mo->momx/4; + fast->momy = 3*mo->momy/4; + fast->momz = 3*mo->momz/4; + + P_SetTarget(&fast->target, mo); + fast->angle = K_MomentumAngle(mo); + fast->color = mo->color; + fast->colorized = true; + K_MatchGenericExtraFlags(fast, mo); + P_SetMobjState(fast, S_KARTINVLINES1); } void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent) diff --git a/src/p_inter.c b/src/p_inter.c index 1c07a5a90..6e367a9fe 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1984,7 +1984,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { if (source->player->kartstuff[k_invincibilitytimer]) { - kinvextend = (source->player->kartstuff[k_invincibilitytimer])+2*TICRATE; + kinvextend = (source->player->kartstuff[k_invincibilitytimer])+5*TICRATE; CONS_Printf("extend k_invincibilitytimer for %s - old value %d new value %d\n", player_names[source->player - players], source->player->kartstuff[k_invincibilitytimer]/TICRATE, kinvextend/TICRATE); source->player->kartstuff[k_invincibilitytimer] = kinvextend; } diff --git a/src/p_user.c b/src/p_user.c index 0f060295b..a89bec290 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2377,7 +2377,7 @@ void P_MovePlayer(player_t *player) if (player->kartstuff[k_invincibilitytimer] > 0) { K_SpawnSparkleTrail(player->mo); - if (player->kartstuff[k_invincibilitytimer] > 5*TICRATE && player->speed > 10*player->mo->scale && (leveltime & 8)) + if (player->kartstuff[k_invincibilitytimer] > 5*TICRATE && player->speed > 10*player->mo->scale && (leveltime % 8) == 0) K_SpawnInvincibilitySpeedLines(player->mo); } From 3c817774b842ac3dcbf55280ea8ea6a6229e8650 Mon Sep 17 00:00:00 2001 From: SteelT Date: Mon, 29 Mar 2021 20:59:28 -0400 Subject: [PATCH 06/13] Fix sparkle animation not being capped properly. --- src/k_kart.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f272f98d9..2f84e84be 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3778,14 +3778,12 @@ void K_SpawnSparkleTrail(mobj_t *mo) if (leveltime & 2) index = 2; - //CONS_Printf("%d\n", index); - //CONS_Printf("%d\n", invanimnum); - invtime = mo->player->kartstuff[k_invincibilitytimer]/TICRATE+1; + //CONS_Printf("%d\n", index); + for (i = 0; i < 8; i++) { - //newangle = (mo->angle + ANGLE_157h) + FixedAngle(((360 / 8) * i) << FRACBITS) + ANGLE_90; newx = mo->x + (P_RandomRange(-rad, rad)*FRACUNIT); newy = mo->y + (P_RandomRange(-rad, rad)*FRACUNIT); newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); @@ -3807,7 +3805,8 @@ void K_SpawnSparkleTrail(mobj_t *mo) P_SetScale(sparkle, mo->scale); } - invanimnum = (invtime > 11) ? 11 : invtime; + invanimnum = (invtime >= 11) ? 11 : invtime; + //CONS_Printf("%d\n", invanimnum); P_SetMobjState(sparkle, K_SparkleTrailStartStates[invanimnum][index]); sparkle->colorized = true; sparkle->color = mo->color; @@ -3815,7 +3814,6 @@ void K_SpawnSparkleTrail(mobj_t *mo) void K_SpawnInvincibilitySpeedLines(mobj_t *mo) { - mobj_t *fast = P_SpawnMobjFromMobj(mo, P_RandomRange(-48, 48) * FRACUNIT, P_RandomRange(-48, 48) * FRACUNIT, From 85f95d2d78739f57800c784d16b3603b981ced3b Mon Sep 17 00:00:00 2001 From: SteelT Date: Mon, 29 Mar 2021 21:32:35 -0400 Subject: [PATCH 07/13] Add more comments to the code. To make it easier to understand what's going on. --- src/k_kart.c | 7 ++++--- src/k_kart.h | 8 +++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 2f84e84be..03dd6c79f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -401,7 +401,8 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] = #define DISTVAR (2048) // Magic number distance for use with item roulette tiers -static INT32 K_SparkleTrailStartStates[NUMKARTSPARKLESTATES][2] = { +// Array of states to pick the starting point of the animation, based on the actual time left for invincibility. +static INT32 K_SparkleTrailStartStates[KART_NUMINVSPARKLESANIM][2] = { {S_KARTINVULN12, S_KARTINVULNB12}, {S_KARTINVULN11, S_KARTINVULNB11}, {S_KARTINVULN10, S_KARTINVULNB10}, @@ -3767,8 +3768,8 @@ void K_SpawnSparkleTrail(mobj_t *mo) const INT32 rad = (mo->radius*3)/FRACUNIT; mobj_t *sparkle; INT32 i; - UINT8 invanimnum; - INT32 invtime; + UINT8 invanimnum; // Current sparkle animation number + INT32 invtime;// Invincibility time left, in seconds UINT8 index = 1; fixed_t newx, newy, newz; diff --git a/src/k_kart.h b/src/k_kart.h index 95896f348..348ca84b7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -11,7 +11,13 @@ #include "command.h" // Need for player_t #define KART_FULLTURN 800 -#define NUMKARTSPARKLESTATES 12 + +/* +Number of animations for the invincibility sparkles +If states are ever added or removed +Make sure this matches the actual number of states +*/ +#define KART_NUMINVSPARKLESANIM 12 player_t *K_GetItemBoxPlayer(mobj_t *mobj); angle_t K_ReflectAngle(angle_t angle, angle_t against, fixed_t maxspeed, fixed_t yourspeed); From cf32ebb490a1145d02e25ff3789d1bee67838ce8 Mon Sep 17 00:00:00 2001 From: SteelT Date: Wed, 31 Mar 2021 21:03:07 -0400 Subject: [PATCH 08/13] Fix bug with sparkles not being removed properly --- src/k_kart.c | 67 +++++++++++++++++++++++++---------------------- src/k_kart.h | 3 ++- src/lua_baselib.c | 16 ++++++++++- src/p_user.c | 4 ++- 4 files changed, 55 insertions(+), 35 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 03dd6c79f..7297f46ae 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3763,56 +3763,59 @@ void K_SpawnBoostTrail(player_t *player) } } -void K_SpawnSparkleTrail(mobj_t *mo) +mobj_t *K_SpawnSparkleTrail(mobj_t *mo) { const INT32 rad = (mo->radius*3)/FRACUNIT; mobj_t *sparkle; - INT32 i; - UINT8 invanimnum; // Current sparkle animation number - INT32 invtime;// Invincibility time left, in seconds - UINT8 index = 1; fixed_t newx, newy, newz; I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); + newx = mo->x + (P_RandomRange(-rad, rad)*FRACUNIT); + newy = mo->y + (P_RandomRange(-rad, rad)*FRACUNIT); + newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); + + sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); + sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); + sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. + CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); + sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. + sparkle->extravalue2 = P_RandomRange(0, 1) ? 1 : -1; // Rotation direction? + sparkle->cvmem = P_RandomRange(-25, 25)*mo->scale; // Vertical "angle" + K_FlipFromObject(sparkle, mo); + + //if (i == 0) + //P_SetMobjState(sparkle, S_KARTINVULN_LARGE1); + + P_SetTarget(&sparkle->target, mo); + sparkle->destscale = mo->destscale; + P_SetScale(sparkle, mo->scale); + sparkle->colorized = true; + sparkle->color = mo->color; + return sparkle; +} + +void K_SparkleTrailHandling(mobj_t *mo, player_t *player) +{ + UINT8 invanimnum; // Current sparkle animation number + INT32 invtime;// Invincibility time left, in seconds + UINT8 index = 1; + if (leveltime & 2) index = 2; - invtime = mo->player->kartstuff[k_invincibilitytimer]/TICRATE+1; + invtime = player->kartstuff[k_invincibilitytimer]/TICRATE+1; //CONS_Printf("%d\n", index); - for (i = 0; i < 8; i++) - { - newx = mo->x + (P_RandomRange(-rad, rad)*FRACUNIT); - newy = mo->y + (P_RandomRange(-rad, rad)*FRACUNIT); - newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); - - sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); - sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); - sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. - CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); - sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. - sparkle->extravalue2 = P_RandomRange(0, 1) ? 1 : -1; // Rotation direction? - sparkle->cvmem = P_RandomRange(-25, 25)*mo->scale; // Vertical "angle" - K_FlipFromObject(sparkle, mo); - - //if (i == 0) - //P_SetMobjState(sparkle, S_KARTINVULN_LARGE1); - - P_SetTarget(&sparkle->target, mo); - sparkle->destscale = mo->destscale; - P_SetScale(sparkle, mo->scale); - } - invanimnum = (invtime >= 11) ? 11 : invtime; //CONS_Printf("%d\n", invanimnum); - P_SetMobjState(sparkle, K_SparkleTrailStartStates[invanimnum][index]); - sparkle->colorized = true; - sparkle->color = mo->color; + + P_SetMobjState(mo, K_SparkleTrailStartStates[invanimnum][index]); } + void K_SpawnInvincibilitySpeedLines(mobj_t *mo) { mobj_t *fast = P_SpawnMobjFromMobj(mo, diff --git a/src/k_kart.h b/src/k_kart.h index 348ca84b7..2734ed1d7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -64,7 +64,8 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color); void K_RunFinishLineBeam(void); UINT16 K_DriftSparkColor(player_t *player, INT32 charge); void K_SpawnBoostTrail(player_t *player); -void K_SpawnSparkleTrail(mobj_t *mo); +mobj_t *K_SpawnSparkleTrail(mobj_t *mo); +void K_SparkleTrailHandling(mobj_t *mo, player_t *player); void K_SpawnInvincibilitySpeedLines(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent); void K_SpawnDraftDust(mobj_t *mo); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 035d930de..c7dcab07b 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3493,7 +3493,20 @@ static int lib_kSpawnSparkleTrail(lua_State *L) NOHUD if (!mo) return LUA_ErrInvalid(L, "mobj_t"); - K_SpawnSparkleTrail(mo); + LUA_PushUserdata(L, K_SpawnSparkleTrail(mo), META_MOBJ); + return 1; +} + +static int lib_kSparkleTrailHandling(lua_State *L) +{ + mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + player_t *player = *((player_t **)luaL_checkudata(L, 2, META_PLAYER)); + NOHUD + if (!mo) + return LUA_ErrInvalid(L, "mobj_t"); + if (!player) + return LUA_ErrInvalid(L, "player_t"); + K_SparkleTrailHandling(mo, player); return 0; } @@ -3925,6 +3938,7 @@ static luaL_Reg lib[] = { {"K_SpawnMineExplosion",lib_kSpawnMineExplosion}, {"K_SpawnBoostTrail",lib_kSpawnBoostTrail}, {"K_SpawnSparkleTrail",lib_kSpawnSparkleTrail}, + {"K_SparkleTrailHandling", lib_kSparkleTrailHandling}, {"K_SpawnWipeoutTrail",lib_kSpawnWipeoutTrail}, {"K_DriftDustHandling",lib_kDriftDustHandling}, {"K_DoSneaker",lib_kDoSneaker}, diff --git a/src/p_user.c b/src/p_user.c index a89bec290..aeed8dfae 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2376,7 +2376,9 @@ void P_MovePlayer(player_t *player) if (player->kartstuff[k_invincibilitytimer] > 0) { - K_SpawnSparkleTrail(player->mo); + mobj_t *sparkle; + sparkle = K_SpawnSparkleTrail(player->mo); + K_SparkleTrailHandling(sparkle, player); if (player->kartstuff[k_invincibilitytimer] > 5*TICRATE && player->speed > 10*player->mo->scale && (leveltime % 8) == 0) K_SpawnInvincibilitySpeedLines(player->mo); } From 24fbdd70dd982830734c844ef7aa5e7c8d80d2ec Mon Sep 17 00:00:00 2001 From: SteelT Date: Wed, 31 Mar 2021 22:01:33 -0400 Subject: [PATCH 09/13] Revert "Fix bug with sparkles not being removed properly" This reverts commit cf32ebb490a1145d02e25ff3789d1bee67838ce8. --- src/k_kart.c | 67 ++++++++++++++++++++++------------------------- src/k_kart.h | 3 +-- src/lua_baselib.c | 16 +---------- src/p_user.c | 4 +-- 4 files changed, 35 insertions(+), 55 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7297f46ae..03dd6c79f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3763,59 +3763,56 @@ void K_SpawnBoostTrail(player_t *player) } } -mobj_t *K_SpawnSparkleTrail(mobj_t *mo) +void K_SpawnSparkleTrail(mobj_t *mo) { const INT32 rad = (mo->radius*3)/FRACUNIT; mobj_t *sparkle; + INT32 i; + UINT8 invanimnum; // Current sparkle animation number + INT32 invtime;// Invincibility time left, in seconds + UINT8 index = 1; fixed_t newx, newy, newz; I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); - newx = mo->x + (P_RandomRange(-rad, rad)*FRACUNIT); - newy = mo->y + (P_RandomRange(-rad, rad)*FRACUNIT); - newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); - - sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); - sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); - sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. - CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); - sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. - sparkle->extravalue2 = P_RandomRange(0, 1) ? 1 : -1; // Rotation direction? - sparkle->cvmem = P_RandomRange(-25, 25)*mo->scale; // Vertical "angle" - K_FlipFromObject(sparkle, mo); - - //if (i == 0) - //P_SetMobjState(sparkle, S_KARTINVULN_LARGE1); - - P_SetTarget(&sparkle->target, mo); - sparkle->destscale = mo->destscale; - P_SetScale(sparkle, mo->scale); - sparkle->colorized = true; - sparkle->color = mo->color; - return sparkle; -} - -void K_SparkleTrailHandling(mobj_t *mo, player_t *player) -{ - UINT8 invanimnum; // Current sparkle animation number - INT32 invtime;// Invincibility time left, in seconds - UINT8 index = 1; - if (leveltime & 2) index = 2; - invtime = player->kartstuff[k_invincibilitytimer]/TICRATE+1; + invtime = mo->player->kartstuff[k_invincibilitytimer]/TICRATE+1; //CONS_Printf("%d\n", index); + for (i = 0; i < 8; i++) + { + newx = mo->x + (P_RandomRange(-rad, rad)*FRACUNIT); + newy = mo->y + (P_RandomRange(-rad, rad)*FRACUNIT); + newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); + + sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); + sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); + sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. + CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); + sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. + sparkle->extravalue2 = P_RandomRange(0, 1) ? 1 : -1; // Rotation direction? + sparkle->cvmem = P_RandomRange(-25, 25)*mo->scale; // Vertical "angle" + K_FlipFromObject(sparkle, mo); + + //if (i == 0) + //P_SetMobjState(sparkle, S_KARTINVULN_LARGE1); + + P_SetTarget(&sparkle->target, mo); + sparkle->destscale = mo->destscale; + P_SetScale(sparkle, mo->scale); + } + invanimnum = (invtime >= 11) ? 11 : invtime; //CONS_Printf("%d\n", invanimnum); - - P_SetMobjState(mo, K_SparkleTrailStartStates[invanimnum][index]); + P_SetMobjState(sparkle, K_SparkleTrailStartStates[invanimnum][index]); + sparkle->colorized = true; + sparkle->color = mo->color; } - void K_SpawnInvincibilitySpeedLines(mobj_t *mo) { mobj_t *fast = P_SpawnMobjFromMobj(mo, diff --git a/src/k_kart.h b/src/k_kart.h index 2734ed1d7..348ca84b7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -64,8 +64,7 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color); void K_RunFinishLineBeam(void); UINT16 K_DriftSparkColor(player_t *player, INT32 charge); void K_SpawnBoostTrail(player_t *player); -mobj_t *K_SpawnSparkleTrail(mobj_t *mo); -void K_SparkleTrailHandling(mobj_t *mo, player_t *player); +void K_SpawnSparkleTrail(mobj_t *mo); void K_SpawnInvincibilitySpeedLines(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent); void K_SpawnDraftDust(mobj_t *mo); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index c7dcab07b..035d930de 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3493,20 +3493,7 @@ static int lib_kSpawnSparkleTrail(lua_State *L) NOHUD if (!mo) return LUA_ErrInvalid(L, "mobj_t"); - LUA_PushUserdata(L, K_SpawnSparkleTrail(mo), META_MOBJ); - return 1; -} - -static int lib_kSparkleTrailHandling(lua_State *L) -{ - mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); - player_t *player = *((player_t **)luaL_checkudata(L, 2, META_PLAYER)); - NOHUD - if (!mo) - return LUA_ErrInvalid(L, "mobj_t"); - if (!player) - return LUA_ErrInvalid(L, "player_t"); - K_SparkleTrailHandling(mo, player); + K_SpawnSparkleTrail(mo); return 0; } @@ -3938,7 +3925,6 @@ static luaL_Reg lib[] = { {"K_SpawnMineExplosion",lib_kSpawnMineExplosion}, {"K_SpawnBoostTrail",lib_kSpawnBoostTrail}, {"K_SpawnSparkleTrail",lib_kSpawnSparkleTrail}, - {"K_SparkleTrailHandling", lib_kSparkleTrailHandling}, {"K_SpawnWipeoutTrail",lib_kSpawnWipeoutTrail}, {"K_DriftDustHandling",lib_kDriftDustHandling}, {"K_DoSneaker",lib_kDoSneaker}, diff --git a/src/p_user.c b/src/p_user.c index aeed8dfae..a89bec290 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2376,9 +2376,7 @@ void P_MovePlayer(player_t *player) if (player->kartstuff[k_invincibilitytimer] > 0) { - mobj_t *sparkle; - sparkle = K_SpawnSparkleTrail(player->mo); - K_SparkleTrailHandling(sparkle, player); + K_SpawnSparkleTrail(player->mo); if (player->kartstuff[k_invincibilitytimer] > 5*TICRATE && player->speed > 10*player->mo->scale && (leveltime % 8) == 0) K_SpawnInvincibilitySpeedLines(player->mo); } From 4b269e89e743e8d6b42a63faf50d2546452a401d Mon Sep 17 00:00:00 2001 From: SteelT Date: Wed, 31 Mar 2021 23:24:19 -0400 Subject: [PATCH 10/13] Actually, fix it in a way without visually nerfing it. --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 937658ac9..ec1030bff 100644 --- a/src/info.c +++ b/src/info.c @@ -23305,7 +23305,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_SPARKLETRAIL -1, // doomednum - S_INVISIBLE, // spawnstate + S_NULL, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound From 32b1acb8104a015dd57b4539082e922dd47119eb Mon Sep 17 00:00:00 2001 From: SteelT Date: Wed, 31 Mar 2021 23:38:05 -0400 Subject: [PATCH 11/13] Disable the debug prints for now Just incase they are needed again in the future, for whatever reason. --- src/k_kart.c | 2 +- src/p_enemy.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 03dd6c79f..1466e41d3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3792,7 +3792,7 @@ void K_SpawnSparkleTrail(mobj_t *mo) sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. - CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); + //CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. sparkle->extravalue2 = P_RandomRange(0, 1) ? 1 : -1; // Rotation direction? sparkle->cvmem = P_RandomRange(-25, 25)*mo->scale; // Vertical "angle" diff --git a/src/p_enemy.c b/src/p_enemy.c index 696a247e3..0f65d135a 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -9830,7 +9830,7 @@ void A_InvincSparkleRotate(mobj_t *actor) if (!actor->target || P_MobjWasRemoved(actor->target)) return; - CONS_Printf("%d\n", actor->movefactor/FRACUNIT); + //CONS_Printf("%d\n", actor->movefactor/FRACUNIT); sx = actor->target->x + FixedMul((actor->movefactor), FINECOSINE((actor->angle)>>ANGLETOFINESHIFT)); sy = actor->target->y + FixedMul((actor->movefactor), FINESINE((actor->angle)>>ANGLETOFINESHIFT)); sz = actor->target->z + (actor->extravalue1) + FixedMul((actor->cvmem), FINECOSINE((leveltime*ANG1*10 + actor->angle)>>ANGLETOFINESHIFT)); From 6d4a544fd54ddc6ba510e988d297ad95af439137 Mon Sep 17 00:00:00 2001 From: SteelT Date: Tue, 6 Apr 2021 23:18:59 -0400 Subject: [PATCH 12/13] Scale the speedlines based on how much is left on the timer --- src/k_kart.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 347ed5d40..85d0084f9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1849,6 +1849,8 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo) fast->colorized = true; K_MatchGenericExtraFlags(fast, mo); P_SetMobjState(fast, S_KARTINVLINES1); + if (mo->player->kartstuff[k_invincibilitytimer] < 10*TICRATE) + fast->destscale = 6*((mo->player->kartstuff[k_invincibilitytimer]/TICRATE)*FRACUNIT)/8; } static SINT8 K_GlanceAtPlayers(player_t *glancePlayer) From 411fa4a6d843a35a7ffa4cce206d1b700aefd921 Mon Sep 17 00:00:00 2001 From: SteelT Date: Tue, 6 Apr 2021 23:41:54 -0400 Subject: [PATCH 13/13] Only extend the invinc time for the player if the hit was direct --- src/p_inter.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index c46d44d4f..5077ef366 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1399,7 +1399,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget else { flingAngle = target->angle + ANGLE_180; - + if (P_RandomByte() & 1) { flingAngle -= ANGLE_45; @@ -1982,10 +1982,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (source && source != player->mo && source->player) { - if (source->player->kartstuff[k_invincibilitytimer]) + // Extend the invincibility if the hit was a direct hit. + if (inflictor == source && source->player->kartstuff[k_invincibilitytimer]) { kinvextend = (source->player->kartstuff[k_invincibilitytimer])+5*TICRATE; - CONS_Printf("extend k_invincibilitytimer for %s - old value %d new value %d\n", player_names[source->player - players], source->player->kartstuff[k_invincibilitytimer]/TICRATE, kinvextend/TICRATE); + //CONS_Printf("extend k_invincibilitytimer for %s - old value %d new value %d\n", player_names[source->player - players], source->player->kartstuff[k_invincibilitytimer]/TICRATE, kinvextend/TICRATE); source->player->kartstuff[k_invincibilitytimer] = kinvextend; }