diff --git a/src/dehacked.c b/src/dehacked.c index da740a7a9..bf12bcb86 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7872,6 +7872,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_THUNDERSHIELD", // Shields "MT_BUBBLESHIELD", "MT_FLAMESHIELD", + "MT_FLAMESHIELDPAPER", "MT_BUBBLESHIELDTRAP", "MT_SINK", // Kitchen Sink Stuff diff --git a/src/info.c b/src/info.c index 264fd8778..179d6e584 100644 --- a/src/info.c +++ b/src/info.c @@ -2919,16 +2919,16 @@ state_t states[NUMSTATES] = {SPR_FLMS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_FLAMESHIELD18}, // S_FLAMESHIELD17 {SPR_FLMS, FF_FULLBRIGHT|17, 2, {NULL}, 0, 0, S_FLAMESHIELD1}, // S_FLAMESHIELD18 - {SPR_FLMD, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH2}, // S_FLAMESHIELDDASH1 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 0, 2, S_FLAMESHIELDDASH3}, // S_FLAMESHIELDDASH2 - {SPR_FLMD, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH4}, // S_FLAMESHIELDDASH3 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 1, 3, S_FLAMESHIELDDASH5}, // S_FLAMESHIELDDASH4 - {SPR_FLMD, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH6}, // S_FLAMESHIELDDASH5 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 2, 0, S_FLAMESHIELDDASH7}, // S_FLAMESHIELDDASH6 - {SPR_FLMD, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 - {SPR_FLMD, FF_FULLBRIGHT, 1, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH8 + {SPR_FLMD, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH2}, // S_FLAMESHIELDDASH1 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 0, 2, S_FLAMESHIELDDASH3}, // S_FLAMESHIELDDASH2 + {SPR_FLMD, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH4}, // S_FLAMESHIELDDASH3 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 1, 3, S_FLAMESHIELDDASH5}, // S_FLAMESHIELDDASH4 + {SPR_FLMD, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH6}, // S_FLAMESHIELDDASH5 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 2, 0, S_FLAMESHIELDDASH7}, // S_FLAMESHIELDDASH6 + {SPR_FLMD, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_FLAMESHIELDDASH8}, // S_FLAMESHIELDDASH7 + {SPR_FLMD, FF_FULLBRIGHT, 2, {A_FlameShieldPaper}, 3, 1, S_FLAMESHIELDDASH1}, // S_FLAMESHIELDDASH8 - {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 2, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER + {SPR_FLMP, FF_FULLBRIGHT|FF_PAPERSPRITE, 3, {NULL}, 0, 0, S_NULL}, // S_FLAMESHIELDPAPER {SPR_SINK, 0, 1, {A_SmokeTrailer}, MT_SINKTRAIL, 0, S_SINK}, // S_SINK {SPR_SINK, 0|FF_TRANS80|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_SINK_SHIELD}, // S_SINK_SHIELD @@ -16271,6 +16271,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_FLAMESHIELDPAPER + -1, // doomednum + S_FLAMESHIELDPAPER, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // 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 + 8<kartstuff[k_flamelength] * (TICRATE/4); if (flamemax > 0) - flamemax += (TICRATE/2); + flamemax += 3*(TICRATE/4); if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { @@ -7636,7 +7636,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) flamemax = player->kartstuff[k_flamelength] * (TICRATE/4); if (flamemax > 0) - flamemax += (TICRATE/2); + flamemax += 3*(TICRATE/4); } if (player->kartstuff[k_flamemeter] > flamemax) @@ -9067,14 +9067,17 @@ static void K_drawKartItem(void) if (stplyr->kartstuff[k_eggmanexplode] > 1 /*&& stplyr->kartstuff[k_eggmanexplode] <= 3*TICRATE*/) V_DrawScaledPatch(fx+17, fy+13-offset, V_HUDTRANS|fflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); - if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD && stplyr->kartstuff[k_flamelength] > 0) { INT32 numframes = 104; INT32 absolutemax = 16 * (TICRATE/4); INT32 flamemax = stplyr->kartstuff[k_flamelength] * (TICRATE/4); - INT32 flen = 1; - INT32 bf = 16 - (flamemax / (TICRATE/4)); - INT32 ff = numframes - ((stplyr->kartstuff[k_flamemeter] * numframes) / absolutemax); + INT32 flamemeter = min(stplyr->kartstuff[k_flamemeter], flamemax); + + INT32 bf = 16 - stplyr->kartstuff[k_flamelength]; + INT32 ff = numframes - ((flamemeter * numframes) / absolutemax); + INT32 fmin = (8 * (bf-1)); + INT32 xo = 6, yo = 4; INT32 flip = 0; @@ -9089,18 +9092,13 @@ static void K_drawKartItem(void) } } - if (stplyr->kartstuff[k_flamelength] > 0) - { - flen = (numframes * 16) / stplyr->kartstuff[k_flamelength]; - } + if (ff < fmin) + ff = fmin; - if (ff < 0) {ff = 0;} - if (ff > flen-1) {ff = flen-1;} - - if (flamemax > 0) + if (bf >= 0 && bf < 16) V_DrawScaledPatch(fx-xo, fy-yo, V_HUDTRANS|fflags|flip, kp_flameshieldmeter_bg[bf][offset]); - if (stplyr->kartstuff[k_flamemeter] > 0) + if (ff >= 0 && ff < numframes && stplyr->kartstuff[k_flamemeter] > 0) { if (stplyr->kartstuff[k_flamemeter] > (flamemax - (TICRATE/4)) && (leveltime & 1)) { diff --git a/src/p_enemy.c b/src/p_enemy.c index d2931d17e..290b49c52 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -9350,8 +9350,9 @@ void A_FlameShieldPaper(mobj_t *actor) INT32 perpendicular = ((i & 1) ? -ANGLE_90 : ANGLE_90); fixed_t newx = actor->x + P_ReturnThrustX(NULL, actor->angle + perpendicular, 8*actor->scale); fixed_t newy = actor->y + P_ReturnThrustY(NULL, actor->angle + perpendicular, 8*actor->scale); - mobj_t *paper = P_SpawnMobj(newx + actor->momx, newy + actor->momy, actor->z + actor->momz, MT_THOK); + mobj_t *paper = P_SpawnMobj(newx, newy, actor->z, MT_FLAMESHIELDPAPER); + P_SetTarget(&paper->target, actor); P_SetScale(paper, actor->scale); paper->destscale = actor->destscale; @@ -9369,6 +9370,8 @@ void A_FlameShieldPaper(mobj_t *actor) { paper->frame |= framea; } + + paper->extravalue1 = i; } } diff --git a/src/p_mobj.c b/src/p_mobj.c index 773ed3709..d1134257a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8370,6 +8370,30 @@ void P_MobjThinker(mobj_t *mobj) mobj->target->y + FINESINE(mobj->angle >> ANGLETOFINESHIFT), mobj->z + mobj->target->height * P_MobjFlip(mobj)); break; + case MT_FLAMESHIELDPAPER: + if (!mobj->target || P_MobjWasRemoved(mobj->target)) + { + P_RemoveMobj(mobj); + return; + } + + mobj->z = mobj->target->z; + + K_MatchGenericExtraFlags(mobj, mobj->target); + + { + INT32 perpendicular = ((mobj->extravalue1 & 1) ? -ANGLE_90 : ANGLE_90); + fixed_t newx = mobj->target->x + P_ReturnThrustX(NULL, mobj->target->angle + perpendicular, 8*mobj->target->scale); + fixed_t newy = mobj->target->y + P_ReturnThrustY(NULL, mobj->target->angle + perpendicular, 8*mobj->target->scale); + + P_TeleportMove(mobj, newx, newy, mobj->target->z); + + if (mobj->extravalue1 & 1) + mobj->angle = mobj->target->angle - ANGLE_45; + else + mobj->angle = mobj->target->angle + ANGLE_45; + } + break; case MT_TIREGREASE: if (!mobj->target || P_MobjWasRemoved(mobj->target) || !mobj->target->player || !mobj->target->player->kartstuff[k_tiregrease])