mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-20 10:32:27 +00:00
- moved all of RR's weapon code to the subfolder.
This commit is contained in:
parent
d1b44d1900
commit
294cf05792
6 changed files with 276 additions and 268 deletions
|
@ -184,12 +184,14 @@ version "4.10"
|
|||
#include "zscript/games/duke/actors/redneckcstuff/rrcactus.zs"
|
||||
#include "zscript/games/duke/actors/redneckcstuff/rrteleport.zs"
|
||||
|
||||
|
||||
#include "zscript/games/duke/actors/redneckweapons/crossbow.zs"
|
||||
#include "zscript/games/duke/actors/redneckweapons/boatcannon.zs"
|
||||
|
||||
#include "zscript/games/duke/actors/redneckenemies/vixen.zs"
|
||||
|
||||
#include "zscript/games/duke/actors/redneckweapons/boatcannon.zs"
|
||||
#include "zscript/games/duke/actors/redneckweapons/crossbow.zs"
|
||||
#include "zscript/games/duke/actors/redneckweapons/ripsaw.zs"
|
||||
#include "zscript/games/duke/actors/redneckweapons/shitball.zs"
|
||||
#include "zscript/games/duke/actors/redneckweapons/vixenatk.zs"
|
||||
|
||||
#include "zscript/games/duke/world/dukebreak.zs"
|
||||
#include "zscript/games/duke/world/redneckbreak.zs"
|
||||
|
||||
|
|
|
@ -171,164 +171,3 @@ class DukeFireball : DukeProjectile // WorldTour only
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// this class is called shitball - but it's not just about throwing shit in the game,
|
||||
// the entire logic with 4 different looks depending on the shooter is also shit...
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class RedneckShitBall : DukeSpit
|
||||
{
|
||||
default
|
||||
{
|
||||
spriteset "SHITBALL", "SHITBALL2", "SHITBALL3", "SHITBALL4",
|
||||
"FROGBALL1", "FROGBALL2", "FROGBALL3", "FROGBALL4", "FROGBALL5", "FROGBALL6",
|
||||
"SHITBURN", "SHITBURN2", "SHITBURN3", "SHITBURN4",
|
||||
"RABBITBALL";
|
||||
+NOFLOORPAL;
|
||||
}
|
||||
|
||||
private void rabbitguts()
|
||||
{
|
||||
self.spawnguts('RedneckRabbitJibA', 2);
|
||||
self.spawnguts('RedneckRabbitJibB', 2);
|
||||
self.spawnguts('RedneckRabbitJibC', 2);
|
||||
|
||||
}
|
||||
override bool weaponhitplayer(DukeActor targ)
|
||||
{
|
||||
if (ownerActor && ownerActor.bSPAWNRABBITGUTS)
|
||||
rabbitguts();
|
||||
|
||||
return Super.weaponhitplayer(targ);
|
||||
}
|
||||
|
||||
override bool weaponhitwall(walltype wal)
|
||||
{
|
||||
self.SetPosition(oldpos);
|
||||
if (ownerActor && ownerActor.bSPAWNRABBITGUTS)
|
||||
rabbitguts();
|
||||
|
||||
return super.weaponhitwall(wal);
|
||||
}
|
||||
|
||||
override bool weaponhitsector()
|
||||
{
|
||||
self.setPosition(oldpos);
|
||||
if (ownerActor && ownerActor.bSPAWNRABBITGUTS)
|
||||
rabbitguts();
|
||||
|
||||
return super.weaponhitsector();
|
||||
}
|
||||
|
||||
override bool animate(tspritetype tspr)
|
||||
{
|
||||
int sprite = ((PlayClock >> 4) & 3);
|
||||
if (self.ownerActor)
|
||||
{
|
||||
let OwnerAc = self.ownerActor;
|
||||
if (OwnerAc.bTRANSFERPALTOJIBS)
|
||||
{
|
||||
if (OwnerAc.pal == 8)
|
||||
{
|
||||
sprite = 4 + ((PlayClock >> 4) % 6);
|
||||
}
|
||||
else if (OwnerAc.pal == 19)
|
||||
{
|
||||
sprite = 10 + ((PlayClock >> 4) & 3);
|
||||
tspr.shade = -127;
|
||||
}
|
||||
}
|
||||
else if (OwnerAc.bSPAWNRABBITGUTS)
|
||||
{
|
||||
tspr.clipdist |= TSPR_ROTATE8FRAMES;
|
||||
sprite = 14;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const
|
||||
{
|
||||
if (actor.bSPAWNRABBITGUTS)
|
||||
{
|
||||
shootprojectile1(actor, p, pos, ang, 37.5, -20);
|
||||
}
|
||||
else
|
||||
{
|
||||
shootprojectile1(actor, p, pos, ang, 25, -10);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class RedneckSawBlade : DukeProjectile
|
||||
{
|
||||
default
|
||||
{
|
||||
spriteset "SAWBLADE", "SAWBLADE2", "SAWBLADE3", "SAWBLADE4", "SAWBLADE5", "SAWBLADE6", "SAWBLADE7", "SAWBLADE8",
|
||||
"CHEERBLADE", "CHEERBLADE2", "CHEERBLADE3", "CHEERBLADE4";
|
||||
}
|
||||
|
||||
override bool weaponhitwall(walltype wal)
|
||||
{
|
||||
if (Raze.tileflags(wal.walltexture) & Duke.TFLAG_NOCIRCLEREFLECT)
|
||||
{
|
||||
self.Destroy();
|
||||
return true;
|
||||
}
|
||||
if (self.extra <= 0)
|
||||
{
|
||||
self.pos += self.angle.ToVector() * 8;
|
||||
let Owner = self.ownerActor;
|
||||
if (!Owner || !(Owner.bALTPROJECTILESPRITE)) // depends on the shooter. Urgh...
|
||||
{
|
||||
let j = self.spawn("RedneckCircleStuck");
|
||||
if (j)
|
||||
{
|
||||
j.scale = (0.125, 0.125);
|
||||
j.cstat = CSTAT_SPRITE_ALIGNMENT_WALL;
|
||||
j.angle += 90;
|
||||
j.clipdist = self.scale.X * self.spriteWidth() * 0.125;
|
||||
}
|
||||
}
|
||||
self.Destroy();
|
||||
return true;
|
||||
}
|
||||
if (!dlevel.isMirror(wal))
|
||||
{
|
||||
self.extra -= 20;
|
||||
self.yint--;
|
||||
}
|
||||
|
||||
let k = wal.delta().Angle();
|
||||
self.angle = k * 2 - self.angle;
|
||||
return true;
|
||||
}
|
||||
|
||||
override bool animate(tspritetype tspr)
|
||||
{
|
||||
int frame;
|
||||
if (!OwnerActor || !(OwnerActor.bALTPROJECTILESPRITE)) frame = ((PlayClock >> 4) & 7);
|
||||
else frame = 8 + ((PlayClock >> 4) & 3);
|
||||
tspr.SetSpritePic(self, frame);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class RedneckCircleStuck : DukeActor
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "CIRCLESTUCK";
|
||||
}
|
||||
}
|
|
@ -31,106 +31,3 @@ class RedneckVixen : DukeActor
|
|||
}
|
||||
|
||||
|
||||
class RedneckUWhip : DukeProjectile
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "UWHIP";
|
||||
+FULLBRIGHT;
|
||||
+INFLAME;
|
||||
}
|
||||
|
||||
void shootwhip(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const
|
||||
{
|
||||
let sect = actor.sector;
|
||||
double zvel;
|
||||
double vel = 300 / 16;
|
||||
|
||||
if (actor.extra >= 0) actor.shade = -96;
|
||||
|
||||
if (p != null)
|
||||
{
|
||||
let aimed = actor.aim(self);
|
||||
|
||||
if (aimed)
|
||||
{
|
||||
double dal = ((aimed.scale.X * aimed.spriteHeight()) * 0.5);
|
||||
double dist = (p.actor.pos.XY - aimed.pos.XY).Length();
|
||||
zvel = ((aimed.pos.Z - pos.Z - dal) * vel) / dist;
|
||||
ang = (aimed.pos.XY - pos.XY).Angle();
|
||||
}
|
||||
else
|
||||
[vel, zvel] = Raze.setFreeAimVelocity(vel, zvel, p.getPitchWithView(), 49.);
|
||||
}
|
||||
else
|
||||
{
|
||||
let j = actor.findplayer();
|
||||
if (actor.projectilespread < 0)
|
||||
ang += frandom(self.projectilespread, 0);
|
||||
else
|
||||
ang += frandom(-self.projectilespread / 2, self.projectilespread / 2);
|
||||
|
||||
double dist = (j.actor.pos.XY - actor.pos.XY).Length();
|
||||
zvel = ((j.actor.opos.Z + j.actor.oviewzoffset - pos.Z + 3) * vel) / dist;
|
||||
}
|
||||
|
||||
double oldzvel = zvel;
|
||||
double scale = p? 0.109375 : 0.125;
|
||||
|
||||
let spawned = dlevel.SpawnActor(sect, pos, self.GetClass(), -127, (scale,scale), ang, vel, zvel, actor, STAT_PROJECTILE);
|
||||
if (!spawned) return;
|
||||
spawned.extra += random(0, 7);
|
||||
spawned.cstat = CSTAT_SPRITE_YCENTER;
|
||||
spawned.clipdist = 1;
|
||||
|
||||
ang = actor.Angle + frandom(-22.5 / 4, 22.5 / 4);
|
||||
zvel = oldzvel + frandom(-2, 2);
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang)
|
||||
{
|
||||
pos.Z += 4;
|
||||
shootwhip(actor, p, pos, ang);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class RedneckOWhip : RedneckUWhip
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "OWHIP";
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang)
|
||||
{
|
||||
pos.Z -= 15;
|
||||
shootwhip(actor, p, pos, ang);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class RedneckVixenShot : DukeActor
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "VIXENSHOT";
|
||||
+INFLAME;
|
||||
+FULLBRIGHT;
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const
|
||||
{
|
||||
pos.Z -= 4;
|
||||
shootprojectile1(actor, p, pos, ang, 52.5, 0, 0.125);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class RedneckSawBlade : DukeProjectile
|
||||
{
|
||||
default
|
||||
{
|
||||
spriteset "SAWBLADE", "SAWBLADE2", "SAWBLADE3", "SAWBLADE4", "SAWBLADE5", "SAWBLADE6", "SAWBLADE7", "SAWBLADE8",
|
||||
"CHEERBLADE", "CHEERBLADE2", "CHEERBLADE3", "CHEERBLADE4";
|
||||
Strength THROWSAW_WEAPON_STRENGTH;
|
||||
}
|
||||
|
||||
override bool weaponhitwall(walltype wal)
|
||||
{
|
||||
if (Raze.tileflags(wal.walltexture) & Duke.TFLAG_NOCIRCLEREFLECT)
|
||||
{
|
||||
self.Destroy();
|
||||
return true;
|
||||
}
|
||||
if (self.extra <= 0)
|
||||
{
|
||||
self.pos += self.angle.ToVector() * 8;
|
||||
let Owner = self.ownerActor;
|
||||
if (!Owner || !(Owner.bALTPROJECTILESPRITE)) // depends on the shooter. Urgh...
|
||||
{
|
||||
let j = self.spawn("RedneckCircleStuck");
|
||||
if (j)
|
||||
{
|
||||
j.scale = (0.125, 0.125);
|
||||
j.cstat = CSTAT_SPRITE_ALIGNMENT_WALL;
|
||||
j.angle += 90;
|
||||
j.clipdist = self.scale.X * self.spriteWidth() * 0.125;
|
||||
}
|
||||
}
|
||||
self.Destroy();
|
||||
return true;
|
||||
}
|
||||
if (!dlevel.isMirror(wal))
|
||||
{
|
||||
self.extra -= 20;
|
||||
self.yint--;
|
||||
}
|
||||
|
||||
let k = wal.delta().Angle();
|
||||
self.angle = k * 2 - self.angle;
|
||||
return true;
|
||||
}
|
||||
|
||||
override bool animate(tspritetype tspr)
|
||||
{
|
||||
int frame;
|
||||
if (!OwnerActor || !(OwnerActor.bALTPROJECTILESPRITE)) frame = ((PlayClock >> 4) & 7);
|
||||
else frame = 8 + ((PlayClock >> 4) & 3);
|
||||
tspr.SetSpritePic(self, frame);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class RedneckCircleStuck : DukeActor
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "CIRCLESTUCK";
|
||||
Strength 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// this class is called shitball - but it's not just about throwing shit in the game,
|
||||
// the entire logic with 4 different looks depending on the shooter is also shit...
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class RedneckShitBall : DukeSpit
|
||||
{
|
||||
default
|
||||
{
|
||||
spriteset "SHITBALL", "SHITBALL2", "SHITBALL3", "SHITBALL4",
|
||||
"FROGBALL1", "FROGBALL2", "FROGBALL3", "FROGBALL4", "FROGBALL5", "FROGBALL6",
|
||||
"SHITBURN", "SHITBURN2", "SHITBURN3", "SHITBURN4",
|
||||
"RABBITBALL";
|
||||
+NOFLOORPAL;
|
||||
Strength SHITBALL_WEAPON_STRENGTH;
|
||||
}
|
||||
|
||||
private void rabbitguts()
|
||||
{
|
||||
self.spawnguts('RedneckRabbitJibA', 2);
|
||||
self.spawnguts('RedneckRabbitJibB', 2);
|
||||
self.spawnguts('RedneckRabbitJibC', 2);
|
||||
|
||||
}
|
||||
override bool weaponhitplayer(DukeActor targ)
|
||||
{
|
||||
if (ownerActor && ownerActor.bSPAWNRABBITGUTS)
|
||||
rabbitguts();
|
||||
|
||||
return Super.weaponhitplayer(targ);
|
||||
}
|
||||
|
||||
override bool weaponhitwall(walltype wal)
|
||||
{
|
||||
self.SetPosition(oldpos);
|
||||
if (ownerActor && ownerActor.bSPAWNRABBITGUTS)
|
||||
rabbitguts();
|
||||
|
||||
return super.weaponhitwall(wal);
|
||||
}
|
||||
|
||||
override bool weaponhitsector()
|
||||
{
|
||||
self.setPosition(oldpos);
|
||||
if (ownerActor && ownerActor.bSPAWNRABBITGUTS)
|
||||
rabbitguts();
|
||||
|
||||
return super.weaponhitsector();
|
||||
}
|
||||
|
||||
override bool animate(tspritetype tspr)
|
||||
{
|
||||
int sprite = ((PlayClock >> 4) & 3);
|
||||
if (self.ownerActor)
|
||||
{
|
||||
let OwnerAc = self.ownerActor;
|
||||
if (OwnerAc.bTRANSFERPALTOJIBS)
|
||||
{
|
||||
if (OwnerAc.pal == 8)
|
||||
{
|
||||
sprite = 4 + ((PlayClock >> 4) % 6);
|
||||
}
|
||||
else if (OwnerAc.pal == 19)
|
||||
{
|
||||
sprite = 10 + ((PlayClock >> 4) & 3);
|
||||
tspr.shade = -127;
|
||||
}
|
||||
}
|
||||
else if (OwnerAc.bSPAWNRABBITGUTS)
|
||||
{
|
||||
tspr.clipdist |= TSPR_ROTATE8FRAMES;
|
||||
sprite = 14;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const
|
||||
{
|
||||
if (actor.bSPAWNRABBITGUTS)
|
||||
{
|
||||
shootprojectile1(actor, p, pos, ang, 37.5, -20);
|
||||
}
|
||||
else
|
||||
{
|
||||
shootprojectile1(actor, p, pos, ang, 25, -10);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
class RedneckUWhip : DukeProjectile
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "UWHIP";
|
||||
+FULLBRIGHT;
|
||||
+INFLAME;
|
||||
Strength ALIENGISMO_WEAPON_STRENGTH;
|
||||
}
|
||||
|
||||
void shootwhip(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const
|
||||
{
|
||||
let sect = actor.sector;
|
||||
double zvel;
|
||||
double vel = 300 / 16;
|
||||
|
||||
if (actor.extra >= 0) actor.shade = -96;
|
||||
|
||||
if (p != null)
|
||||
{
|
||||
let aimed = actor.aim(self);
|
||||
|
||||
if (aimed)
|
||||
{
|
||||
double dal = ((aimed.scale.X * aimed.spriteHeight()) * 0.5);
|
||||
double dist = (p.actor.pos.XY - aimed.pos.XY).Length();
|
||||
zvel = ((aimed.pos.Z - pos.Z - dal) * vel) / dist;
|
||||
ang = (aimed.pos.XY - pos.XY).Angle();
|
||||
}
|
||||
else
|
||||
[vel, zvel] = Raze.setFreeAimVelocity(vel, zvel, p.getPitchWithView(), 49.);
|
||||
}
|
||||
else
|
||||
{
|
||||
let j = actor.findplayer();
|
||||
if (actor.projectilespread < 0)
|
||||
ang += frandom(self.projectilespread, 0);
|
||||
else
|
||||
ang += frandom(-self.projectilespread / 2, self.projectilespread / 2);
|
||||
|
||||
double dist = (j.actor.pos.XY - actor.pos.XY).Length();
|
||||
zvel = ((j.actor.opos.Z + j.actor.oviewzoffset - pos.Z + 3) * vel) / dist;
|
||||
}
|
||||
|
||||
double oldzvel = zvel;
|
||||
double scale = p? 0.109375 : 0.125;
|
||||
|
||||
let spawned = dlevel.SpawnActor(sect, pos, self.GetClass(), -127, (scale,scale), ang, vel, zvel, actor, STAT_PROJECTILE);
|
||||
if (!spawned) return;
|
||||
spawned.extra += random(0, 7);
|
||||
spawned.cstat = CSTAT_SPRITE_YCENTER;
|
||||
spawned.clipdist = 1;
|
||||
|
||||
ang = actor.Angle + frandom(-22.5 / 4, 22.5 / 4);
|
||||
zvel = oldzvel + frandom(-2, 2);
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang)
|
||||
{
|
||||
pos.Z += 4;
|
||||
shootwhip(actor, p, pos, ang);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class RedneckOWhip : RedneckUWhip
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "OWHIP";
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang)
|
||||
{
|
||||
pos.Z -= 15;
|
||||
shootwhip(actor, p, pos, ang);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class RedneckVixenShot : DukeActor
|
||||
{
|
||||
default
|
||||
{
|
||||
pic "VIXENSHOT";
|
||||
+INFLAME;
|
||||
+FULLBRIGHT;
|
||||
Strength PLASMATHROWER_WEAPON_STRENGTH;
|
||||
}
|
||||
|
||||
override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const
|
||||
{
|
||||
pos.Z -= 4;
|
||||
shootprojectile1(actor, p, pos, ang, 52.5, 0, 0.125);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in a new issue