mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-03-06 17:01:14 +00:00
* 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.
121 lines
2.7 KiB
C++
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;
|
|
}
|