Much stuff, starting work on Demolitionist Menu.

This commit is contained in:
Mari the Deer 2020-01-28 01:41:14 +01:00
commit ec1db7a42e
64 changed files with 1185 additions and 90 deletions

96
PriceTable.md Normal file
View file

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

View file

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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

BIN
graphics/KBaseMockup.xcf Normal file

Binary file not shown.

View file

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

View file

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

BIN
sounds/SUNDOWNER.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

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

View file

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

View file

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

View file

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

View file

@ -1,2 +1,6 @@
// Symnatek Reinforced Combat Hammer (from UnSX 5)
// Slot 1, spawns shared with Pusher
Class ItamexHammer : SWWMWeapon
{
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<excess; i++ )
{
let s = Spawn(GetParentAmmo(),item.pos);
double ang = FRandom[SpareShells](0,360);
s.vel.xy = (cos(ang),sin(ang))*FRandom[SpareShells](1.,3.);
s.vel.z = FRandom[SpareShells](2,5);
}
}
}
return Super.HandlePickup(item);
}
}
Class RedShell : Ammo
{
Mixin SWWMShellAmmo;
Default
{
Stamina 500;
Inventory.Amount 1;
Inventory.MaxAmount 60;
Ammo.BackpackAmount 6;
}
}
Class RedShell2 : RedShell
{
Default
{
Inventory.Amount 2;
}
}
Class RedShell4 : RedShell
{
Default
{
Inventory.Amount 4;
}
}
Class RedShell6 : RedShell
{
Default
{
Inventory.Amount 6;
}
}
Class RedShell8 : RedShell
{
Default
{
Inventory.Amount 8;
}
}
Class RedShell12 : RedShell
{
Default
{
Inventory.Amount 12;
}
}
Class GreenShell : Ammo
{
Mixin SWWMShellAmmo;
Default
{
Stamina 600;
Inventory.Amount 1;
Inventory.MaxAmount 48;
Ammo.BackpackAmount 4;
}
}
Class GreenShell2 : GreenShell
{
Default
{
Inventory.Amount 2;
}
}
Class GreenShell4 : GreenShell
{
Default
{
Inventory.Amount 4;
}
}
Class GreenShell6 : GreenShell
{
Default
{
Inventory.Amount 6;
}
}
Class GreenShell8 : GreenShell
{
Default
{
Inventory.Amount 6;
}
}
Class WhiteShell : Ammo
{
Mixin SWWMShellAmmo;
Default
{
Stamina 900;
Inventory.Amount 1;
Inventory.MaxAmount 24;
Ammo.BackpackAmount 2;
}
}
Class WhiteShell2 : WhiteShell
{
Default
{
Inventory.Amount 2;
}
}
Class WhiteShell4 : WhiteShell
{
Default
{
Inventory.Amount 4;
}
}
Class WhiteShell6 : WhiteShell
{
Default
{
Inventory.Amount 6;
}
}
Class BlueShell : Ammo
{
Mixin SWWMShellAmmo;
Default
{
Stamina 700;
Inventory.Amount 1;
Inventory.MaxAmount 30;
Ammo.BackpackAmount 3;
}
}
Class BlueShell2 : BlueShell
{
Default
{
Inventory.Amount 2;
}
}
Class BlueShell4 : BlueShell
{
Default
{
Inventory.Amount 4;
}
}
Class BlueShell6 : BlueShell
{
Default
{
Inventory.Amount 6;
}
}
Class BlackShell : Ammo
{
Mixin SWWMShellAmmo;
Default
{
Stamina 1000;
Inventory.Amount 1;
Inventory.MaxAmount 20;
Ammo.BackpackAmount 2;
}
}
Class BlackShell2 : BlackShell
{
Default
{
Inventory.Amount 2;
}
}
Class BlackShell4 : BlackShell
{
Default
{
Inventory.Amount 4;
}
}
Class PurpleShell : Ammo
{
Default
{
Stamina 800;
Inventory.Amount 1;
Inventory.MaxAmount 24;
Ammo.BackpackAmount 4;
}
}
Class PurpleShell2 : PurpleShell
{
Default
{
Inventory.Amount 2;
}
}
Class PurpleShell4 : PurpleShell
{
Default
{
Inventory.Amount 4;
}
}
Class PurpleShell6 : PurpleShell
{
Default
{
Inventory.Amount 6;
}
}
Class GoldShell : Ammo
{
Mixin SWWMShellAmmo;
Default
{
Stamina 120000;
Inventory.Amount 1;
Inventory.MaxAmount 6;
Ammo.BackpackAmount 0;
}
}
// ============================================================================
// Eviscerator ammo
// ============================================================================
Class EvisceratorShell : Ammo
{
Default
{
Stamina 2500;
Inventory.Amount 1;
Inventory.MaxAmount 60;
Ammo.BackpackAmount 6;
}
}
Class EvisceratorSixPack : EvisceratorShell
{
Default
{
Inventory.Amount 6;
}
}
// ============================================================================
// Hellblazer ammo
// ============================================================================
Class HellblazerMissiles : Ammo
{
Default
{
Stamina 6000;
Inventory.Amount 1;
Inventory.MaxAmount 12;
Ammo.BackpackAmount 4;
}
}
Class HellblazerCrackshots : Ammo
{
Default
{
Stamina 8000;
Inventory.Amount 1;
Inventory.MaxAmount 8;
Ammo.BackpackAmount 2;
}
}
Class HellblazerRavagers : Ammo
{
Default
{
Stamina 12000;
Inventory.Amount 1;
Inventory.MaxAmount 4;
Ammo.BackpackAmount 1;
}
}
Class HellblazerWarheads : Ammo
{
Default
{
Stamina 25000;
Inventory.Amount 1;
Inventory.MaxAmount 2;
Ammo.BackpackAmount 0;
}
}
// ============================================================================
// Sparkster ammo
// ============================================================================
Class SparkUnit : Ammo
{
Default
{
Stamina 20000;
Inventory.Amount 1;
Inventory.MaxAmount 20;
Ammo.BackpackAmount 2;
}
}
// ============================================================================
// Silver Bullet ammo
// ============================================================================
Class SilverBulletAmmo : Ammo
{
Default
{
Stamina 6000;
Inventory.Amount 1;
Inventory.MaxAmount 12;
Ammo.BackpackAmount 1;
}
}
// ============================================================================
// Candygun ammo
// ============================================================================
Class CandyGunAmmo : Ammo
{
Default
{
Stamina 80000;
Inventory.Amount 1;
Inventory.MaxAmount 8;
Ammo.BackpackAmount 0;
}
}
Class CandyGunSpares : Ammo
{
Default
{
Stamina 150000;
Inventory.Amount 1;
Inventory.MaxAmount 4;
Ammo.BackpackAmount 0;
}
}
// ============================================================================
// Ynykron ammo
// ============================================================================
Class YnykronAmmo : Ammo
{
Default
{
Stamina 400000;
Inventory.Amount 1;
Inventory.MaxAmount 2;
Ammo.BackpackAmount 0;
}
}

View file

@ -1,2 +1,10 @@
// Imanaki Corp Hellfire Cannon Mk3, aka "Hellblazer" (from SWWM series, originally inspired by the Hellraiser from OMGWEAPONS)
// Slot 6, replaces Rocket Launcher, Phoenix Rod, Firestorm
Class Hellblazer : SWWMWeapon
{
Default
{
Stamina 40000;
}
}

View file

@ -1,2 +1,14 @@
// Blackmann Arms "Wallbuster" Heavy Armor Perforator Shotgun (planned for unreleased Total Destruction UT mod as the "Armor Perforator")
// Slot 3, replaces Super Shotgun, Ethereal Crossbow, Frost Shards
Class WallbusterReloadMenu : GenericMenu
{
}
Class Wallbuster : SWWMWeapon
{
Default
{
Stamina 15000;
}
}

View file

@ -10,35 +10,69 @@ enum ESWWMGZChannels
CHAN_JETPACK = 63206
};
// Scoreing
// Misc. Utility code
Class SWWMUtility
{
static void StripColor( out String str )
{
int len = str.CodePointCount();
for ( int i=0; i<len; i++ )
{
int remlen = 0;
if ( str.GetNextCodePoint(i) != 0x1C )
continue;
remlen++;
if ( str.GetNextCodePoint(i+remlen) == 0x5B )
while ( str.GetNextCodePoint(i+remlen) != 0x5D )
remlen++;
remlen++;
str.Remove(i,remlen);
len -= remlen;
}
}
}
// Scoring
Class SWWMCredits : Thinker
{
PlayerInfo myplayer;
int credits;
static void GiveCredits( PlayerInfo p, int amount )
static void Give( PlayerInfo p, int amount )
{
let c = FindCredits(p);
let c = Find(p);
if ( !c ) return;
if ( (c.credits+amount < c.credits) || (c.credits+amount > 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<SWWMTrade> 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<SWWMLore> 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<ent.Size(); i++ )
{
if ( ent[i].tag != tag ) continue;
return;
}
SWWMLore e = new("SWWMLore");
e.tag = "$"..tag;
e.text = "$"..text;
// sorted add
String loca = StringTable.Localize(e.tag), locb;
int cpa, cpb;
for ( int i=0; i<ent.Size(); i++ )
{
locb = StringTable.Localize(ent[i].tag);
bool less = false;
int lena = loca.CodePointCount(),
lenb = locb.CodePointCount();
int lim = min(lena,lenb);
for ( int j=0; j<lim; j++ )
{
cpa = loca.GetNextCodePoint(j);
cpb = locb.GetNextCodePoint(j);
if ( cpa >= 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<MAXPLAYERS; i++ )
{
if ( !playeringame[i] ) continue;
// while we're at it, also update the bridge var for counting credits
creditsbridge[i] = SWWMCredits.GetCredits(players[i]);
if ( players[i].itemcount > 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<Inventory> 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<Weapon>)(item));
}
}
else if ( e.Name.Left(10) ~== "swwmtrade." )
{
Class<Inventory> 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 )

View file

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

View file

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

View file

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

View file

@ -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<pname.CodePointCount(); i++ )
{
int remlen = 0;
if ( pname.GetNextCodePoint(i) != 0x1C )
continue;
remlen++;
if ( pname.GetNextCodePoint(i+remlen) == 0x5B )
while ( pname.GetNextCodePoint(i+remlen) != 0x5D )
remlen++;
remlen++;
pname.Remove(i,remlen);
}
SWWMUtility.StripColor(pname);
String fullstr = String.Format("\cq%s\cd@\cqdemolitionist%d\cn ~ \c-wall %s%s",pname,consoleplayer+1,txt,mTewiFont.mFont.GetCursor());
// cut out to fit
int w = mTewiFont.mFont.StringWidth(fullstr);

View file

@ -56,6 +56,11 @@ Class SWWMArmor : Armor
}
}
// gives armor when used
Class SWWMSpareArmor : Inventory
{
}
// Base casing classes
Class SWWMCasing : Actor
{

View file

@ -1,2 +1,10 @@
// Tach-Engine Technologies Microfusion Rotary Hammer aka "Pusher" (planned for unreleased Zanaveth Ultra Suite 2)
// Slot 1, replaces Chainsaw, Gauntlets, Timon's Axe
Class PusherWeapon : SWWMWeapon
{
Default
{
Stamina 5000;
}
}

View file

@ -1,3 +0,0 @@
// Akari Labs "Loudboi" Voicebox
// With this you can E M I T
// Additional voice packs will be made later

View file

@ -2,7 +2,25 @@
Class SWWMKnowledgeBaseMenu : GenericMenu
{
// TODO everything, just have it be a blank menu for now
TextureID MainWindow, TabSeparator, WindowSeparator;
Font TewiFont;
int curtab;
// for scrolling
int sel0, sel1, sel2;
// inventory lists
Array<Inventory> invlist;
// lore stuff
SWWMLoreLibrary lorelib;
// store prompt
Array<Class<Inventory> > 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<l.Count(); i++ )
{
xx = (CleanWidth-TewiFont.StringWidth(l.StringAt(i)))/2;
Screen.DrawText(TewiFont,Font.CR_FIRE,xx,yy,l.StringAt(i),DTA_Clean,true);
yy += TewiFont.GetHeight();
}
return;
}
double hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.);
Vector2 ss = (Screen.GetWidth(),Screen.GetHeight())/hs;
Vector2 origin = (ss.x-640,ss.y-400)/2.;
Screen.DrawTexture(MainWindow,false,origin.x,origin.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
str = StringTable.Localize("$SWWM_COMINGSOON");
Vector2 ss = (Screen.GetWidth()/hs,Screen.GetHeight()/hs);
Screen.DrawText(TewiFont,Font.CR_FIRE,(ss.x-TewiFont.StringWidth(str))/2.,(ss.y-TewiFont.GetHeight())/2.,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
}
}

View file

@ -110,6 +110,7 @@ Class Demolitionist : PlayerPawn
override void Tick()
{
Super.Tick();
if ( !player ) return;
if ( !myvoice ) myvoice = CVar.GetCVar('swwm_voicetype',player);
if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player);
if ( player.onground && !bNoGravity && !lastground && (waterlevel < 2) && (health > 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<MAXPLAYERS; i++ )
{
@ -499,6 +518,7 @@ Class Demolitionist : PlayerPawn
}
override bool UseInventory( Inventory item )
{
if ( !player ) return Super.UseInventory(item);
if ( !mute ) mute = CVar.GetCVar('swwm_mutevoice',player);
if ( !(item is 'PuzzleItem') || (mute.GetInt() >= 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:

View file

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

View file

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

View file

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

View file

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

View file

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