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:
parent
112129d8f8
commit
0420d511a6
28 changed files with 493 additions and 294 deletions
136
FuturePlans.md
136
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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
BIN
graphics/Achievements/AchievementCandy.png
Normal file
BIN
graphics/Achievements/AchievementCandy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
graphics/Achievements/AchievementDeadeye.png
Normal file
BIN
graphics/Achievements/AchievementDeadeye.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
BIN
graphics/Achievements/AchievementGrenade.png
Normal file
BIN
graphics/Achievements/AchievementGrenade.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
BIN
graphics/Achievements/AchievementPeace.png
Normal file
BIN
graphics/Achievements/AchievementPeace.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
graphics/Achievements/AchievementUntouchable.png
Normal file
BIN
graphics/Achievements/AchievementUntouchable.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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-";
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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++ )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue