gzdoom-gles/src/g_strife/a_thingstoblowup.cpp
Christoph Oelckers b1a83bfd26 - started with cleanup and separation of DECORATE code.
* everything related to scripting is now placed in a subdirectory 'scripting', which itself is separated into DECORATE, ZSCRIPT, the VM and code generation.
 * a few items have been moved to different headers so that the DECORATE parser definitions can mostly be kept local. The only exception at the moment is the flags interface on which 3 source files depend.
2016-10-12 19:22:33 +02:00

121 lines
2.7 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 "vm.h"
#include "vm.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;
}