mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-01 21:00:57 +00:00
103 lines
2.4 KiB
C++
103 lines
2.4 KiB
C++
#include "ns.h"
|
|
#include "wh.h"
|
|
|
|
BEGIN_WH_NS
|
|
|
|
|
|
static void stand(PLAYER& plr, short i) {
|
|
SPRITE& spr = sprite[i];
|
|
|
|
if (bcos(spr.ang) * (plr.x - spr.x) + bsin(spr.ang) * (plr.y - spr.y) >= 0) {
|
|
if (cansee(spr.x, spr.y, spr.z - (tileHeight(spr.picnum) << 7), spr.sectnum, plr.x, plr.y,
|
|
plr.z, plr.sector) && plr.invisibletime < 0) {
|
|
if (plr.shadowtime > 0) {
|
|
spr.ang = (short)(((krand() & 512 - 256) + spr.ang + 1024) & 2047);
|
|
newstatus(i, FLEE);
|
|
}
|
|
else
|
|
newstatus(i, CHASE);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void nuked(PLAYER& plr, short i) {
|
|
SPRITE& spr = sprite[i];
|
|
chunksofmeat(plr, i, spr.x, spr.y, spr.z, spr.sectnum, spr.ang);
|
|
trailingsmoke(i, false);
|
|
newstatus(i, DIE);
|
|
}
|
|
|
|
static void kurtExplo(PLAYER& plr, short i) {
|
|
SPRITE& spr = sprite[i];
|
|
spr.lotag -= TICSPERFRAME;
|
|
spr.picnum++;
|
|
if (spr.lotag < 0)
|
|
spr.lotag = 12;
|
|
|
|
short j = headspritesect[spr.sectnum];
|
|
while (j != -1) {
|
|
short nextj = nextspritesect[j];
|
|
int dx = abs(spr.x - sprite[j].x); // x distance to sprite
|
|
int dy = abs(spr.y - sprite[j].y); // y distance to sprite
|
|
int dz = abs((spr.z >> 8) - (sprite[j].z >> 8)); // z distance to sprite
|
|
int dh = tileHeight(sprite[j].picnum) >> 1; // height of sprite
|
|
if (dx + dy < PICKDISTANCE && dz - dh <= getPickHeight()) {
|
|
if (sprite[j].detail == KURTTYPE) {
|
|
sprite[j].hitag -= TICSPERFRAME << 4;
|
|
if (sprite[j].hitag < 0) {
|
|
newstatus(j, DIE);
|
|
}
|
|
}
|
|
}
|
|
j = nextj;
|
|
}
|
|
}
|
|
|
|
void createKurtAI() {
|
|
auto& e = enemy[KURTTYPE];
|
|
e.info.Init(35, 35, 1024 + 256, 120, 0, 48, false, 50, 0);
|
|
e.info.getAttackDist = [](EnemyInfo& e, SPRITE& spr) {
|
|
int out = e.attackdist;
|
|
switch (spr.picnum) {
|
|
case KURTAT:
|
|
case GONZOCSW:
|
|
case GONZOCSWAT:
|
|
if (spr.extra > 10)
|
|
out = 2048 << 1;
|
|
break;
|
|
}
|
|
|
|
return out;
|
|
};
|
|
e.stand = stand;
|
|
e.nuked = nuked;
|
|
e.chase = enemy[GONZOTYPE].chase;
|
|
e.resurect = enemy[GONZOTYPE].resurect;
|
|
e.skirmish = enemy[GONZOTYPE].skirmish;
|
|
e.search = enemy[GONZOTYPE].search;
|
|
e.frozen = enemy[GONZOTYPE].frozen;
|
|
e.pain = enemy[GONZOTYPE].pain;
|
|
e.face = enemy[GONZOTYPE].face;
|
|
e.attack = enemy[GONZOTYPE].attack;
|
|
e.cast = enemy[GONZOTYPE].cast;
|
|
e.flee = enemy[GONZOTYPE].flee;
|
|
e.die = enemy[GONZOTYPE].die;
|
|
}
|
|
|
|
void premapKurt(short i) {
|
|
SPRITE& spr = sprite[i];
|
|
spr.detail = KURTTYPE;
|
|
enemy[KURTTYPE].info.set(spr);
|
|
changespritestat(i, STAND);
|
|
|
|
switch (spr.picnum) {
|
|
case KURTSTAND:
|
|
spr.extra = 20;
|
|
break;
|
|
case KURTKNEE:
|
|
spr.extra = 10;
|
|
break;
|
|
}
|
|
}
|
|
|
|
END_WH_NS
|