diff --git a/language.version b/language.version index 2fb14fda4..f889d1913 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r345 \cu(Fri 19 Aug 16:13:38 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r345 \cu(2022-08-19 16:13:38)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r346 \cu(Fri 19 Aug 21:58:44 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r346 \cu(2022-08-19 21:58:44)\c-"; diff --git a/modeldef.quadravol b/modeldef.quadravol index a5a30d3d8..d027eba2d 100644 --- a/modeldef.quadravol +++ b/modeldef.quadravol @@ -55,6 +55,16 @@ Model "Quadravol" FrameIndex XZWZ M 2 105 FrameIndex XZWZ N 2 106 FrameIndex XZWZ O 2 107 + // 1H Eject + FrameIndex XZWZ P 2 267 + FrameIndex XZWZ Q 2 268 + FrameIndex XZWZ R 2 269 + FrameIndex XZWZ S 2 270 + FrameIndex XZWZ T 2 271 + FrameIndex XZWZ U 2 272 + FrameIndex XZWZ V 2 273 + FrameIndex XZWZ W 2 274 + FrameIndex XZWZ X 2 275 } Model "Quadravol" @@ -86,6 +96,28 @@ Model "Quadravol" FrameIndex XZW0 I 3 0 Skin 3 "QuadMuz9.png" FrameIndex XZW0 J 3 0 + + Offset 13 -60 -9 + Skin 3 "QuadMuz0.png" + FrameIndex XZW0 K 3 0 + Skin 3 "QuadMuz1.png" + FrameIndex XZW0 L 3 0 + Skin 3 "QuadMuz2.png" + FrameIndex XZW0 M 3 0 + Skin 3 "QuadMuz3.png" + FrameIndex XZW0 N 3 0 + Skin 3 "QuadMuz4.png" + FrameIndex XZW0 O 3 0 + Skin 3 "QuadMuz5.png" + FrameIndex XZW0 P 3 0 + Skin 3 "QuadMuz6.png" + FrameIndex XZW0 Q 3 0 + Skin 3 "QuadMuz7.png" + FrameIndex XZW0 R 3 0 + Skin 3 "QuadMuz8.png" + FrameIndex XZW0 S 3 0 + Skin 3 "QuadMuz9.png" + FrameIndex XZW0 T 3 0 } Model "Quadravol" @@ -101,6 +133,7 @@ Model "Quadravol" AngleOffset -90 Scale -0.01 0.005 0.01 + //// TWO HANDED // Still FrameIndex XZW2 A 1 0 // Deselect @@ -227,4 +260,260 @@ Model "Quadravol" FrameIndex XZW6 I 1 120 FrameIndex XZW6 J 1 121 FrameIndex XZW6 K 1 122 + // Idle + FrameIndex XZW6 L 1 124 + FrameIndex XZW6 M 1 125 + FrameIndex XZW6 N 1 126 + FrameIndex XZW6 O 1 127 + FrameIndex XZW6 P 1 128 + FrameIndex XZW6 Q 1 129 + FrameIndex XZW6 R 1 130 + FrameIndex XZW6 S 1 131 + FrameIndex XZW6 T 1 132 + FrameIndex XZW6 U 1 133 + FrameIndex XZW6 V 1 134 + FrameIndex XZW6 W 1 135 + FrameIndex XZW6 X 1 136 + FrameIndex XZW6 Y 1 137 + FrameIndex XZW6 Z 1 138 + FrameIndex XZW7 A 1 139 + // Melee + FrameIndex XZW7 B 1 141 + FrameIndex XZW7 C 1 142 + FrameIndex XZW7 D 1 143 + FrameIndex XZW7 E 1 144 + FrameIndex XZW7 F 1 145 + FrameIndex XZW7 G 1 146 + FrameIndex XZW7 H 1 147 + FrameIndex XZW7 I 1 148 + FrameIndex XZW7 J 1 149 // MeleeHit + FrameIndex XZW7 K 1 150 + FrameIndex XZW7 L 1 151 + FrameIndex XZW7 M 1 152 + FrameIndex XZW7 N 1 153 + FrameIndex XZW7 O 1 154 + FrameIndex XZW7 P 1 155 + FrameIndex XZW7 Q 1 156 + FrameIndex XZW7 R 1 157 + FrameIndex XZW7 S 1 158 + FrameIndex XZW7 T 1 159 + FrameIndex XZW7 U 1 160 + FrameIndex XZW7 V 1 161 + FrameIndex XZW7 W 1 162 + FrameIndex XZW7 X 1 163 + // Bayonet + FrameIndex XZW7 Y 1 166 + FrameIndex XZW7 Z 1 167 + FrameIndex XZW8 A 1 168 + FrameIndex XZW8 B 1 169 + FrameIndex XZW8 C 1 170 // BayonetEnd + FrameIndex XZW8 D 1 171 + FrameIndex XZW8 E 1 172 + FrameIndex XZW8 F 1 173 + FrameIndex XZW8 G 1 174 + FrameIndex XZW8 H 1 175 + FrameIndex XZW8 I 1 176 + FrameIndex XZW8 J 1 177 + FrameIndex XZW8 K 1 178 + FrameIndex XZW8 L 1 179 + // BayonetFire + FrameIndex XZW8 M 1 182 + FrameIndex XZW8 N 1 183 + FrameIndex XZW8 O 1 184 + FrameIndex XZW8 P 1 185 + FrameIndex XZW8 Q 1 186 + FrameIndex XZW8 R 1 187 + FrameIndex XZW8 S 1 188 + FrameIndex XZW8 T 1 189 + FrameIndex XZW8 U 1 190 + FrameIndex XZW8 V 1 191 + FrameIndex XZW8 W 1 192 + FrameIndex XZW8 X 1 193 + FrameIndex XZW8 Y 1 194 + // ToOneHand + FrameIndex XZW8 Z 1 196 + FrameIndex XZW9 A 1 197 + FrameIndex XZW9 B 1 198 + FrameIndex XZW9 C 1 199 + FrameIndex XZW9 D 1 200 + FrameIndex XZW9 E 1 201 + FrameIndex XZW9 F 1 202 + //// ONE HANDED + // Still + FrameIndex XZW9 G 1 203 + // Deselect + FrameIndex XZW9 H 1 204 + FrameIndex XZW9 I 1 205 + FrameIndex XZW9 J 1 206 + FrameIndex XZW9 K 1 207 + FrameIndex XZW9 L 1 208 + FrameIndex XZW9 M 1 209 + FrameIndex XZW9 N 1 210 // Select + FrameIndex XZW9 O 1 211 + FrameIndex XZW9 P 1 212 + FrameIndex XZW9 Q 1 213 + FrameIndex XZW9 R 1 214 + FrameIndex XZW9 S 1 215 + FrameIndex XZW9 T 1 216 + FrameIndex XZW9 U 1 217 + FrameIndex XZW9 V 1 218 + FrameIndex XZW9 W 1 219 + // FireOne + FrameIndex XZW9 X 1 221 + FrameIndex XZW9 Y 1 222 + FrameIndex XZW9 Z 1 223 + FrameIndex XZWA A 1 224 + FrameIndex XZWA B 1 225 + FrameIndex XZWA C 1 226 + FrameIndex XZWA D 1 227 + FrameIndex XZWA E 1 228 + // FireTwo + FrameIndex XZWA F 1 230 + FrameIndex XZWA G 1 231 + FrameIndex XZWA H 1 232 + FrameIndex XZWA I 1 233 + FrameIndex XZWA J 1 234 + FrameIndex XZWA K 1 235 + FrameIndex XZWA L 1 236 + FrameIndex XZWA M 1 237 + // FireThree + FrameIndex XZWA N 1 239 + FrameIndex XZWA O 1 240 + FrameIndex XZWA P 1 241 + FrameIndex XZWA Q 1 242 + FrameIndex XZWA R 1 243 + FrameIndex XZWA S 1 244 + FrameIndex XZWA T 1 245 + FrameIndex XZWA U 1 246 + // FireFour + FrameIndex XZWA V 1 248 + FrameIndex XZWA W 1 249 + FrameIndex XZWA X 1 250 + FrameIndex XZWA Y 1 251 + FrameIndex XZWA Z 1 252 + FrameIndex XZWB A 1 253 + FrameIndex XZWB B 1 254 + FrameIndex XZWB C 1 255 + // FireFive + FrameIndex XZWB D 1 257 + FrameIndex XZWB E 1 258 + FrameIndex XZWB F 1 259 + FrameIndex XZWB G 1 260 + FrameIndex XZWB H 1 261 + FrameIndex XZWB I 1 262 + FrameIndex XZWB J 1 263 + FrameIndex XZWB K 1 264 + // LeverAct + FrameIndex XZWB L 1 266 + FrameIndex XZWB M 1 267 // LeverForward, Eject + FrameIndex XZWB N 1 268 + FrameIndex XZWB O 1 269 + FrameIndex XZWB P 1 270 + FrameIndex XZWB Q 1 271 + FrameIndex XZWB R 1 272 + FrameIndex XZWB S 1 273 + FrameIndex XZWB T 1 274 + FrameIndex XZWB U 1 275 + FrameIndex XZWB V 1 276 + FrameIndex XZWB W 1 277 + FrameIndex XZWB X 1 278 + FrameIndex XZWB Y 1 279 + FrameIndex XZWB Z 1 280 // LeverBack + FrameIndex XZWC A 1 281 + FrameIndex XZWC B 1 282 // Chamber + FrameIndex XZWC C 1 283 + FrameIndex XZWC D 1 284 + FrameIndex XZWC E 1 285 + FrameIndex XZWC F 1 286 + // LoadStart (to 2H) + FrameIndex XZWC G 1 288 + // LoadEnd (from 2H) + FrameIndex XZWC H 1 290 + FrameIndex XZWC I 1 291 + // Idle + FrameIndex XZWC J 1 293 + FrameIndex XZWC K 1 294 + FrameIndex XZWC L 1 295 + FrameIndex XZWC M 1 296 + FrameIndex XZWC N 1 297 + FrameIndex XZWC O 1 298 + FrameIndex XZWC P 1 299 + FrameIndex XZWC Q 1 300 + FrameIndex XZWC R 1 301 + FrameIndex XZWC S 1 302 + FrameIndex XZWC T 1 303 + FrameIndex XZWC U 1 304 + FrameIndex XZWC V 1 305 + FrameIndex XZWC W 1 306 + FrameIndex XZWC X 1 307 + FrameIndex XZWC Y 1 308 + // Melee + FrameIndex XZWC Z 1 310 + FrameIndex XZWD A 1 311 + FrameIndex XZWD B 1 312 + FrameIndex XZWD C 1 313 + FrameIndex XZWD D 1 314 + FrameIndex XZWD E 1 315 + FrameIndex XZWD F 1 316 + FrameIndex XZWD G 1 317 + FrameIndex XZWD H 1 318 // MeleeHit + FrameIndex XZWD I 1 319 + FrameIndex XZWD J 1 320 + FrameIndex XZWD K 1 321 + FrameIndex XZWD L 1 322 + FrameIndex XZWD M 1 323 + FrameIndex XZWD N 1 324 + FrameIndex XZWD O 1 325 + FrameIndex XZWD P 1 326 + FrameIndex XZWD Q 1 327 + FrameIndex XZWD R 1 328 + FrameIndex XZWD S 1 329 + FrameIndex XZWD T 1 330 + FrameIndex XZWD U 1 331 + FrameIndex XZWD V 1 332 + // Bayonet + FrameIndex XZWD W 1 335 + FrameIndex XZWD X 1 336 + FrameIndex XZWD Y 1 337 + FrameIndex XZWD Z 1 338 + FrameIndex XZWE A 1 339 // BayonetEnd + FrameIndex XZWE B 1 340 + FrameIndex XZWE C 1 341 + FrameIndex XZWE D 1 342 + FrameIndex XZWE E 1 343 + FrameIndex XZWE F 1 344 + FrameIndex XZWE G 1 345 + FrameIndex XZWE H 1 346 + FrameIndex XZWE I 1 347 + FrameIndex XZWE J 1 348 + // BayonetFire + FrameIndex XZWE K 1 351 + FrameIndex XZWE L 1 352 + FrameIndex XZWE M 1 353 + FrameIndex XZWE N 1 354 + FrameIndex XZWE O 1 355 + FrameIndex XZWE P 1 356 + FrameIndex XZWE Q 1 357 + FrameIndex XZWE R 1 358 + FrameIndex XZWE S 1 359 + FrameIndex XZWE T 1 360 + FrameIndex XZWE U 1 361 + FrameIndex XZWE V 1 362 + FrameIndex XZWE W 1 363 + // ToTwoHanded + FrameIndex XZWE X 1 365 + FrameIndex XZWE Y 1 366 + FrameIndex XZWE Z 1 367 + FrameIndex XZWF A 1 368 + FrameIndex XZWF B 1 369 + FrameIndex XZWF C 1 370 + FrameIndex XZWF D 1 371 + FrameIndex XZWF E 1 372 + FrameIndex XZWF F 1 373 + FrameIndex XZWF G 1 374 + FrameIndex XZWF H 1 375 + FrameIndex XZWF I 1 376 + FrameIndex XZWF J 1 377 + FrameIndex XZWF K 1 378 + FrameIndex XZWF L 1 379 } diff --git a/models/Quadravol1st.blend b/models/Quadravol1st.blend index 85da51db0..0067d82dc 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 0a16889bb..acb0df3b6 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 becff8cf6..91f366cac 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 77cce32b5..17121efa0 100644 --- a/zscript/dlc1/swwm_notashotgun.zsc +++ b/zscript/dlc1/swwm_notashotgun.zsc @@ -78,28 +78,34 @@ Class Quadravol : SWWMWeapon override Vector3 GetTraceOffset() { - return (10,3,-2.5); + return onehand?(10,3.5,-2):(10,3,-2.5); } - action State A_QuadFire() + action State A_QuadFire( bool bMelee = false ) { static const String BaseNum[] = {"one","two","three","four","five"}; static const StateLabel FireStates[] = {"FireOne","FireTwo","FireThree","FireFour","FireFive"}; + static const StateLabel FireStates1H[] = {"FireOne1H","FireTwo1H","FireThree1H","FireFour1H","FireFive1H"}; int idx = clamp(invoker.chargelevel-1,0,4); A_StartSound("quadshot/fire"..BaseNum[idx],CHAN_WEAPON,CHANF_OVERLAP); A_PlayerFire(); Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); - Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+3*y-2.5*z); + double offy = invoker.onehand?3.5:3; + double offz = invoker.onehand?2:2.5; + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+offy*y-offz*z); bool pointblank = false; int rings = 1; Vector3 dir; + FLineTraceData d; + Actor fool = null; for ( double i=0; i<.16; i+=.04 ) { for ( int j=0; j<360; j+=(360/rings) ) { dir = SWWMUtility.ConeSpread(x,y,z,j,i); - pointblank |= LineTrace(atan2(dir.y,dir.x),60,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y); + pointblank |= LineTrace(atan2(dir.y,dir.x),60,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + if ( (d.HitType == TRACE_HitActor) && !fool ) fool = d.HitActor; } rings += 3; } @@ -121,13 +127,15 @@ Class Quadravol : SWWMWeapon p.angle = atan2(x2.y,x2.x); p.pitch = asin(-x2.z); p.vel = x2*p.speed; - if ( pointblank ) + if ( pointblank || bMelee ) { p.tracer = self; - p.special1 = 50; - p.special2 = 40000; + p.master = fool; + p.special1 = bMelee?100:50; + p.special2 = bMelee?120000:40000; + p.bAMBUSH = bMelee; p.ExplodeMissile(null,null); - self.DamageMobj(invoker,self,40,'Fire',DMG_EXPLOSION); + self.DamageMobj(invoker,self,bAMBUSH?20:40,'Fire',DMG_EXPLOSION); } for ( int i=0; i<4; i++ ) { @@ -161,7 +169,8 @@ Class Quadravol : SWWMWeapon } invoker.chargelevel = 0; invoker.charged = true; // eat it up - return ResolveState(FireStates[idx]); + if ( bMelee ) return ResolveState(null); + return invoker.onehand?ResolveState(FireStates1H[idx]):ResolveState(FireStates[idx]); } action void A_Eject() @@ -174,7 +183,8 @@ Class Quadravol : SWWMWeapon if ( invoker.waschambered ) { A_ChangeModel("",2,"","",5,"models",invoker.wascharged?"QuadCell_Used.png":"QuadCell.png",CMDL_USESURFACESKIN,-1); - A_Overlay(PSP_WEAPON+1,"DropCasing"); + if ( invoker.onehand ) A_Overlay(PSP_WEAPON+1,"DropCasing1H"); + else A_Overlay(PSP_WEAPON+1,"DropCasing"); } } @@ -235,6 +245,16 @@ Class Quadravol : SWWMWeapon invoker.Ammo1.Amount++; } + action void A_FireBayonet() + { + A_StartSound("quadshot/bayonetfire",CHAN_WEAPON,CHANF_OVERLAP); + A_Melee(50,"spreadgun/slug",1.5,.8,-.5,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse); + Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch); + vel += dir*4.; + A_QuakeEx(4,4,4,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75); + A_BumpFOV(1.03); + } + override bool PickupForAmmoSWWM( SWWMWeapon ownedWeapon ) { bool good = Super.PickupForAmmoSWWM(ownedWeapon); @@ -298,7 +318,11 @@ Class Quadravol : SWWMWeapon XZW1 A -1; Stop; Select: - XZW2 R 1 A_FullRaise(); + XZW2 R 1 + { + A_FullRaise(); + return A_JumpIf(invoker.onehand,"Select1H"); + } XZW2 STUVWXYZ 1; XZW3 ABCDEFGHI 1; XZW3 JKLMN 2; @@ -356,7 +380,11 @@ Class Quadravol : SWWMWeapon XZW5 AB 5; Goto Ready; AltFire: - XZW2 A 2 A_PlayerCheckGun(); + XZW2 A 2 + { + A_PlayerCheckGun(); + return A_JumpIf(invoker.onehand,"AltFire1H"); + } XZW5 C 2; XZW5 D 2 A_StartSound("quadshot/leverforward",CHAN_WEAPON,CHANF_OVERLAP); XZW5 E 2 A_Eject(); @@ -376,7 +404,8 @@ Class Quadravol : SWWMWeapon XZW2 A 2 { if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) ) - return ResolveState("Idle"); + return invoker.onehand?ResolveState("Idle1H"):ResolveState("Idle"); + if ( invoker.onehand ) return ResolveState("Reload1H"); A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP); return ResolveState(null); } @@ -393,11 +422,12 @@ Class Quadravol : SWWMWeapon XZW5 P 2 { if ( (invoker.clipcount >= invoker.default.clipcount) || ((invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true)) ) - return ResolveState(null); + return A_JumpIf(invoker.onehand,"ReloadEnd1H"); if ( invoker.fromfire && (player.cmd.buttons&BT_ATTACK) ) return ResolveState("ReloadHold"); invoker.fromfire = false; - return A_JumpIf(player.cmd.buttons&BT_RELOAD,"ReloadHold"); + if ( player.cmd.buttons&BT_RELOAD ) return ResolveState("ReloadHold"); + return A_JumpIf(invoker.onehand,"ReloadEnd1H"); } XZW6 B 2 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP); XZW6 CDEF 2; @@ -408,22 +438,65 @@ Class Quadravol : SWWMWeapon 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; + XZW2 A 2 A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP,.8); + XZW6 LMNO 2; + XZW6 PQRST 3; + XZW6 U 2 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP,.6); + XZW6 VW 2; + XZW6 XYZ 3; + XZW7 A 3; + Goto Ready; Zoom: - // TODO stance switch - XZW2 A 1 A_Log("\cg// TODO - Stance Switch\c-"); - XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_ZOOM),"Ready"); - Wait; + XZW2 A 2 + { + if ( invoker.onehand ) + { + invoker.onehand = false; + return ResolveState("Zoom1H"); + } + A_StartSound("quadshot/onehand",CHAN_WEAPON,CHANF_OVERLAP); + invoker.onehand = true; + return ResolveState(null); + } + XZW8 Z 2; + XZW9 ABCDEF 2; + Goto Ready1H; User1: - // TODO melee - XZW2 A 1 A_Log("\cg// TODO - Quick Melee\c-"); - XZW2 A 1 A_JumpIf(!(player.cmd.buttons&BT_USER1),"Ready"); - Wait; + XZW2 A 2 + { + A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP); + return A_JumpIf(invoker.onehand,"User11H"); + } + XZW7 BCDEF 2; + XZW7 G 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + XZW7 H 2 A_Parry(6); + XZW7 I 1; + XZW7 J 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet"); + XZW7 KLM 1; + XZW7 NOPQRST 2; + XZW7 UVWX 3; + Goto Ready; + Bayonet: + XZW7 J 1 A_FireBayonet(); + XZW7 YZ 2 A_JumpIf((player.cmd.buttons&BT_ATTACK)&&(invoker.chargelevel>0),"BayonetFire"); + XZW8 ABC 2 A_JumpIf((player.cmd.buttons&BT_ATTACK)&&(invoker.chargelevel>0),"BayonetFire"); + XZW8 D 1 A_StartSound("quadshot/bayonetreturn",CHAN_WEAPON,CHANF_OVERLAP); + XZW8 EFGH 1; + XZW8 IJKL 2; + Goto Ready; + BayonetFire: + #### # 1 A_QuadFire(true); + XZW8 MNO 1; + XZW8 P 1 A_StartSound("quadshot/bayonetreturn",CHAN_WEAPON,CHANF_OVERLAP); + XZW8 QRST 1; + XZW8 UVWXY 2; + Goto Ready; Deselect: - XZW2 A 1 A_StartSound("quadshot/deselect",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 1 + { + A_StartSound(invoker.onehand?"quadshot/deselectfast":"quadshot/deselect",CHAN_WEAPON,CHANF_OVERLAP); + return A_JumpIf(invoker.onehand,"Deselect1H"); + } XZW2 BCDEFGHIJKLMNOPQR 1; XZW2 R -1 A_FullLower(); Stop; @@ -431,11 +504,139 @@ Class Quadravol : SWWMWeapon XZW0 A 2 Bright { let psp = player.GetPSprite(PSP_FLASH); - psp.frame = Random[GunFlash](0,9); + psp.frame = Random[GunFlash](0,9)+invoker.onehand*10; let l = Spawn("SWWMWeaponLight",pos); l.target = self; } Stop; - // TODO one-handed states + // one-handed states + Select1H: + XZW9 N 2 A_FullRaise(); + XZW9 OPQRSTUVW 2; + Goto Ready1H; + Ready1H: + XZW9 G 1 + { + A_Fill(); // just in case + 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; + FireOne1H: + XZW9 G 1; + XZW9 XYZ 1; + XZWA A 1; + XZWA BCDE 2; + Goto Ready1H; + FireTwo1H: + XZW9 G 1; + XZWA FG 1; + XZWA HI 2; + XZWA JKLM 3; + Goto Ready1H; + FireThree1H: + XZW9 G 1; + XZWA NOPQ 2; + XZWA RSTU 3; + Goto Ready1H; + FireFour1H: + XZW9 G 1; + XZWA VWXY 2; + XZWA Z 3; + XZWB A 3; + XZWB BC 4; + Goto Ready1H; + FireFive1H: + XZW9 G 1; + XZWB DE 2; + XZWB FG 3; + XZWB HI 4; + XZWB JK 5; + Goto Ready1H; + AltFire1H: + XZW9 G 2; + XZWB L 2; + XZWB M 1 + { + A_StartSound("quadshot/leverforward",CHAN_WEAPON,CHANF_OVERLAP); + A_Eject(); + } + XZWB NO 1; + XZWB P 2 A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP,pitch:.6); + XZWB QR 2; + XZWB S 2 A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP,pitch:.5); + XZWB TUV 2; + XZWB W 2 A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP,pitch:.4); + XZWB XY 1; + XZWB Z 1 A_StartSound("quadshot/leverback",CHAN_WEAPON,CHANF_OVERLAP); + XZWC A 2; + XZWC B 2 A_Fill(); + XZWC CDEF 3; + Goto Ready1H; + DropCasing1H: + XZWZ PQRSTUVW 1; + XZWZ X 0; + TNT1 A 1 A_DropCasing(); + Stop; + Idle1H: + XZW9 G 2 A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP,.8); + XZWC JKLM 2; + XZWC NOPQR 3; + XZWC STU 2; + XZWC VWX 3; + XZWC Y 3; + Goto Ready1H; + Zoom1H: + XZW9 G 2; + XZWE XYZ 2; + XZWF AB 2; + XZWF C 1 A_StartSound("quadshot/twohand",CHAN_WEAPON,CHANF_OVERLAP); + XZWF DEFG 1; + XZWF HIJKL 2; + Goto Ready; + User11H: + XZW9 G 2; + XZWC Z 2; + XZWD ABCD 2; + XZWD E 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + XZWD F 2 A_Parry(6); + XZWD G 1; + XZWD H 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet1H"); + XZWD IJK 1; + XZWD LMNOPQR 2; + XZWD STUV 3; + Goto Ready1H; + Bayonet1H: + XZWD H 1 A_FireBayonet(); + XZWD WX 2 A_JumpIf((player.cmd.buttons&BT_ATTACK)&&(invoker.chargelevel>0),"BayonetFire1H"); + XZWD YZ 2 A_JumpIf((player.cmd.buttons&BT_ATTACK)&&(invoker.chargelevel>0),"BayonetFire1H"); + XZWE A 2 A_JumpIf((player.cmd.buttons&BT_ATTACK)&&(invoker.chargelevel>0),"BayonetFire1H"); + XZWE B 1 A_StartSound("quadshot/bayonetreturn",CHAN_WEAPON,CHANF_OVERLAP); + XZWE CDEF 1; + XZWE GHIJ 2; + Goto Ready1H; + BayonetFire1H: + #### # 1 A_QuadFire(true); + XZWE KLM 1; + XZWE N 1 A_StartSound("quadshot/bayonetreturn",CHAN_WEAPON,CHANF_OVERLAP); + XZWE OPQR 1; + XZWE STUVW 2; + Goto Ready1H; + Deselect1H: + XZW9 GHIJKLM 2; + XZW9 N -1 A_FullLower(); + Stop; + Reload1H: + XZW9 G 2; + XZWC G 3; + Goto ReloadHold; + ReloadEnd1H: + XZW5 P 2; + XZWC HI 3; + Goto Ready1H; } } diff --git a/zscript/dlc1/swwm_notashotgun_fx.zsc b/zscript/dlc1/swwm_notashotgun_fx.zsc index a77b457b1..b705bcd1c 100644 --- a/zscript/dlc1/swwm_notashotgun_fx.zsc +++ b/zscript/dlc1/swwm_notashotgun_fx.zsc @@ -258,12 +258,13 @@ Class QuadProj : Actor { Vector3 rel = level.Vec3Diff(master.pos,pos); double hdiff = 1.-2.*clamp((rel.z-4.)/master.height,0.,.5); - SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),200000); + SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),200000+special2); } - if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),500000); + if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?150000:500000); SWWMUtility.DoExplosion(self,0,80000+special2,240,80,DE_BLAST|DE_EXTRAZTHRUST); SWWMUtility.DoExplosion(self,100+special1,0,240,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer); - SWWMUtility.DoExplosion(self,150+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer); + if ( SWWMUtility.DoExplosion(self,150+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer) && bAMBUSH && target ) + SWWMUtility.AchievementProgressInc("roast",1,target.player); A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.8); A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.6); A_AlertMonsters(swwm_uncapalert?0:1500); @@ -296,6 +297,13 @@ Class QuadProj : Actor if ( swwm_omnibust ) BusterWall.ProjectileBust(self,150,SWWMUtility.Vec3FromAngles(angle,pitch)); } + override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) + { + // from melee combo + if ( bAMBUSH ) return StringTable.Localize("$O_QUADRAVOL2"); + return Super.GetObituary(victim,inflictor,mod,playerattack); + } + Default { Obituary "$O_QUADRAVOL"; diff --git a/zscript/weapons/swwm_baseweapon_melee.zsc b/zscript/weapons/swwm_baseweapon_melee.zsc index f24934617..3ab88cf48 100644 --- a/zscript/weapons/swwm_baseweapon_melee.zsc +++ b/zscript/weapons/swwm_baseweapon_melee.zsc @@ -371,7 +371,9 @@ extend Class SWWMWeapon MELEE_Vertical = 16, // ring is widened vertically, rather than horizontally MELEE_Wider = 32, // ring is widened by 2.5x rather than 1.5x MELEE_ExtraWide = 64, // if Wider is also specified, widen by 5x, otherwise widen by 3x - MELEE_HammerHit = 128 // is hammer melee (gibbing counts for "HAHA DAB" achievement) + MELEE_HammerHit = 128, // is hammer melee (gibbing counts for "HAHA DAB" achievement) + MELEE_NoRage = 256, // unaffected by ragekit + MELEE_NoUse = 512 // do not pass use actions to this melee }; action void A_Parry( int duration ) @@ -401,7 +403,7 @@ extend Class SWWMWeapon int rings = 1; double step = spread/20.; double range = 1.5*DEFMELEERANGE*rangemul; - bool raging = CountInv("RagekitPower"); + bool raging = (flags&MELEE_NoRage)?false:CountInv("RagekitPower"); double widemul = (flags&MELEE_ExtraWide)?(flags&MELEE_Wider)?5:3:(flags&MELEE_Wider)?2.5:1.5; for ( double i=0; i