New achievements coded (Most icons still not done).

Various random tweaks and fixes.
Reformatted and cleaned up Future Plans file.
This commit is contained in:
Mari the Deer 2021-09-08 21:09:13 +02:00
commit 0420d511a6
28 changed files with 493 additions and 294 deletions

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -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";

View file

@ -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";

View file

@ -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-";

View file

@ -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;

View file

@ -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;

View file

@ -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<MAXPLAYERS; i++ )
@ -91,15 +111,29 @@ extend Class SWWMHandler
}
if ( !collected ) SWWMUtility.MarkAchievement('swwm_achievement_cliffyb',players[consoleplayer]);
}
// these can't be done on hexen
if ( gameinfo.GameType&GAME_Hexen ) return;
// beat the par time?
if ( level.partime && (Thinker.Tics2Seconds(level.maptime) <= level.partime) )
SWWMUtility.AchievementProgressInc('swwm_progress_par',1,players[consoleplayer]);
// blaze it?
if ( Thinker.Tics2Seconds(level.maptime) == 260 )
SWWMUtility.MarkAchievement('swwm_achievement_blaze',players[consoleplayer]);
// one standing?
if ( (level.total_monsters-level.killed_monsters) == 1 )
SWWMUtility.MarkAchievement('swwm_achievement_onestanding',players[consoleplayer]);
// nice?
if ( players[consoleplayer].Health == 69 )
SWWMUtility.MarkAchievement('swwm_achievement_nice',players[consoleplayer]);
// peaceful/untouchable?
if ( !dealtdamage[consoleplayer] )
SWWMUtility.MarkAchievement('swwm_achievement_peace',players[consoleplayer]);
if ( !reallytookdamage[consoleplayer] )
SWWMUtility.MarkAchievement('swwm_achievement_untouchable',players[consoleplayer]);
// in a hurry?
if ( ((level.total_monsters > 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<Line> con;
con.Clear();
con.Push(l);
int found;
if ( l.frontsector )
{
for ( int j=0; j<l.frontsector.Lines.Size(); j++ )
do
{
let l2 = l.frontsector.Lines[j];
if ( (l2 == l) || (l2.special != l.special) ) continue;
// needs to have a point in common with this one or any of the added lines
if ( (l2.v1 != l.v1) && (l2.v2 != l.v2) && (l2.v1 != l.v2) && (l2.v2 != l.v1) )
found = 0;
for ( int j=0; j<l.frontsector.Lines.Size(); j++ )
{
let l2 = l.frontsector.Lines[j];
if ( (l2.special != l.special) || (con.Find(l2) < con.Size()) ) continue;
// needs to have a point in common with this one or any of the added lines
bool nomatches = true;
for ( int k=0; k<skipme.Size(); k++ )
for ( int k=0; k<con.Size(); k++ )
{
if ( (l2.v1 != skipme[k].v1) && (l2.v2 != skipme[k].v2) && (l2.v1 != skipme[k].v2) && (l2.v2 != skipme[k].v1) )
if ( (l2.v1 != con[k].v1) && (l2.v2 != con[k].v2) && (l2.v1 != con[k].v2) && (l2.v2 != con[k].v1) )
continue;
nomatches = false;
break;
}
if ( nomatches ) continue;
skipme.Push(l2);
con.Push(l2);
found++;
}
skipme.Push(l2);
xcnt++;
lpos += SWWMUtility.UseLinePos(l2);
}
while ( found > 0 );
}
if ( l.backsector )
{
for ( int j=0; j<l.backsector.Lines.Size(); j++ )
do
{
let l2 = l.backsector.Lines[j];
if ( (l2 == l) || (l2.special != l.special) ) continue;
// needs to have a point in common with this one or any of the added lines
if ( (l2.v1 != l.v1) && (l2.v2 != l.v2) && (l2.v1 != l.v2) && (l2.v2 != l.v1) )
found = 0;
for ( int j=0; j<l.backsector.Lines.Size(); j++ )
{
let l2 = l.backsector.Lines[j];
if ( (l2.special != l.special) || (con.Find(l2) < con.Size()) ) continue;
// needs to have a point in common with this one or any of the added lines
bool nomatches = true;
for ( int k=0; k<skipme.Size(); k++ )
{
@ -271,13 +311,17 @@ extend Class SWWMHandler
break;
}
if ( nomatches ) continue;
skipme.Push(l2);
con.Push(l2);
found++;
}
skipme.Push(l2);
xcnt++;
lpos += SWWMUtility.UseLinePos(l2);
}
while ( found > 0 );
}
lpos /= xcnt;
Vector3 lpos = (0,0,0);
for ( int i=0; i<con.Size(); i++ )
lpos += SWWMUtility.UseLinePos(con[i]);
lpos /= con.Size();
SWWMInterest.Spawn(lpos,theline:l);
}
// spawn loot

View file

@ -70,6 +70,12 @@ extend Class SWWMHandler
// combat tracking
private void CombatTrack()
{
// if players are above 1HP, reset the "one hp kill" counter
for ( int i=0; i<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
if ( players[i].Health != 1 ) onehpspree[i] = 0;
}
// prune old entries
for ( int i=0; i<combatactors.Size(); i++ )
{

View file

@ -160,6 +160,28 @@ Class SWWMStatusBar : BaseStatusBar
koraxhack = false;
return true;
}
// check for puzzle solving lines (oh god why), and increment the achievement
if ( (msg == StringTable.Localize("$TXT_ACS_MAP04_9_ONEHA"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP04_11_ONETH"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP05_6_ONETH"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP08_6_ONESI"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP09_6_ONESI"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP10_6_ONESI"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP28_6_ONENI"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP30_6_ONENI"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP34_1_ONENI"))
// deathkings
|| (msg == StringTable.Localize("$TXT_ACS_MAP44_1_THREE"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP44_2_TWOMO"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP44_3_ONEMO"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP44_4_THEPU"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP44_10_ONETH"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP44_11_TWOTH"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP46_8_ONEFO"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP51_8_ONETH"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP51_9_TWOTH"))
|| (msg == StringTable.Localize("$TXT_ACS_MAP51_10_THECR")) )
SWWMUtility.AchievementProgressInc('swwm_progress_puzzle',1,players[consoleplayer]);
if ( !fnt || (fnt == smallfont) )
{
midstr = msg;

View file

@ -25,6 +25,13 @@ Class ArmorNuggetItem : SWWMSpareArmor
SWWMLoreLibrary.Add(other.player,"Nugget");
return Super.CreateCopy(other);
}
override void DoPickupSpecial( Actor toucher )
{
Super.DoPickupSpecial(toucher);
SWWMUtility.AchievementProgressInc('swwm_progress_candy',1,toucher.player);
}
Default
{
//$Title Armor Nugget

View file

@ -71,6 +71,11 @@ Class HealthNuggetItem : SWWMHealth
SWWMLoreLibrary.Add(other.player,"Nugget");
return Super.CreateCopy(other);
}
override void DoPickupSpecial( Actor toucher )
{
Super.DoPickupSpecial(toucher);
SWWMUtility.AchievementProgressInc('swwm_progress_candy',1,toucher.player);
}
Default
{
//$Title Health Nugget

View file

@ -305,6 +305,7 @@ Class LoveHeart : Actor
if ( target && target.player )
{
int scr = (TexMan.GetName(HitTexture).Left(6)~=="ZZWOLF")?200:20;
if ( scr == 20 ) SWWMUtility.AchievementProgressInc('swwm_progress_doodle',1,player);
SWWMCredits.Give(target.player,scr);
if ( target.player == players[consoleplayer] ) SWWMScoreObj.Spawn(scr,pos);
}
@ -316,7 +317,40 @@ Class LoveHeart : Actor
else if ( Hit3DFloor.flags&F3DFloor.FF_LOWERTEXTURE ) HitLine.sidedef[LineSide].SetTexture(2,replacewith);
else Hit3DFloor.master.sidedef[0].SetTexture(1,replacewith);
}
else HitLine.sidedef[LineSide].SetTexture(LinePart,replacewith);
else
{
// find connected sidedefs with the same texture
Array<Line> con;
con.Clear();
con.Push(HitLine);
Sector s = LineSide?HitLine.backsector:HitLine.frontsector;
int found = 0;
do
{
found = 0;
for ( int i=0; i<s.Lines.Size(); i++ )
{
let l = s.Lines[i];
if ( !l.sidedef[LineSide] || (l.sidedef[LineSide].GetTexture(LinePart) != HitTexture) )
continue;
if ( con.Find(l) < con.Size() ) continue;
bool notmatched = true;
for ( int j=0; j<con.Size(); j++ )
{
if ( (l.v1 != con[j].v1) && (l.v2 != con[j].v2) && (l.v1 != con[j].v2) && (l.v2 != con[j].v1) )
continue;
notmatched = false;
break;
}
if ( notmatched ) continue;
con.Push(l);
found++;
}
}
while ( found > 0 );
for ( int i=0; i<con.Size(); i++ )
con[i].sidedef[LineSide].SetTexture(LinePart,replacewith);
}
}
else if ( HitSector && HitCeiling )
{
@ -325,7 +359,45 @@ Class LoveHeart : Actor
if ( Hit3DFloor.flags&F3DFloor.FF_INVERTSECTOR ) Hit3DFloor.model.SetTexture(1,replacewith);
else Hit3DFloor.model.SetTexture(0,replacewith);
}
else HitSector.SetTexture(1,replacewith);
else
{
// find connected sectors with the same ceiling texture (THIS IS VERY UGLY CODE)
Array<Sector> con;
con.Clear();
con.Push(HitSector);
int found;
do
{
found = 0;
for ( int i=0; i<con.Size(); i++ )
{
Sector s = con[i];
for ( int j=0; j<s.Lines.Size(); j++ )
{
Line l = s.Lines[j];
// only check two-sided
if ( !l.sidedef[1] ) continue;
// don't check if there's a height difference
if ( (l.frontsector.ceilingplane.ZAtPoint(l.v1.p) != l.backsector.ceilingplane.ZAtPoint(l.v1.p))
|| (l.frontsector.ceilingplane.ZAtPoint(l.v2.p) != l.backsector.ceilingplane.ZAtPoint(l.v2.p)) )
continue;
if ( (l.frontsector.GetTexture(1) == HitTexture) && (con.Find(l.frontsector) >= 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.Size(); i++ )
con[i].SetTexture(1,replacewith);
}
}
else if ( HitSector && !HitCeiling )
{
@ -334,7 +406,45 @@ Class LoveHeart : Actor
if ( Hit3DFloor.flags&F3DFloor.FF_INVERTSECTOR ) Hit3DFloor.model.SetTexture(0,replacewith);
else Hit3DFloor.model.SetTexture(1,replacewith);
}
else HitSector.SetTexture(0,replacewith);
else
{
// find connected sectors with the same floor texture (THIS IS VERY UGLY CODE)
Array<Sector> con;
con.Clear();
con.Push(HitSector);
int found;
do
{
found = 0;
for ( int i=0; i<con.Size(); i++ )
{
Sector s = con[i];
for ( int j=0; j<s.Lines.Size(); j++ )
{
Line l = s.Lines[j];
// only check two-sided
if ( !l.sidedef[1] ) continue;
// don't check if there's a height difference
if ( (l.frontsector.floorplane.ZAtPoint(l.v1.p) != l.backsector.floorplane.ZAtPoint(l.v1.p))
|| (l.frontsector.floorplane.ZAtPoint(l.v2.p) != l.backsector.floorplane.ZAtPoint(l.v2.p)) )
continue;
if ( (l.frontsector.GetTexture(0) == HitTexture) && (con.Find(l.frontsector) >= 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.Size(); i++ )
con[i].SetTexture(0,replacewith);
}
}
}
action void A_HeartBurst()

View file

@ -51,6 +51,7 @@ Class SWWMHangingKeen : Actor
action void A_DropKeen()
{
Spawn("SWWMDroppedKeen",Vec3Offset(0,0,8));
SWWMUtility.MarkAchievement('swwm_achievement_keen',players[consoleplayer]);
}
override bool Used( Actor user )
{

View file

@ -529,6 +529,7 @@ Class Demolitionist : PlayerPawn
A_StartSound("bestsound",CHAN_ITEMEXTRA,CHANF_OVERLAP);
lastbump *= .97;
int scr = (TexMan.GetName(d.HitTexture).Left(6)~=="ZZWOLF")?200:20;
if ( scr == 20 ) SWWMUtility.AchievementProgressInc('swwm_progress_doodle',1,player);
SWWMCredits.Give(player,scr);
if ( player == players[consoleplayer] ) SWWMScoreObj.Spawn(scr,d.HitLocation);
if ( d.HitType == TRACE_HitWall )
@ -539,7 +540,40 @@ Class Demolitionist : PlayerPawn
else if ( d.Hit3DFloor.flags&F3DFloor.FF_LOWERTEXTURE ) d.HitLine.sidedef[d.LineSide].SetTexture(2,replacewith);
else d.Hit3DFloor.master.sidedef[0].SetTexture(1,replacewith);
}
else d.HitLine.sidedef[d.LineSide].SetTexture(d.LinePart,replacewith);
else
{
// find connected sidedefs with the same texture
Array<Line> 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<s.Lines.Size(); i++ )
{
let l = s.Lines[i];
if ( !l.sidedef[d.LineSide] || (l.sidedef[d.LineSide].GetTexture(d.LinePart) != d.HitTexture) )
continue;
if ( con.Find(l) < con.Size() ) continue;
bool notmatched = true;
for ( int j=0; j<con.Size(); j++ )
{
if ( (l.v1 != con[j].v1) && (l.v2 != con[j].v2) && (l.v1 != con[j].v2) && (l.v2 != con[j].v1) )
continue;
notmatched = false;
break;
}
if ( notmatched ) continue;
con.Push(l);
found++;
}
}
while ( found > 0 );
for ( int i=0; i<con.Size(); i++ )
con[i].sidedef[d.LineSide].SetTexture(d.LinePart,replacewith);
}
}
else if ( d.HitType == TRACE_HitCeiling )
{
@ -548,7 +582,45 @@ Class Demolitionist : PlayerPawn
if ( d.Hit3DFloor.flags&F3DFloor.FF_INVERTSECTOR ) d.Hit3DFloor.model.SetTexture(1,replacewith);
else d.Hit3DFloor.model.SetTexture(0,replacewith);
}
else d.HitSector.SetTexture(1,replacewith);
else
{
// find connected sectors with the same ceiling texture (THIS IS VERY UGLY CODE)
Array<Sector> con;
con.Clear();
con.Push(d.HitSector);
int found;
do
{
found = 0;
for ( int i=0; i<con.Size(); i++ )
{
Sector s = con[i];
for ( int j=0; j<s.Lines.Size(); j++ )
{
Line l = s.Lines[j];
// only check two-sided
if ( !l.sidedef[1] ) continue;
// don't check if there's a height difference
if ( (l.frontsector.ceilingplane.ZAtPoint(l.v1.p) != l.backsector.ceilingplane.ZAtPoint(l.v1.p))
|| (l.frontsector.ceilingplane.ZAtPoint(l.v2.p) != l.backsector.ceilingplane.ZAtPoint(l.v2.p)) )
continue;
if ( (l.frontsector.GetTexture(1) == d.HitTexture) && (con.Find(l.frontsector) >= 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.Size(); i++ )
con[i].SetTexture(1,replacewith);
}
}
else if ( d.HitType == TRACE_HitFloor )
{
@ -557,7 +629,45 @@ Class Demolitionist : PlayerPawn
if ( d.Hit3DFloor.flags&F3DFloor.FF_INVERTSECTOR ) d.Hit3DFloor.model.SetTexture(0,replacewith);
else d.Hit3DFloor.model.SetTexture(1,replacewith);
}
else d.HitSector.SetTexture(0,replacewith);
else
{
// find connected sectors with the same floor texture (THIS IS VERY UGLY CODE)
Array<Sector> con;
con.Clear();
con.Push(d.HitSector);
int found;
do
{
found = 0;
for ( int i=0; i<con.Size(); i++ )
{
Sector s = con[i];
for ( int j=0; j<s.Lines.Size(); j++ )
{
Line l = s.Lines[j];
// only check two-sided
if ( !l.sidedef[1] ) continue;
// don't check if there's a height difference
if ( (l.frontsector.floorplane.ZAtPoint(l.v1.p) != l.backsector.floorplane.ZAtPoint(l.v1.p))
|| (l.frontsector.floorplane.ZAtPoint(l.v2.p) != l.backsector.floorplane.ZAtPoint(l.v2.p)) )
continue;
if ( (l.frontsector.GetTexture(0) == d.HitTexture) && (con.Find(l.frontsector) >= 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<con.Size(); i++ )
con[i].SetTexture(0,replacewith);
}
}
}
void CheckItemUsePickup()
@ -916,6 +1026,7 @@ Class Demolitionist : PlayerPawn
{
cairtime = 0;
mystats.grounddist += traveldist;
SWWMUtility.AchievementProgressIncDouble('swwm_progress_travel',traveldist/32000.,player);
}
}
else mystats.swimdist += traveldist;
@ -1421,9 +1532,9 @@ Class Demolitionist : PlayerPawn
private void CheckBreakCrusher()
{
double gaph = (ceilingz-floorz);
if ( gaph > 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

View file

@ -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<Weapon> which )
{

View file

@ -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);

View file

@ -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;
}

View file

@ -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);