This one chases normally when out of LOS for the sake of simplicity though.
Code: Select all
actor stormtrooper: zombieman replaces zombieman
{
Health 100
Radius 20
Height 56
Speed 5
painchance 255
var int user_walkframe;
var int User_make_aimshot;
var int user_make_rageshot;
var int user_chargemultiplier;
var float User_TargetDist;
var float user_maxrange;
var float user_enraged;
states
{
Spawn:
POSS AB 10 A_Look
TNT1 A 0 A_setuservar("user_walkframe",0)
TNT1 A 0 A_setuservar("user_make_aimshot",0)
TNT1 A 0 A_setuservar("user_chargemultiplier",1)
//TNT1 A 0 A_setuservar("user_enraged",0)
Loop
See:
TNT1 A 0 A_setuservar("user_make_aimshot",0)
TNT1 A 0 A_SetuserVar("user_walkframe",0)
TNT1 A 0 A_JumpIf(user_enraged!=0,"SeeRed")
TNT1 A 0 A_Chase("AimedShot", "AimedShot", CHF_DONTTURN|CHF_NODIRECTIONTURN|CHF_DONTMOVE)
POSS ABCDEFGHIJKLMNOPPQ 1
{
A_SetuserVar("user_TargetDist",getdistance(1,AAPTR_TARGET));
A_SetuserVar("user_walkframe",user_walkframe+1);
if(A_JumpIfTargetInLos("null",0))//"null" here is irrellevant since you can't jump out of an if statement anyway
{
A_FaceTarget(10.0); //turns smoothly
A_SetUserVar("User_TargetDist",getdistance(1,AAPTR_TARGET));
if (User_TargetDist > 250.0)
{
A_setuservar("user_make_aimshot",1);
}
if(frandom(0.0,2.0)>1.9)
{
A_custommissile("stormshot",80.0,0,frandom(-10.0,10.0),CMF_OFFSETPITCH,frandom(-10.0,10.0));
A_PlaySound("weapons/blaster1", CHAN_WEAPON);
}
if (User_TargetDist <= 250.0)
{
A_setuservar("user_chargemultiplier",-1);
}
if(User_TargetDist > 500.0 || user_chargemultiplier==-1)
{
A_ChangeVelocity(Cos(angle) * (speed*user_chargemultiplier), Sin(angle) * (speed*user_chargemultiplier), velz, CVF_REPLACE);//moves towards player
}
}
else
{
A_chase("",""); //moves like a normal doom monster when player not in LOS
}
}
TNT1 A 0 A_JumpIf(user_make_aimshot !=0,"AimedSHot")
Loop
AimedShot:
TNT1 A 0 A_JumpIf(abs(GetAngle(1))>20.0,"see")
TNT1 A 0 A_FaceTarget(20.0,20.0)
TNT1 A 0 A_setuservar("user_chargemultiplier",1)
POSS A 1 A_settics(random(10,30))
POSS A 0 A_PlaySound("weapons/blaster1", CHAN_WEAPON)
POSS A 0 A_custommissile("StormShot2",80.0,0,frandom(-2.0,2.0),CMF_AIMDIRECTION |CMF_OFFSETPITCH,frandom(-2.0,2.0))
TNT1 A 0 A_Jumpif(GetDistance(1,AAPTR_TARGET)<250.0,"see")
loop
SeeRed:
TNT1 A 0 A_SetuserVar("user_walkframe",0)
TNT1 A 0 A_setuservar("user_make_rageshot",0)
TNT1 A 0 A_Chase("RageShot", "RageShot", CHF_DONTTURN|CHF_NODIRECTIONTURN|CHF_DONTMOVE)
TNT1 A 0 A_PrintBold("Waaagh!")
POSS ABCDEFGHIJKLMNOPPQ 1 Light("blasterimpact")
{
A_SetuserVar("user_TargetDist",getdistance(1,AAPTR_TARGET));
A_SetuserVar("user_walkframe",user_walkframe+1);
if(A_JumpIfTargetInLos("null",0))//"null" here is irrellevant since you can't jump out of an if statement anyway
{
A_FaceTarget(12.0); //turns smoothly
A_SetUserVar("User_TargetDist",getdistance(1,AAPTR_TARGET));
if (User_TargetDist < 500.0)
{
A_setuservar("user_make_rageshot",1);
}
if(frandom(0.0,2.0)>1.9)
{
A_custommissile("stormshot",80.0,0,frandom(-10.0,10.0),CMF_OFFSETPITCH,frandom(-10.0,10.0));
A_PlaySound("weapons/blaster1", CHAN_WEAPON);
}
if(User_TargetDist > 250.0 || user_chargemultiplier==-1)
{
A_ChangeVelocity(Cos(angle) * (speed*user_chargemultiplier), Sin(angle) * (speed*user_chargemultiplier), velz, CVF_REPLACE);//moves towards player
}
}
else
{
A_chase("",""); //moves like a normal doom monster when player not in LOS
}
}
TNT1 A 0 A_JumpIf(user_make_rageshot !=0,"rageSHot")
Loop
RageShot:
TNT1 A 0 A_JumpIf(abs(GetAngle(1))>20.0,"SeeRed")
TNT1 A 0 A_FaceTarget(20.0,20.0)
TNT1 A 0 A_setuservar("user_chargemultiplier",1)
POSS A 1 Light("blasterimpact") A_settics(random(3,10))
POSS A 0 A_PlaySound("weapons/blaster1", CHAN_WEAPON)
POSS A 0 A_custommissile("StormShot3",80.0,0,frandom(-8.0,8.0),CMF_AIMDIRECTION |CMF_OFFSETPITCH,frandom(-8.0,8.0))
TNT1 A 0 A_Jumpif(GetDistance(1,AAPTR_TARGET)>500.0,"SeeRed")
loop
Pain:
TNT1 A 0 A_SetUserVar(user_enraged,1)
TNT1 A 0 A_ChangeFlag("nopain", 1)
goto see
death:
TNT1 A 0
stop
xdeath:
TNT1 A 0
stop
}
}
It's inefficient, crude, experimental etc but has some fun concepts. The monster stands still and shoots accurately when at a high range rather than charge in and put itself in harms way, when you get close it backpedals away from you while firing, and it can get pissed off and go into berserker mode where it's fearless and charges you while spraying wildly.