From 041d7660ae401b5ab54398af9eae78d7e5a1403d Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 12 Nov 2023 23:32:59 -0700 Subject: [PATCH] Charge minimum viable visuals (plus future frame/obj setup) --- src/deh_tables.c | 10 +++ src/info.c | 144 +++++++++++++++++++++++++++++++++++++++++++ src/info.h | 14 +++++ src/k_kart.c | 22 ++++--- src/k_objects.h | 5 ++ src/objects/charge.c | 106 ++++++++++++++++++++++++++++++- src/p_mobj.c | 25 ++++++++ 7 files changed, 315 insertions(+), 11 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index f951e365a..e80bcb37a 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3326,6 +3326,11 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKBODY", "S_CHARGEAURA", + "S_CHARGEFALL", + "S_CHARGEFLICKER", + "S_CHARGESPARK", + "S_CHARGERELEASE", + "S_CHARGEEXTRA", "S_SERVANTHAND", @@ -5559,6 +5564,11 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLOCKBODY", "MT_CHARGEAURA", + "MT_CHARGEFALL", + "MT_CHARGEFLICKER", + "MT_CHARGESPARK", + "MT_CHARGERELEASE", + "MT_CHARGEEXTRA", "MT_SERVANTHAND", diff --git a/src/info.c b/src/info.c index 83b6407c0..67f1001df 100644 --- a/src/info.c +++ b/src/info.c @@ -568,6 +568,10 @@ char sprnames[NUMSPRITES + 1][5] = "GBDY", // Guard body "TRC1", // Charge aura + "TRC2", // Charge fall + "TRC3", // Charge flicker/sparks + "TRC4", // Charge release + "TRC5", // Charge extra "DHND", // Servant Hand @@ -4142,6 +4146,11 @@ state_t states[NUMSTATES] = {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY {SPR_TRC1, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_CHARGEAURA + {SPR_TRC2, FF_FULLBRIGHT|FF_ANIMATE|0, 20, {NULL}, 19, 1, S_NULL}, // S_CHARGEFALL + {SPR_TRC3, FF_FULLBRIGHT|FF_ADD|0, 2, {NULL}, 0, 0, S_NULL}, // S_CHARGEFLICKER + {SPR_TRC3, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_NULL}, // S_CHARGESPARK + {SPR_TRC4, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|0, -1, {NULL}, 4, 1, S_NULL}, // S_CHARGERELEASE + {SPR_TRC5, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|0, -1, {NULL}, 4, 1, S_NULL}, // S_CHARGEEXTRA {SPR_DHND, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SERVANTHAND @@ -23274,6 +23283,141 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_CHARGEFALL + -1, // doomednum + S_CHARGEFALL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_CHARGEFLICKER + -1, // doomednum + S_CHARGEFLICKER, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_CHARGESPARK + -1, // doomednum + S_CHARGESPARK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_CHARGERELEASE + -1, // doomednum + S_CHARGERELEASE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_CHARGEEXTRA + -1, // doomednum + S_CHARGEEXTRA, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + { // MT_SERVANTHAND -1, // doomednum S_SERVANTHAND, // spawnstate diff --git a/src/info.h b/src/info.h index 1bb5cfdac..3d83aebed 100644 --- a/src/info.h +++ b/src/info.h @@ -1125,6 +1125,10 @@ typedef enum sprite SPR_GBDY, // Guard body SPR_TRC1, // Charge aura + SPR_TRC2, // Charge fall + SPR_TRC3, // Charge flicker/sparks + SPR_TRC4, // Charge release + SPR_TRC5, // Charge extra SPR_DHND, // Servant Hand @@ -4553,6 +4557,11 @@ typedef enum state S_BLOCKBODY, S_CHARGEAURA, + S_CHARGEFALL, + S_CHARGEFLICKER, + S_CHARGESPARK, + S_CHARGERELEASE, + S_CHARGEEXTRA, S_SERVANTHAND, @@ -6824,6 +6833,11 @@ typedef enum mobj_type MT_BLOCKBODY, MT_CHARGEAURA, + MT_CHARGEFALL, + MT_CHARGEFLICKER, + MT_CHARGESPARK, + MT_CHARGERELEASE, + MT_CHARGEEXTRA, MT_SERVANTHAND, diff --git a/src/k_kart.c b/src/k_kart.c index c9e7f1657..6f970d03a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8545,7 +8545,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) mobj_t *aura = P_SpawnMobjFromMobj(player->mo, 0, 0, player->mo->height/2, MT_CHARGEAURA); aura->angle = player->mo->angle + i*ANG15; P_SetTarget(&aura->target, player->mo); - if (i != 0) + if (i == 0) + aura->extravalue2 = 1; + else aura->renderflags |= RF_TRANS50; } } @@ -8871,14 +8873,6 @@ void K_KartResetPlayerColor(player_t *player) } } - if (player->trickcharge && (leveltime & 1)) - { - player->mo->colorized = true; - player->mo->color = SKINCOLOR_INVINCFLASH; - fullbright = true; - goto finalise; - } - if (player->ringboost && (leveltime & 1)) // ring boosting { player->mo->colorized = true; @@ -12483,9 +12477,17 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { P_InstaThrust(player->mo, player->mo->angle, 2*abs(player->fastfall)/3 + 15*FRACUNIT); player->mo->hitlag = 3; - S_StartSound(player->mo, sfx_gshac); // TODO + S_StartSound(player->mo, sfx_gshba); // TODO player->fastfall = 0; // intentionally skip bounce player->trickcharge = 0; + + UINT8 i; + for (i = 0; i < 4; i++) + { + mobj_t *arc = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_CHARGEFALL); + P_SetTarget(&arc->target, player->mo); + arc->extravalue1 = i; + } } else { diff --git a/src/k_objects.h b/src/k_objects.h index baae5e050..1dc774f4f 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -127,6 +127,11 @@ void Obj_BlockBodyThink(mobj_t *body); void Obj_GuardBreakThink(mobj_t *fx); void Obj_ChargeAuraThink(mobj_t *aura); +void Obj_ChargeFallThink(mobj_t *charge); +void Obj_ChargeFlickerThink(mobj_t *flicker); +void Obj_ChargeSparkThink(mobj_t *spawk); +void Obj_ChargeReleaseThink(mobj_t *release); +void Obj_ChargeExtraThink(mobj_t *extra); /* Ring Shooter */ boolean Obj_RingShooterThinker(mobj_t *mo); diff --git a/src/objects/charge.c b/src/objects/charge.c index 6566b69c3..bb695ce5a 100644 --- a/src/objects/charge.c +++ b/src/objects/charge.c @@ -4,10 +4,16 @@ #include "../p_local.h" #include "../k_kart.h" #include "../k_powerup.h" +#include "../m_random.h" +#define CHARGEAURA_BURSTTIME (9) +#define CHARGEAURA_SPARKRADIUS (160) + +// xval1: destruction timer +// xval2: master (spawns other visuals) void Obj_ChargeAuraThink (mobj_t *aura) { - if (P_MobjWasRemoved(aura->target) || !aura->target->player || !aura->target->player->trickcharge) + if (P_MobjWasRemoved(aura->target) || !aura->target->player || (aura->extravalue1 >= CHARGEAURA_BURSTTIME)) { P_RemoveMobj(aura); } @@ -22,7 +28,20 @@ void Obj_ChargeAuraThink (mobj_t *aura) aura->flags |= MF_NOCLIPTHING; aura->color = mo->color; + aura->renderflags &= ~RF_DONTDRAW; + fixed_t baseScale = 12*mo->scale/10; + + if (aura->extravalue1 || !player->trickcharge) + { + aura->extravalue1++; + baseScale += (mo->scale / 3) * aura->extravalue1; + aura->renderflags &= ~RF_TRANSMASK; + aura->renderflags |= (aura->extravalue1)<extravalue1 % 2) + aura->renderflags |= RF_DONTDRAW; + } + P_SetScale(aura, baseScale); // Twirl @@ -30,5 +49,90 @@ void Obj_ChargeAuraThink (mobj_t *aura) // Visuals aura->renderflags |= RF_PAPERSPRITE|RF_ADD; + // fuck + boolean forceinvisible = !!!(leveltime % 8); + if (aura->extravalue1 || !(player->driftcharge > K_GetKartDriftSparkValueForStage(player, 3))) + forceinvisible = false; + + if (forceinvisible) + aura->renderflags |= RF_DONTDRAW; + + if (aura->extravalue2) + { + if (player->driftcharge) + { + mobj_t *spark = P_SpawnMobjFromMobj(aura, + mo->scale*P_RandomRange(PR_DECORATION, -1*CHARGEAURA_SPARKRADIUS, CHARGEAURA_SPARKRADIUS), + mo->scale*P_RandomRange(PR_DECORATION, -1*CHARGEAURA_SPARKRADIUS, CHARGEAURA_SPARKRADIUS), + mo->scale*P_RandomRange(PR_DECORATION, -1*CHARGEAURA_SPARKRADIUS, CHARGEAURA_SPARKRADIUS), + MT_CHARGESPARK); + spark->frame = P_RandomRange(PR_DECORATION, 1, 5); + P_SetTarget(&spark->target, aura); + P_SetScale(spark, 15*aura->scale/10); + } + + if (forceinvisible) + { + mobj_t *flicker = P_SpawnMobjFromMobj(aura, 0, 0, 0, MT_CHARGEFLICKER); + P_SetTarget(&flicker->target, aura); + P_SetScale(flicker, aura->scale); + } + } } +} + +void Obj_ChargeFallThink (mobj_t *charge) +{ + if (P_MobjWasRemoved(charge->target) || !charge->target->player) + { + P_RemoveMobj(charge); + } + else + { + mobj_t *mo = charge->target; + player_t *player = mo->player; + + // Follow player + charge->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(charge, mo->x, mo->y, mo->z); + charge->flags |= MF_NOCLIPTHING; + charge->color = mo->color; + charge->angle = mo->angle + ANGLE_45 + (ANGLE_90 * charge->extravalue1); + + if (!P_IsObjectOnGround(mo)) + charge->renderflags |= RF_DONTDRAW; + else + charge->renderflags &= ~RF_DONTDRAW; + + fixed_t baseScale = 12*mo->scale/10; + P_SetScale(charge, baseScale); + + charge->renderflags &= ~RF_TRANSMASK; + if (charge->tics < 10) + charge->renderflags |= (9 - charge->tics)<renderflags |= RF_PAPERSPRITE|RF_ADD; + } +} + +void Obj_ChargeFlickerThink (mobj_t *flicker) +{ + // xd +} + +void Obj_ChargeSparkThink (mobj_t *spark) +{ + // xd + spark->renderflags |= RF_FULLBRIGHT|RF_ADD; +} + +void Obj_ChargeReleaseThink (mobj_t *flicker) +{ + // xd +} + +void Obj_ChargeExtraThink (mobj_t *flicker) +{ + // xd } \ No newline at end of file diff --git a/src/p_mobj.c b/src/p_mobj.c index c2b98d99e..4305f6cb7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8856,6 +8856,31 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_ChargeAuraThink(mobj); break; } + case MT_CHARGEFALL: + { + Obj_ChargeFallThink(mobj); + break; + } + case MT_CHARGEFLICKER: + { + Obj_ChargeFlickerThink(mobj); + break; + } + case MT_CHARGESPARK: + { + Obj_ChargeSparkThink(mobj); + break; + } + case MT_CHARGERELEASE: + { + Obj_ChargeReleaseThink(mobj); + break; + } + case MT_CHARGEEXTRA: + { + Obj_ChargeExtraThink(mobj); + break; + } case MT_GUARDBREAK: { Obj_GuardBreakThink(mobj);