diff --git a/src/deh_tables.c b/src/deh_tables.c index c40d56be3..a9d6f96c7 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1568,6 +1568,10 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKRING", "S_BLOCKBODY", + "S_AMPRING", + "S_AMPBODY", + "S_AMPAURA", + "S_CHARGEAURA", "S_CHARGEFALL", "S_CHARGEFLICKER", @@ -3507,6 +3511,10 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLOCKRING", "MT_BLOCKBODY", + "MT_AMPRING", + "MT_AMPBODY", + "MT_AMPAURA", + "MT_CHARGEAURA", "MT_CHARGEFALL", "MT_CHARGEFLICKER", diff --git a/src/info.c b/src/info.c index 3aaefbcda..5a4cb9fbe 100644 --- a/src/info.c +++ b/src/info.c @@ -579,6 +579,8 @@ char sprnames[NUMSPRITES + 1][5] = "AMPA", "AMPB", + "AMPC", + "AMPD", "WTRL", // Water Trail @@ -2125,6 +2127,10 @@ state_t states[NUMSTATES] = {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY + {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING + {SPR_AMPC, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPBODY + {SPR_AMPD, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPAURA + {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 @@ -13634,6 +13640,87 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_AMPRING + -1, // doomednum + S_AMPRING, // 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 + 3, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_AMPBODY + -1, // doomednum + S_AMPBODY, // 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 + 2, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + + { // MT_AMPAURA + -1, // doomednum + S_AMPAURA, // 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 + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + { // MT_CHARGEAURA -1, // doomednum S_CHARGEAURA, // spawnstate diff --git a/src/info.h b/src/info.h index 2631ccc19..42758fc57 100644 --- a/src/info.h +++ b/src/info.h @@ -1118,6 +1118,8 @@ typedef enum sprite SPR_AMPA, SPR_AMPB, + SPR_AMPC, + SPR_AMPD, SPR_WTRL, // Water Trail @@ -2593,6 +2595,10 @@ typedef enum state S_BLOCKRING, S_BLOCKBODY, + S_AMPRING, + S_AMPBODY, + S_AMPAURA, + S_CHARGEAURA, S_CHARGEFALL, S_CHARGEFLICKER, @@ -4559,6 +4565,10 @@ typedef enum mobj_type MT_BLOCKRING, MT_BLOCKBODY, + MT_AMPRING, + MT_AMPBODY, + MT_AMPAURA, + MT_CHARGEAURA, MT_CHARGEFALL, MT_CHARGEFLICKER, diff --git a/src/k_objects.h b/src/k_objects.h index c336956c2..29765ec69 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -139,6 +139,10 @@ void Obj_BlockRingThink(mobj_t *ring); void Obj_BlockBodyThink(mobj_t *body); void Obj_GuardBreakThink(mobj_t *fx); +void Obj_AmpRingThink(mobj_t *amp); +void Obj_AmpBodyThink(mobj_t *amp); +void Obj_AmpAuraThink(mobj_t *amp); + void Obj_AmpsThink(mobj_t *amps); void Obj_ChargeAuraThink(mobj_t *aura); diff --git a/src/objects/amps.c b/src/objects/amps.c index 8f250874c..646cd89e8 100644 --- a/src/objects/amps.c +++ b/src/objects/amps.c @@ -22,6 +22,8 @@ #define AMP_ARCTIME (8) +static UINT8 interlacedfuckingthing[] = {6,1,7,2,8,3,9,2,1,1,1,2,1,3,1,2,10,1,11,2,4,3,5,2,1,1,1,2,1,3,1,2}; + void Obj_AmpsThink (mobj_t *amps) { if (P_MobjWasRemoved(amps->target) @@ -46,7 +48,7 @@ void Obj_AmpsThink (mobj_t *amps) fixed_t vert = dist/3; fixed_t speed = 45*amps->scale; - if (amps->extravalue2) + if (amps->extravalue2) // Mode: going down, aim at the player and speed up / dampen stray movement { if (amps->extravalue1) amps->extravalue1--; @@ -58,7 +60,7 @@ void Obj_AmpsThink (mobj_t *amps) fakez = mo->z + (vert * amps->extravalue1 / AMP_ARCTIME); damper = 1; } - else + else // Mode: going up, aim above the player { amps->extravalue1++; if (amps->extravalue1 >= AMP_ARCTIME) @@ -86,4 +88,110 @@ void Obj_AmpsThink (mobj_t *amps) P_RemoveMobj(amps); } } -} \ No newline at end of file +} + +void Obj_AmpRingThink (mobj_t *amps) +{ + if (P_MobjWasRemoved(amps->target) || !amps->target->player) + { + P_RemoveMobj(amps); + } + else + { + mobj_t *mo = amps->target; + player_t *player = mo->player; + + amps->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(amps, mo->x, mo->y, mo->z + mo->height/2); + amps->flags |= MF_NOCLIPTHING; + + amps->color = mo->player->skincolor; + amps->sprite = SPR_AMPB; + amps->frame = interlacedfuckingthing[(leveltime/1)%32]-1; + amps->colorized = true; + + if (amps->scale != 3*mo->scale/2) + P_InstaScale(amps, 3*mo->scale/2); + + amps->angle = amps->target->angle + (ANG15/2 * leveltime); + amps->renderflags |= RF_ADD|RF_PAPERSPRITE|RF_FULLBRIGHT; + + if (player->overdrive) + amps->renderflags &= ~RF_DONTDRAW; + else + amps->renderflags |= RF_DONTDRAW; + + if (player->overdrive < 35 && player->overdrive % 2) + amps->renderflags |= RF_DONTDRAW; + } +} + +void Obj_AmpBodyThink (mobj_t *amps) +{ + if (P_MobjWasRemoved(amps->target) || !amps->target->player) + { + P_RemoveMobj(amps); + } + else + { + mobj_t *mo = amps->target; + player_t *player = mo->player; + + amps->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(amps, mo->x, mo->y, mo->z + mo->height/2); + amps->flags |= MF_NOCLIPTHING; + + amps->color = mo->player->skincolor; + amps->frame = leveltime%14; + amps->colorized = true; + + if (amps->scale != 5*mo->scale/4) + P_InstaScale(amps, 5*mo->scale/4); + + amps->angle = amps->target->angle; + amps->renderflags |= RF_ADD|RF_FULLBRIGHT; + + if (player->overdrive) + amps->renderflags &= ~RF_DONTDRAW; + else + amps->renderflags |= RF_DONTDRAW; + + if (player->overdrive < 35 && player->overdrive % 2) + amps->renderflags |= RF_DONTDRAW; + } +} + +void Obj_AmpAuraThink (mobj_t *amps) +{ + if (P_MobjWasRemoved(amps->target) || !amps->target->player) + { + P_RemoveMobj(amps); + } + else + { + mobj_t *mo = amps->target; + player_t *player = mo->player; + + amps->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(amps, mo->x, mo->y, mo->z + mo->height/2); + amps->flags |= MF_NOCLIPTHING; + + amps->color = mo->player->skincolor; + amps->frame = leveltime%2; + amps->colorized = true; + + if (amps->scale != 5*mo->scale/4) + P_InstaScale(amps, 5*mo->scale/4); + + amps->angle = amps->target->angle; + amps->renderflags |= RF_ADD|RF_FULLBRIGHT; + + amps->renderflags &= ~RF_TRANSMASK; + amps->renderflags |= (max(3, NUMTRANSMAPS - player->overdrive/TICRATE) << RF_TRANSSHIFT); + + if (!player->overdrive) + amps->renderflags |= RF_DONTDRAW; + else + amps->renderflags &= ~RF_DONTDRAW; + } +} diff --git a/src/objects/block.c b/src/objects/block.c index c30f18dc4..9332274f9 100644 --- a/src/objects/block.c +++ b/src/objects/block.c @@ -17,8 +17,6 @@ #include "../k_kart.h" #include "../k_powerup.h" -static UINT8 interlacedfuckingthing[] = {6,1,7,2,8,3,9,2,1,1,1,2,1,3,1,2,10,1,11,2,4,3,5,2,1,1,1,2,1,3,1,2}; - void Obj_BlockRingThink (mobj_t *ring) { if (P_MobjWasRemoved(ring->target) || !ring->target->player) @@ -39,19 +37,6 @@ void Obj_BlockRingThink (mobj_t *ring) fixed_t baseScale = mo->scale / 2; baseScale += (mo->scale / 30) * player->spheres; - if (player->overdrive) - { - baseScale += mo->scale; - ring->sprite = SPR_AMPB; - ring->frame = interlacedfuckingthing[(leveltime/1)%32]-1; - ring->colorized = true; - } - else - { - ring->colorized = false; - ring->frame = 0; - } - P_SetScale(ring, baseScale); // Twirl @@ -59,19 +44,12 @@ void Obj_BlockRingThink (mobj_t *ring) // Visuals ring->renderflags |= RF_ADD|RF_PAPERSPRITE; - if (player->overdrive > 35) - { + if (leveltime%2) ring->renderflags &= ~RF_DONTDRAW; - } else - { - if (leveltime%2) - ring->renderflags &= ~RF_DONTDRAW; - else - ring->renderflags |= RF_DONTDRAW; - } + ring->renderflags |= RF_DONTDRAW; - if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !(K_PlayerGuard(player) || player->overdrive)) + if (K_PowerUpRemaining(player, POWERUP_BARRIER) || !K_PlayerGuard(player)) ring->renderflags |= RF_DONTDRAW; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 13fb1b0f5..f5a71a7ac 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8595,6 +8595,21 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_BlockBodyThink(mobj); break; } + case MT_AMPRING: + { + Obj_AmpRingThink(mobj); + break; + } + case MT_AMPBODY: + { + Obj_AmpBodyThink(mobj); + break; + } + case MT_AMPAURA: + { + Obj_AmpAuraThink(mobj); + break; + } case MT_CHARGEAURA: { Obj_ChargeAuraThink(mobj); @@ -12155,6 +12170,24 @@ void P_SpawnPlayer(INT32 playernum) K_MatchGenericExtraFlags(body, p->mo); body->renderflags |= RF_DONTDRAW; + mobj_t *aring = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_AMPRING); + P_SetTarget(å->target, p->mo); + P_SetScale(aring, p->mo->scale); + K_MatchGenericExtraFlags(aring, p->mo); + aring->renderflags |= RF_DONTDRAW; + + mobj_t *abody = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_AMPBODY); + P_SetTarget(&abody->target, p->mo); + P_SetScale(abody, p->mo->scale); + K_MatchGenericExtraFlags(abody, p->mo); + abody->renderflags |= RF_DONTDRAW; + + mobj_t *aaura = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_AMPAURA); + P_SetTarget(&aaura->target, p->mo); + P_SetScale(aaura, p->mo->scale); + K_MatchGenericExtraFlags(aaura, p->mo); + aaura->renderflags |= RF_DONTDRAW; + if (K_PlayerGuard(p)) S_StartSound(body, sfx_s1af); }