From 4d3d1bf84e5415dacb6592678822a9531f6c4f5a Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sun, 7 Jun 2020 14:47:27 +0200 Subject: [PATCH] Various changes (see full commit message): - Adjusted timing of crackshot sub-grenades so they're more useful - Added "Humiliation" bonus for killing an enemy with the Deep Impact primary - Added per-ammo obituaries to Wallbuster - Adjusted Pusher behaviour so it stops gracefully at skies - More accurate tracking of "favourite weapon" - Changed Vanilla Boss Enhancer so it only works on vanilla maps --- FuturePlans.md | 10 +- language.def_base | 7 +- language.es_base | 7 +- language.version | 2 +- zscript/swwm_blazeit.zsc | 2 +- zscript/swwm_cbt.zsc | 14 +- zscript/swwm_common.zsc | 25 ++- zscript/swwm_deepdarkimpact.zsc | 4 +- zscript/swwm_jackhammer.zsc | 40 ++++- zscript/swwm_shot.zsc | 18 ++ zscript/swwm_sparkyboi.zsc | 2 + zscript/swwm_splode.zsc | 3 + zscript/swwm_tastytreat.zsc | 6 + zscript/swwm_vanillaboss.zsc | 303 +++++++++++++++++++------------- 14 files changed, 309 insertions(+), 134 deletions(-) diff --git a/FuturePlans.md b/FuturePlans.md index a293d678d..dacbc3770 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -12,7 +12,11 @@ after the first release. - PROWEL & TADEL (Ultra Suite 2 & 3) - Super Happy Fun Ball (SWWM Z) * Additional Demolitionist Menu features - - Per-monster kill tracker in stats tab + - Stats tab subsections + - Monster kill tracker + - Item pickup tracker + - Level stats tracker + - Achevements tracker (see below) - Radio (add-on) - Pong minigame - Selling items at the store @@ -45,7 +49,7 @@ after the first release. * Fake livestream chat overlay, with dynamic reactions to all sorts of stuff * Character and item images for the library * Full Mashiro model for Lämp easter egg -* Summonable Ibuki companion (w/ optional "stream friendly" clothing) +* Ibuki companion add-on (w/ optional "stream friendly" clothing) * Saya model, for scenes or something idk -* Japanese Localization??? +* Japanese localization??? * Strife support, with rewritten dialogue diff --git a/language.def_base b/language.def_base index 7e3bf0d7e..9be903a2b 100644 --- a/language.def_base +++ b/language.def_base @@ -522,6 +522,7 @@ FN_KEEN = "Ruined by Bethesda"; // obituaries O_PUSHER = "%k opened some air holes into %o."; O_DEEPIMPACT = "%o was impacted deeply by %k."; +O_DEEPIMPACT_WEAK = "%k coughed in %o's general direction."; O_EXPLODIUM = "%k inflicted severe knee explosions onto %o."; O_SPREADGUN_RED = "%k gave %o a mouthful of shot."; O_SPREADGUN_GREEN = "%o got slugged by %k."; @@ -530,7 +531,10 @@ O_SPREADGUN_BLUE = "%k made %o very salty."; O_SPREADGUN_BLACK = "%k set %o on fire along with everything around %h."; O_SPREADGUN_PURPLE = "%o was conked by %k's lead ball."; O_SPREADGUN_GOLD = "%o ate up %k's golden blast."; -O_WALLBUSTER = "%k gave %o a mighty busting."; +O_WALLBUSTER_RED = "%k gave %o a mighty busting."; +O_WALLBUSTER_GREEN = "%k turned %o into a donut."; +O_WALLBUSTER_BLUE = "%k made %o REALLY salty."; +O_WALLBUSTER_PURPLE = "%k inflicted lead ball torture onto %o."; O_EVISCERATOR = "%o was eviscerated by %k."; O_HELLBLAZER = "%k blasted %o into burning bits."; O_SPARKSTER = "%o got sparked hard by %k."; @@ -681,6 +685,7 @@ SWWM_NEXIT = "Exit"; SWWM_SEXIT = "Secret Exit"; SWWM_LEG = "Legendary "; SWWM_LEGPREFIX = "L"; +SWWM_SHAMEFUL = "Humiliation"; // 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 750ad087e..da664ba35 100644 --- a/language.es_base +++ b/language.es_base @@ -513,6 +513,7 @@ FN_KEEN = "Arruinado por Bethesda"; // obituaries O_PUSHER = "%k le abrió unos agujeros de ventilación a %o."; O_DEEPIMPACT = "%o fue impactad@[ao_esp] profundamente por %k."; +O_DEEPIMPACT_WEAK = "%k tosió en la dirección general de %o."; O_EXPLODIUM = "%k inflingió explosiones de rodilla severas a %o."; O_SPREADGUN_RED = "%k le dió a %o un bocado de perdigones."; O_SPREADGUN_GREEN = "%o fue sluggead@[ao_esp] por %k."; @@ -521,7 +522,10 @@ O_SPREADGUN_BLUE = "%k puso a %o muy salad@[ao_esp]."; O_SPREADGUN_BLACK = "%k prendió fuego a %o y todo lo que había a su alrededor."; O_SPREADGUN_PURPLE = "A %o le salió un chichón con la bola de plomo de %k."; O_SPREADGUN_GOLD = "%o se tragó la explosión dorada de %k."; -O_WALLBUSTER = "%k ha destrozado a %o pero bien."; +O_WALLBUSTER_RED = "%k ha destrozado a %o pero bien."; +O_WALLBUSTER_GREEN = "%k convirtió a %o en rosquilla."; +O_WALLBUSTER_BLUE = "%k puso a %o muy MUY salad@[ao_esp]."; +O_WALLBUSTER_PURPLE = "%k inflingió una tortura de bolas de plomo a %o."; O_EVISCERATOR = "%o fue descuartizad@[ao_esp] por %k."; O_HELLBLAZER = "%k reventó a %o en cachitos humeantes."; O_SPARKSTER = "%o fue bien chispead@[ao_esp] por %k."; @@ -667,6 +671,7 @@ SWWM_NEXIT = "Salida"; SWWM_SEXIT = "Salida Secreta"; SWWM_LEG = " Legendario"; SWWM_LEGPREFIX = "R"; +SWWM_SHAMEFUL = "Humillación"; // 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 7056a5efa..852a43db3 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\cxSWWM GZ\c- r319 (Sat 6 Jun 23:56:13 CEST 2020)"; +SWWM_MODVER="\cxSWWM GZ\c- r320 (Sun 7 Jun 14:47:27 CEST 2020)"; diff --git a/zscript/swwm_blazeit.zsc b/zscript/swwm_blazeit.zsc index db024f7f6..45d5e65e6 100644 --- a/zscript/swwm_blazeit.zsc +++ b/zscript/swwm_blazeit.zsc @@ -853,7 +853,7 @@ Class HellblazerClusterMini : HellblazerMissile s.alpha *= .4; s.vel = .3*vel + (traildir+(FRandom[Hellblazer](-.4,.4),FRandom[Hellblazer](-.4,.4),FRandom[Hellblazer](-.4,.4))).unit()*FRandom[Hellblazer](1.,2.); } - if ( (deto > 2) && (GetAge() > 4) ) + if ( (deto > 1) && (GetAge() > 2) ) { ExplodeMissile(); return; diff --git a/zscript/swwm_cbt.zsc b/zscript/swwm_cbt.zsc index bd4713dc2..8f343d853 100644 --- a/zscript/swwm_cbt.zsc +++ b/zscript/swwm_cbt.zsc @@ -427,7 +427,16 @@ Class Wallbuster : SWWMWeapon transient ui TextureID WeaponBox, AmmoIcon[4], LoadIcon[4], UsedIcon[4], EmptyIcon; transient ui Font TewiFont; + Class curobt; + override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) + { + if ( curobt is 'RedShell' ) return StringTable.Localize("$O_WALLBUSTER_RED"); + if ( curobt is 'GreenShell' ) return StringTable.Localize("$O_WALLBUSTER_GREEN"); + if ( curobt is 'BlueShell' ) return StringTable.Localize("$O_WALLBUSTER_BLUE"); + if ( curobt is 'PurpleShell' ) return StringTable.Localize("$O_WALLBUSTER_PURPLE"); + return Super.GetObituary(victim,inflictor,mod,playerattack); + } override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss ) { static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; @@ -788,6 +797,7 @@ Class Wallbuster : SWWMWeapon b.y += 8; Vector2 n = (b.x*cos(t2)-b.y*sin(t2),b.x*sin(t2)+b.y*cos(t2)); origin = level.Vec3Offset(base,n.x*y+n.y*z); + invoker.curobt = types[which]; switch ( which ) { case 1: @@ -840,6 +850,7 @@ Class Wallbuster : SWWMWeapon b.pitch = asin(-x2.z); b.Stamina += howmany*16; b.Accuracy += 2+howmany/5; + b.Args[1] = 1; // came from wallbuster } for ( int i=0; i<(9-howmany/3); i++ ) { @@ -877,6 +888,7 @@ Class Wallbuster : SWWMWeapon p.angle = atan2(dir.y,dir.x); p.pitch = asin(-dir.z); p.vel = dir*p.speed*1.25; + p.special1 = 1; // came from wallbuster for ( int i=0; i<(4-howmany/8); i++ ) { let s = Spawn("SWWMViewSmoke",origin); @@ -1102,7 +1114,7 @@ Class Wallbuster : SWWMWeapon { Tag "$T_WALLBUSTER"; Inventory.PickupMessage "$I_WALLBUSTER"; - Obituary "$O_WALLBUSTER"; + Obituary "$O_WALLBUSTER_RED"; Weapon.SlotNumber 4; Weapon.SelectionOrder 2200; Weapon.UpSound "wallbuster/select"; diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index 15e17dfcd..2b55dc73a 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -248,9 +248,17 @@ Class SWWMStats : Thinker { Class which = myplayer.ReadyWeapon?myplayer.ReadyWeapon.GetClass():null; if ( inflictor is 'Weapon' ) which = Weapon(inflictor).GetClass(); - // properly credit napalm damage to Spreadgun - if ( inflictor is 'OnFire' ) which = 'Spreadgun'; - // TODO handle other projectiles + // properly credit some projectiles to their respective gun + if ( inflictor is 'AirBullet' ) which = 'DeepImpact'; + else if ( inflictor is 'PusherProjectile' ) which = 'PusherWeapon'; + else if ( (inflictor is 'ExplodiumMagArm') || (inflictor is 'ExplodiumMagProj') || (inflictor is 'ExplodiumBulletImpact') ) which = 'ExplodiumGun'; + else if ( (inflictor is 'DragonBreathArm') || ((inflictor is 'SaltImpact') && !inflictor.Args[0]) || ((inflictor is 'SaltBeam') && !inflictor.Args[1]) || (inflictor is 'OnFire') || (inflictor is 'FlamingChunk') || ((inflictor is 'TheBall') && !inflictor.special1) || (inflictor is 'GoldenImpact') || (inflictor is 'GoldenSubImpact') || (inflictor is 'GoldenSubSubImpact') ) which = 'Spreadgun'; + else if ( ((inflictor is 'SaltImpact') && inflictor.Args[0]) || ((inflictor is 'SaltBeam') && inflictor.Args[1]) || ((inflictor is 'TheBall') && inflictor.special1) ) which = 'Wallbuster'; + else if ( (inflictor is 'EvisceratorChunk') || (inflictor is 'EvisceratorProj') ) which = 'Eviscerator'; + else if ( (inflictor is 'HellblazerRavagerArm') || (inflictor is 'HellblazerWarheadArm') ) which = 'Hellblazer'; + else if ( (inflictor is 'BigBiospark') || (inflictor is 'BiosparkBall') || (inflictor is 'BiosparkBeamImpact') || (inflictor is 'BiosparkComboImpact') || (inflictor is 'BiosparkBeam') || (inflictor is 'BiosparkArc') ) which = 'Sparkster'; + else if ( (inflictor is 'CandyBeam') || (inflictor is 'CandyPop') || (inflictor is 'CandyMagArm') || (inflictor is 'CandyGunProj') || (inflictor is 'CandyMagProj') || (inflictor is 'CandyBulletImpact') ) which = 'CandyGun'; + // TODO Silver Bullet / Ynykron projs when implemented if ( !which ) return; for ( int i=0; i