mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 15:21:51 +00:00
Merge branch 'master' of https://github.com/rheit/zdoom
This commit is contained in:
commit
943a799aee
8 changed files with 70 additions and 32 deletions
|
@ -532,7 +532,10 @@ public:
|
||||||
void TickPSprites();
|
void TickPSprites();
|
||||||
void DestroyPSprites();
|
void DestroyPSprites();
|
||||||
DPSprite *FindPSprite(int layer);
|
DPSprite *FindPSprite(int layer);
|
||||||
DPSprite *GetPSprite(PSPLayers layer); // Used ONLY for compatibility with the old hardcoded layers.
|
// Used ONLY for compatibility with the old hardcoded layers.
|
||||||
|
// Make sure that a state is properly set after calling this unless
|
||||||
|
// you are 100% sure the context already implies the layer exists.
|
||||||
|
DPSprite *GetPSprite(PSPLayers layer);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Bookkeeping on players - state.
|
// Bookkeeping on players - state.
|
||||||
|
|
|
@ -123,9 +123,10 @@ DEFINE_ACTION_FUNCTION(AActor, A_Feathers)
|
||||||
|
|
||||||
void P_UpdateBeak (AActor *self)
|
void P_UpdateBeak (AActor *self)
|
||||||
{
|
{
|
||||||
if (self->player != nullptr)
|
DPSprite *pspr;
|
||||||
|
if (self->player != nullptr && (pspr = self->player->FindPSprite(PSP_WEAPON)) != nullptr)
|
||||||
{
|
{
|
||||||
self->player->GetPSprite(PSP_WEAPON)->y = WEAPONTOP + self->player->chickenPeck / 2;
|
pspr->y = WEAPONTOP + self->player->chickenPeck / 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -352,22 +352,12 @@ DEFINE_ACTION_FUNCTION(AActor, A_ItBurnsItBurns)
|
||||||
|
|
||||||
if (self->player != nullptr && self->player->mo == self)
|
if (self->player != nullptr && self->player->mo == self)
|
||||||
{
|
{
|
||||||
FState *firehands = self->FindState("FireHands");
|
P_SetPsprite(self->player, PSP_STRIFEHANDS, self->FindState("FireHands"));
|
||||||
if (firehands != NULL)
|
|
||||||
{
|
|
||||||
DPSprite *psp = self->player->GetPSprite(PSP_STRIFEHANDS);
|
|
||||||
if (psp != nullptr)
|
|
||||||
{
|
|
||||||
psp->SetState(firehands);
|
|
||||||
psp->Flags &= PSPF_ADDWEAPON | PSPF_ADDBOB;
|
|
||||||
psp->y = WEAPONTOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->player->ReadyWeapon = nullptr;
|
self->player->ReadyWeapon = nullptr;
|
||||||
self->player->PendingWeapon = WP_NOCHANGE;
|
self->player->PendingWeapon = WP_NOCHANGE;
|
||||||
self->player->playerstate = PST_LIVE;
|
self->player->playerstate = PST_LIVE;
|
||||||
self->player->extralight = 3;
|
self->player->extralight = 3;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -388,14 +378,22 @@ DEFINE_ACTION_FUNCTION(AActor, A_CrispyPlayer)
|
||||||
|
|
||||||
if (self->player != nullptr && self->player->mo == self)
|
if (self->player != nullptr && self->player->mo == self)
|
||||||
{
|
{
|
||||||
self->player->playerstate = PST_DEAD;
|
|
||||||
|
|
||||||
DPSprite *psp;
|
DPSprite *psp;
|
||||||
psp = self->player->GetPSprite(PSP_STRIFEHANDS);
|
psp = self->player->GetPSprite(PSP_STRIFEHANDS);
|
||||||
|
|
||||||
FState *firehandslower = self->FindState("FireHandsLower");
|
FState *firehandslower = self->FindState("FireHandsLower");
|
||||||
FState *firehands = self->FindState("FireHands");
|
FState *firehands = self->FindState("FireHands");
|
||||||
if (firehandslower != NULL && firehands != NULL && firehands < firehandslower)
|
FState *state = psp->GetState();
|
||||||
psp->SetState(psp->GetState() + (firehandslower - firehands));
|
|
||||||
|
if (state != nullptr && firehandslower != nullptr && firehands != nullptr && firehands < firehandslower)
|
||||||
|
{
|
||||||
|
self->player->playerstate = PST_DEAD;
|
||||||
|
psp->SetState(state + (firehandslower - firehands));
|
||||||
|
}
|
||||||
|
else if (state == nullptr)
|
||||||
|
{
|
||||||
|
psp->SetState(nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -407,13 +405,20 @@ DEFINE_ACTION_FUNCTION(AActor, A_HandLower)
|
||||||
if (self->player != nullptr)
|
if (self->player != nullptr)
|
||||||
{
|
{
|
||||||
DPSprite *psp = self->player->GetPSprite(PSP_STRIFEHANDS);
|
DPSprite *psp = self->player->GetPSprite(PSP_STRIFEHANDS);
|
||||||
|
|
||||||
|
if (psp->GetState() == nullptr)
|
||||||
|
{
|
||||||
|
psp->SetState(nullptr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
psp->y += 9;
|
psp->y += 9;
|
||||||
if (psp->y > WEAPONBOTTOM*2)
|
if (psp->y > WEAPONBOTTOM*2)
|
||||||
{
|
{
|
||||||
psp->SetState(nullptr);
|
psp->SetState(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->player->extralight > 0) self->player->extralight--;
|
if (self->player->extralight > 0) self->player->extralight--;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -216,15 +216,29 @@ DPSprite *player_t::GetPSprite(PSPLayers layer)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always update the caller here in case we switched weapon
|
// Always update the caller here in case we switched weapon
|
||||||
// or if the layer was being used by an inventory item before.
|
// or if the layer was being used by something else before.
|
||||||
pspr->Caller = newcaller;
|
pspr->Caller = newcaller;
|
||||||
|
|
||||||
if (newcaller != oldcaller)
|
if (newcaller != oldcaller)
|
||||||
{ // Only change the flags if this layer was created now or if we updated the caller.
|
{ // Only reset stuff if this layer was created now or if it was being used before.
|
||||||
if (layer >= PSP_TARGETCENTER)
|
if (layer >= PSP_TARGETCENTER)
|
||||||
{ // The targeter layers were affected by those.
|
{ // The targeter layers were affected by those.
|
||||||
pspr->Flags |= (PSPF_CVARFAST|PSPF_POWDOUBLE);
|
pspr->Flags = (PSPF_CVARFAST|PSPF_POWDOUBLE);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pspr->Flags = (PSPF_ADDWEAPON|PSPF_ADDBOB|PSPF_CVARFAST|PSPF_POWDOUBLE);
|
||||||
|
}
|
||||||
|
if (layer == PSP_STRIFEHANDS)
|
||||||
|
{
|
||||||
|
// Some of the old hacks rely on this layer coming from the FireHands state.
|
||||||
|
// This is the ONLY time a psprite's state is actually null.
|
||||||
|
pspr->State = nullptr;
|
||||||
|
pspr->y = WEAPONTOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
pspr->oldx = pspr->x;
|
||||||
|
pspr->oldy = pspr->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pspr;
|
return pspr;
|
||||||
|
|
|
@ -42,7 +42,7 @@ class FArchive;
|
||||||
// drawn directly on the view screen,
|
// drawn directly on the view screen,
|
||||||
// coordinates are given for a 320*200 view screen.
|
// coordinates are given for a 320*200 view screen.
|
||||||
//
|
//
|
||||||
enum PSPLayers // These are all called by the owner's ReadyWeapon.
|
enum PSPLayers
|
||||||
{
|
{
|
||||||
PSP_STRIFEHANDS = -1,
|
PSP_STRIFEHANDS = -1,
|
||||||
PSP_WEAPON = 1,
|
PSP_WEAPON = 1,
|
||||||
|
|
|
@ -329,13 +329,19 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetDistance)
|
||||||
// NON-ACTION function to get the angle in degrees (normalized to -180..180)
|
// NON-ACTION function to get the angle in degrees (normalized to -180..180)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
enum GAFlags
|
||||||
|
{
|
||||||
|
GAF_RELATIVE = 1,
|
||||||
|
GAF_SWITCH = 1 << 1,
|
||||||
|
};
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetAngle)
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetAngle)
|
||||||
{
|
{
|
||||||
if (numret > 0)
|
if (numret > 0)
|
||||||
{
|
{
|
||||||
assert(ret != NULL);
|
assert(ret != NULL);
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
PARAM_SELF_PROLOGUE(AActor);
|
||||||
PARAM_BOOL(relative);
|
PARAM_INT(flags);
|
||||||
PARAM_INT_OPT(ptr) { ptr = AAPTR_TARGET; }
|
PARAM_INT_OPT(ptr) { ptr = AAPTR_TARGET; }
|
||||||
|
|
||||||
AActor *target = COPY_AAPTR(self, ptr);
|
AActor *target = COPY_AAPTR(self, ptr);
|
||||||
|
@ -346,9 +352,10 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetAngle)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DVector3 diff = self->Vec3To(target);
|
DVector3 diff = (flags & GAF_SWITCH) ? target->Vec3To(self) : self->Vec3To(target);
|
||||||
DAngle angto = diff.Angle();
|
DAngle angto = diff.Angle();
|
||||||
if (relative) angto = deltaangle(self->Angles.Yaw, angto);
|
DAngle yaw = (flags & GAF_SWITCH) ? target->Angles.Yaw : self->Angles.Yaw;
|
||||||
|
if (flags & GAF_RELATIVE) angto = deltaangle(yaw, angto);
|
||||||
ret->SetFloat(angto.Degrees);
|
ret->SetFloat(angto.Degrees);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -5669,7 +5676,9 @@ enum RadiusGiveFlags
|
||||||
RGF_MONSTERS |
|
RGF_MONSTERS |
|
||||||
RGF_OBJECTS |
|
RGF_OBJECTS |
|
||||||
RGF_VOODOO |
|
RGF_VOODOO |
|
||||||
RGF_CORPSES | RGF_MISSILES,
|
RGF_CORPSES |
|
||||||
|
RGF_MISSILES |
|
||||||
|
RGF_ITEMS,
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool DoRadiusGive(AActor *self, AActor *thing, PClassActor *item, int amount, double distance, int flags, PClassActor *filter, FName species, double mindist)
|
static bool DoRadiusGive(AActor *self, AActor *thing, PClassActor *item, int amount, double distance, int flags, PClassActor *filter, FName species, double mindist)
|
||||||
|
|
|
@ -41,7 +41,7 @@ ACTOR Actor native //: Thinker
|
||||||
native bool IsPointerEqual(int ptr_select1, int ptr_select2);
|
native bool IsPointerEqual(int ptr_select1, int ptr_select2);
|
||||||
native int CountInv(class<Inventory> itemtype, int ptr_select = AAPTR_DEFAULT);
|
native int CountInv(class<Inventory> itemtype, int ptr_select = AAPTR_DEFAULT);
|
||||||
native float GetDistance(bool checkz, int ptr = AAPTR_DEFAULT);
|
native float GetDistance(bool checkz, int ptr = AAPTR_DEFAULT);
|
||||||
native float GetAngle(bool relative, int ptr = AAPTR_DEFAULT);
|
native float GetAngle(int flags, int ptr = AAPTR_DEFAULT);
|
||||||
native float GetZAt(float px = 0, float py = 0, float angle = 0, int flags = 0, int pick_pointer = AAPTR_DEFAULT);
|
native float GetZAt(float px = 0, float py = 0, float angle = 0, int flags = 0, int pick_pointer = AAPTR_DEFAULT);
|
||||||
native int GetSpawnHealth();
|
native int GetSpawnHealth();
|
||||||
native int GetGibHealth();
|
native int GetGibHealth();
|
||||||
|
|
|
@ -652,3 +652,9 @@ enum
|
||||||
BT_USER3 = 1<<23,
|
BT_USER3 = 1<<23,
|
||||||
BT_USER4 = 1<<24,
|
BT_USER4 = 1<<24,
|
||||||
};
|
};
|
||||||
|
// Flags for GetAngle
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
GAF_RELATIVE = 1,
|
||||||
|
GAF_SWITCH = 1 << 1,
|
||||||
|
};
|
Loading…
Reference in a new issue