Quadravol melee and stance swap fully implemented.
Fix quick melee not hitting world geometry (oops).
This commit is contained in:
parent
d5ff3343db
commit
ab462cc05d
8 changed files with 565 additions and 61 deletions
|
|
@ -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-";
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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<spread; i+=step )
|
||||
{
|
||||
|
|
@ -499,38 +501,42 @@ extend Class SWWMWeapon
|
|||
action bool A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1., double spreadmul = 1., double kickmul = 1., int flags = 0 )
|
||||
{
|
||||
let raging = RagekitPower(FindInventory("RagekitPower"));
|
||||
if ( flags&MELEE_NoRage ) raging = null;
|
||||
if ( raging ) rangemul += .2;
|
||||
Vector3 origin = Vec3Offset(0,0,player.viewheight);
|
||||
Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch);
|
||||
// check for usables
|
||||
if ( !invoker.ut ) invoker.ut = new("UseLineTracer");
|
||||
let ut = invoker.ut; // for convenience
|
||||
ut.uses.Clear();
|
||||
ut.Trace(origin,level.PointInSector(origin.xy),dir,DEFMELEERANGE*rangemul,0);
|
||||
invoker.wallponch = true;
|
||||
for ( int i=0; i<ut.uses.Size(); i++ )
|
||||
if ( !(flags&MELEE_NoUse) )
|
||||
{
|
||||
if ( ut.uses[i].hitactor )
|
||||
if ( !invoker.ut ) invoker.ut = new("UseLineTracer");
|
||||
let ut = invoker.ut; // for convenience
|
||||
ut.uses.Clear();
|
||||
ut.Trace(origin,level.PointInSector(origin.xy),dir,DEFMELEERANGE*rangemul,0);
|
||||
invoker.wallponch = true;
|
||||
for ( int i=0; i<ut.uses.Size(); i++ )
|
||||
{
|
||||
// punching is not greeting/patting (that'd be weird)
|
||||
if ( (ut.uses[i].hitactor == self) || (ut.uses[i].hitactor is 'Demolitionist')
|
||||
|| (ut.uses[i].hitactor is 'HeadpatTracker')
|
||||
|| (ut.uses[i].hitactor is 'FroggyChair') ) continue;
|
||||
if ( ut.uses[i].hitactor.Used(self) ) break;
|
||||
}
|
||||
else if ( ut.uses[i].hitline && UseLineTracer.TangibleLine(ut.uses[i]) )
|
||||
{
|
||||
int locknum = SWWMUtility.GetLineLock(ut.uses[i].hitline);
|
||||
if ( !locknum || CheckKeys(locknum,false,true) )
|
||||
ut.uses[i].hitline.RemoteActivate(self,ut.uses[i].hitside,SPAC_Use,ut.uses[i].pos);
|
||||
if ( !(ut.uses[i].hitline.activation&SPAC_UseThrough) ) break;
|
||||
if ( ut.uses[i].hitactor )
|
||||
{
|
||||
// punching is not greeting/patting (that'd be weird)
|
||||
if ( (ut.uses[i].hitactor == self) || (ut.uses[i].hitactor is 'Demolitionist')
|
||||
|| (ut.uses[i].hitactor is 'HeadpatTracker')
|
||||
|| (ut.uses[i].hitactor is 'FroggyChair') ) continue;
|
||||
if ( ut.uses[i].hitactor.Used(self) ) break;
|
||||
}
|
||||
else if ( ut.uses[i].hitline && UseLineTracer.TangibleLine(ut.uses[i]) )
|
||||
{
|
||||
int locknum = SWWMUtility.GetLineLock(ut.uses[i].hitline);
|
||||
if ( !locknum || CheckKeys(locknum,false,true) )
|
||||
ut.uses[i].hitline.RemoteActivate(self,ut.uses[i].hitside,SPAC_Use,ut.uses[i].pos);
|
||||
if ( !(ut.uses[i].hitline.activation&SPAC_UseThrough) ) break;
|
||||
}
|
||||
}
|
||||
invoker.wallponch = false;
|
||||
// check for shootables
|
||||
SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,0);
|
||||
}
|
||||
invoker.wallponch = false;
|
||||
// check for shootables
|
||||
SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,0);
|
||||
bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags);
|
||||
if ( !flags&MELEE_Rip ) return res;
|
||||
if ( res && !(flags&MELEE_Rip) ) return res;
|
||||
// check for walls instead
|
||||
FTranslatedLineTarget t;
|
||||
double slope = AimLineAttack(angle,DEFMELEERANGE*rangemul,t,0.,ALF_CHECK3D);
|
||||
|
|
@ -552,7 +558,7 @@ extend Class SWWMWeapon
|
|||
{
|
||||
HitNormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit();
|
||||
if ( !d.LineSide ) HitNormal *= -1;
|
||||
d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4);
|
||||
if ( !(flags&MELEE_NoUse) ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4);
|
||||
}
|
||||
let p = Spawn(raging?"BigPunchImpact":"PunchImpact",d.HitLocation+HitNormal*4);
|
||||
p.angle = atan2(HitNormal.y,HitNormal.x);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue