mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-26 22:11:43 +00:00
- Added Warp properties RadiusOffset and Pitch.
- RadiusOffset is a multiplier of the target actor's radius added onto the offsets x and y. - Pitch is added to the warping actor's current pitch, provided WARPF_USEPITCH is supplied. - Fixed WARPF_TOFLOOR not working as intended.
This commit is contained in:
parent
125afcf3de
commit
af9478f818
6 changed files with 40 additions and 18 deletions
|
@ -5864,6 +5864,8 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
|
||||||
const char *statename = argCount > 6 ? FBehavior::StaticLookupString(args[6]) : "";
|
const char *statename = argCount > 6 ? FBehavior::StaticLookupString(args[6]) : "";
|
||||||
bool exact = argCount > 7 ? !!args[7] : false;
|
bool exact = argCount > 7 ? !!args[7] : false;
|
||||||
fixed_t heightoffset = argCount > 8 ? args[8] : 0;
|
fixed_t heightoffset = argCount > 8 ? args[8] : 0;
|
||||||
|
fixed_t radiusoffset = argCount > 9 ? args[9] : 0;
|
||||||
|
fixed_t pitch = argCount > 10 ? args[10] : 0;
|
||||||
|
|
||||||
FState *state = argCount > 6 ? activator->GetClass()->ActorInfo->FindStateByString(statename, exact) : 0;
|
FState *state = argCount > 6 ? activator->GetClass()->ActorInfo->FindStateByString(statename, exact) : 0;
|
||||||
|
|
||||||
|
@ -5881,7 +5883,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
|
||||||
if (!reference)
|
if (!reference)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (P_Thing_Warp(activator, reference, xofs, yofs, zofs, angle, flags, heightoffset))
|
if (P_Thing_Warp(activator, reference, xofs, yofs, zofs, angle, flags, heightoffset, radiusoffset, pitch))
|
||||||
{
|
{
|
||||||
if (state && argCount > 6)
|
if (state && argCount > 6)
|
||||||
{
|
{
|
||||||
|
|
|
@ -176,7 +176,7 @@ bool P_Thing_Raise(AActor *thing, AActor *raiser);
|
||||||
bool P_Thing_CanRaise(AActor *thing);
|
bool P_Thing_CanRaise(AActor *thing);
|
||||||
const PClass *P_GetSpawnableType(int spawnnum);
|
const PClass *P_GetSpawnableType(int spawnnum);
|
||||||
void InitSpawnablesFromMapinfo();
|
void InitSpawnablesFromMapinfo();
|
||||||
int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, fixed_t zofs, angle_t angle, int flags, fixed_t heightoffset);
|
int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, fixed_t zofs, angle_t angle, int flags, fixed_t heightoffset, fixed_t radiusoffset, angle_t pitch);
|
||||||
|
|
||||||
enum WARPF
|
enum WARPF
|
||||||
{
|
{
|
||||||
|
@ -198,6 +198,8 @@ enum WARPF
|
||||||
WARPF_MOVEPTR = 0x1000,
|
WARPF_MOVEPTR = 0x1000,
|
||||||
WARPF_USEPTR = 0x2000,
|
WARPF_USEPTR = 0x2000,
|
||||||
WARPF_USETID = 0x2000,
|
WARPF_USETID = 0x2000,
|
||||||
|
WARPF_COPYVELOCITY = 0x4000,
|
||||||
|
WARPF_COPYPITCH = 0x8000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -680,7 +680,7 @@ void InitSpawnablesFromMapinfo()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, fixed_t zofs, angle_t angle, int flags, fixed_t heightoffset)
|
int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs, fixed_t zofs, angle_t angle, int flags, fixed_t heightoffset, fixed_t radiusoffset, angle_t pitch)
|
||||||
{
|
{
|
||||||
if (flags & WARPF_MOVEPTR)
|
if (flags & WARPF_MOVEPTR)
|
||||||
{
|
{
|
||||||
|
@ -692,9 +692,10 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs,
|
||||||
fixed_t oldx = caller->x;
|
fixed_t oldx = caller->x;
|
||||||
fixed_t oldy = caller->y;
|
fixed_t oldy = caller->y;
|
||||||
fixed_t oldz = caller->z;
|
fixed_t oldz = caller->z;
|
||||||
|
|
||||||
zofs += FixedMul(reference->height, heightoffset);
|
zofs += FixedMul(reference->height, heightoffset);
|
||||||
|
|
||||||
|
const fixed_t rad = FixedMul(radiusoffset, reference->radius);
|
||||||
|
const angle_t fineangle = angle >> ANGLETOFINESHIFT;
|
||||||
|
|
||||||
if (!(flags & WARPF_ABSOLUTEANGLE))
|
if (!(flags & WARPF_ABSOLUTEANGLE))
|
||||||
{
|
{
|
||||||
|
@ -704,7 +705,6 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs,
|
||||||
{
|
{
|
||||||
if (!(flags & WARPF_ABSOLUTEOFFSET))
|
if (!(flags & WARPF_ABSOLUTEOFFSET))
|
||||||
{
|
{
|
||||||
angle_t fineangle = angle >> ANGLETOFINESHIFT;
|
|
||||||
fixed_t xofs1 = xofs;
|
fixed_t xofs1 = xofs;
|
||||||
|
|
||||||
// (borrowed from A_SpawnItemEx, assumed workable)
|
// (borrowed from A_SpawnItemEx, assumed workable)
|
||||||
|
@ -722,15 +722,16 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs,
|
||||||
// assigning position again with.
|
// assigning position again with.
|
||||||
// extra unlink, link and environment calculation
|
// extra unlink, link and environment calculation
|
||||||
caller->SetOrigin(
|
caller->SetOrigin(
|
||||||
reference->x + xofs,
|
reference->x + xofs + FixedMul(rad, finecosine[fineangle]),
|
||||||
reference->y + yofs,
|
reference->y + yofs + FixedMul(rad, finesine[fineangle]),
|
||||||
reference->floorz + zofs);
|
reference->z);
|
||||||
|
caller->z = caller->floorz + zofs;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
caller->SetOrigin(
|
caller->SetOrigin(
|
||||||
reference->x + xofs,
|
reference->x + xofs + FixedMul(rad, finecosine[fineangle]),
|
||||||
reference->y + yofs,
|
reference->y + yofs + FixedMul(rad, finesine[fineangle]),
|
||||||
reference->z + zofs);
|
reference->z + zofs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -738,11 +739,12 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs,
|
||||||
{
|
{
|
||||||
if (flags & WARPF_TOFLOOR)
|
if (flags & WARPF_TOFLOOR)
|
||||||
{
|
{
|
||||||
caller->SetOrigin(xofs, yofs, caller->floorz + zofs);
|
caller->SetOrigin(xofs + FixedMul(rad, finecosine[fineangle]), yofs + FixedMul(rad, finesine[fineangle]), zofs);
|
||||||
|
caller->z = caller->floorz + zofs;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
caller->SetOrigin(xofs, yofs, zofs);
|
caller->SetOrigin(xofs + FixedMul(rad, finecosine[fineangle]), yofs + FixedMul(rad, finesine[fineangle]), zofs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -756,6 +758,18 @@ int P_Thing_Warp(AActor *caller, AActor *reference, fixed_t xofs, fixed_t yofs,
|
||||||
{
|
{
|
||||||
caller->angle = angle;
|
caller->angle = angle;
|
||||||
|
|
||||||
|
if (flags & WARPF_COPYPITCH)
|
||||||
|
caller->SetPitch(reference->pitch, false);
|
||||||
|
|
||||||
|
if (pitch)
|
||||||
|
caller->SetPitch(caller->pitch + pitch, false);
|
||||||
|
|
||||||
|
if (flags & WARPF_COPYVELOCITY)
|
||||||
|
{
|
||||||
|
caller->velx = reference->velx;
|
||||||
|
caller->vely = reference->vely;
|
||||||
|
caller->velz = reference->velz;
|
||||||
|
}
|
||||||
if (flags & WARPF_STOP)
|
if (flags & WARPF_STOP)
|
||||||
{
|
{
|
||||||
caller->velx = 0;
|
caller->velx = 0;
|
||||||
|
|
|
@ -4673,7 +4673,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_WolfAttack)
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Warp)
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Warp)
|
||||||
{
|
{
|
||||||
ACTION_PARAM_START(8);
|
ACTION_PARAM_START(10);
|
||||||
|
|
||||||
ACTION_PARAM_INT(destination_selector, 0);
|
ACTION_PARAM_INT(destination_selector, 0);
|
||||||
ACTION_PARAM_FIXED(xofs, 1);
|
ACTION_PARAM_FIXED(xofs, 1);
|
||||||
|
@ -4682,7 +4682,9 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Warp)
|
||||||
ACTION_PARAM_ANGLE(angle, 4);
|
ACTION_PARAM_ANGLE(angle, 4);
|
||||||
ACTION_PARAM_INT(flags, 5);
|
ACTION_PARAM_INT(flags, 5);
|
||||||
ACTION_PARAM_STATE(success_state, 6);
|
ACTION_PARAM_STATE(success_state, 6);
|
||||||
ACTION_PARAM_FIXED(heightoffset,7)
|
ACTION_PARAM_FIXED(heightoffset, 7);
|
||||||
|
ACTION_PARAM_FIXED(radiusoffset, 8);
|
||||||
|
ACTION_PARAM_ANGLE(pitch, 9);
|
||||||
|
|
||||||
AActor *reference;
|
AActor *reference;
|
||||||
|
|
||||||
|
@ -4702,7 +4704,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Warp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (P_Thing_Warp(self, reference, xofs, yofs, zofs, angle, flags, heightoffset))
|
if (P_Thing_Warp(self, reference, xofs, yofs, zofs, angle, flags, heightoffset, radiusoffset, pitch))
|
||||||
{
|
{
|
||||||
if (success_state)
|
if (success_state)
|
||||||
{
|
{
|
||||||
|
|
|
@ -249,7 +249,7 @@ ACTOR Actor native //: Thinker
|
||||||
action native A_PlayerSkinCheck(state label);
|
action native A_PlayerSkinCheck(state label);
|
||||||
action native A_BasicAttack(int meleedamage, sound meleesound, class<actor> missiletype, float missileheight);
|
action native A_BasicAttack(int meleedamage, sound meleesound, class<actor> missiletype, float missileheight);
|
||||||
action native A_Teleport(state teleportstate = "", class<SpecialSpot> targettype = "BossSpot", class<Actor> fogtype = "TeleportFog", int flags = 0, float mindist = 0, float maxdist = 0, int ptr = AAPTR_DEFAULT);
|
action native A_Teleport(state teleportstate = "", class<SpecialSpot> targettype = "BossSpot", class<Actor> fogtype = "TeleportFog", int flags = 0, float mindist = 0, float maxdist = 0, int ptr = AAPTR_DEFAULT);
|
||||||
action native A_Warp(int ptr_destination, float xofs = 0, float yofs = 0, float zofs = 0, float angle = 0, int flags = 0, state success_state = "", float heightoffset = 0);
|
action native A_Warp(int ptr_destination, float xofs = 0, float yofs = 0, float zofs = 0, float angle = 0, int flags = 0, state success_state = "", float heightoffset = 0, float radiusoffset = 0, float pitch = 0);
|
||||||
action native A_ThrowGrenade(class<Actor> itemtype, float zheight = 0, float xyvel = 0, float zvel = 0, bool useammo = true);
|
action native A_ThrowGrenade(class<Actor> itemtype, float zheight = 0, float xyvel = 0, float zvel = 0, bool useammo = true);
|
||||||
action native A_Weave(int xspeed, int yspeed, float xdist, float ydist);
|
action native A_Weave(int xspeed, int yspeed, float xdist, float ydist);
|
||||||
|
|
||||||
|
|
|
@ -362,6 +362,8 @@ Const Int WARPF_ABSOLUTEPOSITION = 0x400;
|
||||||
Const Int WARPF_BOB = 0x800;
|
Const Int WARPF_BOB = 0x800;
|
||||||
Const Int WARPF_MOVEPTR = 0x1000;
|
Const Int WARPF_MOVEPTR = 0x1000;
|
||||||
Const Int WARPF_USETID = 0x2000;
|
Const Int WARPF_USETID = 0x2000;
|
||||||
|
Const Int WARPF_COPYVELOCITY = 0x4000;
|
||||||
|
Const Int WARPF_COPYPITCH = 0x8000;
|
||||||
|
|
||||||
// flags for A_SetPitch/SetAngle/SetRoll
|
// flags for A_SetPitch/SetAngle/SetRoll
|
||||||
const int SPF_FORCECLAMP = 1;
|
const int SPF_FORCECLAMP = 1;
|
||||||
|
|
Loading…
Reference in a new issue