- scriptified the Inquisitor.

This commit is contained in:
Christoph Oelckers 2016-11-28 18:49:25 +01:00
parent b8cf377d9e
commit bf1c2a7e51
4 changed files with 104 additions and 148 deletions

View file

@ -861,8 +861,6 @@ set( NOT_COMPILED_SOURCE_FILES
sc_man_scanner.re
g_hexen/a_heresiarch.cpp
g_hexen/a_spike.cpp
g_strife/a_crusader.cpp
g_strife/a_inquisitor.cpp
g_strife/a_loremaster.cpp
g_strife/a_oracle.cpp
g_strife/a_programmer.cpp

View file

@ -1,136 +0,0 @@
/*
#include "actor.h"
#include "m_random.h"
#include "a_action.h"
#include "p_local.h"
#include "p_enemy.h"
#include "s_sound.h"
#include "vm.h"
*/
static FRandom pr_inq ("Inquisitor");
DEFINE_ACTION_FUNCTION(AActor, A_InquisitorWalk)
{
PARAM_SELF_PROLOGUE(AActor);
S_Sound (self, CHAN_BODY, "inquisitor/walk", 1, ATTN_NORM);
A_Chase (stack, self);
return 0;
}
bool InquisitorCheckDistance (AActor *self)
{
if (self->reactiontime == 0 && P_CheckSight (self, self->target))
{
return self->Distance2D (self->target) < 264.;
}
return false;
}
DEFINE_ACTION_FUNCTION(AActor, A_InquisitorDecide)
{
PARAM_SELF_PROLOGUE(AActor);
if (self->target == NULL)
return 0;
A_FaceTarget (self);
if (!InquisitorCheckDistance (self))
{
self->SetState (self->FindState("Grenade"));
}
if (self->target->Z() != self->Z())
{
if (self->Top() + 54 < self->ceilingz)
{
self->SetState (self->FindState("Jump"));
}
}
return 0;
}
DEFINE_ACTION_FUNCTION(AActor, A_InquisitorAttack)
{
PARAM_SELF_PROLOGUE(AActor);
AActor *proj;
if (self->target == NULL)
return 0;
A_FaceTarget (self);
self->AddZ(32);
self->Angles.Yaw -= 45./32;
proj = P_SpawnMissileZAimed (self, self->Z(), self->target, PClass::FindActor("InquisitorShot"));
if (proj != NULL)
{
proj->Vel.Z += 9;
}
self->Angles.Yaw += 45./16;
proj = P_SpawnMissileZAimed (self, self->Z(), self->target, PClass::FindActor("InquisitorShot"));
if (proj != NULL)
{
proj->Vel.Z += 16;
}
self->AddZ(-32);
return 0;
}
DEFINE_ACTION_FUNCTION(AActor, A_InquisitorJump)
{
PARAM_SELF_PROLOGUE(AActor);
double dist;
double speed;
if (self->target == NULL)
return 0;
S_Sound (self, CHAN_ITEM|CHAN_LOOP, "inquisitor/jump", 1, ATTN_NORM);
self->AddZ(64);
A_FaceTarget (self);
speed = self->Speed * (2./3);
self->VelFromAngle(speed);
dist = self->DistanceBySpeed(self->target, speed);
self->Vel.Z = (self->target->Z() - self->Z()) / dist;
self->reactiontime = 60;
self->flags |= MF_NOGRAVITY;
return 0;
}
DEFINE_ACTION_FUNCTION(AActor, A_InquisitorCheckLand)
{
PARAM_SELF_PROLOGUE(AActor);
self->reactiontime--;
if (self->reactiontime < 0 ||
self->Vel.X == 0 ||
self->Vel.Y == 0 ||
self->Z() <= self->floorz)
{
self->SetState (self->SeeState);
self->reactiontime = 0;
self->flags &= ~MF_NOGRAVITY;
S_StopSound (self, CHAN_ITEM);
return 0;
}
if (!S_IsActorPlayingSomething (self, CHAN_ITEM, -1))
{
S_Sound (self, CHAN_ITEM|CHAN_LOOP, "inquisitor/jump", 1, ATTN_NORM);
}
return 0;
}
DEFINE_ACTION_FUNCTION(AActor, A_TossArm)
{
PARAM_SELF_PROLOGUE(AActor);
AActor *foo = Spawn("InquisitorArm", self->PosPlusZ(24.), ALLOW_REPLACE);
foo->Angles.Yaw = self->Angles.Yaw - 90. + pr_inq.Random2() * (360./1024.);
foo->VelFromAngle(foo->Speed / 8);
foo->Vel.Z = pr_inq() / 64.;
return 0;
}

View file

@ -24,9 +24,7 @@
#include "vm.h"
// Include all the other Strife stuff here to reduce compile time
#include "a_inquisitor.cpp"
#include "a_loremaster.cpp"
//#include "a_macil.cpp"
#include "a_oracle.cpp"
#include "a_programmer.cpp"
#include "a_rebels.cpp"

View file

@ -25,13 +25,6 @@ class Inquisitor : Actor
Obituary "$OB_INQUISITOR";
}
native void A_InquisitorWalk ();
native void A_InquisitorDecide ();
native void A_InquisitorAttack ();
native void A_InquisitorJump ();
native void A_InquisitorCheckLand ();
native void A_TossArm ();
States
{
Spawn:
@ -81,6 +74,109 @@ class Inquisitor : Actor
RBB3 E -1;
Stop;
}
// Inquisitor ---------------------------------------------------------------
void A_InquisitorWalk ()
{
A_PlaySound ("inquisitor/walk", CHAN_BODY);
A_Chase ();
}
private bool InquisitorCheckDistance ()
{
if (reactiontime == 0 && CheckSight (target))
{
return Distance2D (target) < 264.;
}
return false;
}
void A_InquisitorDecide ()
{
if (target == null)
return;
A_FaceTarget ();
if (!InquisitorCheckDistance ())
{
SetStateLabel("Grenade");
}
if (target.pos.z != pos.z)
{
if (pos.z + height + 54 < ceilingz)
{
SetStateLabel("Jump");
}
}
}
void A_InquisitorAttack ()
{
if (target == null)
return;
A_FaceTarget ();
AddZ(32);
angle -= 45./32;
Actor proj = SpawnMissileZAimed (pos.z, target, "InquisitorShot");
if (proj != null)
{
proj.Vel.Z += 9;
}
angle += 45./16;
proj = SpawnMissileZAimed (pos.z, target, "InquisitorShot");
if (proj != null)
{
proj.Vel.Z += 16;
}
AddZ(-32);
}
void A_InquisitorJump ()
{
if (target == null)
return;
A_PlaySound ("inquisitor/jump", CHAN_ITEM, 1, true);
AddZ(64);
A_FaceTarget ();
speed = Speed * (2./3);
VelFromAngle(speed);
double dist = DistanceBySpeed(target, speed);
Vel.Z = (target.pos.z - pos.z) / dist;
reactiontime = 60;
bNoGravity = true;
}
void A_InquisitorCheckLand ()
{
reactiontime--;
if (reactiontime < 0 ||
Vel.X == 0 ||
Vel.Y == 0 ||
pos.z <= floorz)
{
SetState (SeeState);
reactiontime = 0;
bNoGravity = false;
A_StopSound (CHAN_ITEM);
return;
}
A_PlaySound ("inquisitor/jump", CHAN_ITEM, 1, true);
}
void A_TossArm ()
{
Actor foo = Spawn("InquisitorArm", Pos + (0,0,24), ALLOW_REPLACE);
foo.angle = angle - 90. + Random2[Inquisitor]() * (360./1024.);
foo.VelFromAngle(foo.Speed / 8);
foo.Vel.Z = random[Inquisitor]() / 64.;
}
}
// Inquisitor Shot ----------------------------------------------------------
@ -109,7 +205,7 @@ class InquisitorShot : Actor
UBAM AB 3 A_Countdown;
Loop;
Death:
BNG2 A 0 Bright A_SetTranslucent(1,1);
BNG2 A 0 Bright A_SetRenderStyle(1, STYLE_Normal);
BNG2 A 4 Bright A_Explode(192, 192, 1, 1);
BNG2 B 4 Bright;
BNG2 C 4 Bright;