mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-27 22:42:57 +00:00
- Reintroduced Doom.exe's player_t::usedown variable so that respawning a
player does not immediately activate switches. oldbuttons was not usable for this. This also required that CopyPlayer preserves this info. - Fixed: When restarting the music there was a NULL pointer check missing so it crashed when the game was started wi - Fixed: If the Use key is used to respawn the player it must be cleared so that it doesn't trigger any subsequent actions after respawning. - Fixed: Resurrecting a monster did not restore flags5 and flags6. - Fixed: Projectiles which killed a non-monster were unable to determine what precisely they hit because MF_CORPSE is only valid for monsters. A new flag, MF6_KILLED that gets set for all objects that die, was added for this case. - Added a generic A_Weave function that exposes all possible options of A_BishopMissileWeave and A_CStaffMissileSlither. These 2 functions are no longer needed from DECORATE and therefore deprecated. SVN r2045 (trunk)
This commit is contained in:
parent
b3986a0235
commit
85c683e0c7
16 changed files with 102 additions and 51 deletions
|
@ -1,3 +1,20 @@
|
|||
December 25, 2009 (Changes by Graf Zahl)
|
||||
- Reintroduced Doom.exe's player_t::usedown variable so that respawning a
|
||||
player does not immediately activate switches. oldbuttons was not usable
|
||||
for this. This also required that CopyPlayer preserves this info.
|
||||
- Fixed: When restarting the music there was a NULL pointer check missing
|
||||
so it crashed when the game was started wi
|
||||
- Fixed: If the Use key is used to respawn the player it must be cleared
|
||||
so that it doesn't trigger any subsequent actions after respawning.
|
||||
- Fixed: Resurrecting a monster did not restore flags5 and flags6.
|
||||
- Fixed: Projectiles which killed a non-monster were unable to determine
|
||||
what precisely they hit because MF_CORPSE is only valid for monsters.
|
||||
A new flag, MF6_KILLED that gets set for all objects that die, was added
|
||||
for this case.
|
||||
- Added a generic A_Weave function that exposes all possible options of
|
||||
A_BishopMissileWeave and A_CStaffMissileSlither. These 2 functions are
|
||||
no longer needed from DECORATE and therefore deprecated.
|
||||
|
||||
December 24, 2009
|
||||
- The options menu no longer scales up so quickly, so it can fit wider text
|
||||
onscreen. In addition, it now uses the whole height available to it. Also,
|
||||
|
|
|
@ -318,6 +318,7 @@ enum
|
|||
MF6_LINEDONE = 0x00008000, // From MBF: Object has already run a line effect
|
||||
MF6_NOTRIGGER = 0x00010000, // actor cannot trigger any line actions
|
||||
MF6_SHATTERING = 0x00020000, // marks an ice corpse for forced shattering
|
||||
MF6_KILLED = 0x00040000, // Something that was killed (but not necessarily a corpse)
|
||||
|
||||
// --- mobj.renderflags ---
|
||||
|
||||
|
|
|
@ -81,7 +81,6 @@ static bool C_TabCompleteList ();
|
|||
static bool TabbedLast; // True if last key pressed was tab
|
||||
static bool TabbedList; // True if tab list was shown
|
||||
CVAR (Bool, con_notablist, false, CVAR_ARCHIVE)
|
||||
CVAR (Bool, con_ticker, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||
|
||||
static FTextureID conback;
|
||||
static DWORD conshade;
|
||||
|
@ -1105,23 +1104,17 @@ static void C_DrawNotifyText ()
|
|||
|
||||
void C_InitTicker (const char *label, unsigned int max, bool showpercent)
|
||||
{
|
||||
if (con_ticker)
|
||||
{
|
||||
TickerPercent = showpercent;
|
||||
TickerMax = max;
|
||||
TickerLabel = label;
|
||||
TickerAt = 0;
|
||||
maybedrawnow (true, false);
|
||||
}
|
||||
TickerPercent = showpercent;
|
||||
TickerMax = max;
|
||||
TickerLabel = label;
|
||||
TickerAt = 0;
|
||||
maybedrawnow (true, false);
|
||||
}
|
||||
|
||||
void C_SetTicker (unsigned int at, bool forceUpdate)
|
||||
{
|
||||
if (con_ticker)
|
||||
{
|
||||
TickerAt = at > TickerMax ? TickerMax : at;
|
||||
maybedrawnow (true, TickerVisible ? forceUpdate : false);
|
||||
}
|
||||
TickerAt = at > TickerMax ? TickerMax : at;
|
||||
maybedrawnow (true, TickerVisible ? forceUpdate : false);
|
||||
}
|
||||
|
||||
void C_DrawConsole (bool hw2d)
|
||||
|
|
|
@ -276,6 +276,7 @@ public:
|
|||
bool centering;
|
||||
BYTE turnticks;
|
||||
bool attackdown;
|
||||
bool usedown;
|
||||
DWORD oldbuttons;
|
||||
int health; // only used between levels, mo->health
|
||||
// is used during levels
|
||||
|
|
|
@ -1316,7 +1316,7 @@ void G_PlayerReborn (int player)
|
|||
|
||||
p->skill = b_skill; //Added by MC:
|
||||
|
||||
p->oldbuttons = ~0, p->attackdown = true; // don't do anything immediately
|
||||
p->oldbuttons = ~0, p->attackdown = true; p->usedown = true; // don't do anything immediately
|
||||
p->original_oldbuttons = ~0;
|
||||
p->playerstate = PST_LIVE;
|
||||
|
||||
|
|
|
@ -72,25 +72,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_BishopAttack2)
|
|||
|
||||
DEFINE_ACTION_FUNCTION(AActor, A_BishopMissileWeave)
|
||||
{
|
||||
fixed_t newX, newY;
|
||||
int weaveXY, weaveZ;
|
||||
int angle;
|
||||
|
||||
// since these values are now user configurable we have to do a proper range check to avoid array overflows.
|
||||
weaveXY = self->WeaveIndexXY & 63;
|
||||
weaveZ = self->WeaveIndexZ & 63;
|
||||
angle = (self->angle + ANG90) >> ANGLETOFINESHIFT;
|
||||
newX = self->x - FixedMul (finecosine[angle], FloatBobOffsets[weaveXY]<<1);
|
||||
newY = self->y - FixedMul (finesine[angle], FloatBobOffsets[weaveXY]<<1);
|
||||
weaveXY = (weaveXY + 2) & 63;
|
||||
newX += FixedMul (finecosine[angle], FloatBobOffsets[weaveXY]<<1);
|
||||
newY += FixedMul (finesine[angle], FloatBobOffsets[weaveXY]<<1);
|
||||
P_TryMove (self, newX, newY, true);
|
||||
self->z -= FloatBobOffsets[weaveZ];
|
||||
weaveZ = (weaveZ + 2) & 63;
|
||||
self->z += FloatBobOffsets[weaveZ];
|
||||
self->WeaveIndexXY = weaveXY;
|
||||
self->WeaveIndexZ = weaveZ;
|
||||
A_Weave(self, 2, 2, 2*FRACUNIT, FRACUNIT);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
|
|
@ -153,20 +153,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_CStaffAttack)
|
|||
|
||||
DEFINE_ACTION_FUNCTION(AActor, A_CStaffMissileSlither)
|
||||
{
|
||||
fixed_t newX, newY;
|
||||
int weaveXY;
|
||||
int angle;
|
||||
|
||||
// since these values are now user configurable we have to do a proper range check to avoid array overflows.
|
||||
weaveXY = self->WeaveIndexXY & 63;
|
||||
angle = (self->angle+ANG90)>>ANGLETOFINESHIFT;
|
||||
newX = self->x-FixedMul(finecosine[angle], FloatBobOffsets[weaveXY]);
|
||||
newY = self->y-FixedMul(finesine[angle], FloatBobOffsets[weaveXY]);
|
||||
weaveXY = (weaveXY+3)&63;
|
||||
newX += FixedMul(finecosine[angle], FloatBobOffsets[weaveXY]);
|
||||
newY += FixedMul(finesine[angle], FloatBobOffsets[weaveXY]);
|
||||
P_TryMove (self, newX, newY, true);
|
||||
self->WeaveIndexXY = weaveXY;
|
||||
A_Weave(self, 3, 0, FRACUNIT, 0);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
|
|
@ -348,6 +348,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_BellReset2)
|
|||
{
|
||||
self->flags |= MF_SHOOTABLE;
|
||||
self->flags &= ~MF_CORPSE;
|
||||
self->flags6 &= ~MF6_KILLED;
|
||||
self->health = 5;
|
||||
}
|
||||
|
||||
|
|
|
@ -54,6 +54,7 @@ void P_NewChaseDir (AActor *actor);
|
|||
AInventory *P_DropItem (AActor *source, const PClass *type, int special, int chance);
|
||||
void P_TossItem (AActor *item);
|
||||
bool P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params);
|
||||
void A_Weave(AActor *self, int xyspeed, int zspeed, fixed_t xydist, fixed_t zdist);
|
||||
|
||||
DECLARE_ACTION(A_Look)
|
||||
DECLARE_ACTION(A_Wander)
|
||||
|
|
|
@ -396,6 +396,8 @@ void AActor::Die (AActor *source, AActor *inflictor)
|
|||
// be revived by an Arch-Vile. Batman Doom needs this.
|
||||
flags |= MF_CORPSE;
|
||||
}
|
||||
flags6 |= MF6_KILLED;
|
||||
|
||||
// [RH] Allow the death height to be overridden using metadata.
|
||||
fixed_t metaheight = 0;
|
||||
if (DamageType == NAME_Fire)
|
||||
|
|
|
@ -1206,7 +1206,7 @@ void P_ExplodeMissile (AActor *mo, line_t *line, AActor *target)
|
|||
|
||||
FState *nextstate=NULL;
|
||||
|
||||
if (target != NULL && target->flags & (MF_SHOOTABLE|MF_CORPSE))
|
||||
if (target != NULL && ((target->flags & MF_SHOOTABLE) || (target->flags6 & MF6_KILLED)) )
|
||||
{
|
||||
if (target->flags & MF_NOBLOOD) nextstate = mo->FindState(NAME_Crash);
|
||||
if (nextstate == NULL) nextstate = mo->FindState(NAME_Death, NAME_Extreme);
|
||||
|
@ -5472,7 +5472,7 @@ int AActor::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, FN
|
|||
|
||||
void AActor::Crash()
|
||||
{
|
||||
if ((flags & MF_CORPSE) &&
|
||||
if ((flags6 & MF6_KILLED) &&
|
||||
!(flags3 & MF3_CRASHED) &&
|
||||
!(flags & MF_ICECORPSE))
|
||||
{
|
||||
|
|
|
@ -244,6 +244,8 @@ static void CopyPlayer (player_t *dst, player_t *src, const char *name)
|
|||
// needs to come from the save for bots.
|
||||
userinfo_t uibackup = dst->userinfo;
|
||||
int chasecam = dst->cheats & CF_CHASECAM; // Remember the chasecam setting
|
||||
bool attackdown = dst->attackdown;
|
||||
bool usedown = dst->usedown;
|
||||
*dst = *src;
|
||||
dst->cheats |= chasecam;
|
||||
|
||||
|
@ -270,6 +272,9 @@ static void CopyPlayer (player_t *dst, player_t *src, const char *name)
|
|||
{
|
||||
dst->mo->player = dst;
|
||||
}
|
||||
// These 2 variables may not be overwritten.
|
||||
dst->attackdown = attackdown;
|
||||
dst->usedown = usedown;
|
||||
}
|
||||
|
||||
static void SpawnExtraPlayers ()
|
||||
|
|
|
@ -466,6 +466,8 @@ bool P_Thing_Raise(AActor *thing)
|
|||
thing->flags2 = info->flags2;
|
||||
thing->flags3 = info->flags3;
|
||||
thing->flags4 = info->flags4;
|
||||
thing->flags5 = info->flags5;
|
||||
thing->flags6 = info->flags6;
|
||||
thing->health = info->health;
|
||||
thing->target = NULL;
|
||||
thing->lastenemy = NULL;
|
||||
|
|
|
@ -222,6 +222,7 @@ player_t::player_t()
|
|||
centering(0),
|
||||
turnticks(0),
|
||||
attackdown(0),
|
||||
usedown(0),
|
||||
oldbuttons(0),
|
||||
health(0),
|
||||
inventorytics(0),
|
||||
|
@ -2287,10 +2288,15 @@ void P_PlayerThink (player_t *player)
|
|||
}
|
||||
}
|
||||
// check for use
|
||||
if ((cmd->ucmd.buttons & BT_USE) && !(player->oldbuttons & BT_USE))
|
||||
if ((cmd->ucmd.buttons & BT_USE) && !player->usedown)
|
||||
{
|
||||
player->usedown = true;
|
||||
P_UseLines (player);
|
||||
}
|
||||
else
|
||||
{
|
||||
player->usedown = false;
|
||||
}
|
||||
// Morph counter
|
||||
if (player->morphTics)
|
||||
{
|
||||
|
|
|
@ -2307,6 +2307,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
|||
}
|
||||
|
||||
if (!mus_playing.name.IsEmpty() &&
|
||||
mus_playing.handle != NULL &&
|
||||
stricmp (mus_playing.name, musicname) == 0 &&
|
||||
mus_playing.handle->m_Looping == looping)
|
||||
{
|
||||
|
|
|
@ -3019,6 +3019,58 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Quake)
|
|||
P_StartQuake(self, 0, intensity, duration, damrad, tremrad, sound);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// A_Weave
|
||||
//
|
||||
//===========================================================================
|
||||
|
||||
void A_Weave(AActor *self, int xyspeed, int zspeed, fixed_t xydist, fixed_t zdist)
|
||||
{
|
||||
fixed_t newX, newY;
|
||||
int weaveXY, weaveZ;
|
||||
int angle;
|
||||
fixed_t dist;
|
||||
|
||||
weaveXY = self->WeaveIndexXY & 63;
|
||||
weaveZ = self->WeaveIndexZ & 63;
|
||||
angle = (self->angle + ANG90) >> ANGLETOFINESHIFT;
|
||||
|
||||
if (xydist != 0 && xyspeed != 0)
|
||||
{
|
||||
dist = FixedMul(FloatBobOffsets[weaveXY], xydist);
|
||||
newX = self->x - FixedMul (finecosine[angle], dist);
|
||||
newY = self->y - FixedMul (finesine[angle], dist);
|
||||
weaveXY = (weaveXY + xyspeed) & 63;
|
||||
dist = FixedMul(FloatBobOffsets[weaveXY], xydist);
|
||||
newX += FixedMul (finecosine[angle], dist);
|
||||
newY += FixedMul (finesine[angle], dist);
|
||||
P_TryMove (self, newX, newY, true);
|
||||
self->WeaveIndexXY = weaveXY;
|
||||
}
|
||||
|
||||
if (zdist != 0 && zspeed != 0)
|
||||
{
|
||||
self->z -= FixedMul(FloatBobOffsets[weaveZ], zdist);
|
||||
weaveZ = (weaveZ + zspeed) & 63;
|
||||
self->z += FixedMul(FloatBobOffsets[weaveZ], zdist);
|
||||
self->WeaveIndexZ = weaveZ;
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Weave)
|
||||
{
|
||||
ACTION_PARAM_START(4);
|
||||
ACTION_PARAM_INT(xspeed, 0);
|
||||
ACTION_PARAM_INT(yspeed, 1);
|
||||
ACTION_PARAM_FIXED(xdist, 2);
|
||||
ACTION_PARAM_FIXED(ydist, 3);
|
||||
A_Weave(self, xspeed, yspeed, xdist, ydist);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// A_LineEffect
|
||||
|
|
Loading…
Reference in a new issue