Partially implemented Stunner and Impaler (very unfinished).

Switched Impaler fire sound to something more appropriate (proto Skaarj fire).
Add slot priorities to all weapons, final weapons come first.
Adjust hud behavior to properly draw ammo bars by the order of their weapons.
This commit is contained in:
Marisa the Magician 2019-09-16 00:38:38 +02:00
commit fae4f6d50b
31 changed files with 738 additions and 17 deletions

View file

@ -775,6 +775,10 @@ HardwareShader Texture "models/Glass2.png"
Texture "masktex" "models/Glass2_m.png"
Texture "envtex" "models/NyLeve_env.png"
}
HardwareShader Texture "models/ElecFX.png"
{
Shader "shaders/glsl/ElecFX.fp"
}
// PP shaders
HardwareShader PostProcess scene
{

View file

@ -41,3 +41,211 @@ Model "Impaler"
ROTATING
FrameIndex IMPP A 1 0
}
Model "Impaler"
{
Path "models"
Model 2 "Impaler_d.3d"
SurfaceSkin 2 1 "JImpale1.png"
Scale 0.2 -0.2 0.2
AngleOffset 180
Offset 8 -15 -12
DONTCULLBACKFACES
// GemUp
FrameIndex IMGS A 2 42
FrameIndex IMGS B 2 43
FrameIndex IMGS C 2 44
FrameIndex IMGS D 2 45
FrameIndex IMGS E 2 46
// GemIdle
FrameIndex IMGI A 2 47
FrameIndex IMGI B 2 48
FrameIndex IMGI C 2 49
FrameIndex IMGI D 2 50
FrameIndex IMGI E 2 51
FrameIndex IMGI F 2 52
FrameIndex IMGI G 2 53
FrameIndex IMGI H 2 54
// GemDown
FrameIndex IMGD A 2 0
FrameIndex IMGD B 2 1
FrameIndex IMGD C 2 2
FrameIndex IMGD D 2 3
FrameIndex IMGD E 2 4
// GemAltFire
FrameIndex IMGA A 2 55
FrameIndex IMGA B 2 56
FrameIndex IMGA C 2 57
FrameIndex IMGA D 2 58
FrameIndex IMGA E 2 59
FrameIndex IMGA F 2 60
FrameIndex IMGA G 2 61
FrameIndex IMGA H 2 62
// GemAltHold
FrameIndex IMGA I 2 63
FrameIndex IMGA J 2 64
FrameIndex IMGA K 2 65
FrameIndex IMGA L 2 66
FrameIndex IMGA M 2 67
FrameIndex IMGA N 2 68
FrameIndex IMGA O 2 69
FrameIndex IMGA P 2 70
// GemAltRelease
FrameIndex IMGA Q 2 71
FrameIndex IMGA R 2 72
FrameIndex IMGA S 2 73
FrameIndex IMGA T 2 74
FrameIndex IMGA U 2 75
FrameIndex IMGA V 2 76
FrameIndex IMGA W 2 77
FrameIndex IMGA X 2 78
}
Model "Impaler"
{
Path "models"
Model 3 "Impaler_d.3d"
SurfaceSkin 3 2 "ElecFX.png"
Scale 0.2 -0.2 0.2
AngleOffset 180
Offset 8 -15 -12
DONTCULLBACKFACES
// GemUp
FrameIndex IMZS A 3 42
FrameIndex IMZS B 3 43
FrameIndex IMZS C 3 44
FrameIndex IMZS D 3 45
FrameIndex IMZS E 3 46
// GemIdle
FrameIndex IMZI A 3 47
FrameIndex IMZI B 3 48
FrameIndex IMZI C 3 49
FrameIndex IMZI D 3 50
FrameIndex IMZI E 3 51
FrameIndex IMZI F 3 52
FrameIndex IMZI G 3 53
FrameIndex IMZI H 3 54
// GemDown
FrameIndex IMZD A 3 0
FrameIndex IMZD B 3 1
FrameIndex IMZD C 3 2
FrameIndex IMZD D 3 3
FrameIndex IMZD E 3 4
// GemAltFire
FrameIndex IMZA A 3 55
FrameIndex IMZA B 3 56
FrameIndex IMZA C 3 57
FrameIndex IMZA D 3 58
FrameIndex IMZA E 3 59
FrameIndex IMZA F 3 60
FrameIndex IMZA G 3 61
FrameIndex IMZA H 3 62
// GemAltHold
FrameIndex IMZA I 3 63
FrameIndex IMZA J 3 64
FrameIndex IMZA K 3 65
FrameIndex IMZA L 3 66
FrameIndex IMZA M 3 67
FrameIndex IMZA N 3 68
FrameIndex IMZA O 3 69
FrameIndex IMZA P 3 70
// GemAltRelease
FrameIndex IMZA Q 3 71
FrameIndex IMZA R 3 72
FrameIndex IMZA S 3 73
FrameIndex IMZA T 3 74
FrameIndex IMZA U 3 75
FrameIndex IMZA V 3 76
FrameIndex IMZA W 3 77
FrameIndex IMZA X 3 78
}
Model "Impaler"
{
Path "models"
Model 0 "Impaler_d.3d"
SurfaceSkin 0 0 "JImpale1.png"
Scale 0.2 -0.2 0.2
AngleOffset 180
Offset 8 -15 -12
// GemToggle
FrameIndex IMPG A 0 0
FrameIndex IMPG B 0 1
FrameIndex IMPG C 0 2
FrameIndex IMPG D 0 3
FrameIndex IMPG E 0 4
// Down
FrameIndex IMPD A 0 5
FrameIndex IMPD B 0 6
FrameIndex IMPD C 0 7
FrameIndex IMPD D 0 8
FrameIndex IMPD E 0 9
FrameIndex IMPD F 0 10
// Select
FrameIndex IMPS A 0 10
FrameIndex IMPS B 0 11
FrameIndex IMPS C 0 12
FrameIndex IMPS D 0 13
FrameIndex IMPS E 0 14
FrameIndex IMPS F 0 15
// Idle
FrameIndex IMPI A 0 15
FrameIndex IMPI B 0 16
FrameIndex IMPI C 0 17
FrameIndex IMPI D 0 18
FrameIndex IMPI E 0 19
FrameIndex IMPI F 0 20
FrameIndex IMPI G 0 21
FrameIndex IMPI H 0 22
// Fire
FrameIndex IMPF A 0 23
FrameIndex IMPF B 0 24
FrameIndex IMPF C 0 25
FrameIndex IMPF D 0 26
FrameIndex IMPF E 0 27
FrameIndex IMPF F 0 28
FrameIndex IMPF G 0 29
FrameIndex IMPF H 0 30
FrameIndex IMPF I 0 31
// Stab
FrameIndex IMPM A 0 32
FrameIndex IMPM B 0 33
FrameIndex IMPM C 0 34
FrameIndex IMPM D 0 35
FrameIndex IMPM E 0 36
FrameIndex IMPM F 0 37
FrameIndex IMPM G 0 38
FrameIndex IMPM H 0 39
FrameIndex IMPM I 0 40
FrameIndex IMPM J 0 41
// AltFire
FrameIndex IMPA A 0 55
FrameIndex IMPA B 0 56
FrameIndex IMPA C 0 57
FrameIndex IMPA D 0 58
FrameIndex IMPA E 0 59
FrameIndex IMPA F 0 60
FrameIndex IMPA G 0 61
FrameIndex IMPA H 0 62
// AltHold
FrameIndex IMPA I 0 63
FrameIndex IMPA J 0 64
FrameIndex IMPA K 0 65
FrameIndex IMPA L 0 66
FrameIndex IMPA M 0 67
FrameIndex IMPA N 0 68
FrameIndex IMPA O 0 69
FrameIndex IMPA P 0 70
// AltRelease
FrameIndex IMPA Q 0 71
FrameIndex IMPA R 0 72
FrameIndex IMPA S 0 73
FrameIndex IMPA T 0 74
FrameIndex IMPA U 0 75
FrameIndex IMPA V 0 76
FrameIndex IMPA W 0 77
FrameIndex IMPA X 0 78
}

View file

@ -12,3 +12,138 @@ Model "Stunner"
ROTATING
FrameIndex STNP A 1 0
}
Model "Stunner"
{
Path "models"
Model 2 "Stunner_d.3d"
SurfaceSkin 2 0 "Stunner.png"
AngleOffset -90
RollOffset -5
Scale 0.2 -0.2 0.2
Offset 0 -20 -12
DONTCULLBACKFACES
// Sparks
FrameIndex STFF A 2 3
FrameIndex STFF B 2 4
FrameIndex STFF C 2 5
FrameIndex STFF D 2 6
FrameIndex STFF E 2 7
FrameIndex STFF F 2 8
FrameIndex STFF G 2 9
FrameIndex STFF H 2 10
FrameIndex STFF I 2 11
FrameIndex STFF J 2 12
FrameIndex STFF K 2 13
FrameIndex STFF L 2 14
FrameIndex STFF M 2 15
FrameIndex STFF N 2 16
FrameIndex STFF O 2 17
FrameIndex STFF P 2 18
FrameIndex STFF Q 2 19
FrameIndex STFF R 2 20
FrameIndex STFF S 2 21
}
Model "Stunner"
{
Path "models"
Model 0 "Stunner_d.3d"
SurfaceSkin 0 1 "Stunner.png"
AngleOffset -90
RollOffset -5
Scale 0.2 -0.2 0.2
Offset 0 -20 -12
// Idle
FrameIndex STNI A 0 1
// Fire
FrameIndex STNF A 0 2
FrameIndex STNF B 0 3
FrameIndex STNF C 0 4
FrameIndex STNF D 0 5
FrameIndex STNF E 0 6
FrameIndex STNF F 0 7
FrameIndex STNF G 0 8
FrameIndex STNF H 0 9
FrameIndex STNF I 0 10
FrameIndex STNF J 0 11
FrameIndex STNF K 0 12
FrameIndex STNF L 0 13
FrameIndex STNF M 0 14
FrameIndex STNF N 0 15
FrameIndex STNF O 0 16
FrameIndex STNF P 0 17
FrameIndex STNF Q 0 18
FrameIndex STNF R 0 19
FrameIndex STNF S 0 20
FrameIndex STNF T 0 21
// Release
FrameIndex STNR A 0 22
FrameIndex STNR B 0 23
FrameIndex STNR C 0 24
// Hold
FrameIndex STNH A 0 25
FrameIndex STNH B 0 26
FrameIndex STNH C 0 27
FrameIndex STNH D 0 28
FrameIndex STNH E 0 29
FrameIndex STNH F 0 30
FrameIndex STNH G 0 31
FrameIndex STNH H 0 32
FrameIndex STNH I 0 33
FrameIndex STNH J 0 34
FrameIndex STNH K 0 35
FrameIndex STNH L 0 36
FrameIndex STNH M 0 37
FrameIndex STNH N 0 38
FrameIndex STNH O 0 39
FrameIndex STNH P 0 40
FrameIndex STNH Q 0 41
FrameIndex STNH R 0 42
// Down
FrameIndex STND A 0 45
FrameIndex STND B 0 46
FrameIndex STND C 0 47
FrameIndex STND D 0 48
FrameIndex STND E 0 49
FrameIndex STND F 0 50
FrameIndex STND G 0 51
FrameIndex STND H 0 52
FrameIndex STND I 0 53
FrameIndex STND J 0 54
FrameIndex STND K 0 55
FrameIndex STND L 0 56
// Select
FrameIndex STNS A 0 56
FrameIndex STNS B 0 57
FrameIndex STNS C 0 58
FrameIndex STNS D 0 59
FrameIndex STNS E 0 60
FrameIndex STNS F 0 61
FrameIndex STNS G 0 62
FrameIndex STNS H 0 63
FrameIndex STNS I 0 64
FrameIndex STNS J 0 65
FrameIndex STNS K 0 66
FrameIndex STNS L 0 67
FrameIndex STNS M 0 68
FrameIndex STNS N 0 69
FrameIndex STNS O 0 70
FrameIndex STNS P 0 71
FrameIndex STNS Q 0 72
FrameIndex STNS R 0 73
FrameIndex STNS S 0 74
FrameIndex STNS T 0 75
FrameIndex STNS U 0 76
FrameIndex STNS V 0 77
FrameIndex STNS W 0 78
FrameIndex STNS X 0 79
// Release2
FrameIndex STR2 A 0 82
FrameIndex STR2 B 0 83
FrameIndex STR2 C 0 84
FrameIndex STR2 D 0 85
FrameIndex STR2 E 0 86
}

Binary file not shown.

22
shaders/glsl/ElecFX.fp Normal file
View file

@ -0,0 +1,22 @@
vec4 ProcessTexel()
{
vec2 uv = vTexCoord.st;
uv.x += 1.;
float ang = timer*5.;
vec2 uv2 = vec2(uv.x*cos(ang)-uv.y*sin(ang),uv.y*cos(ang)+uv.x*sin(ang))*1.3;
vec4 col = getTexel(fract(uv2));
uv.y -= 2.;
ang = timer*3.;
uv2 = vec2(uv.x*cos(ang)-uv.y*sin(ang),uv.y*cos(ang)+uv.x*sin(ang))*1.5;
col += getTexel(fract(uv2));
uv.x -= 3.;
ang = timer*4.;
uv2 = vec2(uv.x*cos(ang)-uv.y*sin(ang),uv.y*cos(ang)+uv.x*sin(ang))*1.6;
col += getTexel(fract(uv2));
uv.y += 4.;
ang = timer*2.;
uv2 = vec2(uv.x*cos(ang)-uv.y*sin(ang),uv.y*cos(ang)+uv.x*sin(ang))*1.2;
col += getTexel(fract(uv2));
col *= .5;
return col;
}

View file

@ -265,6 +265,25 @@ peace/fly brufly1
telehand/throw peacethr
stun/select stunsel
stun/charge stunchrg
stun/fire stunfire
stun/hit stunhit
impaler/select impsel
impaler/gem impidle
impaler/gemdown impdown
impaler/fire impalerf
impaler/stab1 impstab1
impaler/stab2 impstab2
impaler/stab3 impstab3
$random impaler/stab { impaler/stab1 impaler/stab2 impaler/stab3 }
impaler/flesh impflesh
impaler/wall impwall
impaler/altfire impboltl
impaler/hit imphit
impaler/beam ele04
translator/event transa3
detector/start detact

Binary file not shown.

View file

@ -2,24 +2,24 @@ version "4.3"
#include "zscript/unrealcommon.zsc"
#include "zscript/dispersionpistol.zsc"
#include "zscript/utranslocator.zsc"
#include "zscript/stunner.zsc"
#include "zscript/bonesaw.zsc"
#include "zscript/automag.zsc"
#include "zscript/betamag.zsc"
#include "zscript/stinger.zsc"
#include "zscript/quadshot.zsc"
#include "zscript/asmd.zsc"
#include "zscript/impaler.zsc"
#include "zscript/ueightball.zsc"
#include "zscript/peacemaker.zsc"
#include "zscript/uflakcannon.zsc"
#include "zscript/razorjack.zsc"
#include "zscript/ubiorifle.zsc"
#include "zscript/napalm.zsc"
#include "zscript/flamegun.zsc"
#include "zscript/rifle.zsc"
#include "zscript/uminigun.zsc"
#include "zscript/utranslocator.zsc"
#include "zscript/bonesaw.zsc"
#include "zscript/betamag.zsc"
#include "zscript/quadshot.zsc"
#include "zscript/stunner.zsc"
#include "zscript/flamegun.zsc"
#include "zscript/napalm.zsc"
#include "zscript/impaler.zsc"
#include "zscript/peacemaker.zsc"
#include "zscript/gatling.zsc"
#include "zscript/biggun.zsc"
#include "zscript/uhealitems.zsc"

View file

@ -741,6 +741,7 @@ Class ASMD : UnrealWeapon
Weapon.UpSound "shock/select";
Weapon.SlotNumber 4;
Weapon.SelectionOrder 4;
Weapon.SlotPriority 1;
Weapon.AmmoType "ASMDAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "ASMDAmmo";

View file

@ -273,6 +273,7 @@ Class Automag : UnrealWeapon
Weapon.UpSound "automag/select";
Weapon.SlotNumber 2;
Weapon.SelectionOrder 2;
Weapon.SlotPriority 1;
Weapon.AmmoType "UMiniAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UMiniAmmo";

View file

@ -276,6 +276,7 @@ Class Betamag : UnrealWeapon
Weapon.UpSound "betamag/select";
Weapon.SlotNumber 2;
Weapon.SelectionOrder 1;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "UMiniAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UMiniAmmo";

View file

@ -165,6 +165,7 @@ Class BigGun : UnrealWeapon
Weapon.UpSound "big/select";
Weapon.SlotNumber 9;
Weapon.SelectionOrder 0;
Weapon.SlotPriority 0.8;
Weapon.AmmoType "BigAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "BigAmmo";

View file

@ -48,6 +48,7 @@ Class Bonesaw : UnrealWeapon
Weapon.UpSound "bonesaw/select";
Weapon.SlotNumber 1;
Weapon.SelectionOrder 9;
Weapon.SlotPriority 0.9;
+WEAPON.MELEEWEAPON;
+FORCEPAIN;
+NOEXTREMEDEATH;

View file

@ -73,8 +73,7 @@ Class DefaultAmmo : Ammo
{
Super.Tick();
if ( !Owner ) return;
if ( Amount < 10 ) rechargespeed = 1.1;
else rechargespeed = 0.11*Amount;
rechargespeed = max(1.1,0.11*Amount);
rechargephase += 1./rechargespeed;
if ( rechargephase < 35 ) return;
rechargephase = 0;
@ -664,7 +663,8 @@ Class DispersionPistol : UnrealWeapon
Inventory.PickupMessage "$I_DPISTOL";
Weapon.UpSound "dpistol/select";
Weapon.SlotNumber 1;
Weapon.SelectionOrder 1;
Weapon.SelectionOrder 2;
Weapon.SlotPriority 1;
Weapon.AmmoType "DefaultAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "DefaultAmmo";

View file

@ -15,6 +15,7 @@ Class FlameGun : UnrealWeapon
Weapon.UpSound "flamegun/select";
Weapon.SlotNumber 5;
Weapon.SelectionOrder 2;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "FlameAmmo";
Weapon.AmmoUse 10;
Weapon.AmmoType2 "FlameAmmo";

View file

@ -76,6 +76,7 @@ Class SMiniGun : UnrealWeapon
Weapon.UpSound "smini/select";
Weapon.SlotNumber 0;
Weapon.SelectionOrder 1;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "SMiniAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "SMiniAmmo";

View file

@ -45,6 +45,15 @@ Class ImpalerCharge : Ammo
Class Impaler : UnrealWeapon
{
bool HasGem;
override void DoEffect()
{
Super.DoEffect();
if ( Owner.player.ReadyWeapon != self ) return;
let psp = Owner.player.FindPSprite(-2);
if ( psp ) psp.alpha = clamp(Ammo2.Amount/double(Ammo2.MaxAmount),0.,1.);
}
Default
{
Tag "$T_IMPALER";
@ -52,6 +61,7 @@ Class Impaler : UnrealWeapon
Weapon.UpSound "impaler/select";
Weapon.SlotNumber 7;
Weapon.SelectionOrder 0;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "ImpalerAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "ImpalerCharge";
@ -69,5 +79,144 @@ Class Impaler : UnrealWeapon
Stop;
IMPP B -1;
Stop;
Select:
IMPS A 1 A_Raise(int.max);
Wait;
Ready:
IMPS ABCDEF 3 A_WeaponReady(WRF_NOFIRE);
IMPI A 0 A_JumpIfNoAmmo("Idle");
Goto Reload;
Dummy:
TNT1 A 1
{
let weap = Weapon(invoker);
int flags = 0;
if ( weap.Ammo1.Amount > 0 ) flags |= WRF_ALLOWRELOAD;
if ( weap.Ammo2.Amount <= 0 ) flags |= WRF_NOSECONDARY;
A_WeaponReady(flags);
}
Wait;
Idle:
IMPI A 0 A_Overlay(-9999,"Dummy");
IMPI ABCDEFGH 10;
Goto Idle+1;
Melee:
IMPM A 0 A_Overlay(-9999,"Null");
IMPM ABCDEFGHIJ 2;
Goto Idle;
Fire:
IMPF A 0
{
if ( !invoker.HasGem )
return ResolveState("Melee");
A_Overlay(-9999,"Null");
A_Overlay(-3,"Null");
A_Overlay(-2,"Null");
A_PlaySound("impaler/fire",CHAN_WEAPON);
invoker.HasGem = false;
return ResolveState(null);
}
IMPF ABCDEFGHI 2;
IMPI A 0 A_JumpIfNoAmmo("Idle");
Goto Reload;
AltFire:
IMPA A 0
{
if ( !invoker.HasGem )
return ResolveState("Melee");
A_Overlay(-9999,"Null");
A_Overlay(-3,"GemAltFire");
A_Overlay(-2,"ZapAltFire");
A_PlaySound("impaler/altfire",CHAN_WEAPON,looping:true);
return ResolveState(null);
}
IMPA ABCDEFGH 2;
Goto AltHold;
AltHold:
IMPA IJKLMNOP 2;
Goto AltRelease;
AltRelease:
IMPA Q 0
{
A_Overlay(-3,"GemAltRelease");
A_Overlay(-2,"ZapAltRelease");
A_PlaySound("impaler/gem",CHAN_WEAPON,looping:true);
}
IMPA QRSTUVWX 2;
Goto Idle;
Reload:
IMPG A 0
{
A_Overlay(-9999,"Null");
invoker.HasGem = !invoker.HasGem;
if ( invoker.HasGem )
{
A_Overlay(-3,"GemUp");
A_Overlay(-2,"ZapUp");
A_OverlayFlags(-2,PSPF_RenderStyle|PSPF_Alpha,true);
A_OverlayRenderStyle(-2,STYLE_Add);
A_PlaySound("impaler/gem",CHAN_WEAPON,looping:true);
}
else
{
A_Overlay(-3,"GemDown");
A_Overlay(-2,"ZapDown");
A_PlaySound("impaler/gemdown",CHAN_WEAPON);
}
}
IMPG ABCDE 2;
Goto Idle;
Deselect:
IMPD A 0 A_Overlay(-9999,"Null");
IMPD A 0 A_JumpIf(!invoker.HasGem,"FullDeselect");
IMPG A 0
{
invoker.HasGem = false;
A_Overlay(-3,"GemDown");
A_Overlay(-2,"ZapDown");
A_PlaySound("impaler/gemdown",CHAN_WEAPON);
}
IMPG ABCDE 2;
Goto FullDeselect;
FullDeselect:
IMPD ABCDEF 2;
IMPD F 1 A_Lower(int.max);
Wait;
GemUp:
IMGS ABCDE 2;
Goto GemIdle;
GemIdle:
IMGI ABCDEFGH 10;
Loop;
GemDown:
IMGD ABCDE 2;
Stop;
GemAltFire:
IMGA ABCDEFGH 2;
Goto GemAltHold;
GemAltHold:
IMGA IJKLMNOP 2;
Loop;
GemAltRelease:
IMGA QRSTUVWX 2;
Goto GemIdle;
ZapUp:
IMZS ABCDE 2 Bright;
Goto ZapIdle;
ZapIdle:
IMZI ABCDEFGH 10 Bright;
Loop;
ZapDown:
IMZD ABCDE 2 Bright;
Stop;
ZapAltFire:
IMZA ABCDEFGH 2 Bright;
Goto ZapAltHold;
ZapAltHold:
IMZA IJKLMNOP 2 Bright;
Loop;
ZapAltRelease:
IMZA QRSTUVWX 2 Bright;
Goto ZapIdle;
}
}

View file

@ -36,6 +36,7 @@ Class UFlamethrower : UnrealWeapon
Weapon.UpSound "flamet/select";
Weapon.SlotNumber 6;
Weapon.SelectionOrder 4;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "FlameAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "FlameAmmo";

View file

@ -221,6 +221,7 @@ Class OLSMP : UnrealWeapon
Weapon.UpSound "automag/select";
Weapon.SlotNumber 0;
Weapon.SelectionOrder 9;
Weapon.SlotPriority 0.95;
Weapon.AmmoType "OLSMPAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "OLSMPAmmo";

View file

@ -446,6 +446,7 @@ Class Peacemaker : UnrealWeapon
Weapon.UpSound "peace/select";
Weapon.SlotNumber 8;
Weapon.SelectionOrder 1;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "PeaceAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "PeaceAmmo";

View file

@ -249,6 +249,7 @@ Class QuadShot : UnrealWeapon
Weapon.UpSound "quadshot/select";
Weapon.SlotNumber 3;
Weapon.SelectionOrder 2;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "UShells";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UShells";

View file

@ -246,6 +246,7 @@ Class Razorjack : UnrealWeapon
Weapon.UpSound "ripper/select";
Weapon.SlotNumber 7;
Weapon.SelectionOrder 7;
Weapon.SlotPriority 1;
Weapon.AmmoType "RazorAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "RazorAmmo";

View file

@ -224,6 +224,7 @@ Class URifle : UnrealWeapon
Weapon.UpSound "sniper/select";
Weapon.SlotNumber 9;
Weapon.SelectionOrder 9;
Weapon.SlotPriority 1;
Weapon.AmmoType "URifleAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "URifleAmmo";

View file

@ -494,6 +494,7 @@ Class Stinger : UnrealWeapon
Weapon.UpSound "stinger/select";
Weapon.SlotNumber 3;
Weapon.SelectionOrder 7;
Weapon.SlotPriority 1;
Weapon.AmmoType "StingerAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "StingerAmmo";

View file

@ -14,8 +14,7 @@ Class StunnerAmmo : Ammo
{
Super.Tick();
if ( !Owner ) return;
if ( Amount < 10 ) rechargespeed = 1.1;
else rechargespeed = 0.11*Amount;
rechargespeed = max(2.,.2*Amount);
rechargephase += 1./rechargespeed;
if ( rechargephase < 7 ) return;
rechargephase = 0;
@ -33,6 +32,66 @@ Class StunProj : Actor
Class Stunner : UnrealWeapon
{
double chargesize, count;
bool bCharging;
action void A_StunnerFire()
{
Weapon weap = Weapon(invoker);
if ( !weap ) return;
A_WeaponOffset(0,32);
invoker.bCharging = false;
if ( self is 'UTPlayer' )
UTPlayer(self).PlayAttacking3();
StunnerAmmo(weap.Ammo1).rechargephase = 0;
A_PlaySound("stun/fire",CHAN_WEAPON,Dampener.Active(self)?.4:1.);
double mult = Amplifier.GetMult(self,int(invoker.ChargeSize*50)+50);
invoker.FireEffect();
A_Overlay(-2,"Null");
}
action void A_BeginCharge()
{
let weap = Weapon(invoker);
invoker.bCharging = true;
weap.DepleteAmmo(weap.bAltFire,true,1);
invoker.count = 0;
invoker.chargesize = .6;
A_PlaySound("stun/charge",CHAN_WEAPON,Dampener.Active(self)?.15:1.);
A_Overlay(-2,"Sparks");
A_OverlayFlags(-2,PSPF_RenderStyle,true);
A_OverlayRenderStyle(-2,STYLE_Add);
StunnerAmmo(weap.Ammo1).rechargephase = 0;
if ( !Dampener.Active(self) ) A_AlertMonsters();
}
action State A_ChargeUp()
{
if ( !(player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK)) )
return ResolveState("Release");
Weapon weap = Weapon(invoker);
if ( !weap ) return ResolveState(null);
StunnerAmmo(weap.Ammo1).rechargephase = 0;
UTMainHandler.DoSwing(self,(FRandom[Stunner](-1,1),FRandom[Stunner](-1,1)),0.02*invoker.chargesize,0,2,SWING_Spring);
A_WeaponOffset(FRandom[Stunner](-1,1)*1.2*invoker.chargesize,32+FRandom[Stunner](-1,1)*1.2*invoker.chargesize);
if ( !Dampener.Active(self) ) A_AlertMonsters();
if ( invoker.chargesize >= 6. )
{
invoker.count += 1./35.;
if ( invoker.count > 1.5 ) return ResolveState("Release");
return ResolveState(null);
}
invoker.chargesize += 2./35.;
invoker.count += 1./35.;
if ( invoker.count < 0.14 ) return ResolveState(null);
invoker.count = 0;
if ( !(sv_infiniteammo || (FindInventory('PowerInfiniteAmmo',true))) )
{
if ( weap.Ammo1.Amount < 1 )
return ResolveState("Release");
weap.Ammo1.Amount--;
}
return ResolveState(null);
}
Default
{
Tag "$T_STUNNER";
@ -40,6 +99,7 @@ Class Stunner : UnrealWeapon
Weapon.UpSound "stun/select";
Weapon.SlotNumber 4;
Weapon.SelectionOrder 9;
Weapon.SlotPriority 0.9;
Weapon.AmmoType "StunnerAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "StunnerAmmo";
@ -54,5 +114,46 @@ Class Stunner : UnrealWeapon
Stop;
STNP B -1;
Stop;
Select:
STNS A 1 A_Raise(int.max);
Wait;
Ready:
STNS ABCDEFGHIJKLMNOPQRSTUVWX 2 A_WeaponReady(WRF_NOFIRE);
Goto Idle;
Idle:
STNI A 1
{
A_CheckReload();
let weap = Weapon(invoker);
if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady();
else A_WeaponReady(WRF_NOFIRE);
}
Wait;
Fire:
AltFire:
#### # 2 A_BeginCharge();
STNF ABCDEFGHIJKLMNOPQRST 2 A_ChargeUp();
Goto Hold;
Hold:
STNH R 1 A_ChargeUp();
Wait;
Release:
#### # 2;
STNR A 0 A_StunnerFire();
STNR ABC 1;
STR2 ABCDE 2;
STNF TRPNLJHFDB 1 A_WeaponReady(WRF_NOSWITCH|WRF_DISABLESWITCH);
Goto Idle;
Deselect:
STND ABCDEFGHIJKL 1;
STND L 1 A_Lower(int.max);
Wait;
Sparks:
TNT1 A 8;
STFF ABCDEFGHIJKLMNOPQRS 2 Bright;
STFF J 0 A_JumpIf(invoker.chargesize>=5.,1);
Goto Sparks+10;
STFF JIHGFEDCBA 2 Bright;
Stop;
}
}

View file

@ -668,6 +668,7 @@ Class UBioRifle : UnrealWeapon
Weapon.UpSound "ges/select";
Weapon.SlotNumber 8;
Weapon.SelectionOrder 8;
Weapon.SlotPriority 1;
Weapon.AmmoType "UBioAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UBioAmmo";

View file

@ -495,6 +495,7 @@ Class Eightball : UnrealWeapon
Weapon.UpSound "utrl/select";
Weapon.SlotNumber 5;
Weapon.SelectionOrder 5;
Weapon.SlotPriority 1;
Weapon.AmmoType "URocketAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "URocketAmmo";

View file

@ -291,6 +291,7 @@ Class UFlakCannon : UnrealWeapon
Weapon.UpSound "flak/select";
Weapon.SlotNumber 6;
Weapon.SelectionOrder 4;
Weapon.SlotPriority 1;
Weapon.AmmoType "UFlakBox";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UFlakBox";

View file

@ -150,6 +150,7 @@ Class UMinigun : UnrealWeapon
Weapon.UpSound "minigun/select";
Weapon.SlotNumber 0;
Weapon.SelectionOrder 10;
Weapon.SlotPriority 1;
Weapon.AmmoType "UMiniAmmo";
Weapon.AmmoUse 1;
Weapon.AmmoType2 "UMiniAmmo";

View file

@ -176,7 +176,37 @@ Class UPlayer : UTPlayer
if ( !player.weapons.LocateWeapon(type) ) continue;
readonly<Weapon> def = GetDefaultByType(type);
if ( (giveall == ALL_YESYES) || !def.bCheatNotWeapon )
{
GiveInventory(type,1,true);
if ( (type is 'Automag') && sting_automags )
{
// force akimbo
let t = FindInventory(type);
if ( t ) t.Amount = 2;
}
else if ( (type is 'Betamag') && sting_protomags )
{
// force akimbo
let t = FindInventory(type);
if ( t ) t.Amount = 2;
}
else if ( type is 'DispersionPistol' )
{
// force upgrade
let dsp = DispersionPistol(FindInventory('DispersionPistol'));
if ( dsp )
{
dsp.Ammo1.MaxAmount = 90;
if ( player.ReadyWeapon == dsp )
dsp.pendingupgrade = 4;
else
{
dsp.upgradelevel = 4;
dsp.MainUse = min(6,dsp.upgradelevel+1);
}
}
}
}
}
}
player.PendingWeapon = savedpending;
@ -1154,6 +1184,14 @@ Class UnrealMainHandler : EventHandler
if ( t ) t.Use(false);
}
}
private static bool CmpWeapon( Class<Weapon> a, Class <Weapon> b )
{
let defa = GetDefaultByType(a);
let defb = GetDefaultByType(b);
if ( defa.SlotPriority <= defb.SlotPriority ) return true;
if ( defa.SlotNumber > defb.SlotNumber ) return true;
return false;
}
override void WorldLoaded( WorldEvent e )
{
// More "authentic" Unreal flavor of these edits
@ -1167,8 +1205,9 @@ Class UnrealMainHandler : EventHandler
level.ReplaceTextures("uAlnWl2b","C_WAL19A",0);
level.ReplaceTextures("xAlnWl2b","C_WAL19F",0);
}
// populate ammo-by-slot array
AmmoSlots.Clear();
// populate weapons array
Array<Class<Weapon> > SortedWeapons;
SortedWeapons.Clear();
for ( int i=0; i<AllActorClasses.Size(); i++ )
{
let type = (class<Weapon>)(AllActorClasses[i]);
@ -1179,6 +1218,31 @@ Class UnrealMainHandler : EventHandler
int wslot = def.SlotNumber;
if ( wslot == -1 ) continue;
if ( !def.AmmoType1 ) continue;
SortedWeapons.Push(type);
}
// sort weapons array
for ( int i=0; i<SortedWeapons.Size(); i++ )
{
int j = 1;
while ( j < SortedWeapons.Size() )
{
int k = j;
while ( (k > 0) && CmpWeapon(SortedWeapons[k-1],SortedWeapons[k]) )
{
Class<Weapon> tmp = SortedWeapons[k];
SortedWeapons[k] = SortedWeapons[k-1];
SortedWeapons[k-1] = tmp;
k--;
}
j++;
}
}
// populate ammo-by-slot array
AmmoSlots.Clear();
for ( int i=0; i<SortedWeapons.Size(); i++ )
{
readonly<Weapon> def = GetDefaultByType(SortedWeapons[i]);
int wslot = def.SlotNumber;
int found = -1;
for ( int j=0; j<AmmoSlots.Size(); j++ )
{

View file

@ -225,7 +225,8 @@ Class UTranslocator : UnrealWeapon
Tag "$T_TELEGUN";
Inventory.PickupMessage "$I_TELEGUN";
Weapon.SlotNumber 1;
Weapon.SelectionOrder 10;
Weapon.SelectionOrder 1;
Weapon.SlotPriority 0.1;
Weapon.AmmoType1 "UTranslocatorAmmo";
Weapon.AmmoUse1 1;
Weapon.AmmoType2 "UTranslocatorAmmo";