diff --git a/PriceTable.md b/PriceTable.md new file mode 100644 index 000000000..8fe7b6fa4 --- /dev/null +++ b/PriceTable.md @@ -0,0 +1,96 @@ +### Prices for SWWM GZ items + +These are the prices of any items that can be bought in the in-game store. +For items that are also available in bundles (e.g.: Shells), the price of +those follows the formula (price*(1+0.75*amount)). +These values may be adjusted in the future after things are tested properly. + +#### Weapons and ammo + +Can only buy weapons you don't own. Ammo can still be bought even if you don't +own the respective weapon. + + Item | Price + ------------- | ----- + Pusher | 5000 + Deep Impact | 2000 + Explodium Gun | 3000 + Spreadgun | 10000 + Red Shell | 500 + Green Shell | 600 + White Shell | 900 + Blue Shell | 700 + Black Shell | 1000 + Purple Shell | 800 + Gold Shell | 120000 + Wallbuster | 15000 + Eviscerator | 25000 + Evisc. Shell | 2500 + Hellblazer | 40000 + Missiles | 6000 + Crackshots | 8000 + Ravagers | 12000 + Warheads | 25000 + Sparkster | 80000 + Spark Unit | 20000 + Silver Bullet | 120000 + S.B. Mag | 30000 + Candygun | 200000 + Candy Mag | 80000 + Spare Gun | 150000 + Ynykron | 2000000 + Crystal Unit | 400000 + +#### DLC weapons and ammo (when available) + +These will be available long after the first release. + + Item | Price + ------------- | ----- + Sledgehammer | 4000 + Gravity Gun | 12000 + Gravity Cell | 2000 + Splatter | 20000 + Splat Core | 4000 + Skull Launch. | 35000 + Skull Bomb | 8000 + Blackfire Ig. | 50000 + Blackfire C. | 12000 + Puntzer Gamma | 70000 + SMW.05 Mag | 20000 + EMP Carbine | 90000 + EMP Core | 35000 + PROWEL&TADEL | 160000 + Insane Core | 40000 + S.H. Fun Ball | 2500000 + Spare Balls | 2000000 + +#### Other items + +Other items that can be bought at any moment. Omnisights and Embiggeners cannot +be purchased from the store, they have to be found in maps. + + Item | Price + ------------- | ----- + Health Nugget | 1200 + H.Tetrahedron | 3000 + H.Cube | 8000 + Refresher | 60000 + Armor Nugget | 1000 + Blast Suit | 15000 + War Armor | 50000 + Ghost Arti. | 20000 + Gravity Supp. | 16000 + Invinciball | 150000 + Ragekit | 120000 + Lämp | 12000 + Omnisight | N/A + Embiggener | N/A + T1 Fabricator | 3000 + T2 Fabricator | 12000 + T3 Fabricator | 480000 + T4 Fabricator | 1920000 + T1 Chancebox | 1000 + T2 Chancebox | 10000 + T3 Chancebox | 100000 + T4 Chancebox | 1000000 diff --git a/README.md b/README.md index 8d3b08356..76d415033 100644 --- a/README.md +++ b/README.md @@ -400,10 +400,9 @@ you from dying at all if it autoactivates on low health. Actual 100% invisibility guaranteed, a relic from the old UnSX days. -The ghost artifact is capable of turning you absolutely invisible when standing -still, and just slightly more visible when moving, depending on speed. - -Firing of course nullifies the effect for a while. +The ghost artifact is capable of turning you absolutely invisible. However, it +does not prevent you from making noise, so it's best to use it to sneak past +certain encounters, or prepare surprise attacks. This powerup lasts 60 seconds and cannot be toggled. diff --git a/cvarinfo.txt b/cvarinfo.txt index 0c3ec9043..c8b9c515a 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -15,3 +15,4 @@ user int swwm_mutevoice = 0; // mute demolitionist voice user int swwm_chatduration = 900; // lifespan of chat messages user int swwm_msgduration = 240; // lifespan of other messages user int swwm_pickduration = 120; // lifespan of pickup messages +user noarchive int swwm_lasttab = 0; // last selected tab in the menu diff --git a/graphics/KBase/MainWindow.png b/graphics/KBase/MainWindow.png new file mode 100644 index 000000000..42c5cce0d Binary files /dev/null and b/graphics/KBase/MainWindow.png differ diff --git a/graphics/KBase/TabSeparator.png b/graphics/KBase/TabSeparator.png new file mode 100644 index 000000000..b22e21515 Binary files /dev/null and b/graphics/KBase/TabSeparator.png differ diff --git a/graphics/KBase/WindowSeparator.png b/graphics/KBase/WindowSeparator.png new file mode 100644 index 000000000..32b5e31bc Binary files /dev/null and b/graphics/KBase/WindowSeparator.png differ diff --git a/graphics/KBaseMockup.xcf b/graphics/KBaseMockup.xcf new file mode 100644 index 000000000..dedb2221e Binary files /dev/null and b/graphics/KBaseMockup.xcf differ diff --git a/language.txt b/language.txt index 3304529d4..274241a7e 100644 --- a/language.txt +++ b/language.txt @@ -11,23 +11,93 @@ SWWM_DASH = "Dash"; SWWM_GESTURE1 = "Point Down"; SWWM_GESTURE2 = "Thumbs Up"; SWWM_GESTURE3 = "Victory"; -SWWM_KBASE = "Knowledge Base"; +SWWM_KBASE = "Demolitionist Menu"; // mod menu +SWWM_MENUTITLE = "SWWM Options"; +SWWM_VOICETYPE = "Demolitionist Voice Type"; +SWWM_MUTELEVEL = "Voice Muting Level"; +SWWM_MUTENONE = "None"; +SWWM_MUTECOMBAT = "Combat Comments"; +SWWM_MUTEINTER = "Interaction Comments"; +SWWM_MUTELINERS = "Map Start Oneliners"; +SWWM_MUTEALL = "Everything"; // knowledge base -SWWM_TOOSMALL = "Your resolution is too small to fit this menu.\n640x400 or higher is required."; SWWM_COMINGSOON = "(coming soon)"; +SWWM_MISSTAB = "Mission"; +SWWM_STATTAB = "Stats"; +SWWM_STATUPTIME = "Uptime:"; +SWWM_STATONFOOT = "Distance on Foot:"; +SWWM_STATFLIGHT = "Distance in Air:"; +SWWM_STATBOOST = "Times Boosted:"; +SWWM_STATDASH = "Times Dashed:"; +SWWM_STATSTOMP = "Times Stomped:"; +SWWM_STATSPEED = "Top Speed:"; +SWWM_STATAIRTIME = "Longest Air Time:"; +SWWM_STATHISCORE = "Highest Score:"; +SWWM_INVTAB = "Inventory"; +SWWM_KEYTAB = "Keychain"; +SWWM_KBASETAB = "Library"; +SWWM_STORETAB = "Store"; +SWWM_STOREFULL = "You can't hold more of that"; +SWWM_STOREMUNS = "You don't have enough money"; +SWWM_TRADETAB = "Trading"; +SWWM_TRADEFULL = "They can't hold more of that"; +SWWM_TRADEHIST = "History"; +SWWM_TRADETO = "Sent to"; +SWWM_TRADEFROM = "Received from"; +SWWM_MSGSENT = "You sent %s to %s."; +SWWM_MSGRECV = "%s sent you %s."; +SWWM_CHATTAB = "Chat Log"; +SWWM_MAINCONTROLS = "PgUp/PgDn: Switch Tab | Arrows: Navigate | "; +SWWM_EXTCONTROLS = "Enter: Select | Escape: Cancel | "; +SWWM_CHATCONTROLS = "Del: Clear | "; +// mission entries +SWWM_MISSION_DOOM = +"Welcome to your first mission, Demolitionist. Since I have very little confidence in those UAC idiots, I have decided to send you up ahead to assist on the fight against the demon invaders that came to Earth, thanks to their very wonderful and very reliable teleportation experiments backfiring, which is something absolutely no one saw coming, oh no, definitely not. It's not like that hasn't happened like... several times now? If Samuel Hayden didn't have me blocked I'd be sending him all sorts of trash right now. Oh I'd love to see his reaction to this...\n" +"\n" +"Anyway, let's get to the point here. Your main objective is to eliminate all hostile forces in the region. There's going to be a hell a of a lot of fighting up ahead, but I know you can do it, that's why I built you. Do this job well and maybe you'll be rewarded when you come back home, who knows. No, Ibuki won't hug you again, I promise, your chassis will be safe. Your reward will actually be something else, but I won't tell you more details, I want it to be a surprise.\n" +"\n" +"By the way, we haven't been able to provide you with all the available equipment, it would've been very expensive. Instead, be on the lookout for strategically placed supplies along the way. If that sounds too videogamey, you can eat my pants, I wasn't the one who made that decision. Whatever.\n" +"\n" +"Saya out."; +SWWM_MISSION_HERETIC = "Welcome to your second mission, Demolitionist. This one will be quite different, as you may see. While scouring the multiverse with our new portal technology we came across this cool little place called Parthoris. It's got elves 'n magic stuff, very fantasy-like setting, I dig it. Anyway I hope the ride wasn't too bumpy, crossing between universes and all.\n" +"\n" +"Here's what's up: We have information that there is some sort of ongoing war between a bunch of elves and some crazy cult. Your objective is to neutralize this cult, preferably also taking out its leader, some sort of wizard dude. They call him D'Sparil and he's part of a triad of big baddies called the \"Serpent Riders\", because they ride dragons or something I guess? Guy's tall, wears red robes, and talks backwards, can't miss him. I'm sure that when you get back you'll want to transfer over to your maidbot body again, so I'll be working on a couple extensions there to make things more... \"fun\", if you catch my drift.\n" +"\n" +"Once again, I'm sorry that we couldn't give you all your stuff. I'm taking the blame this time, I think I screwed something up with the deployment and it got scattered all over the place. It's possible that the locals may have also moved stuff around so... good luck finding it all.\n" +"\n" +"Saya out."; +SWWM_MISSION_HEXEN = "Welcome to your third mission, Demolitionist. We're sending you into another world, but this is actually related to your previous mission. First of all, yes I fucked up again, I'm sorry, really. All your stuff got lost... again, my bad. On top of that there was some sort of mixup with the ammo supplies and instead we got these weird \"Fabricator\" things from Cyrus. They do provide ammo, at least.\n" +"\n" +"So yeah, you're now in the land of Cronos, more of that cool dark fantasy stuff around. It seems that some old pal of that wizard dude from last time is being a stinky ass here, and we need that sorted out before we can start studying this place in more detail. So there you go, beat the crap outta him! As a reward, we can do some more of \"that\". Just you, me, maybe Ibuki too... hnnn... and then... *heavy breathing*\n" +"\n" +"OK, wow... phew. Saya, focus. No hornyposting on mission statements. Anyway, more details about your target. Evil dragonish-looking dude, deep voice, and also a Serpent Rider, though I can't even begin to understand how he'd ride one. Maybe he's the one that receives the riding... u... ggdfgfhfhdfh... ok, pls no, BAD mental image, UGH. I think I'm going to need to spend a couple more hours drowning in Ibuki's tiddies to get this out of my head...\n" +"\n" +"Saya out."; +// lore entries +SWWM_LORE_ENTRY_ = ""; +SWWM_LORE_GRAPHIC_ = ""; +SWWM_LORE_CONTENTS_ = ""; /* GAME STUFF */ -// tags -T_PUSHER = "\"Pusher\" Microfusion Rotary Hammer"; -T_DEEPIMPACT = "\"Deep Impact\" Airblaster"; +// tags, pickups +T_PUSHER = "Pusher"; +I_PUSHER = "\"Pusher\" Microfusion Rotary Hammer"; +T_DEEPIMPACT = "Deep Impact"; +I_DEEPIMPACT = "\"Deep Impact\" Airblaster"; T_EXPLODIUM = "Explodium Gun"; -T_SPREADGUN = "\"Rhino Stopper\" Spreadgun"; -T_WALLBUSTER = "\"Wallbuster\" Heavy Perforator Shotgun"; -T_EVISCERATOR = "\"Eviscerator\" High Load Flechette Cannon"; -T_HELLBLAZER = "\"Hellblazer\" Rocket Launcher"; -T_SPARKSTER = "Model S-5 Biospark Carbine"; +T_SPREADGUN = "Spreadgun"; +I_SPREADGUN = "\"Rhino Stopper\" Spreadgun"; +T_WALLBUSTER = "Wallbuster"; +I_WALLBUSTER = "\"Wallbuster\" Heavy Perforator Shotgun"; +T_EVISCERATOR = "Eviscerator"; +I_EVISCERATOR = "\"Eviscerator\" High Load Flechette Cannon"; +T_HELLBLAZER = "Hellblazer"; +I_HELLBLAZER = "\"Hellblazer\" Rocket Launcher"; +T_SPARKSTER = "Sparkster"; +I_SPARKSTER = "Model S-5 Biospark Carbine"; T_SILVERBULLET = "Silver Bullet JET"; -T_CANDYGUN = "\"Taste the Sweetness\" Candy Gun"; +T_CANDYGUN = "Candy Gun"; +I_CANDYGUN = "\"Taste the Sweetness\" Candy Gun"; T_YNYKRON = "Ynykron Artifact"; T_REDSHELL = "Shell"; T_REDSHELLS = "Shells"; @@ -67,6 +137,8 @@ T_TETRAHEALTH = "Health Tetrahedron"; T_CUBEHEALTH = "Health Cube"; T_INVINCIBALL = "Fuckin' Invinciball"; T_LAMP = "Lämp"; +T_MOTH = "Moth"; +T_MASHIRO = "White Moth"; T_NUGGETH = "Health Nugget"; T_NUGGETA = "Armor Nugget"; T_OMNISIGHT = "Omnisight"; @@ -126,6 +198,8 @@ SWWM_INTERTIP11 = "The Lämp has a chance to attract a rare type of moth that is SWWM_INTERTIP12 = "Most healing items will auto-activate if you're about to die, though sometimes they may not be enough to really save you... unless it's a Grilled Cheese Sandwich."; SWWM_INTERTIP13 = "The Ynykron Artifact will instantly kill everything you aim it at, unless it's really unkillable, though usually that's only the case for gods. You're not planning on going after any gods, right?"; SWWM_INTERTIP14 = "Do not be deceived by the Candy Gun, it may seem like a simple recolor, but it is A LOT stronger than your starting weapon."; +SWWM_INTERTIP15 = "The Ragekit will greatly increase the strength of your melee attacks and reduce incoming damage, but it'll also make you scream, all the time."; +SWWM_INTERTIP16 = "You can share items with other players in multiplayer using the trading tab in your Demolitionist menu. Items that won't fit in the destination inventory will not be traded."; /* SUBTITLES */ // new weapon received @@ -210,6 +284,7 @@ SWWM_SUBS_DEFAULT_FINDSECRET9 = "It was a piece of cake."; SWWM_SUBS_DEFAULT_FINDSECRET10 = "I still got it."; SWWM_SUBS_DEFAULT_FINDSECRET11 = "I did good work, didn't I?"; SWWM_SUBS_DEFAULT_FINDSECRET12 = "Wow, that's pretty lucky!"; +SWWM_SUBS_DEFAULT_FINDSECRET13 = "Yeah, well, I am pretty awesome."; // frag taunts SWWM_SUBS_DEFAULT_SCOREKILL1 = "Good riddance."; SWWM_SUBS_DEFAULT_SCOREKILL2 = "One down."; @@ -257,5 +332,32 @@ SWWM_SUBS_DEFAULT_GETHIT15 = "And now it's your turn."; SWWM_SUBS_DEFAULT_GETHIT16 = "Time to shut you up for good."; SWWM_SUBS_DEFAULT_GETHIT17 = "You're not leaving here in one piece."; SWWM_SUBS_DEFAULT_GETHIT18 = "You're obviously upset..."; +// getting hurt by friendlies +SWWM_SUBS_DEFAULT_FRIENDHIT1 = "Are you ticked off at me?"; +SWWM_SUBS_DEFAULT_FRIENDHIT2 = "Are you serious?"; +SWWM_SUBS_DEFAULT_FRIENDHIT3 = "What? Why?"; +SWWM_SUBS_DEFAULT_FRIENDHIT4 = "That's awfully rude."; +SWWM_SUBS_DEFAULT_FRIENDHIT5 = "Sorry, what?"; +SWWM_SUBS_DEFAULT_FRIENDHIT6 = "Not very friendly, are you?"; +SWWM_SUBS_DEFAULT_FRIENDHIT7 = "Whoa, whoa. Easy there."; +// hurting a friendly +SWWM_SUBS_DEFAULT_HITFRIEND1 = "I... sorry."; +SWWM_SUBS_DEFAULT_HITFRIEND2 = "I'm sorry."; +SWWM_SUBS_DEFAULT_HITFRIEND3 = "Sorry."; +// greeting another player +SWWM_SUBS_DEFAULT_GREET1 = "Hi."; +SWWM_SUBS_DEFAULT_GREET2 = "Hey there."; +SWWM_SUBS_DEFAULT_GREET3 = "Hey."; +SWWM_SUBS_DEFAULT_GREET4 = "Hey."; +SWWM_SUBS_DEFAULT_GREET5 = "Hey."; +SWWM_SUBS_DEFAULT_GREET6 = "Well hello."; +SWWM_SUBS_DEFAULT_GREET7 = "Hi there."; +// ragekit +SWWM_SUBS_DEFAULT_RAGEKIT1 = "AAAAAAAAAAAAAAAAAAAAAA!!!!!"; +SWWM_SUBS_DEFAULT_RAGEKIT2 = "FFFFFFUUUUUUUUUUUCKKKK!!!"; +SWWM_SUBS_DEFAULT_RAGEKIT3 = "FUCKFUCKFUCCKKKK!!"; +SWWM_SUBS_DEFAULT_RAGEKIT4 = "AAAAAAAAAARGH!!!!"; +SWWM_SUBS_DEFAULT_RAGEKIT5 = "KILLLLL!!!!"; +SWWM_SUBS_DEFAULT_RAGEKIT6 = "RAAAARGH!!! BRING IT!!!"; [es] diff --git a/sndinfo.txt b/sndinfo.txt index c1757ed32..daeade9e5 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -42,6 +42,7 @@ voice/default/findsecret9 sounds/voice/default/findsecret9.ogg voice/default/findsecret10 sounds/voice/default/findsecret10.ogg voice/default/findsecret11 sounds/voice/default/findsecret11.ogg voice/default/findsecret12 sounds/voice/default/findsecret12.ogg +voice/default/findsecret13 sounds/voice/default/findsecret13.ogg voice/default/getweapon1 sounds/voice/default/getweapon1.ogg voice/default/getweapon2 sounds/voice/default/getweapon2.ogg voice/default/getweapon3 sounds/voice/default/getweapon3.ogg @@ -151,6 +152,29 @@ voice/default/gethit15 sounds/voice/default/gethit15.ogg voice/default/gethit16 sounds/voice/default/gethit16.ogg voice/default/gethit17 sounds/voice/default/gethit17.ogg voice/default/gethit18 sounds/voice/default/gethit18.ogg +voice/default/friendhit1 sounds/voice/default/friendhit1.ogg +voice/default/friendhit2 sounds/voice/default/friendhit2.ogg +voice/default/friendhit3 sounds/voice/default/friendhit3.ogg +voice/default/friendhit4 sounds/voice/default/friendhit4.ogg +voice/default/friendhit5 sounds/voice/default/friendhit5.ogg +voice/default/friendhit6 sounds/voice/default/friendhit6.ogg +voice/default/friendhit7 sounds/voice/default/friendhit7.ogg +voice/default/greet1 sounds/voice/default/greet1.ogg +voice/default/greet2 sounds/voice/default/greet2.ogg +voice/default/greet3 sounds/voice/default/greet3.ogg +voice/default/greet4 sounds/voice/default/greet4.ogg +voice/default/greet5 sounds/voice/default/greet5.ogg +voice/default/greet6 sounds/voice/default/greet6.ogg +voice/default/greet7 sounds/voice/default/greet7.ogg +voice/default/hitfriend1 sounds/voice/default/hitfriend1.ogg +voice/default/hitfriend2 sounds/voice/default/hitfriend2.ogg +voice/default/hitfriend3 sounds/voice/default/hitfriend3.ogg +voice/default/ragekit1 sounds/voice/default/ragekit1.ogg +voice/default/ragekit2 sounds/voice/default/ragekit2.ogg +voice/default/ragekit3 sounds/voice/default/ragekit3.ogg +voice/default/ragekit4 sounds/voice/default/ragekit4.ogg +voice/default/ragekit5 sounds/voice/default/ragekit5.ogg +voice/default/ragekit6 sounds/voice/default/ragekit6.ogg $random voice/default/grunt { voice/default/grunt1 voice/default/grunt2 voice/default/grunt3 voice/default/grunt4 voice/default/grunt5 voice/default/grunt6 } $random voice/default/lopain { voice/default/lopain1 voice/default/lopain2 voice/default/lopain3 voice/default/lopain4 voice/default/lopain5 } diff --git a/sounds/SUNDOWNER.ogg b/sounds/SUNDOWNER.ogg new file mode 100644 index 000000000..eb8fb7a56 Binary files /dev/null and b/sounds/SUNDOWNER.ogg differ diff --git a/sounds/voice/default/findsecret13.ogg b/sounds/voice/default/findsecret13.ogg new file mode 100644 index 000000000..76783ec5c Binary files /dev/null and b/sounds/voice/default/findsecret13.ogg differ diff --git a/sounds/voice/default/friendhit1.ogg b/sounds/voice/default/friendhit1.ogg new file mode 100644 index 000000000..2ea33fec1 Binary files /dev/null and b/sounds/voice/default/friendhit1.ogg differ diff --git a/sounds/voice/default/friendhit2.ogg b/sounds/voice/default/friendhit2.ogg new file mode 100644 index 000000000..9507a1c40 Binary files /dev/null and b/sounds/voice/default/friendhit2.ogg differ diff --git a/sounds/voice/default/friendhit3.ogg b/sounds/voice/default/friendhit3.ogg new file mode 100644 index 000000000..03fcd3c69 Binary files /dev/null and b/sounds/voice/default/friendhit3.ogg differ diff --git a/sounds/voice/default/friendhit4.ogg b/sounds/voice/default/friendhit4.ogg new file mode 100644 index 000000000..47d7e1e17 Binary files /dev/null and b/sounds/voice/default/friendhit4.ogg differ diff --git a/sounds/voice/default/friendhit5.ogg b/sounds/voice/default/friendhit5.ogg new file mode 100644 index 000000000..b0717a870 Binary files /dev/null and b/sounds/voice/default/friendhit5.ogg differ diff --git a/sounds/voice/default/friendhit6.ogg b/sounds/voice/default/friendhit6.ogg new file mode 100644 index 000000000..cd7ca1eb0 Binary files /dev/null and b/sounds/voice/default/friendhit6.ogg differ diff --git a/sounds/voice/default/friendhit7.ogg b/sounds/voice/default/friendhit7.ogg new file mode 100644 index 000000000..f08f1520c Binary files /dev/null and b/sounds/voice/default/friendhit7.ogg differ diff --git a/sounds/voice/default/greet1.ogg b/sounds/voice/default/greet1.ogg new file mode 100644 index 000000000..404034fd0 Binary files /dev/null and b/sounds/voice/default/greet1.ogg differ diff --git a/sounds/voice/default/greet2.ogg b/sounds/voice/default/greet2.ogg new file mode 100644 index 000000000..33dbfeaa1 Binary files /dev/null and b/sounds/voice/default/greet2.ogg differ diff --git a/sounds/voice/default/greet3.ogg b/sounds/voice/default/greet3.ogg new file mode 100644 index 000000000..a7f15a5f7 Binary files /dev/null and b/sounds/voice/default/greet3.ogg differ diff --git a/sounds/voice/default/greet4.ogg b/sounds/voice/default/greet4.ogg new file mode 100644 index 000000000..5cef86174 Binary files /dev/null and b/sounds/voice/default/greet4.ogg differ diff --git a/sounds/voice/default/greet5.ogg b/sounds/voice/default/greet5.ogg new file mode 100644 index 000000000..06e03f533 Binary files /dev/null and b/sounds/voice/default/greet5.ogg differ diff --git a/sounds/voice/default/greet6.ogg b/sounds/voice/default/greet6.ogg new file mode 100644 index 000000000..9d0186545 Binary files /dev/null and b/sounds/voice/default/greet6.ogg differ diff --git a/sounds/voice/default/greet7.ogg b/sounds/voice/default/greet7.ogg new file mode 100644 index 000000000..6540318a7 Binary files /dev/null and b/sounds/voice/default/greet7.ogg differ diff --git a/sounds/voice/default/hitfriend1.ogg b/sounds/voice/default/hitfriend1.ogg new file mode 100644 index 000000000..65d09e478 Binary files /dev/null and b/sounds/voice/default/hitfriend1.ogg differ diff --git a/sounds/voice/default/hitfriend2.ogg b/sounds/voice/default/hitfriend2.ogg new file mode 100644 index 000000000..aafd6213c Binary files /dev/null and b/sounds/voice/default/hitfriend2.ogg differ diff --git a/sounds/voice/default/hitfriend3.ogg b/sounds/voice/default/hitfriend3.ogg new file mode 100644 index 000000000..38d8479ee Binary files /dev/null and b/sounds/voice/default/hitfriend3.ogg differ diff --git a/sounds/voice/default/ragekit1.ogg b/sounds/voice/default/ragekit1.ogg new file mode 100644 index 000000000..69dc6e23f Binary files /dev/null and b/sounds/voice/default/ragekit1.ogg differ diff --git a/sounds/voice/default/ragekit2.ogg b/sounds/voice/default/ragekit2.ogg new file mode 100644 index 000000000..20079fe1c Binary files /dev/null and b/sounds/voice/default/ragekit2.ogg differ diff --git a/sounds/voice/default/ragekit3.ogg b/sounds/voice/default/ragekit3.ogg new file mode 100644 index 000000000..eb638e728 Binary files /dev/null and b/sounds/voice/default/ragekit3.ogg differ diff --git a/sounds/voice/default/ragekit4.ogg b/sounds/voice/default/ragekit4.ogg new file mode 100644 index 000000000..bc10765a1 Binary files /dev/null and b/sounds/voice/default/ragekit4.ogg differ diff --git a/sounds/voice/default/ragekit5.ogg b/sounds/voice/default/ragekit5.ogg new file mode 100644 index 000000000..59164a41d Binary files /dev/null and b/sounds/voice/default/ragekit5.ogg differ diff --git a/sounds/voice/default/ragekit6.ogg b/sounds/voice/default/ragekit6.ogg new file mode 100644 index 000000000..9ebdafcf4 Binary files /dev/null and b/sounds/voice/default/ragekit6.ogg differ diff --git a/zscript.txt b/zscript.txt index 05a81b23d..eaacd9503 100644 --- a/zscript.txt +++ b/zscript.txt @@ -11,7 +11,6 @@ version "4.3" #include "zscript/swwm_player.zsc" #include "zscript/swwm_inventory.zsc" #include "zscript/swwm_hud.zsc" -#include "zscript/swwm_loudboi.zsc" #include "zscript/swwm_menu.zsc" // items #include "zscript/swwm_health.zsc" diff --git a/zscript/dlc/swwm_blackfire.zsc b/zscript/dlc/swwm_blackfire.zsc index 5f594f790..347640e7e 100644 --- a/zscript/dlc/swwm_blackfire.zsc +++ b/zscript/dlc/swwm_blackfire.zsc @@ -1,2 +1,6 @@ // Unissix Crafts Blackfire Igniter (from UnSX 4, cut from initial SWWM GZ release) // Slot 6, spawns shared with Hellblazer + +Class BlackfireIgniter : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_dlcammo.zsc b/zscript/dlc/swwm_dlcammo.zsc new file mode 100644 index 000000000..64f260b1d --- /dev/null +++ b/zscript/dlc/swwm_dlcammo.zsc @@ -0,0 +1,37 @@ +// All DLC weapon ammo pickups + +Class GravityCell : Ammo +{ +} + +Class SplatCore : Ammo +{ +} + +Class SkullAmmo : Ammo +{ +} + +Class SkullBox : SkullAmmo +{ +} + +Class DarkCanister : Ammo +{ +} + +Class SMW05Ammo : Ammo +{ +} + +Class EMPCore : Ammo +{ +} + +Class MadCore : Ammo +{ +} + +Class FunBalls : Ammo +{ +} diff --git a/zscript/dlc/swwm_grabbity.zsc b/zscript/dlc/swwm_grabbity.zsc index c4a3c08fb..1411c04cd 100644 --- a/zscript/dlc/swwm_grabbity.zsc +++ b/zscript/dlc/swwm_grabbity.zsc @@ -1,2 +1,6 @@ // Tach-Engine Technologies Microgravity Manipulator aka "Gravity Gun" (from Zanaveth Ultra Suite) -// Slot 4, spawns shared with Wallbuster +// Slot 3, spawns shared with Spreadgun + +Class GravityGun : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_hammertime.zsc b/zscript/dlc/swwm_hammertime.zsc index 73c0c923f..28844dbf7 100644 --- a/zscript/dlc/swwm_hammertime.zsc +++ b/zscript/dlc/swwm_hammertime.zsc @@ -1,2 +1,6 @@ // Symnatek Reinforced Combat Hammer (from UnSX 5) // Slot 1, spawns shared with Pusher + +Class ItamexHammer : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_miniclone.zsc b/zscript/dlc/swwm_miniclone.zsc deleted file mode 100644 index 2b22d17fe..000000000 --- a/zscript/dlc/swwm_miniclone.zsc +++ /dev/null @@ -1,2 +0,0 @@ -// Dr. Locke's Instant Clone Army Deployer aka "Miniclone Machine" (from UnSX and SWWM series) -// Slot 9, spawns shared with Candygun diff --git a/zscript/dlc/swwm_prowelfartsupinthetadel.zsc b/zscript/dlc/swwm_prowelfartsupinthetadel.zsc index a79d2f4fa..9cd1e9534 100644 --- a/zscript/dlc/swwm_prowelfartsupinthetadel.zsc +++ b/zscript/dlc/swwm_prowelfartsupinthetadel.zsc @@ -1,2 +1,6 @@ -// PROWEL and TADEL artifacts, unknown creator (from UnSX series, based on nonsensical gibberish) -// Slot 0, spawns shared with Ynykron Artifact +// PROWEL and TADEL artifacts, by Nukritas 2xx of the University of Nos-Kora (from UnSX series, based on nonsensical gibberish) +// Slot 9, spawns shared with Candy Gun + +Class PROWELfartsupintheTADEL : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_splattim.zsc b/zscript/dlc/swwm_splattim.zsc index b6e09fc7a..21e035116 100644 --- a/zscript/dlc/swwm_splattim.zsc +++ b/zscript/dlc/swwm_splattim.zsc @@ -1,2 +1,6 @@ // Dr. Locke's Instant Room Painter aka "Splatter" (from SWWM Series) -// Slot 9, spawns shared with Candygun +// Slot 4, spawns shared with Wallbuster + +Class Splatter : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_spookyscaryskeletons.zsc b/zscript/dlc/swwm_spookyscaryskeletons.zsc index c16bf9297..3c0dfbf1e 100644 --- a/zscript/dlc/swwm_spookyscaryskeletons.zsc +++ b/zscript/dlc/swwm_spookyscaryskeletons.zsc @@ -1,2 +1,6 @@ // Dr. Locke's Spooky Scary Skeleton Shooter aka "Skull Launcher" (from unreleased "Weirdweapons" mod) // Slot 5, spawns shared with Eviscerator + +Class SkullLauncher : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_superhappyfunball.zsc b/zscript/dlc/swwm_superhappyfunball.zsc index ad804b856..8437506a1 100644 --- a/zscript/dlc/swwm_superhappyfunball.zsc +++ b/zscript/dlc/swwm_superhappyfunball.zsc @@ -1,2 +1,6 @@ // Dr. Locke's Super Happy Fun Ball (was meant for SWWM Z) // Slot 0, spawns shared with Ynykron Artifact + +Class SuperHappyFunBall : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_supermarioworld.zsc b/zscript/dlc/swwm_supermarioworld.zsc index 5e4cb592c..100f20200 100644 --- a/zscript/dlc/swwm_supermarioworld.zsc +++ b/zscript/dlc/swwm_supermarioworld.zsc @@ -1,2 +1,6 @@ // Blackmann Arms "Puntzer Gamma" SMW.05 Assault Carbine (was planned for SWWM Z) // Slot 7, spawns shared with Legacy Sparkster + +Class PuntzerGamma : SWWMWeapon +{ +} diff --git a/zscript/dlc/swwm_veryveryfrightening.zsc b/zscript/dlc/swwm_veryveryfrightening.zsc index f7101baca..3164982ed 100644 --- a/zscript/dlc/swwm_veryveryfrightening.zsc +++ b/zscript/dlc/swwm_veryveryfrightening.zsc @@ -1,2 +1,6 @@ // Tach-Engine Technologies EMP Rail Carbine (planned for unreleased Zanaveth Ultra Suite 2, successor to EMP Rifle from first Ultra Suite) // Slot 8, shared spawn with Silver Bullet JET + +Class EMPCarbine : SWWMWeapon +{ +} diff --git a/zscript/swwm_ammo.zsc b/zscript/swwm_ammo.zsc index fcb1fe326..530fbfdf5 100644 --- a/zscript/swwm_ammo.zsc +++ b/zscript/swwm_ammo.zsc @@ -1 +1,414 @@ // All the ammo items go here + +// ============================================================================ +// Spreadgun / Wallbuster ammo +// ============================================================================ + +// Common code for grouped shell handling and per-amount pickup messages +Mixin Class SWWMShellAmmo +{ + override string PickupMessage() + { + String tagstr = "$"..GetParentAmmo().GetClassName(); + tagstr.MakeUpper(); + if ( Amount > 1 ) + { + tagstr = tagstr.."S"; + return String.Format("%d %s",Amount,StringTable.Localize(tagstr)); + } + return StringTable.Localize(tagstr); + } + + override bool HandlePickup( Inventory item ) + { + // drop unwanted shells + if ( (item is 'Ammo') && (Ammo(item).GetParentAmmo() == GetParentAmmo()) ) + { + int excess = Amount+item.Amount; + if ( excess > MaxAmount ) excess -= MaxAmount; + if ( excess < item.Amount ) + { + // drop spares + for ( int i=0; i 999999999) ) c.credits = 999999999; else c.credits += amount; } - static bool TakeCredits( PlayerInfo p, int amount ) + static clearscope bool CanTake( PlayerInfo p, int amount ) { - let c = FindCredits(p); + let c = Find(p); + if ( !c ) return false; + // too much! + if ( (c.credits-amount < 0) || (c.credits-amount > c.credits) ) return false; + return true; + } + + static bool Take( PlayerInfo p, int amount ) + { + let c = Find(p); + if ( !c ) return false; // too much! if ( (c.credits-amount < 0) || (c.credits-amount > c.credits) ) return false; c.credits -= amount; return true; } - static int GetCredits( PlayerInfo p ) + static clearscope int Get( PlayerInfo p ) { - let c = FindCredits(p); + let c = Find(p); + if ( !c ) return 0; return c.credits; } - private static SWWMCredits FindCredits( PlayerInfo p ) + static clearscope SWWMCredits Find( PlayerInfo p ) { let ti = ThinkerIterator.Create("SWWMCredits",STAT_STATIC); SWWMCredits t; @@ -47,10 +81,129 @@ Class SWWMCredits : Thinker if ( t.myplayer != p ) continue; return t; } - t = new("SWWMCredits"); - t.ChangeStatNum(STAT_STATIC); - t.myplayer = p; - return t; + return null; + } +} + +// Trading history between players +Class SWWMTrade +{ + int timestamp, type; + String other, what; +} + +Class SWWMTradeHistory : Thinker +{ + PlayerInfo myplayer; + Array ent; + + static void RegisterSend( PlayerInfo p, PlayerInfo other, String what ) + { + let th = Find(p); + if ( !th ) return; + SWWMTrade t = new("SWWMTrade"); + t.timestamp = gametic; + t.type = 0; + t.other = other.GetUserName(); + t.what = what; + th.ent.Push(t); + } + static void RegisterReceive( PlayerInfo p, PlayerInfo other, String what ) + { + let th = Find(p); + if ( !th ) return; + SWWMTrade t = new("SWWMTrade"); + t.timestamp = gametic; + t.type = 1; + t.other = other.GetUserName(); + t.what = what; + th.ent.Push(t); + } + + static clearscope SWWMTradeHistory Find( PlayerInfo p ) + { + let ti = ThinkerIterator.Create("SWWMTradeHistory",STAT_STATIC); + SWWMTradeHistory th; + while ( th = SWWMTradeHistory(ti.Next()) ) + { + if ( th.myplayer != p ) continue; + return th; + } + return Null; + } +} + +// Lore holder +Class SWWMLore +{ + String tag, text; +} + +Class SWWMLoreLibrary : Thinker +{ + PlayerInfo myplayer; + Array ent; + + void DirectAdd( String ref ) + { + ref.MakeUpper(); + String tag = String.Format("SWWM_LORETAG_%s",ref); + String text = String.Format("SWWM_LORETXT_%s",ref); + // check that it's valid + if ( StringTable.Localize(tag,false) == tag ) return; + if ( StringTable.Localize(text,false) == text ) return; + // check if existing + for ( int i=0; i= cpb ) continue; + less = true; + break; + } + if ( !less ) continue; + ent.Insert(i,e); + return; + } + // append otherwise + ent.Push(e); + } + + static void Add( PlayerInfo p, String ref ) + { + let ll = Find(p); + if ( !ll ) return; + ll.DirectAdd(ref); + } + + static clearscope SWWMLoreLibrary Find( PlayerInfo p ) + { + let ti = ThinkerIterator.Create("SWWMLoreLibrary",STAT_STATIC); + SWWMLoreLibrary ll; + while ( ll = SWWMLoreLibrary(ti.Next()) ) + { + if ( ll.myplayer != p ) continue; + return ll; + } + return Null; } } @@ -638,7 +791,6 @@ Class SWWMHandler : EventHandler int lastkill[MAXPLAYERS]; int multilevel[MAXPLAYERS]; int lastitemcount[MAXPLAYERS]; - int creditsbridge[MAXPLAYERS]; // curse the gap between play/ui transient CVar mutevoice; @@ -682,10 +834,72 @@ Class SWWMHandler : EventHandler override void PlayerEntered( PlayerEvent e ) { + // create some static thinkers for this player + PlayerInfo p = players[e.playernumber]; + SWWMTradeHistory th = SWWMTradeHistory.Find(p); + if ( !th ) + { + th = new("SWWMTradeHistory"); + th.ChangeStatNum(Thinker.STAT_STATIC); + th.myplayer = p; + } + SWWMCredits c = SWWMCredits.Find(p); + if ( !c ) + { + c = new("SWWMCredits"); + c.ChangeStatNum(Thinker.STAT_STATIC); + c.myplayer = p; + } + SWWMLoreLibrary l = SWWMLoreLibrary.Find(p); + if ( !l ) + { + l = new("SWWMLoreLibrary"); + l.ChangeStatNum(Thinker.STAT_STATIC); + l.myplayer = p; + // pre-add some lore + l.DirectAdd("Belt"); + l.DirectAdd("Collar"); + l.DirectAdd("Demolitionist"); + l.DirectAdd("Display"); + l.DirectAdd("Hammerspace"); + l.DirectAdd("Ibuki"); + l.DirectAdd("Knowledgebase"); + l.DirectAdd("Propulsor"); + l.DirectAdd("Saya"); + l.DirectAdd("Voicebox"); + if ( gameinfo.gametype&GAME_Doom ) + { + l.DirectAdd("Doomguy"); + l.DirectAdd("Earth"); + l.DirectAdd("Hell"); + l.DirectAdd("UAC"); + } + else if ( gameinfo.gametype&GAME_Heretic ) + { + l.DirectAdd("Corvus"); + l.DirectAdd("Parthoris"); + l.DirectAdd("SerpentRiders"); + l.DirectAdd("Sidhe"); + } + else if ( gameinfo.gametype&GAME_Hexen ) + { + l.DirectAdd("Baratus"); + l.DirectAdd("Cronos"); + l.DirectAdd("Daedolon"); + l.DirectAdd("Parias"); + l.DirectAdd("SerpentRiders"); + } + } + // reset some vars multilevel[e.playernumber] = 0; lastkill[e.playernumber] = int.min; } + override void PlayerRespawned( PlayerEvent e ) + { + PlayerEntered(e); + } + override void WorldTick() { if ( !mutevoice ) mutevoice = CVar.GetCVar('swwm_mutevoice',players[consoleplayer]); @@ -706,8 +920,6 @@ Class SWWMHandler : EventHandler for ( int i=0; i lastitemcount[i] ) { int score = 25; @@ -716,7 +928,7 @@ Class SWWMHandler : EventHandler score = 2500; Console.Printf(StringTable.Localize("$SWWM_LASTITEM"),players[i].GetUserName(),score); } - SWWMCredits.GiveCredits(players[i],score); + SWWMCredits.Give(players[i],score); lastitemcount[i] = players[i].itemcount; } } @@ -775,17 +987,18 @@ Class SWWMHandler : EventHandler { if ( !mutevoice ) mutevoice = CVar.GetCVar('swwm_mutevoice',players[consoleplayer]); if ( e.Thing.player ) tookdamage[e.Thing.PlayerNumber()] = true; - if ( e.DamageSource && e.DamageSource.bISMONSTER && (e.Thing == players[consoleplayer].mo) && (e.Thing.Health > 0) ) + if ( e.DamageSource && (e.DamageSource.bISMONSTER || e.DamageSource.player) && (e.Thing == players[consoleplayer].mo) && (e.Thing.Health > 0) ) + { + if ( (!lastcombat || (gametic > lastcombat+20)) && (mutevoice.GetInt() < 1) ) + lastcombat = AddOneliner(e.Thing.IsFriend(e.DamageSource)?"friendhit":"gethit",15); + highesttic = gametic; + } + if ( e.DamageSource && (e.DamageSource == players[consoleplayer].mo) && (e.Thing.bISMONSTER || e.Thing.player) ) { if ( e.Thing.IsFriend(e.DamageSource) ) { - // no comment if it's a friendly (to be added) - } - else - { - // hurt comment if ( (!lastcombat || (gametic > lastcombat+20)) && (mutevoice.GetInt() < 1) ) - lastcombat = AddOneliner("gethit",15); + lastcombat = AddOneliner("hitfriend",15); highesttic = gametic; } } @@ -817,7 +1030,7 @@ Class SWWMHandler : EventHandler score += 5000; Console.Printf(StringTable.Localize("$SWWM_LASTMONSTER",e.DamageSource.player.GetUserName()),5000); } - SWWMCredits.GiveCredits(e.DamageSource.player,score); + SWWMCredits.Give(e.DamageSource.player,score); // TODO floating score for HUD spreecount[pnum]++; } @@ -870,6 +1083,17 @@ Class SWWMHandler : EventHandler } } + override void CheckReplacement( ReplaceEvent e ) + { + if ( (e.Replacee is 'Pistol') || (e.Replacee is 'GoldWand') || (e.Replacee is 'FWeapFist') || (e.Replacee is 'CWeapMace') || (e.Replacee is 'MWeapWand') ) e.Replacement = 'ExplodiumGun'; + else if ( (e.Replacee is 'BFG9000') || (e.Replacee is 'Mace') ) + { + if ( Random[Replacements](0,1) ) e.Replacement = 'Ynykron'; + else e.Replacement = 'CandyGun'; + } + else if ( e.Replacee is 'MWeaponPiece1' ) e.Replacement = 'CandyGun'; + } + override void NetworkProcess( ConsoleEvent e ) { if ( e.Name ~== "swwmgesture" ) @@ -890,6 +1114,32 @@ Class SWWMHandler : EventHandler break; } } + else if ( e.Name.Left(14) ~== "swwmstoregive." ) + { + Class item = e.Name.Mid(14); + if ( !item ) return; + if ( SWWMCredits.Take(players[e.Args[0]],e.Args[1]) ) + { + players[e.Args[0]].mo.GiveInventory(item,1); + if ( item is 'Weapon' ) players[e.Args[0]].mo.A_SelectWeapon((Class)(item)); + } + } + else if ( e.Name.Left(10) ~== "swwmtrade." ) + { + Class item = e.Name.Mid(10); + if ( !item ) return; + let def = GetDefaultByType(item); + if ( players[e.Args[1]].mo.GiveInventory(item,1) ) + { + players[e.Args[0]].mo.TakeInventory(item,1); + // add to history + SWWMTradeHistory.RegisterSend(players[e.Args[0]],players[e.Args[1]],def.GetTag()); + SWWMTradeHistory.RegisterReceive(players[e.Args[1]],players[e.Args[0]],def.GetTag()); + // add messages + if ( e.Args[0] == consoleplayer ) Console.Printf(StringTable.Localize("$SWWM_MSGSENT"),def.GetTag(),players[e.Args[1]].GetUserName()); + if ( e.Args[1] == consoleplayer ) Console.Printf(StringTable.Localize("$SWWM_MSGRECV"),players[e.Args[0]].GetUserName(),def.GetTag()); + } + } } static void DoFlash( Actor camera, Color c, int duration ) diff --git a/zscript/swwm_danmaku.zsc b/zscript/swwm_danmaku.zsc index f4c667196..ce3db75ec 100644 --- a/zscript/swwm_danmaku.zsc +++ b/zscript/swwm_danmaku.zsc @@ -1,2 +1,10 @@ // Mr. BIG SHOT Industries "Eviscerator" High Load Flak Cannon (from SWWM series) // Slot 5, replaces Chaingun, Dragon Claw, Hammer of Retribution + +Class Eviscerator : SWWMWeapon +{ + Default + { + Stamina 25000; + } +} diff --git a/zscript/swwm_deathlydeathcannon.zsc b/zscript/swwm_deathlydeathcannon.zsc index 35a4572d3..00df49b1f 100644 --- a/zscript/swwm_deathlydeathcannon.zsc +++ b/zscript/swwm_deathlydeathcannon.zsc @@ -1,2 +1,10 @@ // Ynykron Artifact (from UnSX Series, featured in SWWM Platinum as a secret weapon) // Slot 0, replaces BFG9000, Firemace, Wraithverge (arc) + +Class Ynykron : SWWMWeapon +{ + Default + { + Stamina 600000; + } +} diff --git a/zscript/swwm_deepdarkimpact.zsc b/zscript/swwm_deepdarkimpact.zsc index 7a1a91a38..7cf344b5d 100644 --- a/zscript/swwm_deepdarkimpact.zsc +++ b/zscript/swwm_deepdarkimpact.zsc @@ -1,2 +1,10 @@ // Dr. Locke's Mighty Wolf Breath Airgun aka "Deep Impact" Airblaster (from SWWM series) // Slot 1, replaces Fist, Staff, Hexen starting weapons + +Class DeepImpact : SWWMWeapon +{ + Default + { + Stamina 2000; + } +} diff --git a/zscript/swwm_hud.zsc b/zscript/swwm_hud.zsc index 78f2a0d14..c414d5d3d 100644 --- a/zscript/swwm_hud.zsc +++ b/zscript/swwm_hud.zsc @@ -107,8 +107,7 @@ Class SWWMStatusBar : BaseStatusBar // update interpolators HealthInter.Update(CPlayer.health); let hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); - if ( hnd ) ScoreInter.Update(hnd.creditsbridge[CPlayer.mo.PlayerNumber()]); - else ScoreInter.Update(0); + ScoreInter.Update(SWWMCredits.Get(CPlayer)); let d = Demolitionist(CPlayer.mo); if ( d ) { @@ -325,18 +324,7 @@ Class SWWMStatusBar : BaseStatusBar Screen.Dim("Black",.8,0,Screen.GetHeight()-int(15*hs.y),Screen.GetWidth(),int(15*hs.y)); String pname = players[consoleplayer].GetUserName(); // strip colors - for ( int i=0; i invlist; + // lore stuff + SWWMLoreLibrary lorelib; + // store prompt + Array > storelist; + bool buying; + int buyitem; + int buyamount; + // trading + SWWMTradeHistory tradelib; + // temporary bottom messages, such as "not enough money" + String tmsg; + int tmsgtic; override void Init( Menu parent ) { @@ -14,6 +32,11 @@ Class SWWMKnowledgeBaseMenu : GenericMenu return; } TewiFont = Font.GetFont('TewiShaded'); + MainWindow = TexMan.CheckForTexture("graphics/KBase/MainWindow.png",TexMan.Type_Any); + TabSeparator = TexMan.CheckForTexture("graphics/KBase/TabSeparator.png",TexMan.Type_Any); + WindowSeparator = TexMan.CheckForTexture("graphics/KBase/WindowSeparator.png",TexMan.Type_Any); + curtab = CVar.GetCVar('swwm_lasttab',players[consoleplayer]).GetInt(); + if ( (curtab < 0) || (curtab > 7) ) curtab = 0; } override bool MenuEvent( int mkey, bool fromcontroller ) @@ -33,22 +56,11 @@ Class SWWMKnowledgeBaseMenu : GenericMenu { Super.Drawer(); String str; - double hs = min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)); - if ( hs < 1. ) - { - str = StringTable.Localize("$SWWM_TOOSMALL"); - BrokenLines l = TewiFont.BreakLines(str,CleanWidth/2); - int xx, yy = (CleanHeight-l.Count()*TewiFont.GetHeight())/2; - for ( int i=0; i 0) ) @@ -156,7 +157,8 @@ Class Demolitionist : PlayerPawn Actor a; for ( int i=-1; i<=1; i+=2 ) for ( int j=1; j<4; j++ ) { - a = Spawn("DashTrail",Vec3Angle(30,angle+i*160,30)); + a = Spawn("DashTrail",Vec3Angle(15,angle+i*140,35)); + a.target = self; a.vel = (RotateVector((j,0),angle+i*160),0)-(0,0,1)*j; a.vel -= vel*.5; } @@ -166,7 +168,8 @@ Class Demolitionist : PlayerPawn Actor a; for ( int i=-1; i<=1; i+=2 ) for ( int j=1; j<4; j++ ) { - a = Spawn("DashTrail",Vec3Angle(10,angle+i*160,30)); + a = Spawn("DashTrail",Vec3Angle(10,angle+i*140,40)); + a.target = self; a.vel = .5*(RotateVector((j,0),angle+i*160),0)-(0,0,1)*j; a.vel -= vel*.5; } @@ -289,6 +292,12 @@ Class Demolitionist : PlayerPawn } override void PlayIdle() { + if ( !player ) + { + if ( !InStateSequence(CurState,FindState("Spawn")) ) + SetStateLabel("Spawn"); + return; + } if ( player.health <= 0 ) return; if ( !bNoGravity && player.onground && (waterlevel < 3) ) { @@ -356,6 +365,12 @@ Class Demolitionist : PlayerPawn } override void PlayRunning() { + if ( !player ) + { + if ( !InStateSequence(CurState,FindState("See")) ) + SetStateLabel("See"); + return; + } if ( player.health <= 0 ) return; if ( !bNoGravity && player.onground && (waterlevel < 3) ) { @@ -416,7 +431,7 @@ Class Demolitionist : PlayerPawn if ( InStateSequence(CurState,FindState("Dash")) || InStateSequence(CurState,FindState("Jump")) ) return; // don't cancel dash/jump - if ( player.crouchdir == -1 ) SetStateLabel("CrouchMissile"); + if ( player && (player.crouchdir == -1) ) SetStateLabel("CrouchMissile"); else SetStateLabel("Missile"); } override void PlayAttacking2() @@ -435,19 +450,19 @@ Class Demolitionist : PlayerPawn if ( lastdamage > 60 ) { A_StartSound("*pain25",CHAN_VOICE); - if ( mute.GetInt() < 4 ) + if ( mute && myvoice && (mute.GetInt() < 4) ) A_StartSound(String.Format("voice/%s/hipain",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); } else if ( lastdamage > 40 ) { A_StartSound("*pain50",CHAN_VOICE); - if ( mute.GetInt() < 4 ) + if ( mute && myvoice && (mute.GetInt() < 4) ) A_StartSound(String.Format("voice/%s/pain",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); } else if ( lastdamage > 0 ) { A_StartSound("*pain100",CHAN_VOICE); - if ( mute.GetInt() < 4 ) + if ( mute && myvoice && (mute.GetInt() < 4) ) A_StartSound(String.Format("voice/%s/lopain",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); } } @@ -456,11 +471,12 @@ Class Demolitionist : PlayerPawn if ( !myvoice ) myvoice = CVar.GetCVar('swwm_voicetype',player); if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player); A_PlayerScream(); - if ( mute.GetInt() < 4 ) + if ( mute && myvoice && (mute.GetInt() < 4) ) A_StartSound(String.Format("voice/%s/death",myvoice.GetString()),CHAN_DEMOVOICE,CHANF_OVERLAP); } override bool OnGiveSecret( bool printmsg, bool playsound ) { + if ( !player ) return false; if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player); int score = 500; // last secret (this is called before counting it up, so have to subtract) @@ -471,13 +487,16 @@ Class Demolitionist : PlayerPawn } else Console.Printf(StringTable.Localize("$SWWM_FINDSECRET"),player.GetUserName(),score); if ( CheckLocalView() && (mute.GetInt() < 2) ) SWWMHandler.AddOneliner("findsecret",40); - SWWMCredits.GiveCredits(player,score); + SWWMCredits.Give(player,score); return true; } override void AddInventory( Inventory item ) { - if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player); Super.AddInventory(item); + if ( !player ) return; + // add lore if any + SWWMLoreLibrary.Add(player,item.GetClassName()); + if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player); if ( (item is 'Weapon') && CheckLocalView() && (mute.GetInt() < 2) ) SWWMHandler.AddOneliner("getweapon"); if ( (item is 'Key') && !key_reentrant ) @@ -485,7 +504,7 @@ Class Demolitionist : PlayerPawn // score int score = 250; Console.Printf(StringTable.Localize("$SWWM_FINDKEY"),player.GetUserName(),item.GetTag(),score); - SWWMCredits.GiveCredits(player,score); + SWWMCredits.Give(player,score); // share all keys in mp for ( int i=0; i= 2) ) return Super.UseInventory(item); @@ -522,6 +542,14 @@ Class Demolitionist : PlayerPawn b.A_CheckTerrain(); } } + override bool Used( Actor user ) + { + if ( !(user is 'Demolitionist') || !user.player ) return false; + CVar othermute = CVar.GetCVar('swwm_mutevoice',user.player); + if ( (user.player == players[consoleplayer]) && (othermute.GetInt() < 2) ) + SWWMHandler.AddOneliner("greet"); + return false; + } States { Spawn: @@ -723,15 +751,22 @@ Class DashTrail : Actor { Super.PostBeginPlay(); SetState(FindState("Spawn")+Random[ExploS](0,7)); - let t = Spawn("DashTrail2",pos); + let t = Spawn("DashTrail2",level.Vec3Offset(pos,vel*.3)); + t.target = target; t.vel = vel*1.2; - let s = Spawn("SWWMSmoke",pos); + let s = Spawn("SWWMSmoke",level.Vec3Offset(pos,vel*1.6)); s.vel = vel*.8; s.SetShade(Color(1,1,1)*Random[ExploS](64,128)); s.special1 = Random[ExploS](2,4); s.scale *= 1.4; s.alpha *= .3; } + override void Tick() + { + Super.Tick(); + // hack + if ( target && (players[consoleplayer].Camera == target) ) Warp(target,pos.x,pos.y,pos.z,0,WARPF_ABSOLUTEPOSITION|WARPF_COPYINTERPOLATION); + } States { Spawn: @@ -762,6 +797,12 @@ Class DashTrail2 : Actor Super.PostBeginPlay(); SetState(FindState("Spawn")+Random[ExploS](0,7)); } + override void Tick() + { + Super.Tick(); + // hack + if ( target && (players[consoleplayer].Camera == target) ) Warp(target,pos.x,pos.y,pos.z,0,WARPF_ABSOLUTEPOSITION|WARPF_COPYINTERPOLATION); + } States { Spawn: diff --git a/zscript/swwm_shot.zsc b/zscript/swwm_shot.zsc index 6a8ca2c13..0cbc853c6 100644 --- a/zscript/swwm_shot.zsc +++ b/zscript/swwm_shot.zsc @@ -1,2 +1,10 @@ // Blackmann "Rhino Stopper" Spreadgun (from Instant Action 3, also planned for Zanaveth Ultra Suite 2) // Slot 3, replaces Shotgun, Ethereal Crossbow, Serpent Staff + +Class Spreadgun : SWWMWeapon +{ + Default + { + Stamina 10000; + } +} diff --git a/zscript/swwm_sparkyboi.zsc b/zscript/swwm_sparkyboi.zsc index 314ed931d..7b151c425 100644 --- a/zscript/swwm_sparkyboi.zsc +++ b/zscript/swwm_sparkyboi.zsc @@ -1,2 +1,10 @@ // Decade Mechanics Model S-5 Biospark Carbine aka "Legacy Sparkster" (from UnSX series, also featured in SWWM series) // Slot 7, replaces Plasma Rifle, Hellstaff, Arc of Death + +Class Sparkster : SWWMWeapon +{ + Default + { + Stamina 80000; + } +} diff --git a/zscript/swwm_splode.zsc b/zscript/swwm_splode.zsc index 7dbf36ead..d4f4d855f 100644 --- a/zscript/swwm_splode.zsc +++ b/zscript/swwm_splode.zsc @@ -293,6 +293,13 @@ Class ExplodiumGun : SWWMWeapon ui TextureID WeaponBox; ui HUDFont mTewiFont; + override void AttachToOwner( Actor other ) + { + Super.AttachToOwner(other); + // additional lore + SWWMLoreLibrary.Add(other.player,"Munch"); + } + override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss ) { if ( !WeaponBox ) WeaponBox = TexMan.CheckForTexture("graphics/HUD/ExplodiumDisplay.png",TexMan.Type_Any); @@ -433,6 +440,7 @@ Class ExplodiumGun : SWWMWeapon Obituary "$O_EXPLODIUM"; Weapon.UpSound "explodium/select"; Weapon.SlotNumber 2; + Stamina 600; } States { diff --git a/zscript/swwm_tastytreat.zsc b/zscript/swwm_tastytreat.zsc index c2b453310..0c08b350e 100644 --- a/zscript/swwm_tastytreat.zsc +++ b/zscript/swwm_tastytreat.zsc @@ -1,2 +1,15 @@ // Munch Innovations "Taste the Sweetness" Candy Gun (from unreleased "Weird Weapons" UT minimod) // Slot 9, replaces BFG9000, Firemace, Bloodscourge (stub) + +Class CandyGun : SWWMWeapon +{ + Default + { + Tag "$T_CANDYGUN"; + Inventory.PickupMessage "$T_CANDYGUN"; + Obituary "$O_CANDYGUN"; + Weapon.UpSound "explodium/select"; + Weapon.SlotNumber 9; + Stamina 70000; + } +} diff --git a/zscript/swwm_thiccboolet.zsc b/zscript/swwm_thiccboolet.zsc index 279b2b204..3ca5e6e6e 100644 --- a/zscript/swwm_thiccboolet.zsc +++ b/zscript/swwm_thiccboolet.zsc @@ -1,2 +1,10 @@ // Blackmann-Forx Silver Bullet JET (successor to Silver Bullet from Zanaveth Ultra Suite) // Slot 8, replaces Plasma Rifle, Hellstaff, Quietus (hilt) + +Class SilverBullet : SWWMWeapon +{ + Default + { + Stamina 120000; + } +}