diff --git a/language.def_lore b/language.def_lore index e9c62a131..f6eeb4775 100644 --- a/language.def_lore +++ b/language.def_lore @@ -3150,6 +3150,18 @@ SWWM_LORETXT_QUADRAVOL = "\n" "\cfTechniques:\c- The weapon has a certain \"extra effective\" special move should you be close enough to your target. Plunging the four bayonets into an enemy and immediately pulling the trigger afterwards will result in a potent point blank explosion that will send them flying, covered in flames.\n" "\n" +"The various charge levels of the internal crucible appear to dramatically alter the behavior of fired projectiles. The most notable changes are reflected as such:\n" +"\n" +"\cfLevel 1:\c- Fast and steady projectile, with moderate blast radius.\n" +"\n" +"\cfLevel 2:\c- Slower projectile with some drift, doubled blast radius and intensity.\n" +"\n" +"\cfLevel 3:\c- Slow, massive, erratic projectile, with much more dramatic blast potential. Ruptures into sub-projectiles on impact.\n" +"\n" +"\cfLevel 4:\c- Projectile bursts into multiple fragments as it leaves the barrel. Each sub-projectile is only slightly weaker than a level 1 fireball.\n" +"\n" +"\cfLevel 5:\c- At this point, whatever projectile was to be fired will instantly explode outwards. This attack is very destructive, and its damage may increase further if a full cell is still chambered.\n" +"\n" "\cxSaya's Notes:\c-\n" "\cfTypical overly dramatic Xekkian stuff. The \"Ardent Cross\", really... But it's as badass as it sounds, at least.\c-\n" "\n" diff --git a/language.es_lore b/language.es_lore index 2dace6aae..57a8c046e 100644 --- a/language.es_lore +++ b/language.es_lore @@ -2924,6 +2924,18 @@ SWWM_LORETXT_QUADRAVOL = "\n" "\cfTécnicas:\c- El arma tiene un cierto movimiento especial \"extra efectivo\" si te encuentras a poca distancia de tu objetivo. Hundiendo las cuatro bayonetas en el enemigo e inmediatamente después apretando el gatillo resultará en una potente explosión a bocajarro que lo enviará volando, cubierto en llamas.\n" "\n" +"Los diversos niveles de carga del crisol interno parecen alterar dramáticamente el comportamiento del proyectil. Los cambios más notables se reflejan aquí:\n" +"\n" +"\cfNivel 1:\c- Proyectil estable y veloz, con un radio de explosión moderado.\n" +"\n" +"\cfNivel 2:\c- Proyectil más lento con algo de desviación, doble de radio e intensidad de explosión.\n" +"\n" +"\cfNivel 3:\c- Proyectil lento, masivo, errático, con un potencial de explosión más dramático. Se rompe en sub-proyectiles al impactar.\n" +"\n" +"\cfNivel 4:\c- El proyectil estalla en múltiples fragmentos al salir del cañón. Cada sub-proyectil es solo ligeramente más débil que una bola de fuego de nivel 1.\n" +"\n" +"\cfNivel 5:\c- Llegado este punto, cualquier proyectil que fuera disparado explotará al instante hacia fuera. Este ataque es muy destructivo, y su daño puede incrementar aun más si todavía queda una célula llena en la recámara.\n" +"\n" "\cxNotas de Saya:\c-\n" "\cfTípicas ñoñerías superdramáticas de los Xekkian. La \"Cruz Ardiente\", en serio... Pero mola tanto como suena, al menos.\c-\n" "\n" diff --git a/language.version b/language.version index 0975b0cde..91b2f92ce 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r341 \cu(Thu 18 Aug 16:18:22 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r341 \cu(2022-08-18 16:18:22)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r343 \cu(Thu 18 Aug 18:33:57 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r343 \cu(2022-08-18 18:33:57)\c-"; diff --git a/lore/default/quadravol.txt b/lore/default/quadravol.txt index eeb6d1ea1..178fee891 100644 --- a/lore/default/quadravol.txt +++ b/lore/default/quadravol.txt @@ -32,6 +32,18 @@ The Ardent Cross was the name of the general's sword which, when imbued with mag \cfTechniques:\c- The weapon has a certain "extra effective" special move should you be close enough to your target. Plunging the four bayonets into an enemy and immediately pulling the trigger afterwards will result in a potent point blank explosion that will send them flying, covered in flames. +The various charge levels of the internal crucible appear to dramatically alter the behavior of fired projectiles. The most notable changes are reflected as such: + +\cfLevel 1:\c- Fast and steady projectile, with moderate blast radius. + +\cfLevel 2:\c- Slower projectile with some drift, doubled blast radius and intensity. + +\cfLevel 3:\c- Slow, massive, erratic projectile, with much more dramatic blast potential. Ruptures into sub-projectiles on impact. + +\cfLevel 4:\c- Projectile bursts into multiple fragments as it leaves the barrel. Each sub-projectile is only slightly weaker than a level 1 fireball. + +\cfLevel 5:\c- At this point, whatever projectile was to be fired will instantly explode outwards. This attack is very destructive, and its damage may increase further if a full cell is still chambered. + \cxSaya's Notes:\c- \cfTypical overly dramatic Xekkian stuff. The "Ardent Cross", really... But it's as badass as it sounds, at least.\c- diff --git a/lore/es/quadravol.txt b/lore/es/quadravol.txt index c24e7a8ae..ce2d6be74 100644 --- a/lore/es/quadravol.txt +++ b/lore/es/quadravol.txt @@ -26,6 +26,18 @@ La Cruz Ardiente era el nombre de la espada del general la cual, al ser imbuida \cfTécnicas:\c- El arma tiene un cierto movimiento especial "extra efectivo" si te encuentras a poca distancia de tu objetivo. Hundiendo las cuatro bayonetas en el enemigo e inmediatamente después apretando el gatillo resultará en una potente explosión a bocajarro que lo enviará volando, cubierto en llamas. +Los diversos niveles de carga del crisol interno parecen alterar dramáticamente el comportamiento del proyectil. Los cambios más notables se reflejan aquí: + +\cfNivel 1:\c- Proyectil estable y veloz, con un radio de explosión moderado. + +\cfNivel 2:\c- Proyectil más lento con algo de desviación, doble de radio e intensidad de explosión. + +\cfNivel 3:\c- Proyectil lento, masivo, errático, con un potencial de explosión más dramático. Se rompe en sub-proyectiles al impactar. + +\cfNivel 4:\c- El proyectil estalla en múltiples fragmentos al salir del cañón. Cada sub-proyectil es solo ligeramente más débil que una bola de fuego de nivel 1. + +\cfNivel 5:\c- Llegado este punto, cualquier proyectil que fuera disparado explotará al instante hacia fuera. Este ataque es muy destructivo, y su daño puede incrementar aun más si todavía queda una célula llena en la recámara. + \cxNotas de Saya:\c- \cfTípicas ñoñerías superdramáticas de los Xekkian. La "Cruz Ardiente", en serio... Pero mola tanto como suena, al menos.\c- diff --git a/sndinfo.dlcweapons b/sndinfo.dlcweapons index 54ccc9670..673942fb2 100644 --- a/sndinfo.dlcweapons +++ b/sndinfo.dlcweapons @@ -95,7 +95,13 @@ quadshot/casing2 sounds/dlc1/quadshot/quad_casing2.ogg quadshot/casing3 sounds/dlc1/quadshot/quad_casing3.ogg quadshot/casing4 sounds/dlc1/quadshot/quad_casing4.ogg $random quadshot/casing { quadshot/casing1 quadshot/casing2 quadshot/casing3 quadshot/casing4 } -// TODO projectile sounds +quadshot/hit1 sounds/dlc1/quadshot/quad_explo1.ogg +quadshot/hit2 sounds/dlc1/quadshot/quad_explo2.ogg +quadshot/hit3 sounds/dlc1/quadshot/quad_explo3.ogg +$random quadshot/hit { quadshot/hit1 quadshot/hit2 quadshot/hit3 } +quadshot/extrahit sounds/dlc1/quadshot/quad_xexpl.ogg +quadshot/pointblank sounds/dlc1/quadshot/quad_xxexpl.ogg +quadshot/fly sounds/dlc1/quadshot/quad_fly.ogg // TODO sparkster rifle diff --git a/sounds/dlc1/quadshot/quad_explo1.ogg b/sounds/dlc1/quadshot/quad_explo1.ogg new file mode 100644 index 000000000..cd2d01515 Binary files /dev/null and b/sounds/dlc1/quadshot/quad_explo1.ogg differ diff --git a/sounds/dlc1/quadshot/quad_explo2.ogg b/sounds/dlc1/quadshot/quad_explo2.ogg new file mode 100644 index 000000000..a09180fdc Binary files /dev/null and b/sounds/dlc1/quadshot/quad_explo2.ogg differ diff --git a/sounds/dlc1/quadshot/quad_explo3.ogg b/sounds/dlc1/quadshot/quad_explo3.ogg new file mode 100644 index 000000000..deacc805e Binary files /dev/null and b/sounds/dlc1/quadshot/quad_explo3.ogg differ diff --git a/sounds/dlc1/quadshot/quad_fly.ogg b/sounds/dlc1/quadshot/quad_fly.ogg new file mode 100644 index 000000000..b9e39bf02 Binary files /dev/null and b/sounds/dlc1/quadshot/quad_fly.ogg differ diff --git a/sounds/dlc1/quadshot/quad_xexpl.ogg b/sounds/dlc1/quadshot/quad_xexpl.ogg new file mode 100644 index 000000000..57e4845ef Binary files /dev/null and b/sounds/dlc1/quadshot/quad_xexpl.ogg differ diff --git a/sounds/dlc1/quadshot/quad_xxexpl.ogg b/sounds/dlc1/quadshot/quad_xxexpl.ogg new file mode 100644 index 000000000..c4407667d Binary files /dev/null and b/sounds/dlc1/quadshot/quad_xxexpl.ogg differ diff --git a/zscript/dlc1/swwm_notashotgun.zsc b/zscript/dlc1/swwm_notashotgun.zsc index 3b1b10463..30bac7e2b 100644 --- a/zscript/dlc1/swwm_notashotgun.zsc +++ b/zscript/dlc1/swwm_notashotgun.zsc @@ -5,7 +5,7 @@ Class Quadravol : SWWMWeapon { int clipcount; int chargelevel; - bool chambered, charged, waschambered, wascharged; + bool chambered, charged, waschambered, wascharged, fromfire; bool onehand; bool initialized; @@ -76,6 +76,37 @@ Class Quadravol : SWWMWeapon else origin.A_StartSound(UpSound,CHAN_WEAPON,CHANF_OVERLAP); } + action State A_QuadFire() + { + static const String BaseNum[] = {"one","two","three","four","five"}; + static const StateLabel FireStates[] = {"FireOne","FireTwo","FireThree","FireFour","FireFive"}; + int idx = clamp(invoker.chargelevel-1,0,4); + A_StartSound("quadshot/fire"..BaseNum[idx],CHAN_WEAPON,CHANF_OVERLAP); + A_PlayerFire(); + switch ( idx ) + { + case 0: + A_Log("\cg// TODO - Fire Level 1\c-"); + break; + case 1: + A_Log("\cg// TODO - Fire Level 2\c-"); + break; + case 2: + A_Log("\cg// TODO - Fire Level 3\c-"); + break; + case 3: + A_Log("\cg// TODO - Fire Level 4\c-"); + break; + case 4: + if ( !invoker.charged ) A_Log("\cg// TODO - Fire Level 5+\c-"); + else A_Log("\cg// TODO - Fire Level 5\c-"); + break; + } + invoker.chargelevel = 0; + invoker.charged = true; // eat it up + return ResolveState(FireStates[idx]); + } + action void A_Eject() { invoker.waschambered = invoker.chambered; @@ -182,7 +213,6 @@ Class Quadravol : SWWMWeapon Super.AttachToOwner(other); } - Default { Tag "$T_QUADRAVOL"; @@ -220,23 +250,50 @@ Class Quadravol : SWWMWeapon XZW2 A 1 { A_Fill(); // just in case - int flg = WRF_ALLOWUSER1|WRF_ALLOWZOOM; - if ( invoker.clipcount < invoker.default.clipcount ) flg |= WRF_ALLOWRELOAD; + int flg = WRF_ALLOWRELOAD|WRF_ALLOWUSER1|WRF_ALLOWZOOM; if ( (invoker.chargelevel <= 0) && (invoker.Ammo1.Amount <= 0) && (invoker.clipcount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) flg |= WRF_NOPRIMARY; + invoker.fromfire = false; A_WeaponReady(flg); + if ( player.cmd.buttons&BT_ATTACK ) + invoker.CheckAmmo(EitherFire,true); } Wait; Fire: - // TODO firing XZW2 A 1 { if ( invoker.chargelevel <= 0 ) { if ( invoker.clipcount > 0 ) return ResolveState("AltFire"); + invoker.fromfire = true; return ResolveState("Reload"); } - return ResolveState(null); + return A_QuadFire(); } + FireOne: + XZW2 A 1; + XZW3 OPQR 2; + XZW3 STUV 3; + Goto Ready; + FireTwo: + XZW2 A 1; + XZW3 WXYZ 2; + XZW4 ABCD 3; + Goto Ready; + FireThree: + XZW2 A 1; + XZW4 EFGH 2; + XZW4 IJKL 3; + Goto Ready; + FireFour: + XZW2 A 1; + XZW4 MNOP 2; + XZW4 QRST 3; + Goto Ready; + FireFive: + XZW2 A 1; + XZW4 UVWX 2; + XZW4 YZ 3; + XZW5 AB 3; Goto Ready; AltFire: XZW2 A 2 A_PlayerCheckGun(); @@ -256,8 +313,13 @@ Class Quadravol : SWWMWeapon TNT1 A 1 A_DropCasing(); Stop; Reload: - // TODO idle animation on full load - XZW2 A 2 A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 2 + { + if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) ) + return ResolveState("Idle"); + A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP); + return ResolveState(null); + } XZW5 MNO 3; Goto ReloadHold; ReloadHold: @@ -272,6 +334,9 @@ Class Quadravol : SWWMWeapon { if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) ) return ResolveState(null); + if ( invoker.fromfire && (player.cmd.buttons&BT_ATTACK) ) + return ResolveState("ReloadHold"); + invoker.fromfire = false; return A_JumpIf(player.cmd.buttons&BT_RELOAD,"ReloadHold"); } XZW6 B 2 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP); @@ -282,18 +347,26 @@ Class Quadravol : SWWMWeapon XZWZ HIJKLMN 2; XZWZ O 0; Stop; + Idle: + // TODO idle + XZW2 A 1 A_Log("\cg// TODO - Idle Animation\c-"); + XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_RELOAD),"Ready"); + Wait; Zoom: // TODO stance switch - XZW2 A 1; - Goto Ready; + XZW2 A 1 A_Log("\cg// TODO - Stance Switch\c-"); + XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_ZOOM),"Ready"); + Wait; User1: // TODO melee - XZW2 A 1; - Goto Ready; + XZW2 A 1 A_Log("\cg// TODO - Quick Melee\c-"); + XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_USER1),"Ready"); + Wait; Deselect: XZW2 A 1 A_StartSound("quadshot/deselect",CHAN_WEAPON,CHANF_OVERLAP); XZW2 BCDEFGHIJKLMNOPQR 1; XZW2 R -1 A_FullLower(); Stop; + // TODO one-handed states } } diff --git a/zscript/swwm_blod.zsc b/zscript/swwm_blod.zsc index eee5e96f7..c16dc9397 100644 --- a/zscript/swwm_blod.zsc +++ b/zscript/swwm_blod.zsc @@ -104,9 +104,7 @@ Class mkBloodSpray : Actor return; } if ( isFrozen() ) return; - Vector3 setofs; - setofs.xy = RotateVector(attachofs.xy,target.angle); - setofs.z = attachofs.z; + Vector3 setofs = SWWMUtility.RotateVector3(attachofs,target.angle); SetOrigin(level.Vec3Offset(target.pos,setofs),false); int sz = max(1,args[0]/2); double ang, pt;