diff --git a/FuturePlans.md b/FuturePlans.md index f11e2d551..6e2b32a67 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -1,4 +1,8 @@ -This is just a bit of *"future planning"* for stuff that I ***might*** add after the first release. +This is just a bit of *"future planning"* for stuff that I ***might*** add later on. + +## 1.2 update *(The Second Batch)*: + +More weapons, because we need 'em. * **DLC Weaponset:** - [1] Itamex Reinforced Hammer *(UnSX 5)* @@ -21,15 +25,25 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - The Most Silent Takedown *(Kill 30 enemies with the Ray-Khom primary without alerting them)* - [0] Grand Lance *(SWWM Iridium)* - Penetrator *(Strike through 20 enemies in a row with a single Grand Lance secondary)* + +## 1.3 update *(Arsenal Appendix)*: + +A couple extra weapons, not enough for a full batch, but still worthy additions. + * **DLC Weaponset 2:** - [1] Hand of Divine *(Total Madness)* - Facepunching Extraordinaire *(Kill 300 enemies with the Hand of Divine)* - [6] Sparkster x3 *(UnSX 2)* - - A Fine Sparking *(Kill 50 enemies at once with a Sparkster Rifle combo shot)* + - A Fine Sparking *(Kill 30 enemies at once with a Sparkster Rifle combo shot)* - [9] Mortal Rifle *(UnSX 2)* - - Railed Hard *(Shoot through 30 enemies with a single Mortal Rifle overpressure shot)* + - Railed Hard *(Shoot through 16 enemies with a single Mortal Rifle overpressure shot)* - [0] Rafan-Kos *(UnSX 4)* - Blasting Ropes *(Melt a grand total of 1000 enemies with the Rafan-Kos)* + +## 1.4 update *(The Final Stage)*: + +All the hard stuff *(some of these aren't guaranteed)*. + * **DLC Gameset:** - Tetris - Pong @@ -37,72 +51,13 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - **[Doom]** Demo Land Adventure *(platformer with shooty gameplay)* - **[Heretic]** Interstellar Demolitionist *(a somewhat simple vertical SHMUP, kinda Touhou styled)* - **[Hexen]** Demolition Quest *(a JRPG, kinda like early FF / BoF)* -* **More collectibles (some of which were initially planned but didn't make it in time):** - - [Doom] Moth Plushy *("She loves a good lämp")* - - [Doom] AA-12 *("Ibuki's favorite shotgun. It's just a collectible model, so it doesn't actually shoot")* - - [Doom] Hege Cactus *("Appears to absorb all water, causing intense thirst")* - - [Doom] Hoagie *("Can't eat it, but looks delicious")* - - [Doom] Red Oni Milk *("It's a bit too obvious, isn't it?")* - - [Doom] Black Rat's Coven - Counter-Inquisition *("Man is this some good music")* - - [Heretic] Manarock *("A delicacy for gods, but instantly deadly for mortals")* - - [Heretic] Lithium - Volume One *("A work of art, one of the finest graphic novels")* - - [Hexen] Psykkonovexx *("Some crazy-ass Anarukon instrument, sounds amazing though")* -* **More items:** - - [Heretic/Hexen] Safety Tether *(Original)* - - Sneaky Retreat *(Use 10 Safety Tethers)* - - Devastation Sigil *(SWWM)* - - Deva Station *(Use 10 Devastation Sigils)* - - Divine Sprite *(SWWM Platinum)* - - Divine Delight *(Use 10 Divine Sprites)* -* **More achievements:** - - Piece of Candy *(Collect 1000 nuggets)* - - Kaboom *(Kill 30 enemies with planted Explodium Mags)* - - Pacifist *(Finish a map without dealing damage)* - - Untouchable *(Finish a map without taking damage)* - - Under Pressure *(Break a crusher)* - - The Longest Journey *(Walk a total of 1000km)* - - Mishe Trickery *(Successfully input a cheat code)* - - ...And a Dream *(Kill 10 enemies while having only 1 HP)* - - In a Hurry *(Beat a map with 0% kills, items and secrets)* - - Deadeye *(Land 7 consecutive Explodium Gun shots without missing)* - - Thorough Tenderizing *(Kill 100 enemies with the Pusher)* - - [Doom] Graffiti Master *(Doodle mustaches on 20 demon faces)* - - [Doom] Goodbye Franchise *(Rescue Commander Keen)* - - [Doom] Taking out the Trash *(Kill all Nazis in the Doom 2 secret maps)* - - [Doom] Environmental Disaster *(Destroy 1000 barrels)* - - [Doom] Cyberbullying *(Kill a Cyberdemon with its own rocket)* - - [Doom] Oh That's a Baseball *(Perfect parry a Lost Soul with the Silver Bullet)* - - [Doom] Dynamic Duo *(Defeat the Bruiser Brothers)* - - [Doom] Huge Guts *(Defeat the Tyrant of Babel)* - - [Doom] All Brain *(Defeat the Spider Mastermind)* - - [Doom] More Brain *(Defeat the Spider Sibling)* - - [Doom] Final Cleanup *(Complete Baphomet's Challenge)* - - [Doom] Simply Dead *(Defeat the Demonic Biomech Squad)* - - [Doom] Titan's Fall *(Defeat the Icon of Sin)* - - [Doom] Shot Until Dead *(Defeat the Last Tyrant)* - - [Doom] Evil Eternal *(Defeat the Archangelus)* - - [Doom] A Gazebo Most Insane *(Conquer the Sundered Realms)* - - [Heretic] What The Fuck? *(Punch a tornado???)* - - [Heretic] Crazy Heads *(Defeat the Iron Liches)* - - [Heretic] A Load of Bull *(Defeat the Maulotaur Servants)* - - [Heretic] Abracadabra I Win *(Defeat D'Sparil)* - - [Heretic] What's So Funny? *(Defeat the Iron Liches... again)* - - [Heretic] Big Mooscles *(Defeat the Maulotaur Servants... again)* - - [Hexen] Even Kirin is Upset *(Solve 20 "puzzles")* - - [Hexen] Extreme Kancho *(Break a stone spike)* - - [Hexen] It Just Works *(Defeat the Death Wyvern)* - - [Hexen] Magic Shmagic *(Defeat the Heresiarch)* - - [Hexen] You Again? *(Defeat another Heresiarch)* - - [Hexen] Domination *(Defeat Zedek)* - - [Hexen] Excommunication *(Defeat Traductus)* - - [Hexen] I Hate Puzzles *(Defeat Menelkir)* - - [Hexen] Worship This *(Defeat Korax)* - - [Hexen] Another One *(Defeat yet another Heresiarch)* - - [Hexen] And Another One *(Defeat... yup, one more Heresiarch)* - - [Hexen] The Last One *(Defeat the last Heresiarch)* - - [Hexen] Didn't I Kick Your Ass Before? *(Defeat the Deathkings)* * **Mothgirl summon for Lämp easter egg** - Layers of White *(Summon the White Lady)* +* **Demolitionist Menu Refactor:** + - Non 16:10 ratio support + - Smooth scrolling + - Much cleaner code + - Modular design * **Replace all hitscan with *"light projectiles"*** * **Crouch sliding *(+ proper crouch dashing)*** * **Expand third person animations** @@ -116,28 +71,49 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - Giggle - Shrug - Beckon +* **Photo Mode** + - Dedicated poses + - Stickers + +## Unspecified + +Things that I'm unsure whether or not they'll be made. + * **Japanese localization???** * ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff** * **Customized cluster text stuff if that ever gets scriptified** * **Official Sunder support *(when the WAD is complete)*** -* **Photo Mode** - - Dedicated poses - - Stickers +* **Original English Voice Acting** + +## Other Projects + +Add-ons and other related stuff. + * **Monster/decoration replacements add-on:** - Potentially standalone, usable with other mods - Balanced for this mod - Unique bosses - Some extra enemy variants - - Coverage for all supported IWADs *(oof)* -* **Original English Voice Acting:** - - Demolitionist - - Ibuki - - Saya - - Kirin -* **Ibuki sub-mod *(Red Oni)*** -* **Saya sub-mod *(Red-Eyed Rampage)*** -* **Kirin sub-mod *(Red Star of Innocence)*** -* **Hardcore Mode sub-mod:** + - Coverage for all supported WADs *(oof)* +* **Ibuki side mod *(Red Oni):*** + - A more *"mundane"* arsenal + - Featuring a very big girl with very big... Assets + - Possibly will have its own DLC Weaponset too + - Featuring a toggleable companion + - Nudity, in a Doom mod? Wow, never seen that one before + - This one's surprisingly meant to be more of a power trip than SWWM GZ +* **Saya side mod *(Red-Eyed Rampage)*** + - The first mod where you play as a mere squishy person + - Spellcasting! + - A more interesting take on "infinite lives" + - Featuring the Pancor Jackhammer *(lol)* +* **[Hexen]** **Kirin side mod *(Red Star of Innocence)*** + - Finally, you get to play as the precious femboy emperor + - Designed entirely for Hexen's funky gameplay™ + - Watch as our boy complains about *"puzzles"* + - Some unique touches to spice things up + - Basically a lite version of what you could expect in **UNDEATH** +* ***(Maybe)* Hardcore Mode sub-mod:** - Featuring Demolitionist on Maidbot frame - More complex game mechanics - Manual Hammerspace management diff --git a/achievements.lst b/achievements.lst index ee1aadb51..bcab9b113 100644 --- a/achievements.lst +++ b/achievements.lst @@ -8,8 +8,8 @@ # gametype: the game this belongs to (any, doom, heretic, hexen, raven, etc.) acid,50,yes,any allcoll,-1,no,any -allitems,30,yes,any -allkills,30,yes,any +allitems,30,yes,nothexen +allkills,30,yes,nothexen allsecrets,30,yes,nothexen anom,10,yes,any anone,0,no,any @@ -17,6 +17,7 @@ balls,10,yes,any barrel,1000,yes,doom barrier,20,yes,doom baseball,0,no,doom +blaze,0,no,nothexen bonk,300,yes,any bossdash,5,yes,any brake,10,yes,any @@ -39,16 +40,6 @@ dime,0,no,any divine,10,yes,any doodle,20,yes,doom dosh,1000000000,no,any -doomboss1,0,no,doom -doomboss2,0,no,doom -doomboss3,0,no,doom -doomboss4,0,no,doom -doomboss5,0,no,doom -doomboss6,0,no,doom -doomboss7,0,no,doom -doomboss8,0,no,doom -doomboss9,0,no,doom -#doomboss10,0,no,doom everything,0,no,any ezkill,50,yes,any #fisto,300,yes,any @@ -63,22 +54,6 @@ gib,1500,yes,any golden,24,yes,any gravity,10,yes,raven grenade,30,yes,any -hereticboss1,0,no,heretic -hereticboss2,0,no,heretic -hereticboss3,0,no,heretic -hereticboss4,0,no,heretic -hereticboss5,0,no,heretic -hexenboss1,0,no,hexen -hexenboss2,0,no,hexen -hexenboss3,0,no,hexen -hexenboss4,0,no,hexen -hexenboss5,0,no,hexen -hexenboss6,0,no,hexen -hexenboss7,0,no,hexen -hexenboss8,0,no,hexen -hexenboss9,0,no,hexen -hexenboss10,0,no,hexen -hexenboss11,0,no,hexen #hnd,6,yes,any hurry,0,no,any #ice,40,yes,any @@ -93,20 +68,20 @@ love,10,yes,any mbf,0,no,doom mega,10000,yes,any moth,50,yes,any -nice,0,no,any +nice,0,no,nothexen oneguy,0,no,any onehp,10,yes,any -onestanding,0,no,any +onestanding,0,no,nothexen oopsie,0,no,any par,15,yes,nothexen parry,200,yes,any -peace,0,no,any +peace,0,no,nothexen #pene,20,yes,any #plasma,50,yes,any plush,10,yes,any puzzle,20,yes,hexen rage,20,yes,any -#rail,30,yes,any +#rail,16,yes,any reflect,20,yes,any refresh,30,yes,any #roast,50,yes,any @@ -119,7 +94,7 @@ slayer,40,yes,any slemg,100,yes,any sneaky,10,yes,raven sneeze,20,yes,any -#spark,50,yes,any +#spark,30,yes,any step,30,yes,any stomp,50,yes,any sunny,15,yes,any @@ -130,7 +105,7 @@ thruwall,20,yes,any tornado,0,no,heretic trash,0,no,doom travel,1000,yes,any -untouchable,0,no,any +untouchable,0,no,nothexen wantdie,0,no,any wave,0,no,any yeet,0,no,doom diff --git a/cvarinfo.achievements b/cvarinfo.achievements index 845283c8e..3e38b75af 100644 --- a/cvarinfo.achievements +++ b/cvarinfo.achievements @@ -3,8 +3,6 @@ // cross-session achievement cvars (0: locked, 1: unlocked, 2: notified) nosave int swwm_achievement_acid = 0; nosave int swwm_achievement_allcoll = 0; -nosave int swwm_achievement_allitems = 0; -nosave int swwm_achievement_allkills = 0; nosave int swwm_achievement_anom = 0; nosave int swwm_achievement_anone = 0; nosave int swwm_achievement_balls = 0; @@ -51,13 +49,10 @@ nosave int swwm_achievement_love = 0; nosave int swwm_achievement_mashiro = 0; nosave int swwm_achievement_mega = 0; nosave int swwm_achievement_moth = 0; -nosave int swwm_achievement_nice = 0; nosave int swwm_achievement_oneguy = 0; nosave int swwm_achievement_onehp = 0; -nosave int swwm_achievement_onestanding = 0; nosave int swwm_achievement_oopsie = 0; nosave int swwm_achievement_parry = 0; -nosave int swwm_achievement_peace = 0; nosave int swwm_achievement_pene = 0; nosave int swwm_achievement_plasma = 0; nosave int swwm_achievement_plush = 0; @@ -83,14 +78,11 @@ nosave int swwm_achievement_tender = 0; nosave int swwm_achievement_thicc = 0; nosave int swwm_achievement_thruwall = 0; nosave int swwm_achievement_travel = 0; -nosave int swwm_achievement_untouchable = 0; nosave int swwm_achievement_wantdie = 0; nosave int swwm_achievement_wave = 0; // cross-session progress cvars nosave int swwm_progress_acid = 0; nosave int swwm_progress_allcoll = 0; -nosave int swwm_progress_allitems = 0; -nosave int swwm_progress_allkills = 0; nosave int swwm_progress_anom = 0; nosave int swwm_progress_balls = 0; nosave int swwm_progress_bonk = 0; diff --git a/filter/game-doom/cvarinfo.doomachievements b/filter/game-doom/cvarinfo.doomachievements index ab0b3f845..762a47dd0 100644 --- a/filter/game-doom/cvarinfo.doomachievements +++ b/filter/game-doom/cvarinfo.doomachievements @@ -1,29 +1,28 @@ // doom-exclusive achievements // cross-session achievement cvars (0: locked, 1: unlocked, 2: notified) +nosave int swwm_achievement_allitems = 0; +nosave int swwm_achievement_allkills = 0; nosave int swwm_achievement_allsecrets = 0; nosave int swwm_achievement_barrel = 0; nosave int swwm_achievement_barrier = 0; nosave int swwm_achievement_baseball = 0; +nosave int swwm_achievement_blaze = 0; nosave int swwm_achievement_cliffyb = 0; nosave int swwm_achievement_cybully = 0; nosave int swwm_achievement_doodle = 0; -nosave int swwm_achievement_doomboss1 = 0; -nosave int swwm_achievement_doomboss2 = 0; -nosave int swwm_achievement_doomboss3 = 0; -nosave int swwm_achievement_doomboss4 = 0; -nosave int swwm_achievement_doomboss5 = 0; -nosave int swwm_achievement_doomboss6 = 0; -nosave int swwm_achievement_doomboss7 = 0; -nosave int swwm_achievement_doomboss8 = 0; -nosave int swwm_achievement_doomboss9 = 0; -nosave int swwm_achievement_doomboss10 = 0; nosave int swwm_achievement_keen = 0; nosave int swwm_achievement_mbf = 0; +nosave int swwm_achievement_nice = 0; +nosave int swwm_achievement_onestanding = 0; nosave int swwm_achievement_par = 0; +nosave int swwm_achievement_peace = 0; nosave int swwm_achievement_trash = 0; +nosave int swwm_achievement_untouchable = 0; nosave int swwm_achievement_yeet = 0; // cross-session progress cvars +nosave int swwm_progress_allitems = 0; +nosave int swwm_progress_allkills = 0; nosave int swwm_progress_allsecrets = 0; nosave int swwm_progress_barrel = 0; nosave int swwm_progress_barrier = 0; diff --git a/filter/game-heretic/cvarinfo.hereticachievements b/filter/game-heretic/cvarinfo.hereticachievements index ae5922ac9..1627939dd 100644 --- a/filter/game-heretic/cvarinfo.hereticachievements +++ b/filter/game-heretic/cvarinfo.hereticachievements @@ -1,17 +1,21 @@ // heretic-exclusive achievements // cross-session achievement cvars (0: locked, 1: unlocked, 2: notified) +nosave int swwm_achievement_allitems = 0; +nosave int swwm_achievement_allkills = 0; nosave int swwm_achievement_allsecrets = 0; +nosave int swwm_achievement_blaze = 0; nosave int swwm_achievement_cliffyb = 0; nosave int swwm_achievement_gravity = 0; -nosave int swwm_achievement_hereticboss1 = 0; -nosave int swwm_achievement_hereticboss2 = 0; -nosave int swwm_achievement_hereticboss3 = 0; -nosave int swwm_achievement_hereticboss4 = 0; -nosave int swwm_achievement_hereticboss5 = 0; +nosave int swwm_achievement_nice = 0; +nosave int swwm_achievement_onestanding = 0; +nosave int swwm_achievement_peace = 0; nosave int swwm_achievement_sneaky = 0; nosave int swwm_achievement_tornado = 0; +nosave int swwm_achievement_untouchable = 0; // cross-session progress cvars +nosave int swwm_progress_allitems = 0; +nosave int swwm_progress_allkills = 0; nosave int swwm_progress_allsecrets = 0; nosave int swwm_progress_gravity = 0; nosave int swwm_progress_sneaky = 0; diff --git a/filter/game-hexen/cvarinfo.hexenachievements b/filter/game-hexen/cvarinfo.hexenachievements index c6af258ce..a82fd5b7d 100644 --- a/filter/game-hexen/cvarinfo.hexenachievements +++ b/filter/game-hexen/cvarinfo.hexenachievements @@ -2,17 +2,6 @@ // cross-session achievement cvars (0: locked, 1: unlocked, 2: notified) nosave int swwm_achievement_gravity = 0; -nosave int swwm_achievement_hexenboss1 = 0; -nosave int swwm_achievement_hexenboss2 = 0; -nosave int swwm_achievement_hexenboss3 = 0; -nosave int swwm_achievement_hexenboss4 = 0; -nosave int swwm_achievement_hexenboss5 = 0; -nosave int swwm_achievement_hexenboss6 = 0; -nosave int swwm_achievement_hexenboss7 = 0; -nosave int swwm_achievement_hexenboss8 = 0; -nosave int swwm_achievement_hexenboss9 = 0; -nosave int swwm_achievement_hexenboss10 = 0; -nosave int swwm_achievement_hexenboss11 = 0; nosave int swwm_achievement_kancho = 0; nosave int swwm_achievement_puzzle = 0; nosave int swwm_achievement_sneaky = 0; diff --git a/graphics/Achievements/AchievementCandy.png b/graphics/Achievements/AchievementCandy.png new file mode 100644 index 000000000..f12a0c705 Binary files /dev/null and b/graphics/Achievements/AchievementCandy.png differ diff --git a/graphics/Achievements/AchievementDeadeye.png b/graphics/Achievements/AchievementDeadeye.png new file mode 100644 index 000000000..aa49d55f2 Binary files /dev/null and b/graphics/Achievements/AchievementDeadeye.png differ diff --git a/graphics/Achievements/AchievementGrenade.png b/graphics/Achievements/AchievementGrenade.png new file mode 100644 index 000000000..0a6afd4f6 Binary files /dev/null and b/graphics/Achievements/AchievementGrenade.png differ diff --git a/graphics/Achievements/AchievementPeace.png b/graphics/Achievements/AchievementPeace.png new file mode 100644 index 000000000..79b8986f2 Binary files /dev/null and b/graphics/Achievements/AchievementPeace.png differ diff --git a/graphics/Achievements/AchievementUntouchable.png b/graphics/Achievements/AchievementUntouchable.png new file mode 100644 index 000000000..d99ea3e6a Binary files /dev/null and b/graphics/Achievements/AchievementUntouchable.png differ diff --git a/language.def_base b/language.def_base index d8ac0a477..6a6b31dc0 100644 --- a/language.def_base +++ b/language.def_base @@ -950,6 +950,8 @@ SWWM_ACHIEVEMENT_BARRIER_TAG = "Green Filter"; SWWM_ACHIEVEMENT_BARRIER_TXT = "Use %d Elemental Barriers"; SWWM_ACHIEVEMENT_BASEBALL_TAG = "Oh That's a Baseball!"; SWWM_ACHIEVEMENT_BASEBALL_TXT = "Perfect parry a Lost Soul with the Silver Bullet"; +SWWM_ACHIEVEMENT_BLAZE_TAG = "Blazing It"; +SWWM_ACHIEVEMENT_BLAZE_TXT = "Beat a map in 4 minutes and 20 seconds"; SWWM_ACHIEVEMENT_BONK_TAG = "Shock Resistant"; SWWM_ACHIEVEMENT_BONK_TXT = "Bump into stuff %d times"; SWWM_ACHIEVEMENT_BOSSDASH_TAG = "Headstrong"; @@ -992,26 +994,6 @@ SWWM_ACHIEVEMENT_DIVINE_TAG = "Divine Delight"; SWWM_ACHIEVEMENT_DIVINE_TXT = "Use %d Divine Sprites"; SWWM_ACHIEVEMENT_DOODLE_TAG = "Graffiti Master"; SWWM_ACHIEVEMENT_DOODLE_TXT = "Doodle mustaches on %d demon faces"; -SWWM_ACHIEVEMENT_DOOMBOSS1_TAG = "Dynamic Duo"; -SWWM_ACHIEVEMENT_DOOMBOSS1_TXT = "Defeat the Bruiser Brothers"; -SWWM_ACHIEVEMENT_DOOMBOSS2_TAG = "Huge Guts"; -SWWM_ACHIEVEMENT_DOOMBOSS2_TXT = "Defeat the Tyrant of Babel"; -SWWM_ACHIEVEMENT_DOOMBOSS3_TAG = "All Brain"; -SWWM_ACHIEVEMENT_DOOMBOSS3_TXT = "Defeat the Spider Mastermind"; -SWWM_ACHIEVEMENT_DOOMBOSS4_TAG = "More Brain"; -SWWM_ACHIEVEMENT_DOOMBOSS4_TXT = "Defeat the Spider Sibling"; -SWWM_ACHIEVEMENT_DOOMBOSS5_TAG = "Final Cleanup"; -SWWM_ACHIEVEMENT_DOOMBOSS5_TXT = "Complete Baphomet's Challenge"; -SWWM_ACHIEVEMENT_DOOMBOSS6_TAG = "Simply Dead"; -SWWM_ACHIEVEMENT_DOOMBOSS6_TXT = "Defeat the Demonic Biomech Squad"; -SWWM_ACHIEVEMENT_DOOMBOSS7_TAG = "Titan's Fall"; -SWWM_ACHIEVEMENT_DOOMBOSS7_TXT = "Defeat the Icon of Sin"; -SWWM_ACHIEVEMENT_DOOMBOSS8_TAG = "Shot Until Dead"; -SWWM_ACHIEVEMENT_DOOMBOSS8_TXT = "Defeat the Last Tyrant"; -SWWM_ACHIEVEMENT_DOOMBOSS9_TAG = "Evil Eternal"; -SWWM_ACHIEVEMENT_DOOMBOSS9_TXT = "Defeat the Archangelus"; -SWWM_ACHIEVEMENT_DOOMBOSS10_TAG = "A Gazebo Most Insane"; -SWWM_ACHIEVEMENT_DOOMBOSS10_TXT = "Conquer the Sundered Realms"; SWWM_ACHIEVEMENT_DOSH_TAG = "Unchecked Capitalism"; SWWM_ACHIEVEMENT_DOSH_TXT = "Accumulate ¥1,000,000,000 across your playthroughs"; SWWM_ACHIEVEMENT_EVERYTHING_TAG = "The Demolitionist"; @@ -1046,42 +1028,10 @@ SWWM_ACHIEVEMENT_GRAVITY_TAG = "Decent Ascent"; SWWM_ACHIEVEMENT_GRAVITY_TXT = "Use %d Gravity Suppressors"; SWWM_ACHIEVEMENT_GRENADE_TAG = "Kaboom"; SWWM_ACHIEVEMENT_GRENADE_TXT = "Kill %d enemies with planted Explodium mags"; -SWWM_ACHIEVEMENT_HERETICBOSS1_TAG = "Crazy Heads"; -SWWM_ACHIEVEMENT_HERETICBOSS1_TXT = "Defeat the Iron Liches"; -SWWM_ACHIEVEMENT_HERETICBOSS2_TAG = "A Load of Bull"; -SWWM_ACHIEVEMENT_HERETICBOSS2_TXT = "Defeat the Maulotaur Servants"; -SWWM_ACHIEVEMENT_HERETICBOSS3_TAG = "Abracadabra I Win"; -SWWM_ACHIEVEMENT_HERETICBOSS3_TXT = "Defeat D'Sparil"; -SWWM_ACHIEVEMENT_HERETICBOSS4_TAG = "What's so Funny?"; -SWWM_ACHIEVEMENT_HERETICBOSS4_TXT = "Defeat the Iron Liches... again"; -SWWM_ACHIEVEMENT_HERETICBOSS5_TAG = "Big Mooscles"; -SWWM_ACHIEVEMENT_HERETICBOSS5_TXT = "Defeat the Maulotaur Servants... again"; -SWWM_ACHIEVEMENT_HEXENBOSS1_TAG = "It Just Works"; -SWWM_ACHIEVEMENT_HEXENBOSS1_TXT = "Defeat the Death Wyvern"; -SWWM_ACHIEVEMENT_HEXENBOSS2_TAG = "Magic Shmagic"; -SWWM_ACHIEVEMENT_HEXENBOSS2_TXT = "Defeat the Heresiarch"; -SWWM_ACHIEVEMENT_HEXENBOSS3_TAG = "You Again?"; -SWWM_ACHIEVEMENT_HEXENBOSS3_TXT = "Defeat another Heresiarch"; -SWWM_ACHIEVEMENT_HEXENBOSS4_TAG = "Domination"; -SWWM_ACHIEVEMENT_HEXENBOSS4_TXT = "Defeat Zedek"; -SWWM_ACHIEVEMENT_HEXENBOSS5_TAG = "Excommunication"; -SWWM_ACHIEVEMENT_HEXENBOSS5_TXT = "Defeat Traductus"; -SWWM_ACHIEVEMENT_HEXENBOSS6_TAG = "I Hate Puzzles"; -SWWM_ACHIEVEMENT_HEXENBOSS6_TXT = "Defeat Menelkir"; -SWWM_ACHIEVEMENT_HEXENBOSS7_TAG = "Worship This"; -SWWM_ACHIEVEMENT_HEXENBOSS7_TXT = "Defeat Korax"; -SWWM_ACHIEVEMENT_HEXENBOSS8_TAG = "Another One"; -SWWM_ACHIEVEMENT_HEXENBOSS8_TXT = "Defeat yet another Heresiarch"; -SWWM_ACHIEVEMENT_HEXENBOSS9_TAG = "And Another One"; -SWWM_ACHIEVEMENT_HEXENBOSS9_TXT = "Defeat... yup, one more Heresiarch"; -SWWM_ACHIEVEMENT_HEXENBOSS10_TAG = "The Last One"; -SWWM_ACHIEVEMENT_HEXENBOSS10_TXT = "Defeat the last Heresiarch"; -SWWM_ACHIEVEMENT_HEXENBOSS11_TAG = "Didn't I Kick Your Ass Before?"; -SWWM_ACHIEVEMENT_HEXENBOSS11_TXT = "Defeat the Deathkings"; SWWM_ACHIEVEMENT_HND_TAG = "High Noon"; SWWM_ACHIEVEMENT_HND_TXT = "Land %d killing shots in a single Puntzer Beta reload"; SWWM_ACHIEVEMENT_HURRY_TAG = "In a Hurry"; -SWWM_ACHIEVEMENT_HURRY_TXT = "Beat a map with 0% kills, items and secrets"; +SWWM_ACHIEVEMENT_HURRY_TXT = "Beat a map with 0 kills, items and secrets"; SWWM_ACHIEVEMENT_ICE_TAG = "Ice Ice Baby"; SWWM_ACHIEVEMENT_ICE_TXT = "Impale %d enemies with the Blackfire Igniter secondary"; SWWM_ACHIEVEMENT_JUMP_TAG = "Verticality"; @@ -1121,7 +1071,7 @@ SWWM_ACHIEVEMENT_PARRY_TXT = "Deflect %d projectiles"; SWWM_ACHIEVEMENT_PAR_TAG = "Fast"; SWWM_ACHIEVEMENT_PAR_TXT = "Beat the par time in %d maps"; SWWM_ACHIEVEMENT_PEACE_TAG = "Pacifist"; -SWWM_ACHIEVEMENT_PEACE_TXT = "Finish a map without killing anything"; +SWWM_ACHIEVEMENT_PEACE_TXT = "Finish a map without dealing damage"; SWWM_ACHIEVEMENT_PENE_TAG = "Penetrator"; SWWM_ACHIEVEMENT_PENE_TXT = "Strike through %d enemies in a row with a single Grand Lance secondary"; SWWM_ACHIEVEMENT_PLASMA_TAG = "Blastin' Plasma"; @@ -1130,7 +1080,7 @@ SWWM_ACHIEVEMENT_PLUSH_TAG = "Lovestruck"; SWWM_ACHIEVEMENT_PLUSH_TXT = "Play with the Saya plush %d times in the same session"; $ifgame(hexen) SWWM_ACHIEVEMENT_PLUSH_TXT = "Play with the Saya or Kirin plushies %d times in the same session"; SWWM_ACHIEVEMENT_PUZZLE_TAG = "Even Kirin is Upset"; -SWWM_ACHIEVEMENT_PUZZLE_TXT = "Solve %d \"puzzles\""; +SWWM_ACHIEVEMENT_PUZZLE_TXT = "Solve %d fractions of \"puzzles\""; SWWM_ACHIEVEMENT_RAGE_TAG = "No Talk me Angy"; SWWM_ACHIEVEMENT_RAGE_TXT = "Use %d Ragekits"; SWWM_ACHIEVEMENT_RAIL_TAG = "Railed Hard"; diff --git a/language.es_base b/language.es_base index 9a163d8c1..c7fe1a897 100644 --- a/language.es_base +++ b/language.es_base @@ -813,6 +813,8 @@ SWWM_ACHIEVEMENT_BARRIER_TAG = "Filtro Verde"; SWWM_ACHIEVEMENT_BARRIER_TXT = "Usa %d Barreras Elementales"; SWWM_ACHIEVEMENT_BASEBALL_TAG = "¡Oh es un Béisbol!"; SWWM_ACHIEVEMENT_BASEBALL_TXT = "Haz una parada perfecta a un Alma Perdida con el Silver Bullet"; +SWWM_ACHIEVEMENT_BLAZE_TAG = "Echando Humo"; +SWWM_ACHIEVEMENT_BLAZE_TXT = "Termina un mapa en 4 minutos y 20 segundos"; SWWM_ACHIEVEMENT_BONK_TAG = "Resistente a Choques"; SWWM_ACHIEVEMENT_BONK_TXT = "Choca %d veces"; SWWM_ACHIEVEMENT_BOSSDASH_TAG = "Cabezonería"; @@ -851,26 +853,6 @@ SWWM_ACHIEVEMENT_DIVINE_TAG = "Deleite Divino"; SWWM_ACHIEVEMENT_DIVINE_TXT = "Usa %d Sprites Divinos"; SWWM_ACHIEVEMENT_DOODLE_TAG = "Maestro del Grafiti"; SWWM_ACHIEVEMENT_DOODLE_TAG = "Garabatea mostachos en %d caras de demonio"; -SWWM_ACHIEVEMENT_DOOMBOSS1_TAG = "Dúo Dinámico"; -SWWM_ACHIEVEMENT_DOOMBOSS1_TXT = "Derrota a los Hermanos de Guerra"; -SWWM_ACHIEVEMENT_DOOMBOSS2_TAG = "Cacho Carne"; -SWWM_ACHIEVEMENT_DOOMBOSS2_TXT = "Derrota al Tirano de Babel"; -SWWM_ACHIEVEMENT_DOOMBOSS3_TAG = "Todo Sesos"; -SWWM_ACHIEVEMENT_DOOMBOSS3_TXT = "Derrota a la Maestra Arácnida"; -SWWM_ACHIEVEMENT_DOOMBOSS4_TAG = "Más Sesos"; -SWWM_ACHIEVEMENT_DOOMBOSS4_TXT = "Derrota a la Hermana Arácnida"; -SWWM_ACHIEVEMENT_DOOMBOSS5_TAG = "Limpieza Final"; -SWWM_ACHIEVEMENT_DOOMBOSS5_TXT = "Completa el Desafío de Baphomet"; -SWWM_ACHIEVEMENT_DOOMBOSS6_TAG = "Simplemente Muerto"; -SWWM_ACHIEVEMENT_DOOMBOSS6_TXT = "Derrota al Escuadrón de Demonios Biomecánicos"; -SWWM_ACHIEVEMENT_DOOMBOSS7_TAG = "Caída del Titán"; -SWWM_ACHIEVEMENT_DOOMBOSS7_TXT = "Derrota al Icono del Pecado"; -SWWM_ACHIEVEMENT_DOOMBOSS8_TAG = "Dispara Hasta que Muera"; -SWWM_ACHIEVEMENT_DOOMBOSS8_TXT = "Derrota al Último Tirano"; -SWWM_ACHIEVEMENT_DOOMBOSS9_TAG = "Maldad Eterna"; -SWWM_ACHIEVEMENT_DOOMBOSS9_TXT = "Derrota al Archangelus"; -SWWM_ACHIEVEMENT_DOOMBOSS10_TAG = "Un Mirador de lo más Insano"; -SWWM_ACHIEVEMENT_DOOMBOSS10_TXT = "Conquista los Reinos Divididos"; SWWM_ACHIEVEMENT_DOSH_TAG = "Capitalismo Desenfrenado"; SWWM_ACHIEVEMENT_DOSH_TXT = "Acumula ¥1.000.000.000 entre todas tus partidas"; SWWM_ACHIEVEMENT_EVERYTHING_TAG = "La Demolicionista"; @@ -904,42 +886,10 @@ SWWM_ACHIEVEMENT_GRAVITY_TAG = "Ascenso Decente"; SWWM_ACHIEVEMENT_GRAVITY_TXT = "Usa %d Supresores de Gravedad"; SWWM_ACHIEVEMENT_GRENADE_TAG = "Cataplúm"; SWWM_ACHIEVEMENT_GRENADE_TXT = "Mata %d enemigos con cargadores de Explodium plantados"; -SWWM_ACHIEVEMENT_HERETICBOSS1_TAG = "Cabezas Locas"; -SWWM_ACHIEVEMENT_HERETICBOSS1_TXT = "Derrota a los Liches de Hierro"; -SWWM_ACHIEVEMENT_HERETICBOSS2_TAG = "La Toreada Padre"; -SWWM_ACHIEVEMENT_HERETICBOSS2_TXT = "Derrota a los Sirvientes Mazotauros"; -SWWM_ACHIEVEMENT_HERETICBOSS3_TAG = "Abracadabra Gané"; -SWWM_ACHIEVEMENT_HERETICBOSS3_TXT = "Derrota a D'Sparil"; -SWWM_ACHIEVEMENT_HERETICBOSS4_TAG = "¿Que es tan Gracioso?"; -SWWM_ACHIEVEMENT_HERETICBOSS4_TXT = "Derrota a los Liches de Hierro... otra vez"; -SWWM_ACHIEVEMENT_HERETICBOSS5_TAG = "Grandes Múusculos"; -SWWM_ACHIEVEMENT_HERETICBOSS5_TXT = "Derrota a los Sirvientes Mazotauros... otra vez"; -SWWM_ACHIEVEMENT_HEXENBOSS1_TAG = "Simplemente Funciona"; -SWWM_ACHIEVEMENT_HEXENBOSS1_TXT = "Derrota al Wyvern Mortal"; -SWWM_ACHIEVEMENT_HEXENBOSS2_TAG = "Magia Potagia"; -SWWM_ACHIEVEMENT_HEXENBOSS2_TXT = "Derrota al Heresiarca"; -SWWM_ACHIEVEMENT_HEXENBOSS3_TAG = "¿Tú Otra Vez?"; -SWWM_ACHIEVEMENT_HEXENBOSS3_TXT = "Derrota a otro Heresiarca"; -SWWM_ACHIEVEMENT_HEXENBOSS4_TAG = "Dominación"; -SWWM_ACHIEVEMENT_HEXENBOSS4_TXT = "Derrota a Zedek"; -SWWM_ACHIEVEMENT_HEXENBOSS5_TAG = "Excomunión"; -SWWM_ACHIEVEMENT_HEXENBOSS5_TXT = "Derrota a Traductus"; -SWWM_ACHIEVEMENT_HEXENBOSS6_TAG = "Odio los Puzzles"; -SWWM_ACHIEVEMENT_HEXENBOSS6_TXT = "Derrota a Menelkir"; -SWWM_ACHIEVEMENT_HEXENBOSS7_TAG = "Adórame Ésta"; -SWWM_ACHIEVEMENT_HEXENBOSS7_TXT = "Derrota a Korax"; -SWWM_ACHIEVEMENT_HEXENBOSS8_TAG = "Otro Más"; -SWWM_ACHIEVEMENT_HEXENBOSS8_TXT = "Derrota a otro Heresiarca más"; -SWWM_ACHIEVEMENT_HEXENBOSS9_TAG = "Y Otro Más"; -SWWM_ACHIEVEMENT_HEXENBOSS9_TXT = "Derrota... sí, otro Heresiarca más"; -SWWM_ACHIEVEMENT_HEXENBOSS10_TAG = "Y San Se Acabó"; -SWWM_ACHIEVEMENT_HEXENBOSS10_TXT = "Derrota al último Heresiarca"; -SWWM_ACHIEVEMENT_HEXENBOSS11_TAG = "¿No os Había Partido el Culo Antes?"; -SWWM_ACHIEVEMENT_HEXENBOSS11_TXT = "Derrota a los Reyes de la Muerte"; SWWM_ACHIEVEMENT_HND_TAG = "Mediodía"; SWWM_ACHIEVEMENT_HND_TXT = "Realiza %d disparos mortales en una única recarga de Puntzer Beta"; SWWM_ACHIEVEMENT_HURRY_TAG = "Con Prisas"; -SWWM_ACHIEVEMENT_HURRY_TXT = "Termina un mapa con un 0% de muertes, ítems y secretos"; +SWWM_ACHIEVEMENT_HURRY_TXT = "Termina un mapa con 0 muertes, ítems y secretos"; SWWM_ACHIEVEMENT_ICE_TXT = "Empala %d enemigos con el disparo secundario del Encendedor de Fuego Negro"; SWWM_ACHIEVEMENT_JUMP_TAG = "Verticalidad"; SWWM_ACHIEVEMENT_JUMP_TXT = "Salta paredes %d veces"; @@ -977,7 +927,7 @@ SWWM_ACHIEVEMENT_PARRY_TXT = "Desvía %d proyectiles"; SWWM_ACHIEVEMENT_PAR_TAG = "Rápido"; SWWM_ACHIEVEMENT_PAR_TXT = "Supera el tiempo par en %d mapas"; SWWM_ACHIEVEMENT_PEACE_TAG = "Pacifista"; -SWWM_ACHIEVEMENT_PEACE_TXT = "Termina un mapa sin matar nada"; +SWWM_ACHIEVEMENT_PEACE_TXT = "Termina un mapa sin causar daño"; SWWM_ACHIEVEMENT_PENE_TAG = "Penetrador"; SWWM_ACHIEVEMENT_PENE_TXT = "Atraviesa %d enemigos en fila con un solo secundario de la Gran Lanza"; SWWM_ACHIEVEMENT_PLASMA_TAG = "Echando Plasmas"; @@ -986,7 +936,7 @@ SWWM_ACHIEVEMENT_PLUSH_TAG = "Amorcito"; SWWM_ACHIEVEMENT_PLUSH_TXT = "Juega con el peluche de Saya %d veces en la misma partida"; $ifgame(hexen) SWWM_ACHIEVEMENT_PLUSH_TXT = "Juega con los peluches de Saya o Kirin %d veces en la misma partida"; SWWM_ACHIEVEMENT_PUZZLE_TAG = "Hasta Kirin está Cabreado"; -SWWM_ACHIEVEMENT_PUZZLE_TXT = "Resuelve %d \"puzzles\""; +SWWM_ACHIEVEMENT_PUZZLE_TXT = "Resuelve %d partes de \"puzzles\""; SWWM_ACHIEVEMENT_RAGE_TAG = "No Hablo me Enfado"; SWWM_ACHIEVEMENT_RAGE_TXT = "Usa %d Ragekits"; SWWM_ACHIEVEMENT_RAIL_TAG = "Metida de Través"; diff --git a/language.version b/language.version index fb4bd6c83..6f31adead 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre r12 \cu(Tue 7 Sep 11:57:21 CEST 2021)\c-"; -SWWM_SHORTVER="\cw1.1pre r12 \cu(2021-09-07 11:57:21)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw1.1pre r13 \cu(Wed 8 Sep 21:09:13 CEST 2021)\c-"; +SWWM_SHORTVER="\cw1.1pre r13 \cu(2021-09-08 21:09:13)\c-"; diff --git a/zscript/handler/swwm_handler_cheats.zsc b/zscript/handler/swwm_handler_cheats.zsc index 49cb2c482..ec59ed115 100644 --- a/zscript/handler/swwm_handler_cheats.zsc +++ b/zscript/handler/swwm_handler_cheats.zsc @@ -423,6 +423,7 @@ extend Class SWWMHandler StatusBar.AttachMessage(m,-1232); CVar.FindCVar('swwm_oldcheat').SetBool(true); } + SWWMUtility.MarkAchievement('swwm_achievement_cheat',players[consoleplayer]); if ( SWWMUtility.CheatsDisabled(consoleplayer) ) { kfail = true; diff --git a/zscript/handler/swwm_handler_damage.zsc b/zscript/handler/swwm_handler_damage.zsc index 139684ed6..062476f41 100644 --- a/zscript/handler/swwm_handler_damage.zsc +++ b/zscript/handler/swwm_handler_damage.zsc @@ -8,6 +8,9 @@ extend Class SWWMHandler int spreecount[MAXPLAYERS]; int lastkill[MAXPLAYERS]; int multilevel[MAXPLAYERS]; + bool dealtdamage[MAXPLAYERS]; + bool reallytookdamage[MAXPLAYERS]; + int onehpspree[MAXPLAYERS]; // gibbing private void DoGibThing( WorldEvent e ) @@ -91,6 +94,7 @@ extend Class SWWMHandler if ( e.Thing.player ) { tookdamage[e.Thing.PlayerNumber()] = true; + reallytookdamage[e.Thing.PlayerNumber()] = true; // does not reset on revive let s = SWWMStats.Find(e.Thing.player); if ( s ) // deathmatch telefrag-on-spawn may cause this to be null { @@ -100,6 +104,7 @@ extend Class SWWMHandler } if ( e.DamageSource && e.DamageSource.player ) { + dealtdamage[e.DamageSource.PlayerNumber()] = true; let s = SWWMStats.Find(e.DamageSource.player); if ( s ) // deathmatch telefrag-on-spawn may cause this to be null { @@ -121,6 +126,9 @@ extend Class SWWMHandler tk.special1 = 1; else tk.special1 = -1; } + // barrel destruction + if ( (e.Thing is 'ExplosiveBarrel') && (e.Thing.Health <= 0) ) + SWWMUtility.AchievementProgressInc('swwm_progress_barrel',1,e.DamageSource.player); } } @@ -176,6 +184,7 @@ extend Class SWWMHandler lastcombat = AddOneliner("scorekill",1,15); } } + int pnum = src.PlayerNumber(); // achievement stuff if ( e.Thing.IsHostile(src) ) { @@ -191,17 +200,28 @@ extend Class SWWMHandler SWWMUtility.AchievementProgressInc('swwm_progress_thicc',1,src.player); else if ( (e.DamageType == 'Love') && !(e.Thing is 'WolfensteinSS') && (e.Thing.Species != 'WolfensteinSS') ) SWWMUtility.AchievementProgressInc('swwm_progress_love',1,src.player); - if ( e.Inflictor && e.Inflictor.FindInventory('ParriedBuff') ) + Inventory buff = e.Inflictor?e.Inflictor.FindInventory('ParriedBuff'):null; + if ( buff ) + { SWWMUtility.AchievementProgressInc('swwm_progress_reflect',1,src.player); + if ( (e.Thing is 'Cyberdemon') && (e.Inflictor is 'Rocket') && (buff.tracer == e.Thing) ) + SWWMUtility.MarkAchievement('swwm_achievement_cybully',src.player); + } + if ( (e.Inflictor is 'PusherWeapon') || (e.Inflictor is 'PusherProjectile') ) + SWWMUtility.AchievementProgressInc('swwm_progress_tender',1,src.player); Inventory tk; if ( (tk = e.Thing.FindInventory("DeepImpactOnlyToken")) && (tk.special1 == 1) ) SWWMUtility.MarkAchievement('swwm_achievement_shame',src.player); SWWMUtility.AchievementProgressInc('swwm_progress_mega',1,src.player); + if ( src.player.Health == 1 ) + { + onehpspree[pnum]++; + SWWMUtility.AchievementProgress('swwm_progress_onehp',onehpspree[pnum],src.player); + } } // no credits unless it's a counted kill or marine (that isn't friendly) or another player in DM if ( e.Thing.IsFriend(src) || (!e.Thing.default.bCountKill && !(e.Thing is 'ScriptedMarine') && !(deathmatch && e.Thing.player)) ) return; - int pnum = src.PlayerNumber(); if ( level.maptime < (lastkill[pnum]+5*GameTicRate) ) multilevel[pnum]++; else multilevel[pnum] = 0; diff --git a/zscript/handler/swwm_handler_worldload.zsc b/zscript/handler/swwm_handler_worldload.zsc index 44e229ec1..f1d0805da 100644 --- a/zscript/handler/swwm_handler_worldload.zsc +++ b/zscript/handler/swwm_handler_worldload.zsc @@ -57,6 +57,26 @@ extend Class SWWMHandler s.AddLevelStats(); s.lastcluster = level.cluster; } + // nazi cleanup + let ti = ThinkerIterator.Create("Actor"); + Actor a; + bool hasnazis = false; + bool livenazis = false; + while ( a = Actor(ti.Next()) ) + { + // yes, the dogs don't count (they're just dogs) + if ( !(a is 'SWWMGuard') && !(a is 'SWWMSS') && !(a is 'SWWMHans') ) + continue; + hasnazis = true; + if ( a.Health > 0 ) livenazis = true; + } + if ( hasnazis && !livenazis ) + { + if ( level.levelnum == 31 ) s.nazicleanup |= 1; + else if ( level.levelnum == 32 ) s.nazicleanup |= 2; + } + if ( s.nazicleanup == 3 ) + SWWMUtility.MarkAchievement('swwm_achievement_trash',s.myplayer); } // reset score on dead players (death exit™) for ( int i=0; i 0) || (level.total_items > 0) || (level.total_secrets > 0)) + && (level.killed_monsters == 0) && (level.found_items == 0) && (level.found_secrets == 0) ) + SWWMUtility.MarkAchievement('swwm_achievement_hurry',players[consoleplayer]); } private void SetupLockdefsCache( SWWMCachedLockInfo cli ) @@ -226,42 +260,48 @@ extend Class SWWMHandler if ( !SWWMUtility.IsExitLine(l) ) continue; if ( skipme.Find(l) < skipme.Size() ) continue; - Vector3 lpos = SWWMUtility.UseLinePos(l); + skipme.Push(l); // look for connected lines - int xcnt = 1; + Array con; + con.Clear(); + con.Push(l); + int found; if ( l.frontsector ) { - for ( int j=0; j 0 ); } if ( l.backsector ) { - for ( int j=0; j 0 ); } - lpos /= xcnt; + Vector3 lpos = (0,0,0); + for ( int i=0; i con; + con.Clear(); + con.Push(HitLine); + Sector s = LineSide?HitLine.backsector:HitLine.frontsector; + int found = 0; + do + { + found = 0; + for ( int i=0; i 0 ); + for ( int i=0; i con; + con.Clear(); + con.Push(HitSector); + int found; + do + { + found = 0; + for ( int i=0; i= con.Size()) ) + { + found++; + con.Push(l.frontsector); + } + if ( (l.backsector.GetTexture(1) == HitTexture) && (con.Find(l.backsector) >= con.Size()) ) + { + found++; + con.Push(l.backsector); + } + } + } + } + while ( found > 0 ); + for ( int i=0; i con; + con.Clear(); + con.Push(HitSector); + int found; + do + { + found = 0; + for ( int i=0; i= con.Size()) ) + { + found++; + con.Push(l.frontsector); + } + if ( (l.backsector.GetTexture(0) == HitTexture) && (con.Find(l.backsector) >= con.Size()) ) + { + found++; + con.Push(l.backsector); + } + } + } + } + while ( found > 0 ); + for ( int i=0; i con; + con.Clear(); + con.Push(d.HitLine); + Sector s = d.LineSide?d.HitLine.backsector:d.HitLine.frontsector; + int found = 0; + do + { + found = 0; + for ( int i=0; i 0 ); + for ( int i=0; i con; + con.Clear(); + con.Push(d.HitSector); + int found; + do + { + found = 0; + for ( int i=0; i= con.Size()) ) + { + found++; + con.Push(l.frontsector); + } + if ( (l.backsector.GetTexture(1) == d.HitTexture) && (con.Find(l.backsector) >= con.Size()) ) + { + found++; + con.Push(l.backsector); + } + } + } + } + while ( found > 0 ); + for ( int i=0; i con; + con.Clear(); + con.Push(d.HitSector); + int found; + do + { + found = 0; + for ( int i=0; i= con.Size()) ) + { + found++; + con.Push(l.frontsector); + } + if ( (l.backsector.GetTexture(0) == d.HitTexture) && (con.Find(l.backsector) >= con.Size()) ) + { + found++; + con.Push(l.backsector); + } + } + } + } + while ( found > 0 ); + for ( int i=0; i height*.6 ) return; + if ( gaph > height*.8 ) return; // the smaller the gap, the more likely the crusher will snap - if ( Random[Demolitionist](0,3) && (FRandom[Demolitionist](0,gaph/height) > .1) ) return; + if ( Random[Demolitionist](0,2) && (FRandom[Demolitionist](0,gaph/height) > .2) ) return; double diffh = 8.+(default.height-gaph); // how much the crusher will have to "snap" after breaking let ceil = ceilingsector; let flor = floorsector; @@ -1452,6 +1563,7 @@ Class Demolitionist : PlayerPawn q.special1 = 10; SWWMCrusherBroken.Create(flor,null,diffh); } + SWWMUtility.MarkAchievement('swwm_achievement_crush',player); } override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle ) { @@ -1493,6 +1605,7 @@ Class Demolitionist : PlayerPawn if ( source.master ) source.master.Destroy(); source.Destroy(); damage = 20; // reduce so it's not instant kill + SWWMUtility.MarkAchievement('swwm_achievement_kancho',player); } } // no damage whatsoever diff --git a/zscript/swwm_thinkers_player.zsc b/zscript/swwm_thinkers_player.zsc index 03bb8a5e7..b41409140 100644 --- a/zscript/swwm_thinkers_player.zsc +++ b/zscript/swwm_thinkers_player.zsc @@ -45,6 +45,8 @@ Class SWWMStats : Thinker int plushuses; // for pistol start info (to avoid it within hubs) int lastcluster; + // for trash removal chievement + int nazicleanup; bool GotWeapon( Class which ) { diff --git a/zscript/weapons/swwm_baseweapon_melee.zsc b/zscript/weapons/swwm_baseweapon_melee.zsc index e685e4e3c..e0274ccef 100644 --- a/zscript/weapons/swwm_baseweapon_melee.zsc +++ b/zscript/weapons/swwm_baseweapon_melee.zsc @@ -138,10 +138,12 @@ Class ParryField : Actor while ( a = Actor(ti.Next()) ) { if ( (justparried.Find(a) < justparried.Size()) || !(SWWMUtility.ValidProjectile(a) || a.bSKULLFLY) || a.bTHRUACTORS || (level.Vec3Diff(a.pos,pos).length() > 80) ) continue; + if ( a is 'Whirlwind' ) SWWMUtility.MarkAchievement('swwm_achievement_tornado',master.player); justparried.Push(a); Vector3 vdir = a.vel; Vector3 dir = level.Vec3Diff(master.Vec2OffsetZ(0,0,pos.z),a.pos).unit(); Vector3 hdir = dir; + Actor oldtarget = a.target; if ( (a.target != master) && (a.bMISSILE || (a is 'HolySpirit')) ) // special wraithverge handling { // deflect directly to target @@ -161,6 +163,7 @@ Class ParryField : Actor { buff = Inventory(Spawn("ParriedBuff")); buff.AttachToOwner(a); + buff.tracer = oldtarget; } double mvel = a.vel.length(); double nspeed = min(100,mvel*FRandom[Parry](1.2,1.4)+20); @@ -199,6 +202,8 @@ Class ParryField : Actor if ( s ) s.pparries++; } critsnd = true; + if ( (a is 'LostSoul') && (master.player.ReadyWeapon is 'SilverBullet') ) + SWWMUtility.MarkAchievement('swwm_achievement_baseball',master.player); } if ( s ) s.parries++; SWWMUtility.AchievementProgressInc('swwm_progress_parry',1,master.player); diff --git a/zscript/weapons/swwm_splode.zsc b/zscript/weapons/swwm_splode.zsc index b7a0a7aca..05f67179e 100644 --- a/zscript/weapons/swwm_splode.zsc +++ b/zscript/weapons/swwm_splode.zsc @@ -10,6 +10,7 @@ Class ExplodiumGun : SWWMWeapon double casex, casey; transient ui TextureID WeaponBox; transient ui Font TewiFont; + int deadeyecnt; Property ClipCount : ClipCount; @@ -111,12 +112,17 @@ Class ExplodiumGun : SWWMWeapon SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { + if ( d.HitActor.IsHostile(self) ) + { + invoker.deadeyecnt++; + SWWMUtility.AchievementProgress('swwm_progress_deadeye',invoker.deadeyecnt,player); + } int dmg = 15; // might as well apply explosion on top if ( dmg >= d.HitActor.Health ) dmg += 20; SWWMUtility.DoKnockback(d.HitActor,d.HitDir,48000); dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Explodium',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x)); - if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT || d.HitActor.bINVULNERABLE ) + if ( !d.HitActor || d.HitActor.bNOBLOOD || d.HitActor.bDORMANT || d.HitActor.bINVULNERABLE ) { let p = Spawn("SWWMBulletImpact",d.HitLocation); p.angle = atan2(d.HitDir.y,d.HitDir.x)+180; @@ -134,6 +140,7 @@ Class ExplodiumGun : SWWMWeapon } else if ( d.HitType != TRACE_HitNone ) { + invoker.deadeyecnt = 0; Vector3 hitnormal = -d.HitDir; if ( d.HitType == TRACE_HitFloor ) { @@ -160,6 +167,7 @@ Class ExplodiumGun : SWWMWeapon b.target = self; if ( swwm_omnibust ) BusterWall.BustLinetrace(d,50,self,d.HitDir,d.HitLocation.z); } + else invoker.deadeyecnt = 0; for ( int i=0; i<6; i++ ) { let s = Spawn("SWWMSmoke",origin); @@ -172,6 +180,7 @@ Class ExplodiumGun : SWWMWeapon action void A_ThrowMag() { + invoker.deadeyecnt = 0; let weap = Weapon(invoker); if ( !weap ) return; Vector3 x, y, z, x2, y2, z2; @@ -192,6 +201,7 @@ Class ExplodiumGun : SWWMWeapon action void A_DropMag() { + invoker.deadeyecnt = 0; if ( swwm_nomagdrop ) return; Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); @@ -338,6 +348,7 @@ Class ExplodiumGun : SWWMWeapon Select: XZW2 B 2 { + invoker.deadeyecnt = 0; A_FullRaise(); return A_JumpIf(invoker.firstselect,"FirstSelect"); } @@ -665,6 +676,11 @@ Class DualExplodiumGun : SWWMWeapon SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { + if ( d.HitActor.IsHostile(self) ) + { + ExplodiumGun(invoker.SisterWeapon).deadeyecnt++; + SWWMUtility.AchievementProgress('swwm_progress_deadeye',ExplodiumGun(invoker.SisterWeapon).deadeyecnt,player); + } int dmg = 15; // might as well apply explosion on top if ( dmg >= d.HitActor.Health ) dmg += 20; @@ -688,6 +704,7 @@ Class DualExplodiumGun : SWWMWeapon } else if ( d.HitType != TRACE_HitNone ) { + ExplodiumGun(invoker.SisterWeapon).deadeyecnt = 0; Vector3 hitnormal = -d.HitDir; if ( d.HitType == TRACE_HitFloor ) { @@ -714,6 +731,7 @@ Class DualExplodiumGun : SWWMWeapon b.target = self; if ( swwm_omnibust ) BusterWall.BustLinetrace(d,50,self,d.HitDir,d.HitLocation.z); } + else ExplodiumGun(invoker.SisterWeapon).deadeyecnt = 0; for ( int i=0; i<6; i++ ) { let s = Spawn("SWWMSmoke",origin); @@ -726,6 +744,7 @@ Class DualExplodiumGun : SWWMWeapon action void A_DropMag( int side = 1 ) { + ExplodiumGun(invoker.SisterWeapon).deadeyecnt = 0; if ( swwm_nomagdrop ) return; Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); @@ -788,6 +807,7 @@ Class DualExplodiumGun : SWWMWeapon Select: XZW2 B 2 { + ExplodiumGun(invoker.SisterWeapon).deadeyecnt = 0; A_FullRaise(); ExplodiumGun(invoker.SisterWeapon).firstselect = false; } diff --git a/zscript/weapons/swwm_splode_fx.zsc b/zscript/weapons/swwm_splode_fx.zsc index 8fa9bdb46..2a8c51636 100644 --- a/zscript/weapons/swwm_splode_fx.zsc +++ b/zscript/weapons/swwm_splode_fx.zsc @@ -64,7 +64,11 @@ Class ExplodiumMagArm : Actor { Spawn("ExplodiumMagTrail",pos); if ( !(ReactionTime%2) ) - SWWMUtility.DoExplosion(self,2+reactiontime/2,3000+500*reactiontime,40+3*reactiontime,20); + { + int nhit, nkill; + [nhit, nkill] = SWWMUtility.DoExplosion(self,2+reactiontime/2,3000+500*reactiontime,40+3*reactiontime,20,DE_COUNTENEMIES); + if ( target && special1 ) SWWMUtility.AchievementProgressInc('swwm_progress_grenade',nkill,target.player); + } Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); let s = Spawn("SWWMHalfSmoke",pos); s.vel = pvel+vel*.2; @@ -147,13 +151,16 @@ Class ExplodiumMagProj : Actor } void A_BlowUp() { + bool isplanted = (self is 'ExplodiumMagAttach'); angle = atan2(cvel.y,cvel.x); pitch = asin(-cvel.z); bNOGRAVITY = true; A_SetRenderStyle(1.,STYLE_Add); Scale *= 2.+.2*special1; A_AlertMonsters(swwm_uncapalert?0:6000); - SWWMUtility.DoExplosion(self,10+20*special1,80000+8000*special1,90+10*special1,60,DE_EXTRAZTHRUST); + int nhit, nkill; + [nhit, nkill] = SWWMUtility.DoExplosion(self,10+20*special1,80000+8000*special1,90+10*special1,60,DE_EXTRAZTHRUST|DE_COUNTENEMIES); + if ( target && isplanted ) SWWMUtility.AchievementProgressInc('swwm_progress_grenade',nkill,target.player); A_QuakeEx(9,9,9,30,0,400+80*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:300,rollintensity:2.); A_StartSound("explodium/maghit",CHAN_VOICE,attenuation:.35); A_StartSound("explodium/maghit",CHAN_WEAPON,attenuation:.2); @@ -191,6 +198,7 @@ Class ExplodiumMagProj : Actor { let s = Spawn("ExplodiumMagArm",pos); s.target = target; + s.special1 = isplanted; } Spawn("ExploLight2",pos); if ( swwm_omnibust ) BusterWall.ProjectileBust(self,20+15*special1,cvel);