Charge minimum viable visuals (plus future frame/obj setup)

This commit is contained in:
AJ Martinez 2023-11-12 23:32:59 -07:00
parent 9bb1f56fa6
commit 041d7660ae
7 changed files with 315 additions and 11 deletions

View file

@ -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",

View file

@ -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

View file

@ -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,

View file

@ -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
{

View file

@ -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);

View file

@ -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)<<RF_TRANSSHIFT;
if (aura->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)<<RF_TRANSSHIFT;
// Visuals
charge->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
}

View file

@ -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);