diff --git a/ItemLore.md b/ItemLore.md index 9cec467..835e231 100644 --- a/ItemLore.md +++ b/ItemLore.md @@ -170,6 +170,29 @@ sometimes give you additional items like Flares, Seeds and other usables. Identical to Doom Tournament. +## Minigun Sentry + +A big, heavy turret that will gun down any enemies that stand in its view +range. + +Unlike the Light Sentries this one has a much wider range of view and can be +resupplied with extra ammo. Conveniently, you can also recall it to put it back +in your inventory. While carried it will slowly repair any damage it has taken. + +In deathmatch, the Sentry will "switch owners" to whoever last replenished it +with ammunition, like the Turrets in ChaosUT. + +Note: This is an original item that mainly exists as a more polished take on +the previous one. + +## Armor Bonus + +There needed to be an equivalent to Doom Tournament's here. These stack up to +a total of 200. In addition, the more you have, the higher the percentage of +damage they will absorb. + +They have the lowest priority, so all other armors will go down first. + # Prototype Items ## Light & Dark Flares @@ -188,21 +211,6 @@ carry and deploy, but once they're out in the field that's it. They will keep going until they run out of ammo or battery, after which they will self-destruct. -## Minigun Sentry - -A big, heavy turret that will gun down any enemies that stand in its view -range. - -Unlike the Light Sentries this one has a much wider range of view and can be -resupplied with extra ammo. Conveniently, you can also recall it to put it back -in your inventory. While carried it will slowly repair any damage it has taken. - -In deathmatch, the Sentry will "switch owners" to whoever last replenished it -with ammunition, like the Turrets in ChaosUT. - -Note: This is an original item that mainly exists as a more polished take on -the previous one. - ## Motion Detector This pocket device will allow you to spot nearby enemies. In addition each one diff --git a/gldefs.txt b/gldefs.txt index 56bdb89..5c2998f 100644 --- a/gldefs.txt +++ b/gldefs.txt @@ -846,6 +846,10 @@ HardwareShader Texture "models/FlametFX.png" { Shader "shaders/glsl/FlametFX.fp" } +HardwareShader Texture "models/shield.png" +{ + Shader "shaders/glsl/AmbientGlow.fp" +} // PP shaders HardwareShader PostProcess scene { diff --git a/graphics/hud083/armor/Asb083.png b/graphics/hud083/armor/Asb083.png index faf1eff..1ab4c45 100644 Binary files a/graphics/hud083/armor/Asb083.png and b/graphics/hud083/armor/Asb083.png differ diff --git a/graphics/hud083/armor/Belt083.png b/graphics/hud083/armor/Belt083.png index 0eb5a8f..03d4035 100644 Binary files a/graphics/hud083/armor/Belt083.png and b/graphics/hud083/armor/Belt083.png differ diff --git a/graphics/hud083/armor/Bonus083.png b/graphics/hud083/armor/Bonus083.png new file mode 100644 index 0000000..a143876 Binary files /dev/null and b/graphics/hud083/armor/Bonus083.png differ diff --git a/graphics/hud083/armor/Kev083.png b/graphics/hud083/armor/Kev083.png index b6e3a6b..b4841f2 100644 Binary files a/graphics/hud083/armor/Kev083.png and b/graphics/hud083/armor/Kev083.png differ diff --git a/graphics/hud083/armor/Pbelt083.png b/graphics/hud083/armor/Pbelt083.png index f7498c3..21ebf83 100644 Binary files a/graphics/hud083/armor/Pbelt083.png and b/graphics/hud083/armor/Pbelt083.png differ diff --git a/graphics/hud083/armor/Tox083.png b/graphics/hud083/armor/Tox083.png index 14caaca..4faaf72 100644 Binary files a/graphics/hud083/armor/Tox083.png and b/graphics/hud083/armor/Tox083.png differ diff --git a/graphics/icons/I_Bonus.png b/graphics/icons/I_Bonus.png new file mode 100644 index 0000000..1af056f Binary files /dev/null and b/graphics/icons/I_Bonus.png differ diff --git a/modeldef.umisc b/modeldef.umisc index fdde838..817faac 100644 --- a/modeldef.umisc +++ b/modeldef.umisc @@ -786,3 +786,14 @@ Model "SCUBAGear" FrameIndex SCUB A 0 0 } + +Model "UArmorBonus" +{ + Path "models" + Model 0 "ubonus_d.3d" + Skin 0 "shield.png" + Scale 0.08 -0.08 0.096 + AngleOffset 90 + + FrameIndex XANH A 0 0 +} diff --git a/models/shield.png b/models/shield.png new file mode 100644 index 0000000..94f62ec Binary files /dev/null and b/models/shield.png differ diff --git a/models/ubonus_a.3d b/models/ubonus_a.3d new file mode 100644 index 0000000..3330487 Binary files /dev/null and b/models/ubonus_a.3d differ diff --git a/models/ubonus_d.3d b/models/ubonus_d.3d new file mode 100644 index 0000000..57d5df5 Binary files /dev/null and b/models/ubonus_d.3d differ diff --git a/sndinfo.txt b/sndinfo.txt index d734dc5..55ff443 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -172,6 +172,11 @@ stinger/hit bladehit stinger/hit2 ricochet stinger/flesh chunkhit $limit stinger/hit 16 +stinger/explo1 stingex1 +stinger/explo2 stingex2 +stinger/explo3 stingex3 +$random stinger/explode { stinger/explo1 stinger/explo2 stinger/explo3 } +$limit stinger/explode 16 flak/click click @@ -318,8 +323,9 @@ flamegun/fire flamgfir flamegun/end flamgend flamegun/charge flamgabg flamegun/alt flamgalt -flamegun/exp expl04 +flamegun/exp expl2 $limit flamegun/exp 16 +flamegun/exp2 expl04 flamet/select flamtsel flamet/idle flamtidl diff --git a/sounds/MGasp1.ogg b/sounds/MGasp1.ogg index 7b063b7..c2f3522 100644 Binary files a/sounds/MGasp1.ogg and b/sounds/MGasp1.ogg differ diff --git a/sounds/NaplmHit.ogg b/sounds/NaplmHit.ogg index b1762a8..5b6cb61 100644 Binary files a/sounds/NaplmHit.ogg and b/sounds/NaplmHit.ogg differ diff --git a/sounds/StingEx1.ogg b/sounds/StingEx1.ogg new file mode 100644 index 0000000..93123d3 Binary files /dev/null and b/sounds/StingEx1.ogg differ diff --git a/sounds/StingEx2.ogg b/sounds/StingEx2.ogg new file mode 100644 index 0000000..608050a Binary files /dev/null and b/sounds/StingEx2.ogg differ diff --git a/sounds/StingEx3.ogg b/sounds/StingEx3.ogg new file mode 100644 index 0000000..46f7550 Binary files /dev/null and b/sounds/StingEx3.ogg differ diff --git a/sounds/expl2.ogg b/sounds/expl2.ogg new file mode 100644 index 0000000..c8d7297 Binary files /dev/null and b/sounds/expl2.ogg differ diff --git a/sounds/hgasp3f.ogg b/sounds/hgasp3f.ogg index eedc81a..ad4011e 100644 Binary files a/sounds/hgasp3f.ogg and b/sounds/hgasp3f.ogg differ diff --git a/sprites/TPNTA0.png b/sprites/TPNTA0.png new file mode 100644 index 0000000..08b12b6 Binary files /dev/null and b/sprites/TPNTA0.png differ diff --git a/zscript/dispersionpistol.zsc b/zscript/dispersionpistol.zsc index 7700316..75870c4 100644 --- a/zscript/dispersionpistol.zsc +++ b/zscript/dispersionpistol.zsc @@ -503,7 +503,7 @@ Class DispersionPistol : UnrealWeapon } else weap.Ammo1.Amount -= invoker.MainUse; } - DefaultAmmo(weap.Ammo1).rechargephase = ((weap.Ammo1.Amount>0)?0:30); + DefaultAmmo(weap.Ammo1).rechargephase = (((weap.Ammo1.Amount>0)||!deathmatch)?0:30); switch ( ulevel ) { case 0: @@ -568,11 +568,12 @@ Class DispersionPistol : UnrealWeapon invoker.bCharging = false; if ( self is 'UTPlayer' ) UTPlayer(self).PlayAttacking3(); - DefaultAmmo(weap.Ammo1).rechargephase = ((weap.Ammo1.Amount>0)?0:30); + DefaultAmmo(weap.Ammo1).rechargephase = (((weap.Ammo1.Amount>0)||!deathmatch)?0:30); A_PlaySound("dpistol/altfire",CHAN_WEAPON,Dampener.Active(self)?.4:1.); double mult = Amplifier.GetMult(self,int(invoker.ChargeSize*50)+50); invoker.FireEffect(); int ulevel = sting_dpistol?0:invoker.upgradelevel; + if ( weap.Ammo1.Amount < max(10,invoker.MainUse) ) ulevel = 0; Class proj, part; switch ( ulevel ) { @@ -673,8 +674,10 @@ Class DispersionPistol : UnrealWeapon if ( invoker.chargesize >= 5. ) return ResolveState(next); if ( !(sv_infiniteammo || (FindInventory('PowerInfiniteAmmo',true))) ) { - if ( weap.Ammo1.Amount < invoker.ChargeUse ) return ResolveState(next); - weap.Ammo1.Amount -= invoker.ChargeUse; + int use = invoker.ChargeUse; + if ( weap.Ammo1.Amount < max(10,invoker.ChargeUse) ) use = 1; + if ( weap.Ammo1.Amount < use ) return ResolveState(next); + weap.Ammo1.Amount -= use; } return ResolveState(null); } @@ -737,7 +740,7 @@ Class DispersionPistol : UnrealWeapon { A_CheckReload(); let weap = Weapon(invoker); - if ( weap && weap.Ammo1.Amount > 0 ) A_WeaponReady(); + if ( weap && (weap.Ammo1.Amount > 0) ) A_WeaponReady(); else A_WeaponReady(WRF_NOFIRE); } TNT1 A 1 @@ -815,6 +818,10 @@ Class DispersionPistol : UnrealWeapon #### # 0 { invoker.chargesize = invoker.count = 0.; + let weap = Weapon(invoker); + if ( weap.Ammo1.Amount < max(10,invoker.ChargeUse) ) + weap.Ammo1.Amount--; + else weap.Ammo1.Amount -= invoker.ChargeUse; invoker.bCharging = true; // need to make sure player does the repeat fire anim if ( self is 'UPlayer' ) diff --git a/zscript/flamegun.zsc b/zscript/flamegun.zsc index 5d57c86..ca5928c 100644 --- a/zscript/flamegun.zsc +++ b/zscript/flamegun.zsc @@ -43,7 +43,7 @@ Class UFireTrail : Actor Class UFireball : Actor { Vector3 Acceleration; - double spreadf; + double spreadf, maxspeed; int ns, nsp; property SpreadFactor : spreadf; @@ -66,22 +66,24 @@ Class UFireball : Actor UFireball.SpreadFactor 0.2; UFireball.NumSmokes 1; UFireball.NumSparks 2; + DeathSound "flamegun/exp"; } override void PostBeginPlay() { Super.PostBeginPlay(); + maxspeed = 30.; if ( bAMBUSH ) return; let l = Spawn("UFireTrail",pos); l.target = self; Acceleration = vel.unit()*50; - A_PlaySound("eightball/fly",CHAN_VOICE,1.0,true,3.,pitch:1.5); + A_PlaySound("eightball/fly",CHAN_VOICE,.6,true,3.,pitch:1.5); } action void A_Spread() { vel += invoker.Acceleration/TICRATE; vel += (FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1))*FRandom[EWizFX](.5,1.)*invoker.spreadf; Vector3 dir = vel.unit(); - if ( vel.length() > 30. ) vel = dir*30.; + if ( vel.length() > invoker.maxspeed ) vel = dir*invoker.maxspeed; angle = atan2(dir.y,dir.x); pitch = asin(-dir.z); if ( waterlevel > 0 ) @@ -102,6 +104,7 @@ Class UFireball : Actor } for ( int i=0; i rad+t.radius) ) continue; - int amt = max(1,int(alpha*10)); + int amt = max(1,int(alpha*5)); OnFire.Apply(t,master,amt); } } @@ -242,7 +242,7 @@ Class UFlame : Actor Speed 20; Radius 4; Height 4; - Alpha 0.2; + Alpha 0.4; Scale 0.1; +NOBLOCKMAP; +NOGRAVITY; @@ -254,6 +254,7 @@ Class UFlame : Actor +FORCEXYBILLBOARD; +DROPOFF; +NOBLOCKMONST; + //+THRUIMPASSABLE; // gonna have to implement this } States { @@ -261,8 +262,8 @@ Class UFlame : Actor SEXP AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTT 1 Bright { A_Flame(); - A_SetScale(scale.x*1.08); - A_FadeOut(0.005); + A_SetScale(scale.x*1.01+0.04); + A_FadeOut(0.01); } Stop; } @@ -803,7 +804,7 @@ Class UFlamethrower : UnrealWeapon Vector3 x, y, z, x2, y2, z2; [x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),15*x+2.3*y-2.7*z); - for ( int i=0; i<2; i++ ) + //for ( int i=0; i<2; i++ ) { double a = FRandom[FlameT](0,360), s = FRandom[FlameT](0,.05); [x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll); @@ -821,7 +822,7 @@ Class UFlamethrower : UnrealWeapon p.vel = vel*.5+(cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed*FRandom[FlameT](0.3,0.6); p.vel.z -= 3; p.target = self; - continue; + //continue; } p.angle = atan2(dir.y,dir.x); p.pitch = asin(-dir.z); diff --git a/zscript/stinger.zsc b/zscript/stinger.zsc index b927a8b..9cacac8 100644 --- a/zscript/stinger.zsc +++ b/zscript/stinger.zsc @@ -173,9 +173,14 @@ Class TarydiumExplosion : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - A_Explode(special1,int(90*scale.x)); - UTMainHandler.DoBlast(self,90*scale.x,90000); - A_PlaySound("flare/explode"); + A_Explode(max(10,special1),90+special1); + UTMainHandler.DoBlast(self,90+special1,900*special1); + UTMainHandler.DoBlast(self,200+special1,200*special1); // hurtless secondary blast, so stuff that's pretty close by gets pushed away + // (just going off the novels here, it's supposed to be pretty strong) + A_QuakeEx(clamp(special1/6,2,9),clamp(special1/6,2,9),clamp(special1/6,2,9),10,0,300+special1*2,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200+special1*2,rollIntensity:0.12); + SetOrigin(Vec3Offset(0,0,16),false); + A_PlaySound("stinger/explode",CHAN_VOICE,pitch:FRandom[Stinger](0.8,1.5)); + A_PlaySound("stinger/explode",CHAN_ITEM,pitch:FRandom[Stinger](0.8,1.5)); let l = Spawn("TarydiumExLight",pos); l.args[3] = int(60*scale.x); scale.x *= RandomPick[Stinger](-1,1); @@ -236,10 +241,10 @@ Class TDebuffLight : PointLightAttenuated Destroy(); return; } - Args[0] = min(dbf.Amount,64); - Args[1] = min(dbf.Amount*3,192); - Args[2] = min(dbf.Amount*4,255); - Args[3] = int(max(dbf.victim.radius,dbf.victim.height))+60+min(dbf.amount/4,40); + Args[0] = int(min(dbf.Amount,64)); + Args[1] = int(min(dbf.Amount*3,192)); + Args[2] = int(min(dbf.Amount*4,255)); + Args[3] = int(max(dbf.victim.radius,dbf.victim.height)+60+min(dbf.amount/4,40)); SetOrigin(dbf.Victim.Vec3Offset(0,0,dbf.Victim.Height/2),true); } } @@ -247,76 +252,78 @@ Class TDebuffLight : PointLightAttenuated Class TarydiumDebuff : Thinker { Actor victim, instigator, lite; - int amount; // accumulated damage for the explosion + double amount; // accumulated damage for the explosion Vector3 oldvel; - bool wasonair, reentrant; + bool wasonair, exploding; + int explodetimer; void UpdateEffect() { - if ( !victim ) - { - BlowUp(); - return; - } + if ( !victim ) return; if ( !lite ) { lite = Actor.Spawn("TDebuffLight",victim.pos); TDebuffLight(lite).dbf = self; - lite.Args[0] = min(Amount,64); - lite.Args[1] = min(Amount*3,192); - lite.Args[2] = min(Amount*4,255); - lite.Args[3] = int(max(victim.radius,victim.height))+60+min(amount/4,40); - } - if ( Random[Stinger](0,amount) > 100 ) - { - amount += 30; - BlowUp(); + lite.Args[0] = int(min(Amount,64)); + lite.Args[1] = int(min(Amount*3,192)); + lite.Args[2] = int(min(Amount*4,255)); + lite.Args[3] = int(max(victim.radius,victim.height)+60+min(amount/4,40)); } } void BlowUp() { - reentrant = true; - let b = victim.Spawn("TarydiumExplosion",victim.Vec3Offset(0,0,victim.default.height/2)); + let b = victim.Spawn("TarydiumExplosion",victim.Vec3Offset(FRandom[Stinger](-victim.radius,victim.radius),FRandom[Stinger](-victim.radius,victim.radius),FRandom[Stinger](0,victim.height))); b.target = instigator; - b.special1 = amount; - b.scale *= 1.+min(1.5,amount*0.02); - Destroy(); + b.special1 = int(amount); // in Unreal this was capped to 10, which would make it deal barely any damage + b.scale *= .8+min(1.,amount*0.01); + amount = amount*0.9-10; // in Unreal this falls off linearly 10 points at a time, which can take very long at full charge + } + + override void OnDestroy() + { + if ( lite ) lite.Destroy(); + Super.OnDestroy(); } override void Tick() { - if ( !sting_stinger ) + if ( !sting_stinger || !victim || (amount <= .4) ) { Destroy(); return; } - if ( !victim || (victim.Health <= 0) ) + if ( exploding ) { + explodetimer--; + if ( explodetimer > 0 ) return; + explodetimer = Random[Stinger](3,6); BlowUp(); return; } + if ( victim.Health <= 0 ) + { + exploding = true; + return; + } if ( victim.pos.z > victim.floorz ) wasonair = true; else { if ( wasonair && (oldvel.z < -20) ) { Amount += min(int(-oldvel.z),100); - BlowUp(); + exploding = true; return; } wasonair = false; } oldvel = victim.vel; - if ( !(level.maptime%20) ) + amount *= 1.-.04/TICRATE; + UpdateEffect(); + if ( amount <= .4 ) { - amount--; - UpdateEffect(); - if ( amount <= 0 ) - { - Destroy(); - return; - } + Destroy(); + return; } if ( level.maptime%3 ) return; int numpt = clamp(int(Random[Stinger](1,3)*amount*0.02),1,8); @@ -340,7 +347,7 @@ Class TarydiumDebuff : Thinker } } - static void Apply( Actor victim, Actor instigator, int amount ) + static void Apply( Actor victim, Actor instigator, double amount ) { if ( !victim || (victim.Health <= 0) || !victim.bISMONSTER ) return; if ( !sting_stinger ) return; @@ -446,7 +453,11 @@ Class StingerProjectile : Actor target.SpawnBlood(pos,AngleTo(target),damage); A_PlaySound("stinger/flesh"); A_AlertMonsters(); - if ( sting_stinger ) TarydiumDebuff.Apply(target,self.target,damage/4); + if ( sting_stinger ) + { + TarydiumDebuff.Apply(target,self.target,10); + damage = 2; + } } return damage; } diff --git a/zscript/uarmoritems.zsc b/zscript/uarmoritems.zsc index f8366f3..368f710 100644 --- a/zscript/uarmoritems.zsc +++ b/zscript/uarmoritems.zsc @@ -247,3 +247,32 @@ Class PowerShield : UnrealArmor Stop; } } + +Class UArmorBonus : UArmor +{ + override void AbsorbDamage( int damage, Name damageType, out int newdamage ) + { + absorb = Clamp(Amount-50,25,100); + Super.AbsorbDamage(damage,damageType,newdamage); + } + Default + { + Tag "$T_ARMORBONUS"; + +COUNTITEM; + +INVENTORY.ALWAYSPICKUP; + Inventory.Amount 5; + Inventory.MaxAmount 200; + Inventory.InterHubAmount 200; + UTArmor.ArmorAbsorption 25; + UnrealArmor.AbsorptionPriority 1; + Inventory.PickupMessage "$I_ARMORBONUS"; + Inventory.PickupSound "misc/u1armor"; + Inventory.Icon "I_Bonus"; + } + States + { + Spawn: + XANH A -1; + Stop; + } +} diff --git a/zscript/uhealitems.zsc b/zscript/uhealitems.zsc index 12eea57..eccf989 100644 --- a/zscript/uhealitems.zsc +++ b/zscript/uhealitems.zsc @@ -8,6 +8,10 @@ Class Bandages : Health Inventory.PickupSound "misc/u1heal"; Inventory.RespawnTics 700; } + override String PickupMessage() + { + return String.Format("%s +%d",PickupMsg,Amount); + } States { Spawn: @@ -26,6 +30,10 @@ Class UHealth : Health Inventory.PickupSound "misc/u1heal"; Inventory.RespawnTics 700; } + override String PickupMessage() + { + return String.Format("%s +%d",PickupMsg,Amount); + } States { Spawn: @@ -40,12 +48,15 @@ Class NaliFruit : Health Default { Tag "$T_FRUIT"; - Scale 0.05; - Inventory.Amount 0; + Inventory.Amount 29; Inventory.PickupMessage "$I_FRUIT"; Inventory.PickupSound "misc/u1heal"; Inventory.RespawnTics 175; } + override String PickupMessage() + { + return String.Format("%s +%d",PickupMsg,Amount); + } override bool TryPickup( in out Actor toucher ) { if ( Amount < 2 ) return false; @@ -54,7 +65,7 @@ Class NaliFruit : Health override void Tick() { Super.Tick(); - if ( !InStateSequence(CurState,FindState("Spawn")) ) return; + if ( !InStateSequence(CurState,FindState("Grow")) ) return; if ( frame > 25 ) return; cnt++; if ( cnt < 300 ) return; @@ -63,8 +74,12 @@ Class NaliFruit : Health States { Spawn: - FRUT A 0 NoDelay + FRUT \[ 12; + Loop; + Grow: + FRUT A 0 { + A_SetScale(0.05); invoker.Amount = 0; invoker.cnt = 0; } @@ -76,8 +91,7 @@ Class NaliFruit : Health A_SetTics(Random[Fruit](1,3)*35); } FRUT BCDEFGHIJKLMNOPQRSTUVWXYZ 32; - FRUT \[ 12; - Goto Spawn+29; + Goto Spawn; } } @@ -163,6 +177,7 @@ Class SeedProj : Actor if ( Scale.x <= 0.05 ) { let f = Spawn("NaliFruit",pos); + f.SetStateLabel("Grow"); f.angle = Random[Fruit](0,359); Destroy(); } @@ -217,6 +232,7 @@ Class SuperHealth : Health Inventory.PickupSound "misc/u1heal"; Inventory.RespawnTics 3500; } + // this one doesn't print the heal amount override void PostBeginPlay() { Super.PostBeginPlay(); diff --git a/zscript/unrealcommon.zsc b/zscript/unrealcommon.zsc index 3c1307c..e3897c9 100644 --- a/zscript/unrealcommon.zsc +++ b/zscript/unrealcommon.zsc @@ -143,6 +143,7 @@ Class UPlayer : UTPlayer if ( !(AllActorClasses[i].GetParentClass() is "UnrealArmor") ) continue; let item = Inventory(Spawn(AllActorClasses[i])); item.ClearCounters(); // don't increase item counts + item.Amount = item.MaxAmount; if ( !item.CallTryPickup(self) ) item.Destroy(); } if ( !giveall ) return; @@ -761,8 +762,9 @@ Class UTeleportFog : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - Spawn("UTTeleportLight",pos+(0,0,16)); - A_PlaySound ("misc/teleport"); + Spawn("UTTeleportLight",Vec3Offset(0,0,16)); + A_PlaySound("misc/teleport",volume:.5); + Spawn("UTeleportParticles",Vec3Offset(0,0,16)); } States { @@ -772,6 +774,31 @@ Class UTeleportFog : Actor } } +Class UTeleportParticles : UTParticleMesh +{ + Default + { + Tag "telepo;UTeleParticle"; + Args 21; + ReactionTime 35; + XScale 0.06; + YScale 0.16; + } +} +Class UTeleParticle : UTMeshParticle +{ + Default + { + Scale 0.2; + } + States + { + Spawn: + TPNT A -1 Bright; + Stop; + } +} + Class UnrealWeapon : UTWeapon { override void FireEffect() @@ -892,9 +919,11 @@ Class UnrealMainHandler : EventHandler TarydiumDebuff t; while ( t = TarydiumDebuff(ti.Next()) ) { - if ( (t.victim != e.Thing) || t.reentrant ) continue; // make sure to skip any debuffs that already blew up to prevent infinite recursion on chain reactions - t.Amount += e.Damage/2; - t.BlowUp(); + if ( (t.victim != e.Thing) || t.exploding ) continue; // make sure to skip any debuffs that already blew up to prevent infinite recursion on chain reactions + t.Amount += e.Damage; + // stunner/asmd and others deal extra explosive charge + if ( e.DamageType == 'jolted' ) t.Amount += 50+e.Damage; + t.exploding = true; break; } } @@ -1082,21 +1111,21 @@ Class UnrealMainHandler : EventHandler else if ( e.Replacee == 'RadSuit' ) e.Replacement = 'UJumpBoots'; else if ( e.Replacee == 'ArtiFly' ) e.Replacement = 'UJumpBoots'; else if ( (e.Replacee == 'Backpack') || (e.Replacee == 'BagOfHolding') ) e.Replacement = 'UnrealBackpack'; - else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') ) e.Replacement = 'Flare'; + else if ( (e.Replacee == 'ArmorBonus') || (e.Replacee == 'ArtiTimeBomb') ) + { + if ( Random[Replacements](0,3) ) e.Replacement = 'UArmorBonus'; + else e.Replacement = 'Flare'; + } else if ( (e.Replacee == 'HealthBonus') || (e.Replacee == 'CrystalVial') ) e.Replacement = 'Bandages'; else if ( (e.Replacee == 'GreenArmor') || (e.Replacee == 'Silvershield') ) e.Replacement = 'KevlarSuit'; else if ( (e.Replacee == 'BlueArmor') || (e.Replacee == 'EnchantedShield') ) e.Replacement = 'UArmor'; - else if ( e.Replacee == 'Stimpack' ) + else if ( (e.Replacee == 'Stimpack') || (e.Replacee == 'ArtiHealth') ) { - if ( !Random[Replacements](0,2) ) e.Replacement = 'UHealth'; + if ( Random[Replacements](0,1) ) e.Replacement = 'UHealth'; + else if ( Random[Replacements](0,2) ) e.Replacement = 'NaliFruit'; else e.Replacement = 'Seeds'; } else if ( e.Replacee == 'Medikit' ) e.Replacement = 'UHealth'; - else if ( e.Replacee == 'ArtiHealth' ) - { - if ( !Random[Replacements](0,2) ) e.Replacement = 'UHealth'; - else e.Replacement = 'Seeds'; - } else if ( e.Replacee == 'ArtiTeleport' ) { // I have no idea what to replace this with, so just have some random stuff @@ -1121,7 +1150,7 @@ Class UnrealMainHandler : EventHandler e.Replacement = 'VoiceBox'; break; case 6: - e.Replacement = 'SentryItem'; + e.Replacement = 'SentryGunItem'; break; case 7: e.Replacement = 'Peacemaker'; diff --git a/zscript/unrealhud.zsc b/zscript/unrealhud.zsc index 9fce7d6..ad3a9f2 100644 --- a/zscript/unrealhud.zsc +++ b/zscript/unrealhud.zsc @@ -38,8 +38,8 @@ Class UnrealHUD : BaseStatusBar // 0.83 HUD stuff String OldAmmo[19]; Class OldAmmoType[19]; - String OldArmor[6]; - Class OldArmorType[6]; + String OldArmor[7]; + Class OldArmorType[7]; String OldKeys[7]; HUDFont mOldDigits, mOldDigitsSmall; Font OldLargeFont, OldSmallFont; @@ -134,12 +134,14 @@ Class UnrealHUD : BaseStatusBar OldArmor[3] = "Tox083"; OldArmor[4] = "Belt083"; OldArmor[5] = "Pbelt083"; + OldArmor[6] = "Bonus083"; OldArmorType[0] = "UArmor"; OldArmorType[1] = "KevlarSuit"; OldArmorType[2] = "AsbestosSuit"; OldArmorType[3] = "ToxinSuit"; OldArmorType[4] = "ShieldBelt"; OldArmorType[5] = "PowerShield"; + OldArmorType[6] = "UArmorBonus"; OldKeys[0] = "Redk083"; OldKeys[1] = "Bluek083"; OldKeys[2] = "Goldk083";