mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-28 14:31:15 +00:00
Merge branch 'EOL-8' into EOL
This commit is contained in:
commit
8e0b7dd804
7 changed files with 304 additions and 145 deletions
|
@ -1651,7 +1651,6 @@ static actionpointer_t actionpointers[] =
|
||||||
{{A_GiveShield}, "A_GIVESHIELD"},
|
{{A_GiveShield}, "A_GIVESHIELD"},
|
||||||
{{A_GravityBox}, "A_GRAVITYBOX"},
|
{{A_GravityBox}, "A_GRAVITYBOX"},
|
||||||
{{A_ScoreRise}, "A_SCORERISE"},
|
{{A_ScoreRise}, "A_SCORERISE"},
|
||||||
{{A_ParticleSpawn}, "A_PARTICLESPAWN"},
|
|
||||||
{{A_AttractChase}, "A_ATTRACTCHASE"},
|
{{A_AttractChase}, "A_ATTRACTCHASE"},
|
||||||
{{A_DropMine}, "A_DROPMINE"},
|
{{A_DropMine}, "A_DROPMINE"},
|
||||||
{{A_FishJump}, "A_FISHJUMP"},
|
{{A_FishJump}, "A_FISHJUMP"},
|
||||||
|
@ -5702,7 +5701,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_SEED",
|
"S_SEED",
|
||||||
|
|
||||||
"S_PARTICLE",
|
"S_PARTICLE",
|
||||||
"S_PARTICLEGEN",
|
|
||||||
|
|
||||||
// Score Logos
|
// Score Logos
|
||||||
"S_SCRA", // 100
|
"S_SCRA", // 100
|
||||||
|
|
11
src/info.c
11
src/info.c
|
@ -2786,7 +2786,7 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_STEM, 4, 2, {NULL}, 0, 0, S_STEAM6}, // S_STEAM5
|
{SPR_STEM, 4, 2, {NULL}, 0, 0, S_STEAM6}, // S_STEAM5
|
||||||
{SPR_STEM, 5, 2, {NULL}, 0, 0, S_STEAM7}, // S_STEAM6
|
{SPR_STEM, 5, 2, {NULL}, 0, 0, S_STEAM7}, // S_STEAM6
|
||||||
{SPR_STEM, 6, 2, {NULL}, 0, 0, S_STEAM8}, // S_STEAM7
|
{SPR_STEM, 6, 2, {NULL}, 0, 0, S_STEAM8}, // S_STEAM7
|
||||||
{SPR_STEM, 7, 18, {NULL}, 0, 0, S_STEAM1}, // S_STEAM8
|
{SPR_NULL, 0, 18, {NULL}, 0, 0, S_STEAM1}, // S_STEAM8
|
||||||
|
|
||||||
// Bumpers
|
// Bumpers
|
||||||
{SPR_BUMP, FF_ANIMATE|FF_GLOBALANIM, -1, {NULL}, 3, 4, S_NULL}, // S_BUMPER
|
{SPR_BUMP, FF_ANIMATE|FF_GLOBALANIM, -1, {NULL}, 3, 4, S_NULL}, // S_BUMPER
|
||||||
|
@ -2963,7 +2963,6 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
// Particle sprite
|
// Particle sprite
|
||||||
{SPR_PRTL, 0, 2*TICRATE, {NULL}, 0, 0, S_NULL}, // S_PARTICLE
|
{SPR_PRTL, 0, 2*TICRATE, {NULL}, 0, 0, S_NULL}, // S_PARTICLE
|
||||||
{SPR_NULL, 0, 3, {A_ParticleSpawn}, 0, 0, S_PARTICLEGEN}, // S_PARTICLEGEN
|
|
||||||
|
|
||||||
{SPR_SCOR, 0, 32, {A_ScoreRise}, 0, 0, S_NULL}, // S_SCRA - 100
|
{SPR_SCOR, 0, 32, {A_ScoreRise}, 0, 0, S_NULL}, // S_SCRA - 100
|
||||||
{SPR_SCOR, 1, 32, {A_ScoreRise}, 0, 0, S_NULL}, // S_SCRB - 200
|
{SPR_SCOR, 1, 32, {A_ScoreRise}, 0, 0, S_NULL}, // S_SCRB - 200
|
||||||
|
@ -6740,7 +6739,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
4, // mass
|
4, // mass
|
||||||
0, // damage
|
0, // damage
|
||||||
sfx_None, // activesound
|
sfx_None, // activesound
|
||||||
MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SCENERY|MF_NOCLIPHEIGHT, // flags
|
MF_NOBLOCKMAP|MF_SCENERY|MF_NOCLIPHEIGHT, // flags
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -14499,7 +14498,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
|
|
||||||
{ // MT_PARTICLEGEN
|
{ // MT_PARTICLEGEN
|
||||||
757, // doomednum
|
757, // doomednum
|
||||||
S_PARTICLEGEN, // spawnstate
|
S_INVISIBLE, // spawnstate
|
||||||
1000, // spawnhealth
|
1000, // spawnhealth
|
||||||
S_NULL, // seestate
|
S_NULL, // seestate
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
|
@ -14520,7 +14519,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
16, // mass
|
16, // mass
|
||||||
0, // damage
|
0, // damage
|
||||||
sfx_None, // activesound
|
sfx_None, // activesound
|
||||||
MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOCLIP|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags
|
MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOCLIP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_SCENERY, // flags
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -16619,7 +16618,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_PENGUINATOR_WADDLE1, // seestate
|
S_PENGUINATOR_WADDLE1, // seestate
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
0, // reactiontime
|
0, // reactiontime
|
||||||
sfx_s3k8a, // attacksound
|
sfx_ngjump, // attacksound
|
||||||
S_NULL, // painstate
|
S_NULL, // painstate
|
||||||
200, // painchance
|
200, // painchance
|
||||||
sfx_None, // painsound
|
sfx_None, // painsound
|
||||||
|
|
|
@ -57,7 +57,6 @@ void A_ExtraLife(); // Extra Life
|
||||||
void A_GiveShield(); // Obtained Shield
|
void A_GiveShield(); // Obtained Shield
|
||||||
void A_GravityBox();
|
void A_GravityBox();
|
||||||
void A_ScoreRise(); // Rise the score logo
|
void A_ScoreRise(); // Rise the score logo
|
||||||
void A_ParticleSpawn();
|
|
||||||
void A_AttractChase(); // Ring Chase
|
void A_AttractChase(); // Ring Chase
|
||||||
void A_DropMine(); // Drop Mine from Skim or Jetty-Syn Bomber
|
void A_DropMine(); // Drop Mine from Skim or Jetty-Syn Bomber
|
||||||
void A_FishJump(); // Fish Jump
|
void A_FishJump(); // Fish Jump
|
||||||
|
@ -3066,7 +3065,6 @@ typedef enum state
|
||||||
S_SEED,
|
S_SEED,
|
||||||
|
|
||||||
S_PARTICLE,
|
S_PARTICLE,
|
||||||
S_PARTICLEGEN,
|
|
||||||
|
|
||||||
// Score Logos
|
// Score Logos
|
||||||
S_SCRA, // 100
|
S_SCRA, // 100
|
||||||
|
|
227
src/m_cheat.c
227
src/m_cheat.c
|
@ -499,56 +499,211 @@ void Command_Teleport_f(void)
|
||||||
REQUIRE_INLEVEL;
|
REQUIRE_INLEVEL;
|
||||||
REQUIRE_SINGLEPLAYER;
|
REQUIRE_SINGLEPLAYER;
|
||||||
|
|
||||||
if (COM_Argc() < 3 || COM_Argc() > 7)
|
if (COM_Argc() < 3 || COM_Argc() > 11)
|
||||||
{
|
{
|
||||||
CONS_Printf(M_GetText("teleport -x <value> -y <value> -z <value>: teleport to a location\n"));
|
CONS_Printf(M_GetText("teleport -x <value> -y <value> -z <value> -ang <value> -aim <value>: teleport to a location\nteleport -sp <sequence> <placement>: teleport to specified checkpoint\n"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!p->mo)
|
if (!p->mo)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
i = COM_CheckParm("-x");
|
i = COM_CheckParm("-sp");
|
||||||
if (i)
|
|
||||||
intx = atoi(COM_Argv(i + 1));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("%s value not specified\n"), "X");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = COM_CheckParm("-y");
|
|
||||||
if (i)
|
|
||||||
inty = atoi(COM_Argv(i + 1));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("%s value not specified\n"), "Y");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ss = R_PointInSubsector(intx*FRACUNIT, inty*FRACUNIT);
|
|
||||||
if (!ss || ss->sector->ceilingheight - ss->sector->floorheight < p->mo->height)
|
|
||||||
{
|
|
||||||
CONS_Alert(CONS_NOTICE, M_GetText("Not a valid location.\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
i = COM_CheckParm("-z");
|
|
||||||
if (i)
|
if (i)
|
||||||
{
|
{
|
||||||
intz = atoi(COM_Argv(i + 1));
|
INT32 starpostnum = atoi(COM_Argv(i + 1)); // starpost number
|
||||||
intz <<= FRACBITS;
|
INT32 starpostpath = atoi(COM_Argv(i + 2)); // quick, dirty way to distinguish between paths
|
||||||
if (intz < ss->sector->floorheight)
|
|
||||||
intz = ss->sector->floorheight;
|
if (starpostnum < 0 || starpostpath < 0)
|
||||||
if (intz > ss->sector->ceilingheight - p->mo->height)
|
{
|
||||||
intz = ss->sector->ceilingheight - p->mo->height;
|
CONS_Alert(CONS_NOTICE, M_GetText("Negative starpost indexing is not valid.\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!starpostnum) // spawnpoints...
|
||||||
|
{
|
||||||
|
mapthing_t *mt;
|
||||||
|
|
||||||
|
if (starpostpath >= numcoopstarts)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("Player %d spawnpoint not found (%d max).\n"), starpostpath+1, numcoopstarts-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mt = playerstarts[starpostpath]; // Given above check, should never be NULL.
|
||||||
|
intx = mt->x<<FRACBITS;
|
||||||
|
inty = mt->y<<FRACBITS;
|
||||||
|
|
||||||
|
ss = R_IsPointInSubsector(intx, inty);
|
||||||
|
if (!ss || ss->sector->ceilingheight - ss->sector->floorheight < p->mo->height)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("Spawnpoint not in a valid location.\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flagging a player's ambush will make them start on the ceiling
|
||||||
|
// Objectflip inverts
|
||||||
|
if (!!(mt->options & MTF_AMBUSH) ^ !!(mt->options & MTF_OBJECTFLIP))
|
||||||
|
{
|
||||||
|
intz = ss->sector->ceilingheight - p->mo->height;
|
||||||
|
if (mt->options >> ZSHIFT)
|
||||||
|
intz -= ((mt->options >> ZSHIFT) << FRACBITS);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
intz = ss->sector->floorheight;
|
||||||
|
if (mt->options >> ZSHIFT)
|
||||||
|
intz += ((mt->options >> ZSHIFT) << FRACBITS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mt->options & MTF_OBJECTFLIP) // flip the player!
|
||||||
|
{
|
||||||
|
p->mo->eflags |= MFE_VERTICALFLIP;
|
||||||
|
p->mo->flags2 |= MF2_OBJECTFLIP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p->mo->eflags &= ~MFE_VERTICALFLIP;
|
||||||
|
p->mo->flags2 &= ~MF2_OBJECTFLIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
localangle = p->mo->angle = p->drawangle = FixedAngle(mt->angle<<FRACBITS);
|
||||||
|
}
|
||||||
|
else // scan the thinkers to find starposts...
|
||||||
|
{
|
||||||
|
mobj_t *mo2;
|
||||||
|
thinker_t *th;
|
||||||
|
|
||||||
|
INT32 starpostmax = 0;
|
||||||
|
intz = starpostpath; // variable reuse - counting down for selection purposes
|
||||||
|
|
||||||
|
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||||
|
{
|
||||||
|
if (th->function.acp1 != (actionf_p1)P_MobjThinker)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
mo2 = (mobj_t *)th;
|
||||||
|
|
||||||
|
if (mo2->type != MT_STARPOST)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (mo2->health != starpostnum)
|
||||||
|
{
|
||||||
|
if (mo2->health > starpostmax)
|
||||||
|
starpostmax = mo2->health;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intz--)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (th == &thinkercap)
|
||||||
|
{
|
||||||
|
if (intz == starpostpath)
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("No starpost of position %d found (%d max).\n"), starpostnum, starpostmax);
|
||||||
|
else
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("Starpost of position %d, %d not found (%d, %d max).\n"), starpostnum, starpostpath, starpostmax, (starpostpath-intz)-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ss = R_IsPointInSubsector(mo2->x, mo2->y);
|
||||||
|
if (!ss || ss->sector->ceilingheight - ss->sector->floorheight < p->mo->height)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("Starpost not in a valid location.\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
intx = mo2->x;
|
||||||
|
inty = mo2->y;
|
||||||
|
intz = mo2->z;
|
||||||
|
|
||||||
|
if (mo2->flags2 & MF2_OBJECTFLIP) // flip the player!
|
||||||
|
{
|
||||||
|
p->mo->eflags |= MFE_VERTICALFLIP;
|
||||||
|
p->mo->flags2 |= MF2_OBJECTFLIP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p->mo->eflags &= ~MFE_VERTICALFLIP;
|
||||||
|
p->mo->flags2 &= ~MF2_OBJECTFLIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
localangle = p->mo->angle = p->drawangle = mo2->angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Printf(M_GetText("Teleporting to checkpoint %d, %d...\n"), starpostnum, starpostpath);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
intz = ss->sector->floorheight;
|
{
|
||||||
|
i = COM_CheckParm("-nop"); // undocumented stupid addition to allow pivoting on the spot with -ang and -aim
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
|
intx = p->mo->x;
|
||||||
|
inty = p->mo->y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = COM_CheckParm("-x");
|
||||||
|
if (i)
|
||||||
|
intx = atoi(COM_Argv(i + 1))<<FRACBITS;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("%s value not specified.\n"), "X");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CONS_Printf(M_GetText("Teleporting to %d, %d, %d...\n"), intx, inty, FixedInt(intz));
|
i = COM_CheckParm("-y");
|
||||||
|
if (i)
|
||||||
|
inty = atoi(COM_Argv(i + 1))<<FRACBITS;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("%s value not specified.\n"), "Y");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ss = R_IsPointInSubsector(intx, inty);
|
||||||
|
if (!ss || ss->sector->ceilingheight - ss->sector->floorheight < p->mo->height)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("Not a valid location.\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i = COM_CheckParm("-z");
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
|
intz = atoi(COM_Argv(i + 1))<<FRACBITS;
|
||||||
|
if (intz < ss->sector->floorheight)
|
||||||
|
intz = ss->sector->floorheight;
|
||||||
|
if (intz > ss->sector->ceilingheight - p->mo->height)
|
||||||
|
intz = ss->sector->ceilingheight - p->mo->height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
intz = ((p->mo->eflags & MFE_VERTICALFLIP) ? ss->sector->ceilingheight : ss->sector->floorheight);
|
||||||
|
|
||||||
|
i = COM_CheckParm("-ang");
|
||||||
|
if (i)
|
||||||
|
localangle = p->drawangle = p->mo->angle = FixedAngle(atoi(COM_Argv(i + 1))<<FRACBITS);
|
||||||
|
|
||||||
|
i = COM_CheckParm("-aim");
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
|
angle_t aim = FixedAngle(atoi(COM_Argv(i + 1))<<FRACBITS);
|
||||||
|
if (aim >= ANGLE_90 && aim <= ANGLE_270)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("Not a valid aiming angle (between +/-90).\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
localaiming = p->aiming = aim;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Printf(M_GetText("Teleporting to %d, %d, %d...\n"), FixedInt(intx), FixedInt(inty), FixedInt(intz));
|
||||||
|
}
|
||||||
|
|
||||||
P_MapStart();
|
P_MapStart();
|
||||||
if (!P_TeleportMove(p->mo, intx*FRACUNIT, inty*FRACUNIT, intz))
|
if (!P_TeleportMove(p->mo, intx, inty, intz))
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Unable to teleport to that spot!\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Unable to teleport to that spot!\n"));
|
||||||
else
|
else
|
||||||
S_StartSound(p->mo, sfx_mixup);
|
S_StartSound(p->mo, sfx_mixup);
|
||||||
|
|
|
@ -112,7 +112,6 @@ void A_ExtraLife(mobj_t *actor);
|
||||||
void A_GiveShield(mobj_t *actor);
|
void A_GiveShield(mobj_t *actor);
|
||||||
void A_GravityBox(mobj_t *actor);
|
void A_GravityBox(mobj_t *actor);
|
||||||
void A_ScoreRise(mobj_t *actor);
|
void A_ScoreRise(mobj_t *actor);
|
||||||
void A_ParticleSpawn(mobj_t *actor);
|
|
||||||
void A_BunnyHop(mobj_t *actor);
|
void A_BunnyHop(mobj_t *actor);
|
||||||
void A_BubbleSpawn(mobj_t *actor);
|
void A_BubbleSpawn(mobj_t *actor);
|
||||||
void A_FanBubbleSpawn(mobj_t *actor);
|
void A_FanBubbleSpawn(mobj_t *actor);
|
||||||
|
@ -3958,53 +3957,6 @@ void A_ScoreRise(mobj_t *actor)
|
||||||
P_SetObjectMomZ(actor, actor->info->speed, false);
|
P_SetObjectMomZ(actor, actor->info->speed, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function: A_ParticleSpawn
|
|
||||||
//
|
|
||||||
// Description: Hyper-specialised function for spawning a particle for MT_PARTICLEGEN.
|
|
||||||
//
|
|
||||||
// var1 = unused
|
|
||||||
// var2 = unused
|
|
||||||
//
|
|
||||||
void A_ParticleSpawn(mobj_t *actor)
|
|
||||||
{
|
|
||||||
INT32 i = 0;
|
|
||||||
mobj_t *spawn;
|
|
||||||
|
|
||||||
#ifdef HAVE_BLUA
|
|
||||||
if (LUA_CallAction("A_ParticleSpawn", actor))
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
if (!actor->health)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!actor->lastlook)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!actor->threshold)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < actor->lastlook; i++)
|
|
||||||
{
|
|
||||||
spawn = P_SpawnMobj(
|
|
||||||
actor->x + FixedMul(FixedMul(actor->friction, actor->scale), FINECOSINE(actor->angle>>ANGLETOFINESHIFT)),
|
|
||||||
actor->y + FixedMul(FixedMul(actor->friction, actor->scale), FINESINE(actor->angle>>ANGLETOFINESHIFT)),
|
|
||||||
actor->z,
|
|
||||||
(mobjtype_t)actor->threshold);
|
|
||||||
P_SetScale(spawn, actor->scale);
|
|
||||||
spawn->momz = FixedMul(actor->movefactor, spawn->scale);
|
|
||||||
spawn->destscale = spawn->scale/100;
|
|
||||||
spawn->scalespeed = spawn->scale/actor->health;
|
|
||||||
spawn->tics = (tic_t)actor->health;
|
|
||||||
spawn->flags2 |= (actor->flags2 & MF2_OBJECTFLIP);
|
|
||||||
spawn->angle += P_RandomKey(36)*ANG10; // irrelevant for default objects but might make sense for some custom ones
|
|
||||||
|
|
||||||
actor->angle += actor->movedir;
|
|
||||||
}
|
|
||||||
|
|
||||||
actor->angle += (angle_t)actor->movecount;
|
|
||||||
actor->tics = (tic_t)actor->reactiontime;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function: A_BunnyHop
|
// Function: A_BunnyHop
|
||||||
//
|
//
|
||||||
// Description: Makes object hop like a bunny.
|
// Description: Makes object hop like a bunny.
|
||||||
|
|
|
@ -104,8 +104,13 @@ void P_ClearStarPost(INT32 postnum)
|
||||||
|
|
||||||
mo2 = (mobj_t *)th;
|
mo2 = (mobj_t *)th;
|
||||||
|
|
||||||
if (mo2->type == MT_STARPOST && mo2->health <= postnum)
|
if (mo2->type != MT_STARPOST)
|
||||||
P_SetMobjState(mo2, mo2->info->seestate);
|
return;
|
||||||
|
|
||||||
|
if (mo2->health > postnum)
|
||||||
|
return;
|
||||||
|
|
||||||
|
P_SetMobjState(mo2, mo2->info->seestate);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1364,7 +1369,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
|
|
||||||
P_ClearStarPost(special->health);
|
P_ClearStarPost(special->health);
|
||||||
|
|
||||||
// Find all starposts in the level with this value.
|
// Find all starposts in the level with this value - INCLUDING this one!
|
||||||
|
if (!(netgame && circuitmap && player != &players[consoleplayer]))
|
||||||
{
|
{
|
||||||
thinker_t *th;
|
thinker_t *th;
|
||||||
mobj_t *mo2;
|
mobj_t *mo2;
|
||||||
|
@ -1376,21 +1382,16 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
|
|
||||||
mo2 = (mobj_t *)th;
|
mo2 = (mobj_t *)th;
|
||||||
|
|
||||||
if (mo2 == special)
|
if (mo2->type != MT_STARPOST)
|
||||||
|
continue;
|
||||||
|
if (mo2->health != special->health)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (mo2->type == MT_STARPOST && mo2->health == special->health)
|
P_SetMobjState(mo2, mo2->info->painstate);
|
||||||
{
|
|
||||||
if (!(netgame && circuitmap && player != &players[consoleplayer]))
|
|
||||||
P_SetMobjState(mo2, mo2->info->painstate);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
S_StartSound(toucher, special->info->painsound);
|
S_StartSound(toucher, special->info->painsound);
|
||||||
|
|
||||||
if (!(netgame && circuitmap && player != &players[consoleplayer]))
|
|
||||||
P_SetMobjState(special, special->info->painstate);
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case MT_FAKEMOBILE:
|
case MT_FAKEMOBILE:
|
||||||
|
|
134
src/p_mobj.c
134
src/p_mobj.c
|
@ -2404,6 +2404,7 @@ boolean P_CheckSolidLava(mobj_t *mo, ffloor_t *rover)
|
||||||
static boolean P_ZMovement(mobj_t *mo)
|
static boolean P_ZMovement(mobj_t *mo)
|
||||||
{
|
{
|
||||||
fixed_t dist, delta;
|
fixed_t dist, delta;
|
||||||
|
boolean onground;
|
||||||
|
|
||||||
I_Assert(mo != NULL);
|
I_Assert(mo != NULL);
|
||||||
I_Assert(!P_MobjWasRemoved(mo));
|
I_Assert(!P_MobjWasRemoved(mo));
|
||||||
|
@ -2421,13 +2422,14 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
mo->eflags &= ~MFE_APPLYPMOMZ;
|
mo->eflags &= ~MFE_APPLYPMOMZ;
|
||||||
}
|
}
|
||||||
mo->z += mo->momz;
|
mo->z += mo->momz;
|
||||||
|
onground = P_IsObjectOnGround(mo);
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (mo->standingslope)
|
if (mo->standingslope)
|
||||||
{
|
{
|
||||||
if (mo->flags & MF_NOCLIPHEIGHT)
|
if (mo->flags & MF_NOCLIPHEIGHT)
|
||||||
mo->standingslope = NULL;
|
mo->standingslope = NULL;
|
||||||
else if (!P_IsObjectOnGround(mo))
|
else if (!onground)
|
||||||
P_SlopeLaunch(mo);
|
P_SlopeLaunch(mo);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2571,15 +2573,9 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (P_CheckDeathPitCollide(mo))
|
if (!mo->player && P_CheckDeathPitCollide(mo))
|
||||||
{
|
{
|
||||||
if (mo->flags & MF_PUSHABLE)
|
if (mo->flags & MF_ENEMY || mo->flags & MF_BOSS)
|
||||||
{
|
|
||||||
// Remove other pushable items from death pits.
|
|
||||||
P_RemoveMobj(mo);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (mo->flags & MF_ENEMY || mo->flags & MF_BOSS)
|
|
||||||
{
|
{
|
||||||
// Kill enemies and bosses that fall into death pits.
|
// Kill enemies and bosses that fall into death pits.
|
||||||
if (mo->health)
|
if (mo->health)
|
||||||
|
@ -2588,6 +2584,11 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
P_RemoveMobj(mo);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (P_MobjFlip(mo)*mo->momz < 0
|
if (P_MobjFlip(mo)*mo->momz < 0
|
||||||
|
@ -2870,6 +2871,8 @@ static boolean P_ZMovement(mobj_t *mo)
|
||||||
|
|
||||||
static void P_PlayerZMovement(mobj_t *mo)
|
static void P_PlayerZMovement(mobj_t *mo)
|
||||||
{
|
{
|
||||||
|
boolean onground;
|
||||||
|
|
||||||
I_Assert(mo != NULL);
|
I_Assert(mo != NULL);
|
||||||
I_Assert(!P_MobjWasRemoved(mo));
|
I_Assert(!P_MobjWasRemoved(mo));
|
||||||
|
|
||||||
|
@ -2903,6 +2906,7 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||||
}
|
}
|
||||||
|
|
||||||
mo->z += mo->momz;
|
mo->z += mo->momz;
|
||||||
|
onground = P_IsObjectOnGround(mo);
|
||||||
|
|
||||||
// Have player fall through floor?
|
// Have player fall through floor?
|
||||||
if (mo->player->playerstate == PST_DEAD
|
if (mo->player->playerstate == PST_DEAD
|
||||||
|
@ -2914,13 +2918,13 @@ static void P_PlayerZMovement(mobj_t *mo)
|
||||||
{
|
{
|
||||||
if (mo->flags & MF_NOCLIPHEIGHT)
|
if (mo->flags & MF_NOCLIPHEIGHT)
|
||||||
mo->standingslope = NULL;
|
mo->standingslope = NULL;
|
||||||
else if (!P_IsObjectOnGround(mo))
|
else if (!onground)
|
||||||
P_SlopeLaunch(mo);
|
P_SlopeLaunch(mo);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// clip movement
|
// clip movement
|
||||||
if (P_IsObjectOnGround(mo) && !(mo->flags & MF_NOCLIPHEIGHT))
|
if (onground && !(mo->flags & MF_NOCLIPHEIGHT))
|
||||||
{
|
{
|
||||||
if (mo->eflags & MFE_VERTICALFLIP)
|
if (mo->eflags & MFE_VERTICALFLIP)
|
||||||
mo->z = mo->ceilingz - mo->height;
|
mo->z = mo->ceilingz - mo->height;
|
||||||
|
@ -3222,19 +3226,14 @@ static boolean P_SceneryZMovement(mobj_t *mo)
|
||||||
P_RemoveMobj(mo);
|
P_RemoveMobj(mo);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix for any silly pushables like the egg statues that are also scenery for some reason -- Monster Iestyn
|
|
||||||
if (P_CheckDeathPitCollide(mo))
|
if (P_CheckDeathPitCollide(mo))
|
||||||
{
|
{
|
||||||
if (mo->flags & MF_PUSHABLE)
|
P_RemoveMobj(mo);
|
||||||
{
|
return false;
|
||||||
P_RemoveMobj(mo);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// clip movement
|
// clip movement
|
||||||
|
@ -7117,6 +7116,59 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MT_PARTICLEGEN:
|
||||||
|
if (!mobj->lastlook)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!mobj->threshold)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (--mobj->fuse <= 0)
|
||||||
|
{
|
||||||
|
INT32 i = 0;
|
||||||
|
mobj_t *spawn;
|
||||||
|
fixed_t bottomheight, topheight;
|
||||||
|
INT32 type = mobj->threshold, line = mobj->cvmem;
|
||||||
|
|
||||||
|
mobj->fuse = (tic_t)mobj->reactiontime;
|
||||||
|
|
||||||
|
bottomheight = lines[line].frontsector->floorheight;
|
||||||
|
topheight = lines[line].frontsector->ceilingheight - mobjinfo[(mobjtype_t)type].height;
|
||||||
|
|
||||||
|
if (mobj->waterbottom != bottomheight || mobj->watertop != topheight)
|
||||||
|
{
|
||||||
|
if (mobj->movefactor && (topheight > bottomheight))
|
||||||
|
mobj->health = (tic_t)(FixedDiv((topheight - bottomheight), abs(mobj->movefactor)) >> FRACBITS);
|
||||||
|
else
|
||||||
|
mobj->health = 0;
|
||||||
|
|
||||||
|
mobj->z = ((mobj->flags2 & MF2_OBJECTFLIP) ? topheight : bottomheight);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mobj->health)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < mobj->lastlook; i++)
|
||||||
|
{
|
||||||
|
spawn = P_SpawnMobj(
|
||||||
|
mobj->x + FixedMul(FixedMul(mobj->friction, mobj->scale), FINECOSINE(mobj->angle>>ANGLETOFINESHIFT)),
|
||||||
|
mobj->y + FixedMul(FixedMul(mobj->friction, mobj->scale), FINESINE(mobj->angle>>ANGLETOFINESHIFT)),
|
||||||
|
mobj->z,
|
||||||
|
(mobjtype_t)mobj->threshold);
|
||||||
|
P_SetScale(spawn, mobj->scale);
|
||||||
|
spawn->momz = FixedMul(mobj->movefactor, spawn->scale);
|
||||||
|
spawn->destscale = spawn->scale/100;
|
||||||
|
spawn->scalespeed = spawn->scale/mobj->health;
|
||||||
|
spawn->tics = (tic_t)mobj->health;
|
||||||
|
spawn->flags2 |= (mobj->flags2 & MF2_OBJECTFLIP);
|
||||||
|
spawn->angle += P_RandomKey(36)*ANG10; // irrelevant for default objects but might make sense for some custom ones
|
||||||
|
|
||||||
|
mobj->angle += mobj->movedir;
|
||||||
|
}
|
||||||
|
|
||||||
|
mobj->angle += (angle_t)mobj->movecount;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (mobj->fuse)
|
if (mobj->fuse)
|
||||||
{ // Scenery object fuse! Very basic!
|
{ // Scenery object fuse! Very basic!
|
||||||
|
@ -7483,6 +7535,19 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
mobj->z += FINESINE(mobj->extravalue1*(FINEMASK+1)/360);
|
mobj->z += FINESINE(mobj->extravalue1*(FINEMASK+1)/360);
|
||||||
P_SetThingPosition(mobj);
|
P_SetThingPosition(mobj);
|
||||||
break;
|
break;
|
||||||
|
case MT_FLAME:
|
||||||
|
if (mobj->flags2 & MF2_BOSSNOTRAP)
|
||||||
|
{
|
||||||
|
if (!mobj->target || P_MobjWasRemoved(mobj->target))
|
||||||
|
{
|
||||||
|
P_RemoveMobj(mobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mobj->z = mobj->target->z + mobj->target->momz;
|
||||||
|
if (!(mobj->eflags & MFE_VERTICALFLIP))
|
||||||
|
mobj->z += mobj->target->height;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case MT_WAVINGFLAG:
|
case MT_WAVINGFLAG:
|
||||||
{
|
{
|
||||||
fixed_t base = (leveltime<<(FRACBITS+1));
|
fixed_t base = (leveltime<<(FRACBITS+1));
|
||||||
|
@ -10309,8 +10374,8 @@ ML_EFFECT4 : Don't clip inside the ground
|
||||||
}
|
}
|
||||||
case MT_PARTICLEGEN:
|
case MT_PARTICLEGEN:
|
||||||
{
|
{
|
||||||
fixed_t radius, speed, bottomheight, topheight;
|
fixed_t radius, speed;
|
||||||
INT32 type, numdivisions, time, anglespeed, ticcount;
|
INT32 type, numdivisions, anglespeed, ticcount;
|
||||||
angle_t angledivision;
|
angle_t angledivision;
|
||||||
INT32 line;
|
INT32 line;
|
||||||
const size_t mthingi = (size_t)(mthing - mapthings);
|
const size_t mthingi = (size_t)(mthing - mapthings);
|
||||||
|
@ -10329,13 +10394,9 @@ ML_EFFECT4 : Don't clip inside the ground
|
||||||
else
|
else
|
||||||
type = (INT32)MT_PARTICLE;
|
type = (INT32)MT_PARTICLE;
|
||||||
|
|
||||||
speed = abs(sides[lines[line].sidenum[0]].textureoffset);
|
|
||||||
bottomheight = lines[line].frontsector->floorheight;
|
|
||||||
topheight = lines[line].frontsector->ceilingheight - mobjinfo[(mobjtype_t)type].height;
|
|
||||||
|
|
||||||
if (!lines[line].backsector
|
if (!lines[line].backsector
|
||||||
|| (ticcount = (sides[lines[line].sidenum[1]].textureoffset >> FRACBITS)) < 1)
|
|| (ticcount = (sides[lines[line].sidenum[1]].textureoffset >> FRACBITS)) < 1)
|
||||||
ticcount = states[S_PARTICLEGEN].tics;
|
ticcount = 3;
|
||||||
|
|
||||||
numdivisions = (mthing->options >> ZSHIFT);
|
numdivisions = (mthing->options >> ZSHIFT);
|
||||||
|
|
||||||
|
@ -10353,18 +10414,9 @@ ML_EFFECT4 : Don't clip inside the ground
|
||||||
angledivision = 0;
|
angledivision = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((speed) && (topheight > bottomheight))
|
speed = abs(sides[lines[line].sidenum[0]].textureoffset);
|
||||||
time = (INT32)(FixedDiv((topheight - bottomheight), speed) >> FRACBITS);
|
|
||||||
else
|
|
||||||
time = 1; // There's no reasonable way to set it, so just show the object for one tic and move on.
|
|
||||||
|
|
||||||
if (mthing->options & MTF_OBJECTFLIP)
|
if (mthing->options & MTF_OBJECTFLIP)
|
||||||
{
|
|
||||||
mobj->z = topheight;
|
|
||||||
speed *= -1;
|
speed *= -1;
|
||||||
}
|
|
||||||
else
|
|
||||||
mobj->z = bottomheight;
|
|
||||||
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Particle Generator (mapthing #%s):\n"
|
CONS_Debug(DBG_GAMELOGIC, "Particle Generator (mapthing #%s):\n"
|
||||||
"Radius is %d\n"
|
"Radius is %d\n"
|
||||||
|
@ -10372,20 +10424,20 @@ ML_EFFECT4 : Don't clip inside the ground
|
||||||
"Anglespeed is %d\n"
|
"Anglespeed is %d\n"
|
||||||
"Numdivisions is %d\n"
|
"Numdivisions is %d\n"
|
||||||
"Angledivision is %d\n"
|
"Angledivision is %d\n"
|
||||||
"Time is %d\n"
|
|
||||||
"Type is %d\n"
|
"Type is %d\n"
|
||||||
"Tic seperation is %d\n",
|
"Tic seperation is %d\n",
|
||||||
sizeu1(mthingi), radius, speed, anglespeed, numdivisions, angledivision, time, type, ticcount);
|
sizeu1(mthingi), radius, speed, anglespeed, numdivisions, angledivision, type, ticcount);
|
||||||
|
|
||||||
mobj->angle = 0;
|
mobj->angle = 0;
|
||||||
mobj->movefactor = speed;
|
mobj->movefactor = speed;
|
||||||
mobj->lastlook = numdivisions;
|
mobj->lastlook = numdivisions;
|
||||||
mobj->movedir = angledivision*ANG1;
|
mobj->movedir = angledivision*ANG1;
|
||||||
mobj->movecount = anglespeed*ANG1;
|
mobj->movecount = anglespeed*ANG1;
|
||||||
mobj->health = time;
|
|
||||||
mobj->friction = radius;
|
mobj->friction = radius;
|
||||||
mobj->threshold = type;
|
mobj->threshold = type;
|
||||||
mobj->reactiontime = ticcount;
|
mobj->reactiontime = ticcount;
|
||||||
|
mobj->cvmem = line;
|
||||||
|
mobj->watertop = mobj->waterbottom = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -10474,7 +10526,11 @@ ML_EFFECT4 : Don't clip inside the ground
|
||||||
break;
|
break;
|
||||||
case MT_FLAMEHOLDER:
|
case MT_FLAMEHOLDER:
|
||||||
if (!(mthing->options & MTF_OBJECTSPECIAL)) // Spawn the fire
|
if (!(mthing->options & MTF_OBJECTSPECIAL)) // Spawn the fire
|
||||||
P_SpawnMobjFromMobj(mobj, 0, 0, mobj->height, MT_FLAME);
|
{
|
||||||
|
mobj_t *flame = P_SpawnMobjFromMobj(mobj, 0, 0, mobj->height, MT_FLAME);
|
||||||
|
P_SetTarget(&flame->target, mobj);
|
||||||
|
flame->flags2 |= MF2_BOSSNOTRAP;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MT_SMASHINGSPIKEBALL:
|
case MT_SMASHINGSPIKEBALL:
|
||||||
if (mthing->angle > 0)
|
if (mthing->angle > 0)
|
||||||
|
|
Loading…
Reference in a new issue