mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2025-02-03 11:50:57 +00:00
60966f472f
- This reverts commit 06216d733e
.
- I don't know what I was thinking. Since stateowner is always available
to the wrapper function, and this code is only generated for the wrapper
function, it's a nonissue. The state is already located before calling
any function that uses it.
121 lines
2.8 KiB
C++
121 lines
2.8 KiB
C++
/*
|
|
#include "actor.h"
|
|
#include "m_random.h"
|
|
#include "p_local.h"
|
|
#include "c_console.h"
|
|
#include "p_enemy.h"
|
|
#include "a_action.h"
|
|
#include "gstrings.h"
|
|
#include "thingdef/thingdef.h"
|
|
#include "thingdef/thingdef.h"
|
|
#include "doomstat.h"
|
|
*/
|
|
|
|
static FRandom pr_bang4cloud ("Bang4Cloud");
|
|
static FRandom pr_lightout ("LightOut");
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_Bang4Cloud)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
double xo = (pr_bang4cloud.Random2() & 3) * (10. / 64);
|
|
double yo = (pr_bang4cloud.Random2() & 3) * (10. / 64);
|
|
Spawn("Bang4Cloud", self->Vec3Offset(xo, yo, 0.), ALLOW_REPLACE);
|
|
return 0;
|
|
}
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GiveQuestItem)
|
|
{
|
|
PARAM_SELF_PROLOGUE(AActor);
|
|
PARAM_INT(questitem);
|
|
|
|
// Give one of these quest items to every player in the game
|
|
if (questitem >= 0 && questitem < (int)countof(QuestItemClasses))
|
|
{
|
|
for (int i = 0; i < MAXPLAYERS; ++i)
|
|
{
|
|
if (playeringame[i])
|
|
{
|
|
AInventory *item = static_cast<AInventory *>(Spawn (QuestItemClasses[questitem - 1]));
|
|
if (!item->CallTryPickup (players[i].mo))
|
|
{
|
|
item->Destroy ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
char messageid[64];
|
|
|
|
mysnprintf(messageid, countof(messageid), "TXT_QUEST_%d", questitem);
|
|
const char * name = GStrings[messageid];
|
|
|
|
if (name != NULL)
|
|
{
|
|
C_MidPrint (SmallFont, name);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// PowerCrystal -------------------------------------------------------------------
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_ExtraLightOff)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
if (self->target != NULL && self->target->player != NULL)
|
|
{
|
|
self->target->player->extralight = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_Explode512)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
P_RadiusAttack (self, self->target, 512, 512, NAME_None, RADF_HURTSOURCE);
|
|
if (self->target != NULL && self->target->player != NULL)
|
|
{
|
|
self->target->player->extralight = 5;
|
|
}
|
|
P_CheckSplash(self, 512);
|
|
|
|
// Strife didn't do this next part, but it looks good
|
|
self->RenderStyle = STYLE_Add;
|
|
return 0;
|
|
}
|
|
|
|
DEFINE_ACTION_FUNCTION(AActor, A_LightGoesOut)
|
|
{
|
|
PARAM_ACTION_PROLOGUE;
|
|
|
|
AActor *foo;
|
|
sector_t *sec = self->Sector;
|
|
vertex_t *spot;
|
|
double newheight;
|
|
|
|
sec->SetLightLevel(0);
|
|
|
|
double oldtheight = sec->floorplane.fD();
|
|
newheight = sec->FindLowestFloorSurrounding(&spot);
|
|
sec->floorplane.setD(sec->floorplane.PointToDist (spot, newheight));
|
|
double newtheight = sec->floorplane.fD();
|
|
sec->ChangePlaneTexZ(sector_t::floor, newtheight - oldtheight);
|
|
sec->CheckPortalPlane(sector_t::floor);
|
|
|
|
for (int i = 0; i < 8; ++i)
|
|
{
|
|
foo = Spawn("Rubble1", self->Pos(), ALLOW_REPLACE);
|
|
if (foo != NULL)
|
|
{
|
|
int t = pr_lightout() & 15;
|
|
foo->Vel.X = t - (pr_lightout() & 7);
|
|
foo->Vel.Y = pr_lightout.Random2() & 7;
|
|
foo->Vel.Z = 7 + (pr_lightout() & 3);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|