Fri Jan 14, 2022 12:10 am
// Grenade weapon
class KZ_GrenadeWeapon : DoomWeapon
{
Default
{
Weapon.AmmoUse 1;
Weapon.AmmoGive 3;
Weapon.AmmoType "KZ_GrenadeAmmo";
Weapon.SelectionOrder 0xffffffff;
Weapon.MinSelectionAmmo1 21;
+Weapon.NOALERT;
Tag "$TAG_KZ_GRENADEWEAPON";
Weapon.SlotNumber 8;
}
States
{
Ready:
TNT1 A 0 A_JumpIfInventory("KZ_GrenadeAmmo", 1, "ReadyLoop");
TNT1 A 0 A_SelectWeapon("", SWF_SELECTPRIORITY);
ReadyLoop:
TNT1 A 0 A_JumpIfInventory("KZ_DoQuickThrow", 1, "Fire");
GRTH Z 1 A_WeaponReady;
Loop;
AltReady:
TNT1 A 0 A_JumpIfInventory("KZ_DoQuickThrow", 1, "ThrowDo");
GRTH Y 1 A_WeaponReady(WRF_NOSECONDARY);
Loop;
Deselect:
TNT1 A 0 {if (invoker.isPinRemoved) return ResolveState("ThrowDo"); return ResolveState(null);}
GRTH Z 1 A_Lower(12);
Loop;
Select:
GRTH Z 1 A_Raise(12);
Loop;
Fire:
TNT1 A 0 {invoker.ExtraForce = 0;}
TNT1 A 0 {if (invoker.isPinRemoved) return ResolveState("UnpinnedThrow"); return ResolveState("PinnedThrow");}
UnpinnedThrow:
GRHO B 2; // to prevent immediately starting to hold and thus keep the possibility to use the lowest throw force
TNT1 A 0 A_JumpIfInventory("KZ_DoQuickThrow", 1, "ThrowDo"); // skip holding and pin removal animation if using a quick throw
UnpinnedHold:
GRHO B 1 IncreaseForce();
TNT1 A 1 A_ReFire("UnpinnedHold");
Goto ThrowDo;
PinnedThrow:
GRTH AB 1;
GRTH CD 2;
TNT1 A 0 A_JumpIfInventory("KZ_DoQuickThrow", 1, "PullPin"); // skip holding if using a quick throw
Hold:
GRTH E 1 IncreaseForce();
TNT1 A 1 A_ReFire("Hold");
PullPin:
GRTH EE 2;
TNT1 A 0 A_StartSound("Grenade_Pin");
GRTH FG 2;
Goto ThrowDo;
ThrowDo:
TNT1 A 0 A_StartSound("Grenade_Toss");
GRTH HI 1;
TNT1 A 0 ThrowGrenade();
GRTH JKLM 1;
TNT1 A 0 A_TakeInventory("KZ_DoQuickThrow", 1);
TNT1 A 1 A_ReFire("Fire");
Goto Ready;
// alt fire
AltFire:
GRTH EE 2;
TNT1 A 0 A_StartSound("Grenade_Pin");
GRTH FG 2;
TNT1 A 0 RemovePin();
Goto AltReady;
}
// weapon variables
int ExtraForce;
bool isPinRemoved;
int CurGrenadeTimer;
int MaxGrenadeTimer;
// weapon functions
override void PostBeginPlay()
{
super.PostBeginPlay();
MaxGrenadeTimer = 105;
CurGrenadeTimer = MaxGrenadeTimer;
}
override void DoEffect()
{
super.DoEffect();
if (!owner) Destroy();
if (isPinRemoved == false) return;
// otherwise
CurGrenadeTimer--;
if (CurGrenadeTimer <= 0)
{
let proj = Spawn("KZ_GrenadeThrown", (owner.pos.x, owner.pos.y, owner.pos.z + 32) );
if (proj)
{
proj.Speed = 0;
proj.Vel3DFromAngle(0, owner.angle, owner.pitch);
proj.ReactionTime = 0;
proj.target = owner;
}
owner.TakeInventory("KZ_GrenadeAmmo", 1);
isPinRemoved = false;
CurGrenadeTimer = MaxGrenadeTimer;
owner.Player.SetPSprite(PSP_WEAPON, FindState("Ready") );
}
}
action void IncreaseForce()
{
invoker.ExtraForce++;
if (invoker.ExtraForce > 40)
{
invoker.ExtraForce = 40;
Console.Printf("Max throw force");
}
}
action void ThrowGrenade()
{
let proj = A_FireProjectile("KZ_GrenadeThrown", useammo: true);
if (proj)
{
if (FindInventory("KZ_DoQuickThrow") == null)
{
proj.Speed = 3 + invoker.ExtraForce;
proj.Vel3DFromAngle(proj.Speed, angle, pitch);
}
if (invoker.CurGrenadeTimer != invoker.MaxGrenadeTimer)
{
proj.ReactionTime = invoker.CurGrenadeTimer;
}
invoker.isPinRemoved = false;
invoker.CurGrenadeTimer = invoker.MaxGrenadeTimer;
}
}
action void RemovePin()
{
invoker.isPinRemoved = true;
invoker.CurGrenadeTimer = invoker.MaxGrenadeTimer;
}
}
Fri Jan 14, 2022 7:04 am
Weapon.AmmoUse2 1
Weapon.AmmoType2 "KZ_GrenadeAmmo";
Fri Jan 14, 2022 8:01 am