// -------------------------------------------------------------------------- // // ARGENT: Chainsaw // // -------------------------------------------------------------------------- class ArgChainsaw : ArgWeapon replaces Chainsaw { int rev; // for sound control Default { Weapon.Kickback 0; Weapon.SelectionOrder 8; Inventory.Icon "graphics/hud/weapon-chainsaw.png"; Inventory.PickupMessage "$ARG_GOT_CHAINSAW"; Obituary "$ARG_OB_CHAINSAW"; Tag "$ARG_TAG_CHAINSAW"; DamageType "ArgChainsaw"; +WEAPON.MELEEWEAPON } States { Spawn: CSAW A -1; Stop; Ready: SAWG AABB 1 A_WeaponReady(WRF_ALLOWRELOAD); Loop; Select: SAWG A 0 A_Raise; SAWG A 1 A_Raise; SAWG A 0 Arg_A_SawIdle(); Goto SelectLoop; Deselect: SAWG A 0 Arg_A_SawOff(); Goto DeselectLoop; Fire: SAWF A 0 Arg_A_SawUp(); SAWF A 1 Arg_A_WeaponOffset( 0.0, 8); SAWF B 1 Arg_A_WeaponOffset(-1.0, 16); SAWF C 1 Arg_A_WeaponOffset(-2.0, 24); SAWF D 1 Arg_A_WeaponOffset(-3.0, 32); SAWF E 1 Arg_A_WeaponOffset(-4.0, 40); SAWG D 1 Arg_A_WeaponOffset(-5.0, 48); SAWG D 1 Arg_A_WeaponOffset(-4.0, 40); SAWG C 1 Arg_A_WeaponOffset(-3.0, 32); SAWG C 1 Arg_A_WeaponOffset(-2.0, 24); SAWG D 1 Arg_A_WeaponOffset(-1.0, 16); SAWG D 1 Arg_A_WeaponOffset( 0.0, 8); Hold: SAWG C 0 Arg_A_SawFull(false); SAWG CC 1 Arg_A_WeaponOffset(0, 0, 1.0); SAWG D 0 Arg_A_SawFull(true); SAWG DD 1 Arg_A_WeaponOffset(0, 0, 2.0); SAWG D 0 Arg_A_SawLoop(); Down: SAWG A 0 Arg_A_SawDown(); SAWG C 1 Arg_A_WeaponOffset( 0.0, 8); SAWG C 1 Arg_A_WeaponOffset(-1.0, 16); SAWG D 1 Arg_A_WeaponOffset(-2.0, 24); SAWG D 1 Arg_A_WeaponOffset(-3.0, 32); SAWG C 1 Arg_A_WeaponOffset(-4.0, 40); SAWG C 1 Arg_A_WeaponOffset(-5.0, 48); SAWF E 1 Arg_A_WeaponOffset( 0.0, 16); SAWF D 1 Arg_A_WeaponOffset( 0.0, 8); SAWF C 1 Arg_A_WeaponOffset( 0.0, 0); SAWF BA 1; SAWG AABBAABBAABBAABBAABBAABBAABBAABBAABB 1 A_WeaponReady(WRF_ALLOWRELOAD); SAWG A 0 Arg_A_SawIdle(); Goto Ready; } /* * Saw functions. Nice n' decomposed. */ action void Arg_A_SawIdle() { A_PlaySound("weapons/chainsaw/idle", CHAN_5, 1.0, 1); } action void Arg_A_SawUp() { A_PlaySound("weapons/chainsaw/up", CHAN_5); invoker.rev = 0; } action void Arg_A_SawFull(bool pullin) { if(pullin) { A_Saw("", "effects/gibs", 0, "ArgChainsawPuff", SF_NOPULLIN | SF_NOTURN); } else { A_Saw("", "effects/gibs", 0, "ArgChainsawPuff"); A_AlertMonsters(); // hooray silly implied-ness } } action void Arg_A_SawLoop() { if(invoker.rev == 12) { A_PlaySound("weapons/chainsaw/loop", CHAN_5, 1.0, 1); } else { invoker.rev++; } A_ReFire(); } action void Arg_A_SawDown() { A_PlaySound("weapons/chainsaw/down", CHAN_5); invoker.rev = 0; } action void Arg_A_SawOff() { A_PlaySound("weapons/chainsaw/off", CHAN_5); } } class ArgChainsawPuff : ArgBulletPuff { Default { DamageType "ArgChainsaw"; +EXTREMEDEATH } }