diff --git a/language.def_base b/language.def_base index 7bf843cb3..cb15a4843 100644 --- a/language.def_base +++ b/language.def_base @@ -696,6 +696,7 @@ SWWM_LOVED_ALT = "F\cg♥\c-CK NAZIS"; SWWM_FROGGED = "RIBBIT"; SWWM_PARRY = "Parry"; SWWM_PPARRY = "Perfect Parry"; +SWWM_TRESPAWN = "\cu[\cf%ds\c- to respawn\cu]\c-"; // score messages SWWM_FINDSECRET = "\cf%s\cf found a secret. +%d\c-"; SWWM_FINDKEY = "\cf%s\cf got the %s\cf. +%d\c-"; diff --git a/language.es_base b/language.es_base index 0680adff4..3ef8b439d 100644 --- a/language.es_base +++ b/language.es_base @@ -598,6 +598,7 @@ SWWM_BUTTSLAM = "Culazo"; SWWM_FROGGED = "CROAC"; SWWM_PARRY = "Parada"; SWWM_PPARRY = "Parada Perfecta"; +SWWM_TRESPAWN = "\cu[\cf%ds\c- para reaparecer\cu]\c-"; // score messages SWWM_FINDSECRET = "\cf%s\cf encontró un secreto. +%d\c-"; SWWM_FINDKEY = "\cf%s\cf obtuvo la %s\cf. +%d\c-"; diff --git a/language.version b/language.version index df260f413..5e4ecda8d 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r505 \cu(Sun 23 May 10:32:23 CEST 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r505 \cu(2021-05-23 10:32:23)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r505 \cu(Sun 23 May 14:05:28 CEST 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r505 \cu(2021-05-23 14:05:28)\c-"; diff --git a/zscript/dlc1/swwm_ammoitems_dlc.zsc b/zscript/dlc1/swwm_ammoitems_dlc.zsc index 889ad52ee..f41b9ca47 100644 --- a/zscript/dlc1/swwm_ammoitems_dlc.zsc +++ b/zscript/dlc1/swwm_ammoitems_dlc.zsc @@ -6,6 +6,7 @@ Class SMW05Ammo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -46,6 +47,7 @@ Class SMW05BundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -72,6 +74,7 @@ Class SheenAmmo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; override string PickupMessage() { @@ -136,6 +139,7 @@ Class QuadravolAmmo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -183,6 +187,7 @@ Class QuadravolAmmoBundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -193,6 +198,7 @@ Class DarkCanister : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -274,6 +280,7 @@ Class EMPCoreBundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -317,6 +324,7 @@ Class RayBoltBundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -327,6 +335,7 @@ Class RayAmmo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -361,6 +370,7 @@ Class RayBattery : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -418,6 +428,7 @@ Class GrandAmmo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index ec57cb0c5..cf9a774c9 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -732,6 +732,11 @@ Class SWWMStatusBar : BaseStatusBar Screen.DrawText(fnt,s.vipitem?Font.CR_PURPLE:s.scoreitem?Font.CR_GOLD:Font.CR_GREEN,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y-hsd.y*fnt.GetHeight()/2.)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); tag = String.Format("\cu(%s\cu)\c-",FormatDist(tdir.length())); Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y+hsd.y*fnt.GetHeight()/2.)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); + if ( s.item is 'SWWMRespawnTimer' ) + { + tag = String.Format(StringTable.Localize("$SWWM_TRESPAWN"),s.item.special2/GameTicRate); + Screen.DrawText(fnt,Font.CR_WHITE,(vpos.x-hsd.x*fnt.StringWidth(tag)/2.)/hsd.x,(vpos.y+hsd.y*fnt.GetHeight()*2)/hsd.y,tag,DTA_VirtualWidthF,ssd.x,DTA_VirtualHeightF,ssd.y,DTA_KeepRatio,true,DTA_Alpha,alph,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); + } } } // targetting array @@ -1570,6 +1575,7 @@ Class SWWMStatusBar : BaseStatusBar yy += 3; } // draw key icons + if ( deathmatch ) return; Vector2 keypos = (ss.x-(margin+2),yy); int colc = 0; double colh = 0; diff --git a/zscript/items/swwm_ammoextra.zsc b/zscript/items/swwm_ammoextra.zsc index bc84c41fe..f1ee9ca3b 100644 --- a/zscript/items/swwm_ammoextra.zsc +++ b/zscript/items/swwm_ammoextra.zsc @@ -6,6 +6,7 @@ Class AmmoFabricator : Inventory abstract { Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; int budget, pertype, maxunitprice; @@ -307,6 +308,7 @@ Class HammerspaceEmbiggener : Inventory { Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; override Inventory CreateCopy( Actor other ) { diff --git a/zscript/items/swwm_ammoitems.zsc b/zscript/items/swwm_ammoitems.zsc index 0d8d7a436..147934c19 100644 --- a/zscript/items/swwm_ammoitems.zsc +++ b/zscript/items/swwm_ammoitems.zsc @@ -8,6 +8,7 @@ Class RedShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -55,6 +56,7 @@ Class GreenShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -102,6 +104,7 @@ Class WhiteShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -148,6 +151,7 @@ Class BlueShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -195,6 +199,7 @@ Class BlackShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -242,6 +247,7 @@ Class PurpleShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -323,6 +329,7 @@ Class GoldShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; action void A_GoldShellTrail() { @@ -379,6 +386,7 @@ Class EvisceratorShell : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -439,6 +447,7 @@ Class EvisceratorTrioSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -453,6 +462,7 @@ Class HellblazerMissiles : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -511,6 +521,7 @@ Class HellblazerMissileTrioSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -521,6 +532,7 @@ Class HellblazerCrackshots : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -568,6 +580,7 @@ Class HellblazerRavagers : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -615,6 +628,7 @@ Class HellblazerWarheads : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -666,6 +680,7 @@ Class SparkUnit : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -706,6 +721,7 @@ Class SilverBulletAmmo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -753,6 +769,7 @@ Class SilverBulletAmmo2 : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -858,6 +875,7 @@ Class SilverBulletsBundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -880,6 +898,7 @@ Class SilverBullets2BundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -894,6 +913,7 @@ Class CandyGunAmmo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { @@ -976,6 +996,7 @@ Class CandyGunBulletsBundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } @@ -1023,6 +1044,7 @@ Class YnykronAmmo : Ammo Mixin SWWMAmmo; Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Default { diff --git a/zscript/items/swwm_armor.zsc b/zscript/items/swwm_armor.zsc index 87faab099..6804e1f7b 100644 --- a/zscript/items/swwm_armor.zsc +++ b/zscript/items/swwm_armor.zsc @@ -69,6 +69,7 @@ Class ArmorNuggetBundleSpawn : Actor a.bCOUNTSECRET = true; level.total_secrets++; } + a.bDROPPED = bDROPPED; } Destroy(); } diff --git a/zscript/items/swwm_baseammo.zsc b/zscript/items/swwm_baseammo.zsc index 21653801c..7cdab453f 100644 --- a/zscript/items/swwm_baseammo.zsc +++ b/zscript/items/swwm_baseammo.zsc @@ -184,6 +184,7 @@ Class MagAmmo : Inventory abstract { Mixin SWWMOverlapPickupSound; Mixin SWWMUseToPickup; + Mixin SWWMRespawn; Class ParentAmmo; Ammo pamo; diff --git a/zscript/items/swwm_basearmor.zsc b/zscript/items/swwm_basearmor.zsc index 4722083b8..0737bbf60 100644 --- a/zscript/items/swwm_basearmor.zsc +++ b/zscript/items/swwm_basearmor.zsc @@ -152,6 +152,7 @@ Class SWWMSpareArmor : Inventory abstract Mixin SWWMAutoUseFix; Mixin SWWMUseToPickup; Mixin SWWMOverlapPickupSound; + Mixin SWWMRespawn; Class giveme; diff --git a/zscript/items/swwm_basehealth.zsc b/zscript/items/swwm_basehealth.zsc index 4ad3859c8..13d1dfb15 100644 --- a/zscript/items/swwm_basehealth.zsc +++ b/zscript/items/swwm_basehealth.zsc @@ -4,6 +4,7 @@ Class SWWMHealth : Inventory abstract Mixin SWWMAutoUseFix; Mixin SWWMUseToPickup; Mixin SWWMOverlapPickupSound; + Mixin SWWMRespawn; // can't use the Health class for whatever reason // nice parser you got there I guess? diff --git a/zscript/items/swwm_baseitem.zsc b/zscript/items/swwm_baseitem.zsc index 9756b1d61..0b7fd9755 100644 --- a/zscript/items/swwm_baseitem.zsc +++ b/zscript/items/swwm_baseitem.zsc @@ -86,3 +86,86 @@ Mixin Class SWWMOverlapPickupSound toucher.A_StartSound(PickupSound,CHAN_ITEM,flags,1.,atten); } } + +Class SWWMRespawnTimer : Actor +{ + default + { + +NOGRAVITY; + +NOINTERACTION; + +DONTSPLASH; + +NOTELEPORT; + Radius .1; + Height 0.; + Args 0,3,2; + } + override void PostBeginPlay() + { + args[3] = Random[ExploS](0,30); + if ( !Inventory(tracer) || !Inventory(tracer).PickupFlash ) return; + // copy pickup flash color + let fog = GetDefaultByType(Inventory(tracer).PickupFlash); + for ( int i=0; i<3; i++ ) args[i] = fog.args[i+1]; + } + override void Tick() + { + if ( !tracer || !tracer.InStateSequence(tracer.CurState,tracer.FindState("HideDoomish")) ) + { + Destroy(); + return; + } + special2 = tracer.tics; + if ( isFrozen() ) return; + double str = 1.-special2/double(special1); + int freq = int(clamp(30*(1.-str),3,30)); + if ( (level.maptime+args[3])%freq ) return; + int numpt = int(Random[ExploS](0,10)*str); + for ( int i=0; i pc = invlist[i].Species; - if ( !pc ) continue; - for ( int j=0; j= j ) i--; + let k = Key(players[consoleplayer].mo.FindInventory(Key.GetKeyType(i))); + if ( !k ) continue; + invlist.Push(k); + } + // because we can't call GetReplacement from ui, let's wrangle something real ugly here to clean up replaced keys + for ( int i=0; i pc = invlist[i].Species; + if ( !pc ) continue; + for ( int j=0; j= j ) i--; + } } } // collectibles, sorted by name diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 2edb7c134..ccf9537f7 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -507,7 +507,7 @@ Class Demolitionist : PlayerPawn while ( bt.Next() ) { let i = bt.Thing; - if ( !i || (!(i is 'Inventory') && !(i is 'Chancebox')) ) continue; + if ( !i || (!(i is 'Inventory') && !(i is 'Chancebox') && !(i is 'SWWMRespawnTimer')) ) continue; if ( (i is 'Inventory') && (i.bINVISIBLE || !i.bSPECIAL || Inventory(i).Owner) ) continue; if ( (i is 'Chancebox') && (i.CurState != i.SpawnState) ) continue; if ( !SWWMUtility.SphereIntersect(i,pos,800) ) continue; diff --git a/zscript/swwm_thinkers_hud.zsc b/zscript/swwm_thinkers_hud.zsc index 2281dc784..8f76dfe90 100644 --- a/zscript/swwm_thinkers_hud.zsc +++ b/zscript/swwm_thinkers_hud.zsc @@ -206,8 +206,16 @@ Class SWWMItemSense : Thinker let i = new("SWWMItemSense"); i.ChangeStatNum(STAT_USER); i.item = item; - i.scoreitem = SWWMUtility.IsScoreItem(item); - i.vipitem = SWWMUtility.IsVipItem(item); + if ( item is 'SWWMRespawnTimer' ) + { + i.scoreitem = SWWMUtility.IsScoreItem(item.tracer); + i.vipitem = SWWMUtility.IsVipItem(item.tracer); + } + else + { + i.scoreitem = SWWMUtility.IsScoreItem(item); + i.vipitem = SWWMUtility.IsVipItem(item); + } i.parent = parent; i.updated = level.maptime+35; i.UpdateTag(); @@ -221,15 +229,22 @@ Class SWWMItemSense : Thinker void UpdateTag() { - if ( !item ) return; + let i = item; + if ( i is 'SWWMRespawnTimer' ) i = i.tracer; + if ( !i ) return; // certain ammo types use the pickup message as it's amount-aware - if ( (item is 'RedShell') || (item is 'GreenShell') - || (item is 'WhiteShell') || (item is 'BlueShell') - || (item is 'BlackShell') || (item is 'PurpleShell') - || (item is 'GoldShell') || (item is 'SMW05Ammo') - || (item is 'SheenAmmo') ) - tag = Inventory(item).PickupMessage(); - else tag = item.GetTag(); + if ( (i is 'RedShell') || (i is 'GreenShell') + || (i is 'WhiteShell') || (i is 'BlueShell') + || (i is 'BlackShell') || (i is 'PurpleShell') + || (i is 'GoldShell') || (i is 'EvisceratorShell') + || (i is 'HellblazerMissiles') + || (i is 'HellblazerCrackshots') + || (i is 'HellblazerRavagers') + || (i is 'HellblazerWarheads') + || (i is 'SMW05Ammo') + || (i is 'SheenAmmo') ) + tag = Inventory(i).PickupMessage(); + else tag = i.GetTag(); } override void OnDestroy() diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index ae6314958..73a6f0edc 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -2,6 +2,7 @@ Class SWWMWeapon : Weapon abstract { Mixin SWWMOverlapPickupSound; + Mixin SWWMRespawn; bool wasused; private int SWeaponFlags; @@ -206,6 +207,12 @@ Class SWWMWeapon : Weapon abstract } return Super.HandlePickup(item); } + override bool ShouldStay() + { + // SWWM weapons never stay unless explicitly stated + if ( !bDROPPED && (deathmatch || alwaysapplydmflags) && sv_weaponstay ) return true; + return false; + } override void AttachToOwner( Actor other ) { Inventory.AttachToOwner(other);