diff --git a/src/deh_tables.c b/src/deh_tables.c index 3b6ad291f..17b5a7bde 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3283,6 +3283,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_MAGICIANBOX", "S_MAGICIANBOXTOP", + "S_MAGICIANBOXBOTTOM", // Signpost sparkles "S_SIGNSPARK1", diff --git a/src/info.c b/src/info.c index b3d377532..d04bd078d 100644 --- a/src/info.c +++ b/src/info.c @@ -543,6 +543,8 @@ char sprnames[NUMSPRITES + 1][5] = "INVI", // Invincibility speedlines "ICAP", // Item capsules "MGBX", // Heavy Magician transform box + "MGBT", // Heavy Magician transform box top + "MGBB", // Heavy Magician transform box bottom "WIPD", // Wipeout dust trail "DRIF", // Drift Sparks @@ -3890,7 +3892,8 @@ state_t states[NUMSTATES] = //{SPR_ICAP, FF_FLOORSPRITE|5, -1, {NULL}, 0, 0, S_NULL}, // S_ITEMCAPSULE_INSIDE {SPR_MGBX, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX - {SPR_MGBX, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_TOP + {SPR_MGBT, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_TOP + {SPR_MGBB, FF_FLOORSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_MAGICIANBOX_BOTTOM {SPR_SGNS, FF_ADD|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_SIGNSPARK2}, // S_SIGNSPARK1 {SPR_SGNS, FF_ADD|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_SIGNSPARK3}, // S_SIGNSPARK2 diff --git a/src/info.h b/src/info.h index f70925273..b272e5176 100644 --- a/src/info.h +++ b/src/info.h @@ -1089,6 +1089,8 @@ typedef enum sprite SPR_INVI, // Invincibility speedlines SPR_ICAP, // Item capsules SPR_MGBX, // Heavy Magician transform box + SPR_MGBT, // Heavy Magician transform box top + SPR_MGBB, // Heavy Magician transform box bottom SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks @@ -4295,6 +4297,7 @@ typedef enum state S_MAGICIANBOX, S_MAGICIANBOX_TOP, + S_MAGICIANBOX_BOTTOM, // Signpost sparkles S_SIGNSPARK1, diff --git a/src/p_mobj.c b/src/p_mobj.c index f3f3cb97c..1d0d11371 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7612,6 +7612,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) case MT_MAGICIANBOX: { fixed_t destx, desty, fakeangle; + fixed_t zoff = 0; INT32 j; // EV1: rotation rate @@ -7635,15 +7636,20 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } else if (mobj->extravalue2 == TICRATE/3 && mobj->target) { + mobj->target->renderflags &= ~RF_DONTDRAW; mobj->momx = mobj->target->momx; mobj->momy = mobj->target->momy; mobj->momz = mobj->target->momz; - P_Thrust(mobj, mobj->angle + ANGLE_90, 32*mapobjectscale); + if (mobj->state == &states[S_MAGICIANBOX]) // sides + P_Thrust(mobj, mobj->angle + ANGLE_90, 32*mapobjectscale); + mobj->flags &= ~MF_NOGRAVITY; mobj->momz += 10*mapobjectscale; + if (mobj->state == &states[S_MAGICIANBOX_BOTTOM]) + mobj->momz *= -1; if (!mobj->cusval) // Some stuff should only occur once per box return true; @@ -7702,19 +7708,31 @@ static boolean P_MobjRegularThink(mobj_t *mobj) destx = mobj->target->x; desty = mobj->target->y; - fakeangle = (FixedInt(AngleFixed(mobj->angle)) + 90)%360; // What + if (mobj->state == &states[S_MAGICIANBOX]) // sides + { + CONS_Printf("side\n"); + fakeangle = (FixedInt(AngleFixed(mobj->angle)) + 90)%360; // What - destx += FixedMul(mobj->radius*2, FINECOSINE(FixedAngle(fakeangle*FRACUNIT) >> ANGLETOFINESHIFT)); - desty += FixedMul(mobj->radius*2, FINESINE(FixedAngle(fakeangle*FRACUNIT) >> ANGLETOFINESHIFT)); + destx += FixedMul(mobj->radius*2, FINECOSINE(FixedAngle(fakeangle*FRACUNIT) >> ANGLETOFINESHIFT)); + desty += FixedMul(mobj->radius*2, FINESINE(FixedAngle(fakeangle*FRACUNIT) >> ANGLETOFINESHIFT)); + } + else if (mobj->state == &states[S_MAGICIANBOX_TOP]) // top + { + CONS_Printf("top\n"); + zoff = mobj->radius*4; + } + else { + CONS_Printf("bottom\n"); + } if (mobj->flags2 & MF2_AMBUSH) { - P_SetOrigin(mobj, destx, desty, mobj->target->z); + P_SetOrigin(mobj, destx, desty, mobj->target->z + zoff); mobj->flags2 &= ~MF2_AMBUSH; } else { - P_MoveOrigin(mobj, destx, desty, mobj->target->z); + P_MoveOrigin(mobj, destx, desty, mobj->target->z + zoff); } break; } diff --git a/src/r_skins.c b/src/r_skins.c index 4db1d7963..7ffcc7f7b 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -367,7 +367,7 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast) fixed_t baseangle = P_RandomRange(PR_DECORATION, 0, 359); INT32 j, k; - for (k = 0; k < 4; k++) + for (k = 0; k < 6; k++) { mobj_t *box = P_SpawnMobjFromMobj(parent, 0, 0, 0, MT_MAGICIANBOX); box->target = parent; @@ -387,6 +387,13 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast) box->cusval = 1; // Should play sounds when disappearing else box->cusval = 0; + + if (k > 3) + { + P_SetMobjState(box, (k == 4) ? S_MAGICIANBOX_TOP : S_MAGICIANBOX_BOTTOM); + box->renderflags |= RF_NOSPLATBILLBOARD; + box->angle = FixedAngle(baseangle*FRACUNIT); + } } for (j = 0; j < 16; j++)