diff --git a/language.version b/language.version index 527a93b9c..abb3fe584 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r330 \cu(Tue 16 Aug 21:31:38 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r330 \cu(2022-08-16 21:31:38)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r331 \cu(Tue 16 Aug 23:17:12 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r331 \cu(2022-08-16 23:17:12)\c-"; diff --git a/modeldef.quadravol b/modeldef.quadravol index 0f44a6ae3..afba2dba9 100644 --- a/modeldef.quadravol +++ b/modeldef.quadravol @@ -30,6 +30,15 @@ Model "Quadravol" FrameIndex XZWZ E 2 91 FrameIndex XZWZ F 2 92 FrameIndex XZWZ G 2 93 // Drop + // Load + FrameIndex XZWZ H 2 100 + FrameIndex XZWZ I 2 101 + FrameIndex XZWZ J 2 102 + FrameIndex XZWZ K 2 103 + FrameIndex XZWZ L 2 104 + FrameIndex XZWZ M 2 105 + FrameIndex XZWZ N 2 106 + FrameIndex XZWZ O 2 107 } Model "Quadravol" @@ -143,4 +152,32 @@ Model "Quadravol" FrameIndex XZW5 J 1 93 // Chamber FrameIndex XZW5 K 1 94 FrameIndex XZW5 L 1 95 + // LoadStart + FrameIndex XZW5 M 1 97 + FrameIndex XZW5 N 1 98 + FrameIndex XZW5 O 1 99 + // LoadLoop + FrameIndex XZW5 P 1 100 // LoadOverlay + FrameIndex XZW5 Q 1 101 + FrameIndex XZW5 R 1 102 + FrameIndex XZW5 S 1 103 // LoadSnd + FrameIndex XZW5 T 1 104 + FrameIndex XZW5 U 1 105 + FrameIndex XZW5 V 1 106 + FrameIndex XZW5 W 1 107 // LoadCell + FrameIndex XZW5 X 1 108 + FrameIndex XZW5 Y 1 109 + FrameIndex XZW5 Z 1 110 + FrameIndex XZW6 A 1 111 + // LoadEnd + FrameIndex XZW6 B 1 113 + FrameIndex XZW6 C 1 114 + FrameIndex XZW6 D 1 115 + FrameIndex XZW6 E 1 116 + FrameIndex XZW6 F 1 117 + FrameIndex XZW6 G 1 118 + FrameIndex XZW6 H 1 119 + FrameIndex XZW6 I 1 120 + FrameIndex XZW6 J 1 121 + FrameIndex XZW6 K 1 122 } diff --git a/models/Quadravol1st.blend b/models/Quadravol1st.blend index 2cbd99109..d1e6b1f62 100644 Binary files a/models/Quadravol1st.blend and b/models/Quadravol1st.blend differ diff --git a/models/Quadravol1st_a.3d b/models/Quadravol1st_a.3d index fcfe217c1..2249db639 100644 Binary files a/models/Quadravol1st_a.3d and b/models/Quadravol1st_a.3d differ diff --git a/models/Quadravol1st_d.3d b/models/Quadravol1st_d.3d index a44e9e043..10b27e155 100644 Binary files a/models/Quadravol1st_d.3d and b/models/Quadravol1st_d.3d differ diff --git a/zscript/dlc1/swwm_notashotgun.zsc b/zscript/dlc1/swwm_notashotgun.zsc index da8f361d5..349fa3d50 100644 --- a/zscript/dlc1/swwm_notashotgun.zsc +++ b/zscript/dlc1/swwm_notashotgun.zsc @@ -59,6 +59,7 @@ Class Quadravol : SWWMWeapon override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) { + if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true; if ( (firemode == PrimaryFire) || (firemode == EitherFire) ) { if ( (chargelevel > 0) || (chambered && !charged) || (clipcount > 0) || (Ammo1.Amount > 0) ) return true; @@ -88,6 +89,21 @@ Class Quadravol : SWWMWeapon } } + action void A_LoadOverlay() + { + A_StartSound("demolitionist/handsdown",CHAN_WEAPON,CHANF_OVERLAP,.8); + A_ChangeModel("",2,"","",5,"models","QuadCell.png",CMDL_USESURFACESKIN,-1); + A_Overlay(PSP_WEAPON+1,"LoadOverlay"); + } + + action void A_Load() + { + A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP,.3); + invoker.clipcount = min(invoker.default.clipcount,invoker.clipcount+1); + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1); + } + action bool A_Fill() { if ( !invoker.chambered || invoker.charged || (invoker.chargelevel >= 5) ) return false; @@ -98,8 +114,31 @@ Class Quadravol : SWWMWeapon action void A_DropCasing() { - if ( invoker.wascharged ) Console.Printf("\cg// TODO - Drop Casing\c-"); - else Console.Printf("\cg// TODO - Drop Ammo\c-"); + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),-8*x+8*y-16*z); + if ( invoker.wascharged ) + { + Console.Printf("\cg// TODO - Drop Casing\c-"); + return; + } + if ( invoker.Ammo1.Amount >= invoker.Ammo1.MaxAmount ) + { + let a = Inventory(Spawn("QuadravolAmmo",origin)); + a.bDROPPED = true; + a.DropTime = 30; + a.bSpecial = a.bSolid = false; + a.Angle = Angle+190; + a.VelFromAngle(5.); + a.Vel.Z = -1.; + a.Vel += Vel; + a.bNoGravity = false; + a.ClearCounters(); + a.OnDrop(self); + a.vel += (RotateVector((FRandom[Junk](-1.5,.5),FRandom[Junk](-1.5,1.5)),a.angle),FRandom[Junk](-1.5,1.5)); + return; + } + invoker.Ammo1.Amount++; } Default @@ -139,11 +178,23 @@ Class Quadravol : SWWMWeapon XZW2 A 1 { A_Fill(); // just in case - A_WeaponReady(); + int flg = WRF_ALLOWUSER1|WRF_ALLOWZOOM; + if ( invoker.clipcount < invoker.default.clipcount ) flg |= WRF_ALLOWRELOAD; + if ( (invoker.chargelevel <= 0) && (invoker.Ammo1.Amount <= 0) && (invoker.clipcount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) flg |= WRF_NOPRIMARY; + A_WeaponReady(flg); } Wait; Fire: - XZW2 A 1; + // TODO firing + XZW2 A 1 + { + if ( invoker.chargelevel <= 0 ) + { + if ( invoker.clipcount > 0 ) return ResolveState("AltFire"); + return ResolveState("Reload"); + } + return ResolveState(null); + } Goto Ready; AltFire: XZW2 A 2; @@ -155,7 +206,7 @@ Class Quadravol : SWWMWeapon XZW5 I 2; XZW5 J 2 A_Fill(); XZW5 K 2; - XZW5 L 3; + XZW5 L 2; Goto Ready; DropCasing: XZWZ ABCDEF 2; @@ -163,12 +214,38 @@ Class Quadravol : SWWMWeapon TNT1 A 1 A_DropCasing(); Stop; Reload: - XZW2 A 1; + // TODO idle animation on full load + XZW2 A 2 A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 MNO 3; + Goto ReloadHold; + ReloadHold: + XZW5 P 2 A_LoadOverlay(); + XZW5 QRS 2; + XZW5 T 2 A_StartSound("quadshot/load",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 UV 2; + XZW5 W 2 A_Load(); + XZW5 XYZ 2; + XZW6 A 2; + XZW5 P 2 + { + if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) ) + return ResolveState(null); + return A_JumpIf(player.cmd.buttons&BT_RELOAD,"ReloadHold"); + } + XZW6 B 2 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 CDEF 2; + XZW6 GHIJK 3; Goto Ready; + LoadOverlay: + XZWZ HIJKLMN 2; + XZWZ O 0; + Stop; Zoom: + // TODO stance switch XZW2 A 1; Goto Ready; User1: + // TODO melee XZW2 A 1; Goto Ready; Deselect: