mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-10 23:02:03 +00:00
- shootfireball, shootflamethrowerflame, shootknee
This commit is contained in:
parent
6ee856b8c1
commit
8268c1b538
2 changed files with 55 additions and 53 deletions
|
@ -355,6 +355,7 @@ int aim(spritetype* s, int aang)
|
||||||
DukeStatIterator it(aimstats[k]);
|
DukeStatIterator it(aimstats[k]);
|
||||||
while (auto act = it.Next())
|
while (auto act = it.Next())
|
||||||
{
|
{
|
||||||
|
i = act->GetIndex();
|
||||||
auto sp = &act->s;
|
auto sp = &act->s;
|
||||||
if (sp->xrepeat > 0 && sp->extra >= 0 && (sp->cstat & (257 + 32768)) == 257)
|
if (sp->xrepeat > 0 && sp->extra >= 0 && (sp->cstat & (257 + 32768)) == 257)
|
||||||
if (badguy(sp) || k < 2)
|
if (badguy(sp) || k < 2)
|
||||||
|
|
|
@ -87,16 +87,16 @@ void incur_damage_d(struct player_struct* p)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
static void shootfireball(int i, int p, int sx, int sy, int sz, int sa)
|
static void shootfireball(DDukeActor *actor, int p, int sx, int sy, int sz, int sa)
|
||||||
{
|
{
|
||||||
spritetype* const s = &sprite[i];
|
auto s = &actor->s;
|
||||||
int vel, zvel;
|
int vel, zvel;
|
||||||
|
|
||||||
if (s->extra >= 0)
|
if (s->extra >= 0)
|
||||||
s->shade = -96;
|
s->shade = -96;
|
||||||
|
|
||||||
sz -= (4 << 7);
|
sz -= (4 << 7);
|
||||||
if (sprite[i].picnum != BOSS5)
|
if (s->picnum != BOSS5)
|
||||||
vel = 840;
|
vel = 840;
|
||||||
else {
|
else {
|
||||||
vel = 968;
|
vel = 968;
|
||||||
|
@ -108,7 +108,7 @@ static void shootfireball(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
sa += 16 - (krand() & 31);
|
sa += 16 - (krand() & 31);
|
||||||
int scratch;
|
int scratch;
|
||||||
int j = findplayer(s, &scratch);
|
int j = findplayer(s, &scratch);
|
||||||
zvel = (((ps[j].oposz - sz + (3 << 8))) * vel) / ldist(&sprite[ps[j].i], s);
|
zvel = (((ps[j].oposz - sz + (3 << 8))) * vel) / ldist(ps[j].GetActor(), actor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -126,10 +126,10 @@ static void shootfireball(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
sizy = 7;
|
sizy = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
int j = EGS(s->sectnum, sx, sy, sz, FIREBALL, -127, sizx, sizy, sa, vel, zvel, i, (short)4);
|
auto spawned = EGS(s->sectnum, sx, sy, sz, FIREBALL, -127, sizx, sizy, sa, vel, zvel, actor, (short)4);
|
||||||
auto spr = &sprite[j];
|
auto spr = &spawned->s;
|
||||||
spr->extra += (krand() & 7);
|
spr->extra += (krand() & 7);
|
||||||
if (sprite[i].picnum == BOSS5 || p >= 0)
|
if (s->picnum == BOSS5 || p >= 0)
|
||||||
{
|
{
|
||||||
spr->xrepeat = 40;
|
spr->xrepeat = 40;
|
||||||
spr->yrepeat = 40;
|
spr->yrepeat = 40;
|
||||||
|
@ -145,58 +145,57 @@ static void shootfireball(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
static void shootflamethrowerflame(int i, int p, int sx, int sy, int sz, int sa)
|
static void shootflamethrowerflame(DDukeActor* actor, int p, int sx, int sy, int sz, int sa)
|
||||||
{
|
{
|
||||||
spritetype* const s = &sprite[i];
|
auto s = &actor->s;
|
||||||
int vel, zvel;
|
int vel, zvel;
|
||||||
|
|
||||||
if (s->extra >= 0)
|
if (s->extra >= 0)
|
||||||
s->shade = -96;
|
s->shade = -96;
|
||||||
vel = 400;
|
vel = 400;
|
||||||
|
|
||||||
int k = -1;
|
DDukeActor* spawned = nullptr;
|
||||||
if (p < 0)
|
if (p < 0)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
int j = findplayer(s, &x);
|
int j = findplayer(actor, &x);
|
||||||
sa = getangle(ps[j].oposx - sx, ps[j].oposy - sy);
|
sa = getangle(ps[j].oposx - sx, ps[j].oposy - sy);
|
||||||
|
|
||||||
if (sprite[i].picnum == BOSS5)
|
if (s->picnum == BOSS5)
|
||||||
{
|
{
|
||||||
vel = 528;
|
vel = 528;
|
||||||
sz += 6144;
|
sz += 6144;
|
||||||
}
|
}
|
||||||
else if (sprite[i].picnum == BOSS3)
|
else if (s->picnum == BOSS3)
|
||||||
sz -= 8192;
|
sz -= 8192;
|
||||||
|
|
||||||
int l = ldist(&sprite[ps[j].i], s);
|
int l = ldist(ps[j].GetActor(), actor);
|
||||||
if (l != 0)
|
if (l != 0)
|
||||||
zvel = ((ps[j].oposz - sz) * vel) / l;
|
zvel = ((ps[j].oposz - sz) * vel) / l;
|
||||||
|
|
||||||
if (badguy(s) && (s->hitag & face_player_smart) != 0)
|
if (badguy(actor) && (s->hitag & face_player_smart) != 0)
|
||||||
sa = (short)(s->ang + (krand() & 31) - 16);
|
sa = (short)(s->ang + (krand() & 31) - 16);
|
||||||
|
|
||||||
if (sector[s->sectnum].lotag == 2 && (krand() % 5) == 0)
|
if (sector[s->sectnum].lotag == 2 && (krand() % 5) == 0)
|
||||||
k = fi.spawn(i, WATERBUBBLE);
|
spawned = spawn(actor, WATERBUBBLE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
zvel = -mulscale16(ps[p].horizon.sum().asq16(), 81);
|
zvel = -mulscale16(ps[p].horizon.sum().asq16(), 81);
|
||||||
if (sprite[ps[p].i].xvel != 0)
|
if (ps[p].GetActor()->s.xvel != 0)
|
||||||
vel = (int)((((512 - (1024
|
vel = (int)((((512 - (1024
|
||||||
- abs(abs(getangle(sx - ps[p].oposx, sy - ps[p].oposy) - sa) - 1024)))
|
- abs(abs(getangle(sx - ps[p].oposx, sy - ps[p].oposy) - sa) - 1024)))
|
||||||
* 0.001953125f) * sprite[ps[p].i].xvel) + 400);
|
* 0.001953125f) * ps[p].GetActor()->s.xvel) + 400);
|
||||||
if (sector[s->sectnum].lotag == 2 && (krand() % 5) == 0)
|
if (sector[s->sectnum].lotag == 2 && (krand() % 5) == 0)
|
||||||
k = fi.spawn(i, WATERBUBBLE);
|
spawned = spawn(actor, WATERBUBBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (k == -1)
|
if (spawned == nullptr)
|
||||||
{
|
{
|
||||||
k = fi.spawn(i, FLAMETHROWERFLAME);
|
spawned = spawn(actor, FLAMETHROWERFLAME);
|
||||||
sprite[k].xvel = (short)vel;
|
spawned->s.xvel = (short)vel;
|
||||||
sprite[k].zvel = (short)zvel;
|
spawned->s.zvel = (short)zvel;
|
||||||
}
|
}
|
||||||
auto spawned = &hittype[k];
|
|
||||||
|
|
||||||
spawned->s.x = sx + sintable[(sa + 630) & 0x7FF] / 448;
|
spawned->s.x = sx + sintable[(sa + 630) & 0x7FF] / 448;
|
||||||
spawned->s.y = sy + sintable[(sa + 112) & 0x7FF] / 448;
|
spawned->s.y = sy + sintable[(sa + 112) & 0x7FF] / 448;
|
||||||
|
@ -208,11 +207,11 @@ static void shootflamethrowerflame(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
spawned->s.yrepeat = 2;
|
spawned->s.yrepeat = 2;
|
||||||
spawned->s.clipdist = 40;
|
spawned->s.clipdist = 40;
|
||||||
spawned->s.yvel = p;
|
spawned->s.yvel = p;
|
||||||
spawned->s.owner = (short)i;
|
spawned->SetOwner(actor);
|
||||||
|
|
||||||
if (p == -1)
|
if (p == -1)
|
||||||
{
|
{
|
||||||
if (sprite[i].picnum == BOSS5)
|
if (s->picnum == BOSS5)
|
||||||
{
|
{
|
||||||
spawned->s.x -= sintable[sa & 2047] / 56;
|
spawned->s.x -= sintable[sa & 2047] / 56;
|
||||||
spawned->s.y -= sintable[(sa + 1024 + 512) & 2047] / 56;
|
spawned->s.y -= sintable[(sa + 1024 + 512) & 2047] / 56;
|
||||||
|
@ -228,12 +227,12 @@ static void shootflamethrowerflame(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
static void shootknee(int i, int p, int sx, int sy, int sz, int sa)
|
static void shootknee(DDukeActor* actor, int p, int sx, int sy, int sz, int sa)
|
||||||
{
|
{
|
||||||
spritetype* const s = &sprite[i];
|
auto s = &actor->s;
|
||||||
int sect = s->sectnum;
|
int sect = s->sectnum;
|
||||||
int zvel;
|
int zvel;
|
||||||
short hitsect, hitspr, hitwall, j, k;
|
short hitsect, hitspr, hitwall;
|
||||||
int hitx, hity, hitz;
|
int hitx, hity, hitz;
|
||||||
|
|
||||||
if (p >= 0)
|
if (p >= 0)
|
||||||
|
@ -245,9 +244,9 @@ static void shootknee(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
j = ps[findplayer(s, &x)].i;
|
auto pactor = ps[findplayer(s, &x)].GetActor();
|
||||||
zvel = ((sprite[j].z - sz) << 8) / (x + 1);
|
zvel = ((pactor->s.z - sz) << 8) / (x + 1);
|
||||||
sa = getangle(sprite[j].x - sx, sprite[j].y - sy);
|
sa = getangle(pactor->s.x - sx, pactor->s.y - sy);
|
||||||
}
|
}
|
||||||
|
|
||||||
hitscan(sx, sy, sz, sect,
|
hitscan(sx, sy, sz, sect,
|
||||||
|
@ -262,21 +261,21 @@ static void shootknee(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
{
|
{
|
||||||
if (hitwall >= 0 || hitspr >= 0)
|
if (hitwall >= 0 || hitspr >= 0)
|
||||||
{
|
{
|
||||||
j = EGS(hitsect, hitx, hity, hitz, KNEE, -15, 0, 0, sa, 32, 0, i, 4);
|
auto knee = EGS(hitsect, hitx, hity, hitz, KNEE, -15, 0, 0, sa, 32, 0, actor, 4);
|
||||||
sprite[j].extra += (krand() & 7);
|
knee->s.extra += (krand() & 7);
|
||||||
if (p >= 0)
|
if (p >= 0)
|
||||||
{
|
{
|
||||||
k = fi.spawn(j, SMALLSMOKE);
|
auto k = spawn(knee, SMALLSMOKE);
|
||||||
sprite[k].z -= (8 << 8);
|
k->s.z -= (8 << 8);
|
||||||
S_PlayActorSound(KICK_HIT, j);
|
S_PlayActorSound(KICK_HIT, knee);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p >= 0 && ps[p].steroids_amount > 0 && ps[p].steroids_amount < 400)
|
if (p >= 0 && ps[p].steroids_amount > 0 && ps[p].steroids_amount < 400)
|
||||||
sprite[j].extra += (max_player_health >> 2);
|
knee->s.extra += (max_player_health >> 2);
|
||||||
|
|
||||||
if (hitspr >= 0 && sprite[hitspr].picnum != ACCESSSWITCH && sprite[hitspr].picnum != ACCESSSWITCH2)
|
if (hitspr >= 0 && sprite[hitspr].picnum != ACCESSSWITCH && sprite[hitspr].picnum != ACCESSSWITCH2)
|
||||||
{
|
{
|
||||||
fi.checkhitsprite(hitspr, j);
|
fi.checkhitsprite(hitspr, knee->GetIndex());
|
||||||
if (p >= 0) fi.checkhitswitch(p, hitspr, 1);
|
if (p >= 0) fi.checkhitswitch(p, hitspr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +288,7 @@ static void shootknee(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
|
|
||||||
if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2)
|
if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2)
|
||||||
{
|
{
|
||||||
fi.checkhitwall(j, hitwall, hitx, hity, hitz, KNEE);
|
fi.checkhitwall(knee->GetIndex(), hitwall, hitx, hity, hitz, KNEE);
|
||||||
if (p >= 0) fi.checkhitswitch(p, hitwall, 0);
|
if (p >= 0) fi.checkhitswitch(p, hitwall, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,7 +300,7 @@ static void shootknee(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
splash->s.y = hity;
|
splash->s.y = hity;
|
||||||
splash->s.ang = ps[p].angle.ang.asbuild(); // Total tweek
|
splash->s.ang = ps[p].angle.ang.asbuild(); // Total tweek
|
||||||
splash->s.xvel = 32;
|
splash->s.xvel = 32;
|
||||||
ssp(i, CLIPMASK0);
|
ssp(actor, CLIPMASK0);
|
||||||
splash->s.xvel = 0;
|
splash->s.xvel = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -998,7 +997,7 @@ static void shootgrowspark(int i, int p, int sx, int sy, int sz, int sa)
|
||||||
|
|
||||||
void shoot_d(int i, int atwith)
|
void shoot_d(int i, int atwith)
|
||||||
{
|
{
|
||||||
short sect, l, j, k;
|
short sect, l, j;
|
||||||
int sx, sy, sz, sa, p, vel, zvel, x, dal;
|
int sx, sy, sz, sa, p, vel, zvel, x, dal;
|
||||||
auto actor = &hittype[i];
|
auto actor = &hittype[i];
|
||||||
spritetype* const s = &actor->s;
|
spritetype* const s = &actor->s;
|
||||||
|
@ -1056,24 +1055,26 @@ void shoot_d(int i, int atwith)
|
||||||
switch (atwith)
|
switch (atwith)
|
||||||
{
|
{
|
||||||
case FIREBALL:
|
case FIREBALL:
|
||||||
shootfireball(i, p, sx, sy, sz, sa);
|
shootfireball(actor, p, sx, sy, sz, sa);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case FLAMETHROWERFLAME:
|
case FLAMETHROWERFLAME:
|
||||||
shootflamethrowerflame(i, p, sx, sy, sz, sa);
|
shootflamethrowerflame(actor, p, sx, sy, sz, sa);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case FIREFLY: // BOSS5 shot
|
case FIREFLY: // BOSS5 shot
|
||||||
k = fi.spawn(i, atwith);
|
{
|
||||||
sprite[k].sectnum = sect;
|
auto k = spawn(actor, atwith);
|
||||||
sprite[k].x = sx;
|
k->s.sectnum = sect;
|
||||||
sprite[k].y = sy;
|
k->s.x = sx;
|
||||||
sprite[k].z = sz;
|
k->s.y = sy;
|
||||||
sprite[k].ang = sa;
|
k->s.z = sz;
|
||||||
sprite[k].xvel = 500;
|
k->s.ang = sa;
|
||||||
sprite[k].zvel = 0;
|
k->s.xvel = 500;
|
||||||
|
k->s.zvel = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (atwith)
|
switch (atwith)
|
||||||
|
@ -1086,7 +1087,7 @@ void shoot_d(int i, int atwith)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KNEE:
|
case KNEE:
|
||||||
shootknee(i, p, sx, sy, sz, sa);
|
shootknee(actor, p, sx, sy, sz, sa);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHOTSPARK1:
|
case SHOTSPARK1:
|
||||||
|
|
Loading…
Reference in a new issue