From a487ab19138f7c54581aafa49aa26bfc06ad3ccf Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Sun, 16 Sep 2018 10:31:24 +0200 Subject: [PATCH] Thunder Shield effect hardcode. --- src/dehacked.c | 1 + src/info.c | 53 ++++++++++++++++++++++++++++++- src/info.h | 54 +++++++++++++++++++++++++++++++ src/k_kart.c | 86 ++++++++++++++++++++++++++++++++++++++------------ src/k_kart.h | 2 +- src/p_enemy.c | 20 ++++++++++++ 6 files changed, 194 insertions(+), 22 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 05be25837..040c403b0 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1828,6 +1828,7 @@ static actionpointer_t actionpointers[] = {{A_JawzExplode}, "A_JAWZEXPLODE"}, // SRB2kart {{A_MineExplode}, "A_MINEEXPLODE"}, // SRB2kart {{A_BallhogExplode}, "A_BALLHOGEXPLODE"}, // SRB2kart + {{A_LightningFollowPlayer}, "A_LIGHTNINGFOLLOWPLAYER"}, //SRB2kart {{A_OrbitNights}, "A_ORBITNIGHTS"}, {{A_GhostMe}, "A_GHOSTME"}, {{A_SetObjectState}, "A_SETOBJECTSTATE"}, diff --git a/src/info.c b/src/info.c index 74a7a4d34..a9c86c03e 100644 --- a/src/info.c +++ b/src/info.c @@ -60,7 +60,7 @@ char sprnames[NUMSPRITES + 1][5] = "BHBM","BLIG","LIGH","THNS","SINK","SITR","KBLN","DEZL","POKE","AUDI", "DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO","CRAB","SHAD", "BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO","ITEM","ITMO", - "ITMI","ITMN","WANT","PBOM","RETI","VIEW" + "ITMI","ITMN","WANT","PBOM","RETI","VIEW","KSPK","LZI1","LZI2","KLIT" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3016,6 +3016,57 @@ state_t states[NUMSTATES] = {SPR_RNDM, FF_ANIMATE, -1, {NULL}, 23, 3, S_NULL}, // S_PLAYERITEM {SPR_PBOM, 4, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL + + // Oh no it's annoying lightning states....... + // Lightning Sparks (it's the ones we'll use for the radius) + {SPR_KSPK, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KSPARK2}, // S_KSPARK1 + {SPR_NULL, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KSPARK3}, // S_KSPARK2 + {SPR_KSPK, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_KSPARK4}, // S_KSPARK3 + {SPR_NULL, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KSPARK5}, // S_KSPARK4 + {SPR_KSPK, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_KSPARK6}, // S_KSPARK5 + {SPR_NULL, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KSPARK7}, // S_KSPARK6 + {SPR_KSPK, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_KSPARK8}, // S_KSPARK7 + {SPR_NULL, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KSPARK9}, // S_KSPARK8 + {SPR_KSPK, FF_TRANS40|FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_KSPARK10}, // S_KSPARK9 + {SPR_NULL, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KSPARK11}, // S_KSPARK10 + {SPR_KSPK, FF_TRANS50|FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_KSPARK12}, // S_KSPARK11 + {SPR_NULL, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KSPARK13}, // S_KSPARK12 + {SPR_KSPK, FF_TRANS60|FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_NULL}, // S_KSPARK13 + + // The straight bolt... + {SPR_LZI1, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO12}, // S_LZIO11 + {SPR_NULL, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO13}, // S_LZIO12 + {SPR_LZI1, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO14}, // S_LZIO13 + {SPR_LZI1, FF_FULLBRIGHT|1, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO15}, // S_LZIO14 + {SPR_NULL, FF_FULLBRIGHT, 4, {A_LightningFollowPlayer}, 0, 0, S_LZIO16}, // S_LZIO15 + {SPR_LZI1, FF_FULLBRIGHT|1, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO17}, // S_LZIO16 + {SPR_NULL, 0, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO18}, // S_LZIO17 + {SPR_LZI1, FF_TRANS50|FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO19}, // S_LZIO18 + {SPR_LZI1, FF_TRANS70|FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_NULL}, // S_LZIO19 + + {SPR_NULL, FF_FULLBRIGHT, 6, {A_LightningFollowPlayer}, 0, 0, S_LZIO22}, // S_LZIO21 + {SPR_LZI2, FF_FULLBRIGHT|1, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO23}, // S_LZIO22 + {SPR_LZI2, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO24}, // S_LZIO23 + {SPR_NULL, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO25}, // S_LZIO24 + {SPR_NULL, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO26}, // S_LZIO25 + {SPR_NULL, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO27}, // S_LZIO26 + {SPR_LZI2, FF_TRANS30|FF_FULLBRIGHT|2, 2, {A_LightningFollowPlayer}, 0, 0, S_LZIO28}, // S_LZIO27 + {SPR_NULL, 0, 4, {A_LightningFollowPlayer}, 0, 0, S_LZIO29}, // S_LZIO28 + {SPR_LZI2, FF_TRANS70|FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_NULL}, // S_LZIO29 + + // The slanted bolt. Man these states are boring as all heck to do. + {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT2}, // S_KLIT1 + {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT3}, // S_KLIT2 + {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE|1, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT4}, // S_KLIT3 + {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT5}, // S_KLIT4 + {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE|2, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT6}, // S_KLIT5 + {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT7}, // S_KLIT6 + {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE|3, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT8}, // S_KLIT7 + {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT9}, // S_KLIT8 + {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE|4, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT10}, // S_KLIT9 + {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT11}, // S_KLIT10 + {SPR_KLIT, FF_FULLBRIGHT|FF_PAPERSPRITE|5, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT12}, // S_KLIT11 + {SPR_NULL, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {A_LightningFollowPlayer}, 0, 0, S_KLIT1}, // S_KLIT12 #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK diff --git a/src/info.h b/src/info.h index 8d27944f5..b5b12d279 100644 --- a/src/info.h +++ b/src/info.h @@ -168,6 +168,7 @@ void A_JawzChase(); // SRB2kart void A_JawzExplode(); // SRB2kart void A_MineExplode(); // SRB2kart void A_BallhogExplode(); // SRB2kart +void A_LightningFollowPlayer(); // SRB2kart: Lightning shield effect player chasing void A_OrbitNights(); void A_GhostMe(); void A_SetObjectState(); @@ -643,6 +644,11 @@ typedef enum sprite SPR_RETI, // player reticule SPR_VIEW, // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw! + + SPR_KSPK, // Spark radius for the lightning shield + SPR_LZI1, // Lightning that falls on the player for lightning shield + SPR_LZI2, // ditto + SPR_KLIT, // You have a twisted mind. But this actually is for the diagonal lightning. SPR_FIRSTFREESLOT, SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, @@ -3556,6 +3562,54 @@ typedef enum state S_PLAYERITEM, S_KARMAWHEEL, + + // Lightning shield use stuff; + S_KSPARK1, // Sparkling Radius + S_KSPARK2, + S_KSPARK3, + S_KSPARK4, + S_KSPARK5, + S_KSPARK6, + S_KSPARK7, + S_KSPARK8, + S_KSPARK9, + S_KSPARK10, + S_KSPARK11, + S_KSPARK12, + S_KSPARK13, // ... that's an awful lot. + + S_LZIO11, // Straight lightning bolt + S_LZIO12, + S_LZIO13, + S_LZIO14, + S_LZIO15, + S_LZIO16, + S_LZIO17, + S_LZIO18, + S_LZIO19, + + S_LZIO21, // Straight lightning bolt (flipped) + S_LZIO22, + S_LZIO23, + S_LZIO24, + S_LZIO25, + S_LZIO26, + S_LZIO27, + S_LZIO28, + S_LZIO29, + + S_KLIT1, // Diagonal lightning. No, it not being straight doesn't make it gay. + S_KLIT2, + S_KLIT3, + S_KLIT4, + S_KLIT5, + S_KLIT6, + S_KLIT7, + S_KLIT8, + S_KLIT9, + S_KLIT10, + S_KLIT11, + S_KLIT12, #ifdef SEENAMES S_NAMECHECK, diff --git a/src/k_kart.c b/src/k_kart.c index 94cdc399f..755f8a92f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2706,11 +2706,57 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map return mo; } +INT32 LightningRadius = 320; + static void K_DoThunderShield(player_t *player) { + mobj_t *mo; + int i = 0; + fixed_t sx; + fixed_t sy; + S_StartSound(player->mo, sfx_s3k45); //player->kartstuff[k_thunderanim] = 35; P_NukeEnemies(player->mo, player->mo, RING_DIST/4); + + // spawn vertical bolt + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); + P_SetTarget(&mo->target, player->mo); + P_SetMobjState(mo, S_LZIO11); + mo->color = SKINCOLOR_TEAL; + mo->scale = player->mo->scale*3 + (player->mo->scale/2); + + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); + P_SetTarget(&mo->target, player->mo); + P_SetMobjState(mo, S_LZIO21); + mo->color = SKINCOLOR_CYAN; + mo->scale = player->mo->scale*3 + (player->mo->scale/2); + + // spawn horizontal bolts; + for (i=0; i<7; i++) + { + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); + mo->angle = P_RandomRange(0, 359)*ANG1; + mo->fuse = P_RandomRange(20, 50); + P_SetTarget(&mo->target, player->mo); + P_SetMobjState(mo, S_KLIT1); + } + + // spawn the radius thing: + /*x = source->x + source->momx + FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); + y = source->y + source->momy + FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT));*/ + + angle_t an = ANGLE_22h; + + for (i=0; i<15; i++) + { + sx = player->mo->x + FixedMul((player->mo->scale*LightningRadius), FINECOSINE((an*i)>>ANGLETOFINESHIFT)); + sy = player->mo->y + FixedMul((player->mo->scale*LightningRadius), FINESINE((an*i)>>ANGLETOFINESHIFT)); + mo = P_SpawnMobj(sx, sy, player->mo->z, MT_THOK); + mo->scale = player->mo->scale*3; + P_SetMobjState(mo, S_KSPARK1); + } + } static void K_DoHyudoroSteal(player_t *player) @@ -5179,52 +5225,52 @@ void K_LoadKartHUDGraphics(void) } // For the item toggle menu -const char *K_GetItemPatch(UINT8 item, boolean small) +const char *K_GetItemPatch(UINT8 item, boolean smoll) { switch (item) { case KITEM_SNEAKER: case KRITEM_TRIPLESNEAKER: - return (small ? "K_ISSHOE" : "K_ITSHOE"); + return (smoll ? "K_ISSHOE" : "K_ITSHOE"); case KITEM_ROCKETSNEAKER: - return (small ? "K_ISRSHE" : "K_ITRSHE"); + return (smoll ? "K_ISRSHE" : "K_ITRSHE"); case KITEM_INVINCIBILITY: - return (small ? "K_ISINV1" : "K_ITINV1"); + return (smoll ? "K_ISINV1" : "K_ITINV1"); case KITEM_BANANA: case KRITEM_TRIPLEBANANA: case KRITEM_TENFOLDBANANA: - return (small ? "K_ISBANA" : "K_ITBANA"); + return (smoll ? "K_ISBANA" : "K_ITBANA"); case KITEM_EGGMAN: - return (small ? "K_ISEGGM" : "K_ITEGGM"); + return (smoll ? "K_ISEGGM" : "K_ITEGGM"); case KITEM_ORBINAUT: - return (small ? "K_ISORBN" : "K_ITORB1"); + return (smoll ? "K_ISORBN" : "K_ITORB1"); case KITEM_JAWZ: case KRITEM_DUALJAWZ: - return (small ? "K_ISJAWZ" : "K_ITJAWZ"); + return (smoll ? "K_ISJAWZ" : "K_ITJAWZ"); case KITEM_MINE: - return (small ? "K_ISMINE" : "K_ITMINE"); + return (smoll ? "K_ISMINE" : "K_ITMINE"); case KITEM_BALLHOG: - return (small ? "K_ISBHOG" : "K_ITBHOG"); + return (smoll ? "K_ISBHOG" : "K_ITBHOG"); case KITEM_SPB: - return (small ? "K_ISSPB" : "K_ITSPB"); + return (smoll ? "K_ISSPB" : "K_ITSPB"); case KITEM_GROW: - return (small ? "K_ISGROW" : "K_ITGROW"); + return (smoll ? "K_ISGROW" : "K_ITGROW"); case KITEM_SHRINK: - return (small ? "K_ISSHRK" : "K_ITSHRK"); + return (smoll ? "K_ISSHRK" : "K_ITSHRK"); case KITEM_THUNDERSHIELD: - return (small ? "K_ISTHNS" : "K_ITTHNS"); + return (smoll ? "K_ISTHNS" : "K_ITTHNS"); case KITEM_HYUDORO: - return (small ? "K_ISHYUD" : "K_ITHYUD"); + return (smoll ? "K_ISHYUD" : "K_ITHYUD"); case KITEM_POGOSPRING: - return (small ? "K_ISPOGO" : "K_ITPOGO"); + return (smoll ? "K_ISPOGO" : "K_ITPOGO"); case KITEM_KITCHENSINK: - return (small ? "K_ISSINK" : "K_ITSINK"); + return (smoll ? "K_ISSINK" : "K_ITSINK"); case KRITEM_TRIPLEORBINAUT: - return (small ? "K_ISORBN" : "K_ITORB3"); + return (smoll ? "K_ISORBN" : "K_ITORB3"); case KRITEM_QUADORBINAUT: - return (small ? "K_ISORBN" : "K_ITORB4"); + return (smoll ? "K_ISORBN" : "K_ITORB4"); default: - return (small ? "K_ISSAD" : "K_ITSAD"); + return (smoll ? "K_ISSAD" : "K_ITSAD"); } } diff --git a/src/k_kart.h b/src/k_kart.h index 9865d3734..8a30537cc 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -57,7 +57,7 @@ void K_CalculateBattleWanted(void); void K_CheckBumpers(void); void K_CheckSpectateStatus(void); -const char *K_GetItemPatch(UINT8 item, boolean small); +const char *K_GetItemPatch(UINT8 item, boolean smoll); INT32 K_calcSplitFlags(INT32 snapflags); void K_LoadKartHUDGraphics(void); fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my); diff --git a/src/p_enemy.c b/src/p_enemy.c index 830116745..74feba68b 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -192,6 +192,7 @@ void A_JawzChase(mobj_t *actor); // SRB2kart void A_JawzExplode(mobj_t *actor); // SRB2kart void A_MineExplode(mobj_t *actor); // SRB2kart void A_BallhogExplode(mobj_t *actor); // SRB2kart +void A_LightningFollowPlayer(mobj_t *actor); // SRB2kart void A_OrbitNights(mobj_t *actor); void A_GhostMe(mobj_t *actor); void A_SetObjectState(mobj_t *actor); @@ -8313,6 +8314,25 @@ void A_BallhogExplode(mobj_t *actor) S_StartSound(mo2, actor->info->deathsound); return; } + +// A_LightningFollowPlayer: +// Dumb simple function that gives a mobj its target's momentums without updating its angle. +void A_LightningFollowPlayer(mobj_t *actor) +{ +#ifdef HAVE_BLUA + if (LUA_CallAction("A_LightningFollowPlayer", actor)) + return; +#endif + if (actor->target) + { + P_TeleportMove(actor, actor->target->x, actor->target->y, actor->target->z); + actor->momx = actor->target->momx; + actor->momy = actor->target->momy; + actor->momz = actor->target->momz; // Give momentum since we don't teleport to our player literally every frame. + } + return; +} + //} // Function: A_OrbitNights