diff --git a/FuturePlans.md b/FuturePlans.md index c65ca2918..b55669f51 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -35,20 +35,21 @@ More weapons, because we need 'em. In addition, all the "easy to implement" mini - ✓ Buttslam lines * ☑ **Additional Collectibles:** - ✓ Saya's Mug +* ☐ ***"Trimming the fat"*:** + - ✓ Remove all shell types except buckshot and golden shells + - ✓ Spreadgun loads golden shells with altfire, like in IA3 + - ✓ Wallbuster tops up buckshot one cylinder at a time until stopped + - Remove all missile types except blazers, and rewrite the absolute mess of code the Hellblazer currently is + - Ammo types for Silver Bullet kept intact, but implement "alt reload" instead through altfire+reload combo ## 1.4 update *(Fine Refinements)*: Re-animation of old FK models. Plus extra score incentives and achievements. * **Re-animate all base models with IK *(important for consistency)*** -* **Ammo type simplification:** - - Remove all shell types except buckshot and golden shells - - Spreadgun loads/unloads golden shells by tapping altfire, like in IA3 - - Wallbuster tops up buckshot one cylinder at a time until reload is released - - Remove all missile types except blazers - - Zoom button becomes an inspect animation when idle, finally allowing the chamber to be visible - - Ammo types for Silver Bullet kept intact, but implement "alt reload" instead through altfire+reload combo - - Repurpose lead balls for a time bomb item +* **Additional Items:** + - Ballsy™ Bomb *(re-purposes lead ball)* + - Battle-Boi™ Deployable Sentry *(re-purposes saltshot)* * **Additional Score Bonuses:** - Double-Cheeked *(Buttslam kill, 1.5x)* - Unseen *(Kill an enemy without a line of sight to yourself, +300)* @@ -80,8 +81,6 @@ Re-animation of old FK models. Plus extra score incentives and achievements. - Gibs - Hexen keys - Hexen puzzle items -* **Bonus Item:** - - Battle-Boi™ Deployable Sentry ## 1.5 update *(The Final Stage)*: diff --git a/MAPPING.md b/MAPPING.md index 5ac9ed44f..54b893def 100644 --- a/MAPPING.md +++ b/MAPPING.md @@ -57,111 +57,95 @@ DoomEdNums 29021 = "RedShell" 29022 = "RedShell2" 29023 = "RedShell4" - 29024 = "GreenShell" - 29025 = "GreenShell2" - 29026 = "GreenShell4" - 29027 = "BlueShell" - 29028 = "BlueShell2" - 29029 = "BlueShell4" - 29030 = "PurpleShell" - 29031 = "PurpleShell2" - 29032 = "PurpleShell4" - 29033 = "BlackShell" - 29034 = "BlackShell2" - 29035 = "BlackShell4" - 29036 = "GoldShell" - 29037 = "GoldShell2" - 29038 = "GoldShell4" - 29039 = "EvisceratorShell" - 29040 = "EvisceratorShell2" - 29041 = "EvisceratorShell3" - 29042 = "EvisceratorSixPack" - 29043 = "HellblazerMissiles" - 29044 = "HellblazerMissiles2" - 29045 = "HellblazerMissiles3" - 29046 = "HellblazerMissileMag" - 29047 = "HellblazerCrackshots" - 29048 = "HellblazerCrackshots2" - 29049 = "HellblazerCrackshotMag" - 29050 = "HellblazerRavagers" - 29051 = "HellblazerRavagerMag" - 29052 = "HellblazerWarheads" - 29053 = "HellblazerWarheadMag" - 29054 = "SparkUnit" - 29055 = "SparkUnit2" - 29056 = "SilverBulletAmmo" - 29057 = "SilverBulletAmmo2" - 29058 = "SilverBullets" - 29059 = "SilverBullets_2" - 29060 = "SilverBullets_3" - 29061 = "SilverBullets2" - 29062 = "SilverBullets2_2" - 29063 = "SilverBullets2_3" - 29064 = "CandyGunAmmo" - 29065 = "CandyGunBullets" - 29066 = "CandyGunBullets2" - 29067 = "CandyGunBullets3" - 29068 = "YnykronAmmo" + 29024 = "RedShell8" + 29025 = "RedShell12" + 29026 = "RedShell16" + 29027 = "GoldShell" + 29028 = "GoldShell2" + 29029 = "GoldShell4" + 29030 = "EvisceratorShell" + 29031 = "EvisceratorShell2" + 29032 = "EvisceratorShell3" + 29033 = "EvisceratorSixPack" + 29034 = "HellblazerMissiles" + 29035 = "HellblazerMissiles2" + 29036 = "HellblazerMissiles3" + 29037 = "HellblazerMissileMag" + 29038 = "SparkUnit" + 29039 = "SparkUnit2" + 29040 = "SilverBulletAmmo" + 29041 = "SilverBulletAmmo2" + 29042 = "SilverBullets" + 29043 = "SilverBullets_2" + 29044 = "SilverBullets_3" + 29045 = "SilverBullets2" + 29046 = "SilverBullets2_2" + 29047 = "SilverBullets2_3" + 29048 = "CandyGunAmmo" + 29049 = "CandyGunBullets" + 29050 = "CandyGunBullets2" + 29051 = "CandyGunBullets3" + 29052 = "YnykronAmmo" // DLC Ammo - 29069 = "SMW05Ammo" - 29070 = "SMW05Ammo2" - 29071 = "SMW05Ammo3" - 29072 = "SMW05SmallAmmo" - 29073 = "SMW05BigAmmo" - 29074 = "SheenAmmo" - 29075 = "SheenAmmo2" - 29076 = "SheenAmmo3" - 29077 = "SheenSmallAmmo" - 29078 = "SheenBigAmmo" - 29079 = "QuadravolAmmo" - 29080 = "QuadravolAmmo2" - 29081 = "QuadravolAmmo3" - 29082 = "SparksterBAmmo" - 29083 = "SparksterBAmmo2" - 29084 = "SparksterBAmmo3" - 29085 = "SparksterRAmmo" - 29086 = "SparksterRAmmo2" - 29087 = "SparksterRAmmo3" - 29088 = "RayBolt" - 29089 = "RayBolt2" - 29090 = "RayBolt5" - 29091 = "RayAmmo" - 29092 = "MisterRound" - 29093 = "MisterRound2" - 29094 = "MisterRound3" - 29095 = "MisterRound5" - 29096 = "MisterAmmo" - 29097 = "MisterGAmmo" - 29098 = "UltimatePod" - 29099 = "UltimateAmmo" + 29053 = "SMW05Ammo" + 29054 = "SMW05Ammo2" + 29055 = "SMW05Ammo3" + 29056 = "SMW05SmallAmmo" + 29057 = "SMW05BigAmmo" + 29058 = "SheenAmmo" + 29059 = "SheenAmmo2" + 29060 = "SheenAmmo3" + 29061 = "SheenSmallAmmo" + 29062 = "SheenBigAmmo" + 29063 = "QuadravolAmmo" + 29064 = "QuadravolAmmo2" + 29065 = "QuadravolAmmo3" + 29066 = "SparksterBAmmo" + 29067 = "SparksterBAmmo2" + 29068 = "SparksterBAmmo3" + 29069 = "SparksterRAmmo" + 29070 = "SparksterRAmmo2" + 29071 = "SparksterRAmmo3" + 29072 = "RayBolt" + 29073 = "RayBolt2" + 29074 = "RayBolt5" + 29075 = "RayAmmo" + 29076 = "MisterRound" + 29077 = "MisterRound2" + 29078 = "MisterRound3" + 29079 = "MisterRound5" + 29080 = "MisterAmmo" + 29081 = "MisterGAmmo" + 29082 = "UltimatePod" + 29083 = "UltimateAmmo" // For Hexen - 29100 = "FabricatorTier1" - 29101 = "FabricatorTier2" - 29102 = "FabricatorTier3" - 29103 = "FabricatorTier4" + 29084 = "FabricatorTier1" + 29085 = "FabricatorTier2" + 29086 = "FabricatorTier3" + 29087 = "FabricatorTier4" // Backpack - 29104 = "HammerspaceEmbiggener" + 29088 = "HammerspaceEmbiggener" // Health - 29105 = "HealthNuggetItem" - 29106 = "TetraHealthItem" - 29107 = "CubeHealthItem" - 29108 = "RefresherItem" + 29089 = "HealthNuggetItem" + 29090 = "TetraHealthItem" + 29091 = "CubeHealthItem" + 29092 = "RefresherItem" // Armor - 29109 = "ArmorNuggetItem" - 29110 = "BlastSuitItem" - 29111 = "WarArmorItem" + 29093 = "ArmorNuggetItem" + 29094 = "BlastSuitItem" + 29095 = "WarArmorItem" // Powerups - 29112 = "GrilledCheeseSandwich" - 29113 = "GhostArtifact" - 29114 = "GravitySuppressor" - 29115 = "FuckingInvinciball" - 29116 = "Ragekit" - 29117 = "SWWMLamp" - 29118 = "EBarrier" - 29119 = "Mykradvo" - 29120 = "DivineSprite" - 29121 = "AngerySigil" -} + 29096 = "GrilledCheeseSandwich" + 29097 = "GhostArtifact" + 29098 = "GravitySuppressor" + 29099 = "FuckingInvinciball" + 29100 = "Ragekit" + 29101 = "SWWMLamp" + 29102 = "EBarrier" + 29103 = "Mykradvo" + 29104 = "DivineSprite" + 29105 = "AngerySigil" +} ``` **Notes:** diff --git a/README.md b/README.md index e3e2714a3..b8ebd52c0 100644 --- a/README.md +++ b/README.md @@ -133,24 +133,18 @@ Coming from the **Doom** modding side of things, this gun really packs a punch, **Primary fire:** Fires, duh. Depending on the loaded ammo the effects may vary. -**Secondary fire:** On tap, switches ammo type for the next shot to be loaded. On hold, also tap primary fire to unload the current shell, but leave the gun empty. +**Secondary fire:** Switches to/from special golden shells *(if you've got any)*. -**Reload:** Unload the current shell and load a new one. Unspent shells are re-added to their respective ammo type pool (or dropped if you can't hold more). +**Reload:** Reloads the gun, obviously. Probably redundant considering this action is performed automatically. The **Spreadgun** uses 6 gauge ammunition, apparently just for the sake of making it feel more powerful due to the increased recoil. ### 6ga shells ~ Replaces Clip / Shells, Wand Crystal / Ethereal Arrows ![](docimg/shells.png) -Available in the following types, with varying chances of appearing depending -on replaced item, may also come in bundles: +A potent dosage of #00 buckshot, ready to tear enemies to shreds, comes packed into each of these. Shells will pop up by themselves or in bunches of various sizes. They're perhaps one of the most common ammo types you may encounter. - - **Standard buckshot *(red)*:** Lots of tiny pellets ready to tear enemies to shreds. Most common. - - **Slug *(green)*:** Concentrated damage in a single, large projectile. Common. - - **Kinylum saltshot *(blue)*:** Highly volatile shards of **Kinylum** that leave behind a trail of burning plasma. Somewhat rare. - - ***"The ball"* *(purple)*:** A big lead ball, 'nuff said. Rare. - - **Telebrium flechette *(black)*:** A discharge of puncturing darts tipped with pure **Telebrium**, highly corrosive, effects may spread through emitted fumes. Very rare. - - **Golden shell *(self-explanatory color)*:** An extremely rare, but very valuable type. Fires a sabot packed with a very dense, high-grade **Explodium** charge, the shell also contains some gold glitter, but it's just for show. Clearly designed by someone completely insane, and definitely guaranteed to not fail catastrophically and blow up your gun, your hands, your arms, and the rest of your upper body. Unlike the others, this one is only available as a rare drop from powerful monsters *(over 1000HP)* and bosses. They may also appear in **Chanceboxes**. +Be on the lookout for a special kind of shell, **Spreadgun**-exclusive, that rarely drops from certain foes *(bosses and/or monsters with over 1000HP)*. We're talking about the **Golden shell**, shiny and sparkly. Loaded into your gun, this will fire a sabot packed with a very dense, high-grade **Explodium** charge, as well as some gold glitter *(which is just for show)*. Golden shells are clearly designed by someone completely insane, and definitely guaranteed to not fail catastrophically and blow up your gun, your hands, your arms, and the rest of your upper body. ### Puntzer Beta *(slot 3)* ~ Replaces Shotgun, Ethereal Crossbow, Serpent Staff ![](docimg/puntzerbeta.png) @@ -171,7 +165,7 @@ These 6.9mm ***(nice)*** corkscrew-shaped bullets have some fine drilling power, ### Wallbuster *(slot 4)* ~ Replaces SSG, Ethereal Crossbow, Frost Shards ![](docimg/wallbuster.png) -A ludicrously overkill weapon, courtesy of the always-overkill **Blackmann Arms**. Sporting a pentagonal array of 5-barrel cylinders, for a grand total of 25 barrels. Everything in front of you is pretty much dead. Cannot use flechettes or golden shells. +A ludicrously overkill weapon, courtesy of the always-overkill **Blackmann Arms**. Sporting a pentagonal array of 5-barrel cylinders, for a grand total of 25 barrels. Everything in front of you is pretty much dead. **Primary fire:** Shoot one barrel at a time. @@ -179,13 +173,7 @@ A ludicrously overkill weapon, courtesy of the always-overkill **Blackmann Arms* **Tertiary fire:** Fire all barrels at the same time, but this time REALLY watch out for the recoil. -**Reload:** Reload *(obviously)*. The process is very complicated so I'll explain it better as a list: - - - A menu will open after the side lever is pulled. Here you can queue ammo to load up. Controls are displayed at all times. - - In single player, the game is paused when you're in the queueing process, so you can take your time, but in coop you better have someone to cover you while you micromanage this beast. - - While loading shells, you can cancel by holding the reload button. - - For a skilled combat robot like you, reloading this should be very fast. 10 seconds tops, for all 25 barrels. - - The Auto-reload function is not very smart, only use it when you have no time to think. +**Reload:** Reload *(obviously)*. You will top up the whole thing, one cylinder at a time, until you either run out of ammo or press reload again or any fire button. Should you make use of its multi-fire functionality, you will soon learn why it bears the name of ***"Wallbuster"***. @@ -258,12 +246,7 @@ This thing is more explosive than it looks, so if you're reading this, Icarus, * ### Hellblazers ~ Replaces Rockets, Flame Orb ![](docimg/hellblazerammo.png) -Ammo for the **Hellblazer**, found either as single units or packs. There are four types: - - - ***"Blazer"* missiles:** The standard ammunition, highly explosive. - - ***"Crackshot"* cluster bombs:** All sorts of little bits that fly around after the initial blast. - - ***"Ravager"* incendiary bombs:** Wide range, the flames will engulf pretty much everything around itself. - - ***"Slayer"* warheads:** Frickin' nukes, you better keep your distance, because they are ***STRONG***. +Ammo for the **Hellblazer**, found either as single units or packs. The **"Blazer"** 25mm micro-missile packs one hell of a punch with its highly explosive charge, with not just one mighty immediate blast, but also a short-lived lingering aura of big blazing hurt around itself too. ### Quadravol *(slot 6)* ~ Replaces Rocket Launcher, Phoenix Rod, Hammer of Retribution ![](docimg/quadravol.png) @@ -339,11 +322,11 @@ The definitive model of **Blackmann Arms**'s legendary **Silver Bullet** series. **Primary fire:** Shoot the bullet. A second press chambers another round. -**Secondary fire:** On tap, picks the ammo for the next reload. On hold, also tap primary to manually cock *(in case you want to eject unfired rounds)*. +**Secondary fire:** Hold and combine with primary fire to manually cock *(in case you want to eject unfired rounds)*, or with reload to switch to alternate ammo *(if available)*. **Tertiary fire:** Press and hold to enter scoped mode. Release to pick the desired zoom level *(can go up to 16x)*. Press again to exit scoped mode. -**Reload:** Reload *(what else is new)* or switch ammo types. +**Reload:** Reload *(what else is new)*. Note that if you only have alternate ammo available, you must use the combo with secondary fire. This weapon is generally not recommended for human use outside of power armor. Good thing you're not a human, then. Still, the recoil compensator jet engines can potentially deal damage to yourself if you don't have any armor, so be careful. diff --git a/achievements.lst b/achievements.lst index 3a8d760d3..a75a1b094 100644 --- a/achievements.lst +++ b/achievements.lst @@ -7,7 +7,6 @@ # this is a bitfield, where abs(maxval) bits must be set # hasformat: the TXT string has a %d in it to substitute for maxval # gametype: the game this belongs to (any, doom, heretic, hexen, raven, etc.) -acid,1000,yes,any allcoll,-1,no,any #allinv,-1,yes,any allitems,100,yes,nothexen @@ -18,7 +17,7 @@ anom,50,yes,any anone,0,no,any #ara,100,yes,any #arse,-8,yes,any -balls,200,yes,any +#balls,200,yes,any #ballself,0,no,any barrel,1000,yes,doom barrier,100,yes,doom @@ -32,7 +31,7 @@ bustin,200,yes,any butts,1000,yes,any candy,1000,yes,any cliffyb,0,no,nothexen -clonk,0,no,any +#clonk,0,no,any #combo,0,no,any conga,20,yes,any crush,0,no,any @@ -95,14 +94,11 @@ rail,44,yes,any reflect,100,yes,any refresh,500,yes,any roast,200,yes,any -salt,0,no,any sanic,800,yes,any sekiro,0,no,any #sentry,1000,yes,any shame,0,no,any shock,200,yes,any -slayer,50,yes,doom -slayer,20,yes,raven slemg,500,yes,any sneaky,20,yes,raven sneeze,50,yes,any diff --git a/cvarinfo.base b/cvarinfo.base index 21a680386..d0e845aba 100644 --- a/cvarinfo.base +++ b/cvarinfo.base @@ -20,7 +20,6 @@ nosave bool swwm_shaders = true; // use pp shaders for some effects server bool swwm_revive = true; // allows the player to do an "emergency reboot" when dying server int swwm_revivecooldown = 60; // cooldown after using a revive, in seconds (0: no limit) nosave int swwm_interart = 1; // show art on intermissions (2: only fanart, 3: only official renders) -server bool swwm_balluse = true; // lead ball can "press" switches remotely server bool swwm_blood = true; // custom blood/gibbing server int swwm_maxblood = 200; // max blood effects at any time server int swwm_maxgibs = 100; // max gibs at any time diff --git a/docimg/hammer.png b/docimg/hammer.png index 378a6347f..e60f4cac4 100644 Binary files a/docimg/hammer.png and b/docimg/hammer.png differ diff --git a/docimg/hellblazerammo.png b/docimg/hellblazerammo.png index 47cb154e5..e2f8ee136 100644 Binary files a/docimg/hellblazerammo.png and b/docimg/hellblazerammo.png differ diff --git a/docimg/mrbullet.png b/docimg/mrbullet.png index 89e506fdf..fd887dada 100644 Binary files a/docimg/mrbullet.png and b/docimg/mrbullet.png differ diff --git a/docimg/plasmablast.png b/docimg/plasmablast.png index 85ff5301c..ba46d82a1 100644 Binary files a/docimg/plasmablast.png and b/docimg/plasmablast.png differ diff --git a/docimg/puntzerbeta.png b/docimg/puntzerbeta.png index 077e04b8a..1d48fb036 100644 Binary files a/docimg/puntzerbeta.png and b/docimg/puntzerbeta.png differ diff --git a/docimg/puntzergamma.png b/docimg/puntzergamma.png index 97a862bb1..4c2725b84 100644 Binary files a/docimg/puntzergamma.png and b/docimg/puntzergamma.png differ diff --git a/docimg/quadammo.png b/docimg/quadammo.png index fcd1710b6..82e1a792f 100644 Binary files a/docimg/quadammo.png and b/docimg/quadammo.png differ diff --git a/docimg/quadravol.png b/docimg/quadravol.png index d3e2f935e..121339238 100644 Binary files a/docimg/quadravol.png and b/docimg/quadravol.png differ diff --git a/docimg/rafankos.png b/docimg/rafankos.png index 856bcbfc9..c2f519c1b 100644 Binary files a/docimg/rafankos.png and b/docimg/rafankos.png differ diff --git a/docimg/raykhom.png b/docimg/raykhom.png index 1dab1646e..1b442046c 100644 Binary files a/docimg/raykhom.png and b/docimg/raykhom.png differ diff --git a/docimg/shells.png b/docimg/shells.png index 9472dcd76..adb67ea9f 100644 Binary files a/docimg/shells.png and b/docimg/shells.png differ diff --git a/docimg/sparkster.png b/docimg/sparkster.png index a5e7ee498..3ec4651c2 100644 Binary files a/docimg/sparkster.png and b/docimg/sparkster.png differ diff --git a/graphics/Achievements/AchievementAcid.png b/graphics/Achievements/AchievementAcid.png deleted file mode 100644 index 15a989a26..000000000 Binary files a/graphics/Achievements/AchievementAcid.png and /dev/null differ diff --git a/graphics/Achievements/AchievementSalt.png b/graphics/Achievements/AchievementSalt.png deleted file mode 100644 index 0b53ec1d5..000000000 Binary files a/graphics/Achievements/AchievementSalt.png and /dev/null differ diff --git a/graphics/Achievements/AchievementSlayer.png b/graphics/Achievements/AchievementSlayer.png deleted file mode 100644 index 102b0fabf..000000000 Binary files a/graphics/Achievements/AchievementSlayer.png and /dev/null differ diff --git a/graphics/HUD/HellblazerCrackshot.png b/graphics/HUD/HellblazerCrackshot.png deleted file mode 100644 index fdea510b2..000000000 Binary files a/graphics/HUD/HellblazerCrackshot.png and /dev/null differ diff --git a/graphics/HUD/HellblazerCrackshotLock.png b/graphics/HUD/HellblazerCrackshotLock.png deleted file mode 100644 index ae1d4354b..000000000 Binary files a/graphics/HUD/HellblazerCrackshotLock.png and /dev/null differ diff --git a/graphics/HUD/HellblazerRavager.png b/graphics/HUD/HellblazerRavager.png deleted file mode 100644 index 4749268eb..000000000 Binary files a/graphics/HUD/HellblazerRavager.png and /dev/null differ diff --git a/graphics/HUD/HellblazerRavagerLock.png b/graphics/HUD/HellblazerRavagerLock.png deleted file mode 100644 index bdb603008..000000000 Binary files a/graphics/HUD/HellblazerRavagerLock.png and /dev/null differ diff --git a/graphics/HUD/HellblazerWarhead.png b/graphics/HUD/HellblazerWarhead.png deleted file mode 100644 index 3abcc7474..000000000 Binary files a/graphics/HUD/HellblazerWarhead.png and /dev/null differ diff --git a/graphics/HUD/HellblazerWarheadLock.png b/graphics/HUD/HellblazerWarheadLock.png deleted file mode 100644 index 9076a69b8..000000000 Binary files a/graphics/HUD/HellblazerWarheadLock.png and /dev/null differ diff --git a/graphics/HUD/MenuShellBlue.png b/graphics/HUD/MenuShellBlue.png deleted file mode 100644 index a5af028e6..000000000 Binary files a/graphics/HUD/MenuShellBlue.png and /dev/null differ diff --git a/graphics/HUD/MenuShellGreen.png b/graphics/HUD/MenuShellGreen.png deleted file mode 100644 index 0e0de0420..000000000 Binary files a/graphics/HUD/MenuShellGreen.png and /dev/null differ diff --git a/graphics/HUD/MenuShellPurple.png b/graphics/HUD/MenuShellPurple.png deleted file mode 100644 index 03dc5d276..000000000 Binary files a/graphics/HUD/MenuShellPurple.png and /dev/null differ diff --git a/graphics/HUD/MenuShellRed.png b/graphics/HUD/MenuShellRed.png deleted file mode 100644 index 0ed3dae45..000000000 Binary files a/graphics/HUD/MenuShellRed.png and /dev/null differ diff --git a/graphics/HUD/ShellBlack.png b/graphics/HUD/ShellBlack.png deleted file mode 100644 index 3ca1059a5..000000000 Binary files a/graphics/HUD/ShellBlack.png and /dev/null differ diff --git a/graphics/HUD/ShellBlue.png b/graphics/HUD/ShellBlue.png deleted file mode 100644 index b79f0373e..000000000 Binary files a/graphics/HUD/ShellBlue.png and /dev/null differ diff --git a/graphics/HUD/ShellBlueSmall.png b/graphics/HUD/ShellBlueSmall.png deleted file mode 100644 index 2b29f3ef0..000000000 Binary files a/graphics/HUD/ShellBlueSmall.png and /dev/null differ diff --git a/graphics/HUD/ShellGreen.png b/graphics/HUD/ShellGreen.png deleted file mode 100644 index e47701f91..000000000 Binary files a/graphics/HUD/ShellGreen.png and /dev/null differ diff --git a/graphics/HUD/ShellGreenSmall.png b/graphics/HUD/ShellGreenSmall.png deleted file mode 100644 index a5285cd41..000000000 Binary files a/graphics/HUD/ShellGreenSmall.png and /dev/null differ diff --git a/graphics/HUD/ShellPurple.png b/graphics/HUD/ShellPurple.png deleted file mode 100644 index a0fb9c3b9..000000000 Binary files a/graphics/HUD/ShellPurple.png and /dev/null differ diff --git a/graphics/HUD/ShellPurpleSmall.png b/graphics/HUD/ShellPurpleSmall.png deleted file mode 100644 index ea4a3d9dc..000000000 Binary files a/graphics/HUD/ShellPurpleSmall.png and /dev/null differ diff --git a/graphics/HUD/WallbusterMenu.png b/graphics/HUD/WallbusterMenu.png deleted file mode 100644 index d8c2ff768..000000000 Binary files a/graphics/HUD/WallbusterMenu.png and /dev/null differ diff --git a/graphics/M_DEMOCHAN_SHELLS.png b/graphics/M_DEMOCHAN_SHELLS.png index ccc052d7b..83de30250 100644 Binary files a/graphics/M_DEMOCHAN_SHELLS.png and b/graphics/M_DEMOCHAN_SHELLS.png differ diff --git a/language.def_base b/language.def_base index b112c09cd..e79411c6c 100644 --- a/language.def_base +++ b/language.def_base @@ -38,14 +38,6 @@ T_MORTALRIFLE = "Mortal Rifle"; T_RAFANKOS = "Rafan-Kos"; T_REDSHELL = "Shell"; T_REDSHELLS = "Shells"; -T_GREENSHELL = "Slug"; -T_GREENSHELLS = "Slugs"; -T_BLUESHELL = "Kinylum Saltshot Round"; -T_BLUESHELLS = "Kinylum Saltshot Rounds"; -T_BLACKSHELL = "Corrosive Round"; -T_BLACKSHELLS = "Corrosive Rounds"; -T_PURPLESHELL = "Lead Ball Round"; -T_PURPLESHELLS = "Lead Ball Rounds"; T_GOLDSHELL = "Golden Shell"; T_GOLDSHELLS = "Golden Shells"; T_EVISHELL = "Eviscerator Shell"; @@ -55,19 +47,7 @@ I_EVISHELLCLIP3 = "Eviscerator Trio Clip"; I_EVISHELLPAK = "Eviscerator 6-Pack"; T_HELLMISSILE = "Hellblazer Missile"; T_HELLMISSILES = "Hellblazer Missiles"; -T_HELLMISSILE2 = "2 Hellblazer Missiles"; -T_HELLMISSILE3 = "3 Hellblazer Missiles"; T_HELLMISSILEMAG = "Hellblazer Missile Mag"; -T_HELLCLUSTER = "Hellblazer Crackshot"; -T_HELLCLUSTERS = "Hellblazer Crackshots"; -T_HELLCLUSTER2 = "2 Hellblazer Crackshots"; -T_HELLCLUSTERMAG = "Hellblazer Crackshot Mag"; -T_HELLBURNINATOR = "Hellblazer Ravager"; -T_HELLBURNINATORS = "Hellblazer Ravagers"; -T_HELLBURNINATORMAG = "Hellblazer Ravager Mag"; -T_HELLNUKE = "Hellblazer Warhead"; -T_HELLNUKES = "Hellblazer Warheads"; -T_HELLNUKEMAG = "Hellblazer Warhead Mag"; T_SPARKUNIT = "Biospark Unit"; T_SPARKUNITS = "Biospark Units"; T_XSBMAG = "1.150 XSB Magazine"; @@ -480,17 +460,9 @@ FN_ELITEZOMBIE_FUN3 = "Blondie Boy"; O_DEEPIMPACT = "%o was impacted deeply by %k."; O_DEEPIMPACT_WEAK = "%k coughed in %o's general direction."; O_EXPLODIUM = "%k inflicted severe knee explosions onto %o."; -O_SPREADGUN_RED = "%k gave %o a mouthful of shot."; -O_SPREADGUN_GREEN = "%o got slugged by %k."; -O_SPREADGUN_BLUE = "%k made %o very salty."; -O_SPREADGUN_BLACK = "%o received a very spiky treatment from %o."; -O_SPREADGUN_BLACK_DEBUFF = "%k turned %o into a corroded mess."; -O_SPREADGUN_PURPLE = "%o was conked by %k's lead ball."; +O_SPREADGUN = "%k gave %o a mouthful of shot."; O_SPREADGUN_GOLD = "%o ate up %k's golden blast."; -O_WALLBUSTER_RED = "%k gave %o a mighty busting."; -O_WALLBUSTER_GREEN = "%k turned %o into a donut."; -O_WALLBUSTER_BLUE = "%k made %o REALLY salty."; -O_WALLBUSTER_PURPLE = "%k inflicted lead ball torture onto %o."; +O_WALLBUSTER = "%k gave %o a mighty busting."; O_EVISCERATOR = "%o was eviscerated by %k."; O_HELLBLAZER = "%k blasted %o into burning bits."; O_SPARKSTER = "%o got sparked hard by %k."; @@ -529,6 +501,8 @@ O_MASHIRO4 = "%o mysteriously disappeared."; O_MASHIRO5 = "%o angered the wrong moth."; O_ENDLEVEL = "%o had a peculiar teleportation-related mishap."; O_MYKRADVO = "%o couldn't hide from %k's vengeful wrath."; +O_LEADBALL = "%o was conked by %k's lead ball."; +O_SALTSHOT = "%k made %o very salty."; // edited vanilla obituaries OB_SUICIDE = "%o commited suikoden."; OB_FALLING = "%o sprained everything."; @@ -736,9 +710,8 @@ TT_EXPLODIUM2 = "\cfReload:\c- Reload weapon(s)."; TT_SPREADGUN = "\cfFire:\c- Shoot weapon.\n" -"\cfAltfire:\c- Select ammo.\n" -"\cfReload:\c- Reload / switch ammo.\n" -"\cfAltfire+Fire:\c- Unload ammo."; +"\cfAltfire:\c- Reload special ammo.\n" +"\cfReload:\c- Reload weapon."; TT_WALLBUSTER = "\cfFire:\c- Shoot one barrel.\n" "\cfAltfire:\c- Shoot one cylinder.\n" @@ -751,8 +724,7 @@ TT_EVISCERATOR = TT_HELLBLAZER = "\cfFire:\c- Load / shoot rockets.\n" "\cfAltfire:\c- Load / shoot grenades.\n" -"\cfZoom:\c- Select ammo.\n" -"\cfReload:\c- Reload / switch ammo.\n" +"\cfReload:\c- Reload weapon.\n" "\cx(More controls in library)\c-"; TT_SPARKSTER = "\cfFire:\c- Orb shot.\n" @@ -761,10 +733,10 @@ TT_SPARKSTER = "\cfReload:\c- Reload / double load."; TT_SILVERBULLET = "\cfFire:\c- Shoot weapon.\n" -"\cfAltfire:\c- Select ammo.\n" "\cfZoom:\c- Use scope.\n" -"\cfReload:\c- Reload / switch ammo.\n" -"\cfAltfire+Fire:\c- Manual bolt cycle."; +"\cfReload:\c- Reload weapon.\n" +"\cfAltfire+Fire:\c- Manual bolt cycle.\n" +"\cfAltfire+Reload:\c- Reload special ammo."; TT_CANDYGUN = "\cfFire:\c- Shoot weapon.\n" "\cfAltfire:\c- Throw magazine.\n" @@ -913,7 +885,7 @@ SWWM_NEWMISSION = "Mission briefing has been updated."; SWWM_CHEEVO = "\cxAchievement unlocked: \cf%s\c-"; SWWM_CHEEVOREM = "\cx%s \cxunlocked an achievement: \cf%s\c-"; // intermission tips -SWWM_NINTERTIP = "210"; +SWWM_NINTERTIP = "207"; SWWM_INTERTIP = "Tip #%d:"; SWWM_INTERTIP1 = "The Demolitionist is immune to drowning, poison and even fall damage (excluding instant kill pits)."; SWWM_INTERTIP2 = "The Explodium Gun's altfire has an explosive yield proportional to the bullets left in the mag."; @@ -941,7 +913,7 @@ SWWM_INTERTIP23 = "Did you know that Saya really hates the UAC?\n\nWhat? You alr SWWM_INTERTIP24 = "You can dash into enemies to push them out of the way. Some smaller ones may die immediately from the impact and go flying."; SWWM_INTERTIP25 = "If you do an air dash straight towards the ground, you might land with enough force to cause a shockwave, pushing away most enemies around you."; SWWM_INTERTIP26 = "You can press switches and open doors by punching them. This can also be done with the Lead Ball ammunition from the Spreadgun, with the exception of exit switches."; -SWWM_INTERTIP27 = "The corrosive effects of the Spreadgun's Black Shells can stack, up to a lethal degree if you hit a target dead on. On top of that, nearby targets might also feel some extra pain from the toxic fumes that'll come out, and spread its effects even further beyond."; +SWWM_INTERTIP27 = "The Spreadgun may be unwieldy to use, but it compensates by being far more destructive than your typical shotgun."; SWWM_INTERTIP28 = "The Demolitionist is too heavy to swim, and will sink quickly. Don't worry, though, the jet boosters work underwater too."; SWWM_INTERTIP29 = "Love is the most powerful thing in the world. Don't hate those who are different. We all must stand together."; SWWM_INTERTIP30 = "The Silver Bullet fires with such a force that its bullets leave shockwaves as they rip through the air (and enemies), dealing additional damage. It can also pierce through some walls."; @@ -951,7 +923,7 @@ SWWM_INTERTIP33 = "If you can line it up properly, dashing into enemies backward SWWM_INTERTIP34 = "While under the effects of a Ragekit, your dashing damage will be amplified to such a level you can even cleanly tear through doors and other obstacles along the way."; SWWM_INTERTIP35 = "We live in a world where many of us are discriminated for our very identity. This is a sad reality, and one that we never chose. Sadder is however the existence of those who hate us."; SWWM_INTERTIP36 = "Demo-chan's favorite color is green."; -SWWM_INTERTIP37 = "Kinylum saltshot is potent enough to pierce through invulnerable enemies. This is also true of all weapons from slot 7 upwards."; +SWWM_INTERTIP37 = "All weapons from slot 7 upwards are capable of damaging otherwise invulnerable enemies."; SWWM_INTERTIP38 = "Even if you're not interested in reading the lore, it is still useful to check the entries of weapons and other items to learn more about their usage. Of course, you can also simply experiment by yourself."; SWWM_INTERTIP39 = "If you experience slowdowns when many sound effects are playing, it's recommended to disable HRTF in the OpenAL settings, if enabled."; SWWM_INTERTIP40 = "Item Sense can help you detect items that would be otherwise hard to see among the chaos of an after-battle corpse pile. With an Omnisight, you can even see where items are through walls!"; @@ -1021,9 +993,9 @@ SWWM_INTERTIP103 = "Grilled cheese sandwiches are actually pretty tasty, as the SWWM_INTERTIP104 = "You can interact with collectible items from the Keychain tab of your Demolitionist Menu. You know, just in case you feel like playing around with them."; SWWM_INTERTIP105 = "Moths like lamps."; SWWM_INTERTIP106 = "No, covering yourself in oil won't allow you to fly when it rains."; -SWWM_INTERTIP107 = "Lead balls can deal random crits. Please don't hurt me, TF2 players."; +SWWM_INTERTIP107 = "\"I didn't know they put Shakespeare in comic books.\"\n — Demo Miyamoto"; SWWM_INTERTIP108 = "This mod may contain horny, in small amounts."; -SWWM_INTERTIP109 = "Did you know the Hellblazer can show its magazine state when placed in the world? It's not really a very important thing, but I'm proud of my obsessive attention to detail."; +SWWM_INTERTIP109 = "The Hellblazer's missiles don't just deal direct blast damage, but also release an expanding wave of scorching heat."; SWWM_INTERTIP110 = "If you didn't know already, the mod can also be used with Heretic and Hexen. New things will be unlocked in each of them, as the overarching story of the mod progresses."; SWWM_INTERTIP111 = "Ironic shitposting is still shitposting."; SWWM_INTERTIP112 = "There are no buses in Gensokyo."; @@ -1098,14 +1070,14 @@ SWWM_INTERTIP180 = "Are you tired of death exits? Then you are in luck, for this SWWM_INTERTIP181 = "Unlike the rapidly thrown quick grenades, the Explodium Gun's altfire will bounce on walls, allowing you to hit targets around corners."; SWWM_INTERTIP182 = "The Sheen HMG sets the air on fire along each bullet's path, just from the sheer pressure of the cartridge used."; SWWM_INTERTIP183 = "The rare golden shells allow you to cause extreme destruction in a large radius. Just be careful not to stand too close."; -SWWM_INTERTIP184 = "Be careful with your lead balls. They might ricochet back into your face and hurt real bad."; +SWWM_INTERTIP184 = "\"Life sometimes truly feels like a videogame.\"\n — Reubens C. Karnanaiahmani"; SWWM_INTERTIP185 = "Once you're set ablaze by the Quadravol, the quickest solution is to shake those flames off. Shame that your enemies aren't smart enough to know that."; SWWM_INTERTIP186 = "Somehow, the Quadravol can be used underwater. One has to wonder what those fireballs are made of."; SWWM_INTERTIP187 = "The Ray-Khom's alternate fire is lethal in contact with water. Do apply some common sense with this information."; SWWM_INTERTIP188 = "The Rafan-Kos can prepare a delicious cyberdemon roast in a matter of seconds."; SWWM_INTERTIP189 = "The Mortal Rifle allegedly uses \"mutating ammunition\", whatever the hell that's supposed to mean."; -SWWM_INTERTIP190 = "Hellblazer warheads will continuously toast things good as their shockwave expands. Get Redeemed, sucker."; -SWWM_INTERTIP191 = "Hellblazer ravagers are best used in enclosed spaces, it keeps all the scorching hot plasma nicely contained."; +SWWM_INTERTIP190 = "Demons tend to be very competitive, so friendly fire can easily turn them against each other."; +SWWM_INTERTIP191 = "The Wallbuster takes a while to fully load up, but once the deed's done, you've got a much faster firing shotgun in your hands."; SWWM_INTERTIP192 = "The Demolitionist can directly interface with the Hellblazer to mark targets for seeking. This even works on grenades."; SWWM_INTERTIP193 = "The Quadravol can be held with one hand. This has no tactical advantage, but you can do the cool spin and that's all that matters."; SWWM_INTERTIP194 = "Xekkian weapons are very big, but so are the people who use them."; @@ -1122,9 +1094,6 @@ SWWM_INTERTIP204 = "Do not be afraid to experiment with different play styles. M SWWM_INTERTIP205 = "The Sheen HMG features such intense recoil that given enough firing speed, it could be used to glide around when aiming straight down."; SWWM_INTERTIP206 = "Rocket jumping with the Quadravol is perfectly safe. You can trust me on this, I am a helpful tip after all."; SWWM_INTERTIP207 = "The Sheen HMG's three speed options allow for optimal balancing between ammo conservation and sheer damage output."; -SWWM_INTERTIP208 = "The Wallbuster is a weapon that requires some prior planning to maximize its usefulness. Make sure you've got it well loaded up before facing the enemy."; -SWWM_INTERTIP209 = "Demons tend to be very competitive, so friendly fire can easily turn them against each other."; -SWWM_INTERTIP210 = "\"Life sometimes truly feels like a videogame.\"\n — Reubens C. Karnanaiahmani"; // intermission fanart SWWM_FANART = "Art: "; SWWM_NFANART = "28"; @@ -1157,8 +1126,6 @@ SWWM_FANART26 = "Marisa15.jpg"; SWWM_FANART27 = "Marisa16.jpg"; SWWM_FANART28 = "Marisa17.jpg"; // achievements -SWWM_ACHIEVEMENT_ACID_TAG = "Fizzy Goodness"; -SWWM_ACHIEVEMENT_ACID_TXT = "Melt %s enemies with Telebrium Flechettes"; SWWM_ACHIEVEMENT_ALLCOLL_TAG = "The Full Set"; SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtain all collectibles in a single save"; SWWM_ACHIEVEMENT_ALLITEMS_TAG = "Collector"; @@ -1312,8 +1279,6 @@ SWWM_ACHIEVEMENT_REFRESH_TAG = "Stay Fresh"; SWWM_ACHIEVEMENT_REFRESH_TXT = "Use %s Refreshers"; SWWM_ACHIEVEMENT_ROAST_TAG = "Gravely Roast"; SWWM_ACHIEVEMENT_ROAST_TXT = "Perform %s bayonet combos with the Quadravol"; -SWWM_ACHIEVEMENT_SALT_TAG = "Maximum Oversalt"; -SWWM_ACHIEVEMENT_SALT_TXT = "Shoot 25 Saltshot rounds simultaneously"; SWWM_ACHIEVEMENT_SANIC_TAG = "CHILLI DOGS"; SWWM_ACHIEVEMENT_SANIC_TXT = "Reach a top speed of %s kph"; SWWM_ACHIEVEMENT_SEKIRO_TAG = "Hesitation is Defeat"; @@ -1322,8 +1287,6 @@ SWWM_ACHIEVEMENT_SHAME_TAG = "Shameful"; SWWM_ACHIEVEMENT_SHAME_TXT = "Kill a boss solely by using the Deep Impact primary"; SWWM_ACHIEVEMENT_SHOCK_TAG = "Shockmaster"; SWWM_ACHIEVEMENT_SHOCK_TXT = "Perform %s Biospark combos"; -SWWM_ACHIEVEMENT_SLAYER_TAG = "I am Become Death"; -SWWM_ACHIEVEMENT_SLAYER_TXT = "Kill %s enemies with a single Slayer Warhead"; SWWM_ACHIEVEMENT_SLEMG_TAG = "The Sledge Method"; SWWM_ACHIEVEMENT_SLEMG_TXT = "Activate %s switches by punching them"; SWWM_ACHIEVEMENT_SNEAKY_TAG = "Sneaky Retreat"; diff --git a/language.def_lore b/language.def_lore index 9c03eeec7..b1b722591 100644 --- a/language.def_lore +++ b/language.def_lore @@ -1761,15 +1761,7 @@ SWWM_LORETXT_HELLBLAZER = "\cxClassification:\c-\n" "\cf Mini-Missile Launcher\c-\n" "\n" -"The \cfHellblazer\c- is the third incarnation of the \cfHellfire Cannon\c-, one of the many weapons that \cfImanaki Corp\c- had constructed based on their experiments with harnessing what they called \cfArdent Energy\c-, a power source from the depths of \cfHell\c- itself. It is a direct improvement of the Mark 2 model, the \cfHellrazer\c-, sporting burst-fire capabilities and a simple drum magazine system for easier reloads. It also features many more types of ammunition this time:\n" -"\n" -"\cf\"Blazer\" grenades:\c- The standard ammunition. Highly explosive despite their small size, thanks to the highly condensed Ardent Energy contained within.\n" -"\n" -"\cf\"Crackshot\" cluster grenades:\c- These burst into smaller grenades which will spread on impact, bouncing around for a short time before detonating.\n" -"\n" -"\cf\"Ravager\" incendiary grenades:\c- Ravagers release a wave of unrefined Ardent Energy on detonation, covering a very wide area around themselves. Quite useful in tight spaces, where this scorching hot plasma won't dissipate as quickly, thoroughly roasting any targets within. For safety reasons this ammunition type cannot be employed in burst-fire.\n" -"\n" -"\cf\"Slayer\" warheads:\c- A returning favorite from the previous series. These miniature nukes contain within themselves highly enriched Ardent Energy that will cause total devastation in a large radius, bringing swift death to even the highest ranked demons in Hell's armies. Cannot operate in burst-fire mode either.\n" +"The \cfHellblazer\c- is the third incarnation of the \cfHellfire Cannon\c-, one of the many weapons that \cfImanaki Corp\c- had constructed based on their experiments with harnessing what they called \cfArdent Energy\c-, a power source from the depths of \cfHell\c- itself. It is a direct improvement of the Mark 2 model, the \cfHellrazer\c-, sporting burst-fire capabilities and a simple drum magazine system for easier reloads. As its ammunition, it employs 25mm \"Blazer\" grenades, highly explosive despite their small size, due to the materials contained within.\n" "\n" "The Hellblazer was discontinued following the destruction of the Imanaki Corp headquarters in 2009, but the \cfTach-Engine Technology Institute\c- had managed to reproduce this weapon following their demise. Replicated models do not actually employ this \"Ardent Energy\" however, so they are not as destructive as they were meant to be. Rather, they are powered by the highly volatile \cfNokron\c-, one of the two exotic elements involved in the process of Microfusion, as its potential for use in explosives is quite notable.\n" "\n" @@ -1779,9 +1771,9 @@ SWWM_LORETXT_HELLBLAZER = "\n" "\cfSecondary Fire:\c- Lobs the loaded ammunition unarmed, as a bouncing grenade. Tap to fire one grenade, hold to preload up to 2 additional grenades (primary Fire cancels this process). Target seeking also affects grenades, as they will attempt to steer themselves towards the target on bounce.\n" "\n" -"\cfTertiary Fire:\c- Cycles the ammo type for the next reload.\n" +"\cfTertiary Fire:\c- Does nothing unless the weapon is locked for fire (see above).\n" "\n" -"\cfReloading:\c- During a reload, you may either refill the current mag (quite easy through the \cfHammerspace™\c- container), or swap it out for a different ammo type.\n" +"\cfReloading:\c- Refills the current magazine, quite easily through the \cfHammerspace™\c- container.\n" "\n" "\cfTechniques:\c- The grenades will automatically detonate on proximity to any hostile targets (unless explicitly seeking one), so you may still land the shot even if you merely grazed them. It is unclear how exactly they detect the targets, or know that they are hostile.\n" "\n" @@ -3794,9 +3786,9 @@ SWWM_LORETXT_SILVERBULLET = "\n" "\cfPrimary Fire:\c- Shoot the bullet. Any small targets hit by it are pretty much turned to paste. A second press after firing will chamber another round.\n" "\n" -"\cfSecondary Fire:\c- Tap to switch next reload between XSB and FCB ammunition, if available. Hold and then press primary fire to manually cock, allowing you to retrieve unfired rounds.\n" +"\cfSecondary Fire:\c- Hold and then press primary fire to manually cock, allowing you to retrieve unfired rounds. Hold and then press reload to reload, but using secondary ammunition if available.\n" "\n" -"\cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered.\n" +"\cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered. Note that if you only have secondary ammunition available, you must use the combo with secondary fire.\n" "\n" "\cfZoom:\c- Custom-tailored adjustable telescopic sight, up to 16x. Equipped with a soft foam covering to protect the user's face during scoped fire.\n" "\n" @@ -3850,36 +3842,22 @@ SWWM_LORETXT_SPREADGUN = "\n" "The \cfSpreadgun\c- is a simple single-shot shotgun with a rather unconventional reload mechanism. Unlike other weapons of the same fashion, the Spreadgun employs an odd variant of break action that \cfBlackmann Arms\c- has described as \"slide-action\", whereas rather than being hinged, the barrel slides horizontally at the press of two side buttons, with a small metal bit springing up and ejecting the loaded shell. After loading in another round, the user merely has to push the barrel back into its closed position. Some have doubts about the practicality of this operation, or its safety, but it's been guaranteed that the gun will not misfire no matter the force exerted to push the barrel back in.\n" "\n" -"The weapon is chambered for rather sizable 6ga shells, and there's an exclusive assortment of ammunition types it can use, all handled by Blackmann Arms themselves. They are as follows:\n" +"The weapon is chambered for rather sizable 6ga shells. The ideal load that you'll find on the field are #00 buckshot rounds. Do note that the spread caused by the shortness of the barrel may make it difficult to reach distant targets, but at close range it should be very effective.\n" "\n" -"\cfStandard Buckshot:\c- Red shells. Exactly what it says on the tin. The spread caused by the shortness of the barrel may make it difficult to reach distant targets, but at close range it should be very effective.\n" +"There is additionally an exclusive secondary load available, so-called \cfGolden Shells\c-, highly rare and expensive, with unmatched destructive power. Each round fires a sabot packing a high-grade, high-density \cfExplodium\c- charge, along with gold glitter (which is apparently just for show). Anything directly hit by it is guaranteed to be completely vaporized by the ensuing blast.\n" "\n" -"\cfMetal Slug:\c- Green shells. Very potent slugs that have a decent accuracy, even at longer ranges. Due to their size and weight, they can potentially penetrate multiple small targets.\n" -"\n" -"\cfKinylum Saltshot:\c- Teal shells. Small chunks of Kinylum in its natural \"salt\" form. Once shot, they leave a trail of boiling hot plasma that remains in the air for a few moments before finally dissipating. In addition, the chunks will explode violently on contact with any surface, or once they \"destabilize\" (which unfortunately makes this type of ammunition ineffective at longer distances).\n" -"\n" -"\cfLead Ball:\c- Purple shells. Coming from \cfPlutoni Incorporated\c-, these rounds shoot out a heavy ball of pure hurt. Despite the fact it's made of lead, it tends to keep its shape no matter how hard it hits something (some wonder if it actually IS made of lead, or if it's something else entirely). Having come out of such a place, it's no surprise that they also have some rather odd effects. It appears that, on certain occasions, the balls may emit odd sounds on impact, which in addition cause some form of potent shockwave around itself, increasing its speed in the process. This odd happening is listed as \"Random Crits\" in the store page.\n" -"\n" -"\cfTelebrium Flechettes:\c- Black shells. Dozens of piercing projectiles tipped with pure Telebrium, an exotic element known for its potent corrosive effects when heated. Targets hit by these projectiles will experience a very painful discharge of corrosive toxins through their bodies (even non-organic ones), although the effects of this will dissipate in a couple seconds. Use of this ammunition is highly restricted, but you have been granted permission to use it against the invading forces.\n" -"\n" -"\cfGolden Shell:\c- Gold-plated shells with a heavy metal body. A highly rare and expensive type of ammunition, with unmatched destructive power. Each round fires a sabot packing a high-grade, high-density \cfExplodium\c- charge, along with gold glitter (which is apparently just for show). Anything directly hit by it is guaranteed to be completely vaporized by the ensuing blast.\n" -"\n" -"The wide range of compatible ammunition types makes the Spreadgun a rather versatile weapon, once you look past its tedious manual reloading. There are however plans to make a much more comfortable semi-automatic, recoil operated variant of this weapon, with prototypes already being tested.\n" +"The Spreadgun can be a versatile weapon, once you look past its tedious manual reloading. Still, there are plans to make a much more comfortable semi-automatic, recoil operated variant of this weapon, with prototypes already being tested.\n" "\n" "\cfPrimary Fire:\c- Shoot the loaded shell.\n" "\n" -"\cfSecondary Fire:\c- Tap to select the next ammo type to be used on reload. Hold and then press primary fire to unload the current shell and leave the weapon empty.\n" +"\cfSecondary Fire:\c- Reloads with golden shells, if available. Note that if the currently loaded round was not spent, it will be returned to its ammo pool. Should there not be enough storage space for it, it will be dropped on the ground instead.\n" "\n" -"\cfReloading:\c- Unload the current shell and load a new one. If the loaded shell was not spent, it will be returned to its ammo pool. Should there not be enough storage space for it, it will be dropped on the ground instead.\n" +"\cfReloading:\c- Reloads with standard ammunition, if available. Same rules apply here.\n" "\n" "\cxSaya's Notes:\c-\n" -"\cfYeah, this shit looks impractical af, and I don't know how no one has shot a hole through their hand reloading the damn thing. BUT, it does let you use all sorts of fun ammo. You've got the typical bread and butter of shells there, and then there's... Literal radioactive rock salt, that explodes, yeah, amazing. But then you look at what's right after that and... yeah.\c-\n" +"\cfYeah, this shit looks impractical af, and I don't know how no one has shot a hole through their hand reloading the damn thing. BUT it's powerful as all fuck, what with the absolute girth of that caliber and all.\c-\n" "\n" -"\cfHermann-senpai redirected me to nerdboi for those black shells, because they were his idea. So, let me explain. Telebrium is... a war crime. Plain and simple. We can kind of get away with it, though, because it's just mindless beasts that you're throwing it at. Still makes me uneasy, but hey, we're not using it on people, unlike the actual cases where it WAS used on people (good god, the stories about that).\c-\n" -"\n" -"\cfAnyway, enough about crimes, let's talk about the purple bois. So these things are a serious crime, and THOSE TWO had to be involved of course. I'm pretty sure those things are NOT made of lead. This looks like that weird metal they work with, that I swear to fuck I can't even pronounce the name of. And it has... yes, RANDOM CRITS. Therein lies the crime, Demo-chan. Can't believe we've got that shit going on now. I absolutely lost it when I first saw it in action, and I'm sure you will, too.\c-\n" -"\n" -"\cfLastly there's those golden bois. We can't buy them ourselves, so nerdo made another of his nerdy deals and said that he might reward you every now and then with one for eliminating \"high level targets\" or something like that. Can't wait to see what that shit is like, a fucking... golden shower of pain.\c-\n" +"\cfAlso, there's the whole thing of those golden bois. We can't buy them ourselves, so nerdo made another of his nerdy deals and said that he might reward you every now and then with one for eliminating \"high level targets\" or something like that. Can't wait to see what that shit is like, a fucking... golden shower of pain.\c-\n" "\n" "\cf*cough*\c-\n" "\n" @@ -4213,17 +4191,7 @@ SWWM_LORETXT_WALLBUSTER = "\n" "The internal mechanisms driving this weapon have such a degree of complexity that they've been described as \cf\"Kraut Deep Space Magic\"\c- by some. Only \cfHermann E. Ischer\c- himself knows every detail about their operation. With each twist of the main trigger, the topmost barrel is primed, and then its cylinder spins counter-clockwise, with the next round ready for shooting. On a complete rotation, or when the secondary trigger is used, the main body spins afterwards, switching to another cylinder.\n" "\n" -"The Wallbuster is compatible with most types of 6ga shells distributed by Blackmann, although there are safety restrictions on some, namely flechettes and golden shells. This limits the range of ammunition usable to only these four types:\n" -"\n" -"\cfStandard Buckshot:\c- Red shells. Exactly what it says on the tin. Quite lethal at short range, and with some extra reach due to the length of the weapon's barrels.\n" -"\n" -"\cfMetal Slug:\c- Green shells. Very potent slugs that have a decent accuracy, even at longer ranges. Due to their size and weight, they can potentially penetrate multiple small targets.\n" -"\n" -"\cfKinylum Saltshot:\c- Teal shells. Small chunks of Kinylum in its natural \"salt\" form. Once shot, they leave a trail of boiling hot plasma that remains in the air for a few moments before finally dissipating. In addition, the chunks will explode violently on contact with any surface, or once they \"destabilize\" (which unfortunately makes this type of ammunition ineffective at longer distances).\n" -"\n" -"\cfLead Ball:\c- Purple shells. Coming from \cfPlutoni Incorporated\c-, these rounds shoot out a heavy ball of pure hurt. Despite the fact it's made of lead, it tends to keep its shape no matter how hard it hits something (some wonder if it actually IS made of lead, or if it's something else entirely). Having come out of such a place, it's no surprise that they also have some rather odd effects. It appears that, on certain occasions, the balls may emit odd sounds on impact, which in addition cause some form of potent shockwave around itself, increasing its speed in the process. This odd happening is listed as \"Random Crits\" in the store page.\n" -"\n" -"Despite this limitation, with just these four types one can make of the Wallbuster a quite mighty companion. Especially taking into account the semi-automatic nature of the weapon, allowing for a quick succession of shots or even shooting multiple shells simultaneously.\n" +"Taking into account the semi-automatic nature of the weapon, allowing for a quick succession of shots or even shooting multiple shells simultaneously, the Wallbuster is a quite mighty companion.\n" "\n" "\cfPrimary Fire:\c- Shoots the topmost barrel.\n" "\n" @@ -4231,14 +4199,14 @@ SWWM_LORETXT_WALLBUSTER = "\n" "\cfTertiary Fire:\c- Shoots it all, if you really want to.\n" "\n" -"\cfReloading:\c- Once the side lever is pulled down, the cylinders can be safely detached and reloaded individually. For reloading on the go, it's recommended to have a \cfMagnetic Utility Belt\c- or similar at hand, as it will make this operation easier. Speed loaders are available for purchase from the Blackmann Arms website, or from authorized distributors. Clever operators might also choose to carry spare pre-loaded cylinders.\n" +"\cfReloading:\c- Once the side lever is pulled down, the cylinders can be safely detached and reloaded individually. A rapid reload routine will execute that automatically makes you top up the gun as much as possible. You can cancel this at any moment by pressing reload again or either fire button.\n" "\n" "\cfTechniques:\c- True to its name, you can destroy all sorts of obstacles along the way, provided you're dealing enough damage relative to their size (requiring secondary or tertiary fire). This even includes locked doors, so you won't have to bother with key hunting anymore.\n" "\n" "\cxSaya's Notes:\c-\n" "\cfOK so, this ballbusting hunk of metal. Yeah, now ain't that some good shit...\c-\n" "\n" -"\cfDon't worry about reloading this taking a long-ass time, btw. DemolitionOS comes with a quick reload routine that'll make it much easier for you. The ammo will be queued up in your Hammerspace, and then all you have to do is hold out your hand above the barrels, and they'll get deployed right inside. Nifty, huh? Taro did most of the work on that, so yeah, you can thank him. PS: I don't recommend you to use the auto-reload function, it's a bit shoddily programmed and it's not very smart with how it picks ammo. I guess in an emergency it's OK since it's really fast, though.\c-\n" +"\cfDon't worry about reloading this taking a long-ass time, btw. DemolitionOS comes with a quick reload routine that'll make it nice and easy for you. The ammo will be queued up in your Hammerspace, and then all you have to do is hold out your hand above the barrels, and they'll get deployed right inside, takes around 10 seconds to top it up, more or less. Nifty, huh? Taro did most of the work on that, so yeah, you can thank him.\c-\n" "\n" "\cfOh and... y'know... this whole thing, that name and all, kinda makes me think of grandma a bit. I mean, if you change the first letter... Oh, do you hear those drums and that guitar? 'cause I sure do...\c-\n" "\n" diff --git a/language.def_menu b/language.def_menu index 82e58c244..588bcdbae 100644 --- a/language.def_menu +++ b/language.def_menu @@ -57,7 +57,6 @@ SWWM_NONE = "None"; SWWM_INTERART = "Intermission Art"; SWWM_NORENDER = "Yes (Fanart Only)"; SWWM_NOFANART = "Yes (Renders Only)"; -SWWM_BALLUSE = "Lead Balls can Activate Switches"; SWWM_BTITLE = "Balance Options"; SWWM_BLOOD = "Enable Custom Blood"; SWWM_FUZZ = "Enable Animated Menu BG"; @@ -221,7 +220,6 @@ TOOLTIP_SWWM_SHADERS = "Use postprocess shaders for things like powerups and the TOOLTIP_SWWM_REVIVE = "Allows the player to get back up after dying by pressing Fire. Has a configurable cooldown."; TOOLTIP_SWWM_REVIVECOOLDOWN = "Time in seconds of downtime after using a reboot, where if you die again, you can't get back up. Set to 0 to allow unlimited reboots. Alternatively, you can also set it to only allow one reboot per map (enforced on expert difficulties)."; TOOLTIP_SWWM_INTERART = "If enabled, displays randomly selected fanart and official renders during intermissions. There are extra options to only show each category."; -TOOLTIP_SWWM_BALLUSE = "Lead Ball projectiles can remotely activate use switches (excluding exits). Potentially OP."; TOOLTIP_SWWM_BLOOD = "Enable custom blood and gore effects, adapted from Soundless Mound. I'd honestly recommend Nashgore instead, it's better."; TOOLTIP_SWWM_FUZZ = "Toggling this off is recommended if you're recording/streaming as this effect can harm video quality."; TOOLTIP_SWWM_CBTALL = "Allows the Wallbuster and other weapons capable of map geometry destruction to break pretty much anything, not just doors and platforms. Note that this can break some maps, which is why this option is here."; @@ -534,19 +532,6 @@ SWWM_HELPTXT = SWWM_GAMETAB = "Games"; SWWM_PICKGAME = "Choose a game"; SWWM_GAMETITLE_MADCATGAME = "Boot Test"; -// Wallbuster menu -SWWM_BUSTERTITLE = "Wallbuster - Easy Reload Menu"; -SWWM_BUSTERKEYS = -"\cfLeft, Right:\c- Select Ammo Type\n" -"\cfDown:\c- Add Ammo\n" -"\cfUp:\c- Remove Ammo\n" -"\cfPage Down:\c- Add 5 Ammo\n" -"\cfPage Up:\c- Remove 5 Ammo\n" -"\cfBackspace:\c- Clear Ammo\n" -"\cfEnter:\c- Initiate Reload\n" -"\cfEnter (if empty):\c- Auto Reload\n" -"\cfDelete:\c- Full Unload\n" -"\cfEsc:\c- Cancel Reload\n"; // Help menu SWWM_HELP_STORY = "The Story So Far"; SWWM_HELP_STORYDOOM = diff --git a/language.es_base b/language.es_base index 8282e3399..4f9aed94b 100644 --- a/language.es_base +++ b/language.es_base @@ -29,14 +29,6 @@ I_NEWSPARKSTER = "Rifle Sparkster Serie x3"; T_MORTALRIFLE = "Rifle Mortal"; T_REDSHELL = "Cartucho"; T_REDSHELLS = "Cartuchos"; -T_GREENSHELL = "Slug"; -T_GREENSHELLS = "Slugs"; -T_BLUESHELL = "Cartucho de Sal de Kinylum"; -T_BLUESHELLS = "Cartuchos de Sal de Kinylum"; -T_BLACKSHELL = "Cartucho Corrosivo"; -T_BLACKSHELLS = "Cartuchos Corrosivos"; -T_PURPLESHELL = "Cartucho de Bola de Plomo"; -T_PURPLESHELLS = "Cartuchos de Bola de Plomo"; T_GOLDSHELL = "Cartucho Dorado"; T_GOLDSHELLS = "Cartuchos Dorados"; T_EVISHELL = "Proyectil de Eviscerator"; @@ -46,16 +38,6 @@ I_EVISHELLCLIP3 = "Clip en Trio para Eviscerator"; I_EVISHELLPAK = "Pack de Seis para Eviscerator"; T_HELLMISSILE = "Misil Hellblazer"; T_HELLMISSILES = "Misiles Hellblazer"; -T_HELLMISSILEMAG = "Cargador de Misiles Hellblazer"; -T_HELLCLUSTER = "Estallador Hellblazer"; -T_HELLCLUSTERS = "Estalladores Hellblazer"; -T_HELLCLUSTERMAG = "Cargador de Estalladores Hellblazer"; -T_HELLBURNINATOR = "Ruinador Hellblazer"; -T_HELLBURNINATORS = "Ruinadores Hellblazer"; -T_HELLBURNINATORMAG = "Cargador de Ruinadores Hellblazer"; -T_HELLNUKE = "Cabeza Nuclear Hellblazer"; -T_HELLNUKES = "Cabezas Nucleares Hellblazer"; -T_HELLNUKEMAG = "Cargador de Cabezas Nucleares Hellblazer"; T_SPARKUNIT = "Unidad Biospark"; T_SPARKUNITS = "Unidades Biospark"; T_XSBMAG = "Cargador 1.150 XSB"; @@ -381,17 +363,9 @@ FN_ELITEZOMBIE_FUN3 = "Rubiales"; O_DEEPIMPACT = "%o fue impactad@[ao_esp] profundamente por %k."; O_DEEPIMPACT_WEAK = "%k tosió en la dirección general de %o."; O_EXPLODIUM = "%k infligió explosiones de rodilla severas a %o."; -O_SPREADGUN_RED = "%k le dio a %o un bocado de perdigones."; -O_SPREADGUN_GREEN = "%o fue sluggead@[ao_esp] por %k."; -O_SPREADGUN_BLUE = "%k puso a %o muy salad@[ao_esp]."; -O_SPREADGUN_BLACK = "%o recibió un trato muy puntiagudo de %k."; -O_SPREADGUN_BLACK_DEBUFF = "%k dejó a %o hech@[ao_esp] un desastre corroído."; -O_SPREADGUN_PURPLE = "A %o le salió un chichón con la bola de plomo de %k."; +O_SPREADGUN = "%k le dio a %o un bocado de perdigones."; O_SPREADGUN_GOLD = "%o se tragó la explosión dorada de %k."; -O_WALLBUSTER_RED = "%k ha destrozado a %o pero bien."; -O_WALLBUSTER_GREEN = "%k convirtió a %o en rosquilla."; -O_WALLBUSTER_BLUE = "%k puso a %o muy MUY salad@[ao_esp]."; -O_WALLBUSTER_PURPLE = "%k infligió una tortura de bolas de plomo a %o."; +O_WALLBUSTER = "%k ha destrozado a %o pero bien."; O_EVISCERATOR = "%o fue descuartizad@[ao_esp] por %k."; O_HELLBLAZER = "%k reventó a %o en cachitos humeantes."; O_SPARKSTER = "%o fue bien chispead@[ao_esp] por %k."; @@ -430,6 +404,8 @@ O_MASHIRO4 = "%o desapareció misteriosamente."; O_MASHIRO5 = "%o enfureció a la polilla equivocada."; O_ENDLEVEL = "%o tuvo un peculiar contratiempo relacionado con el teletransporte."; O_MYKRADVO = "%o no pudo esconderse de la ira vengativa de %k."; +O_LEADBALL = "A %o le salió un chichón con la bola de plomo de %k."; +O_SALTSHOT = "%k puso a %o muy salad@[ao_esp]."; // edited vanilla obituaries OB_SUICIDE = "%o se hizo un sudoku."; OB_FALLING = "%o se partió las patas."; @@ -624,9 +600,8 @@ TT_EXPLODIUM2 = "\cfRecarga:\c- Recargar arma(s)."; TT_SPREADGUN = "\cfPrimario:\c- Disparar arma.\n" -"\cfSecundario:\c- Seleccionar munición.\n" -"\cfRecarga:\c- Recargar / cambiar munición.\n" -"\cfSecundario+Primario:\c- Descargar munición."; +"\cfSecundario:\c- Recargar munición especial.\n" +"\cfRecarga:\c- Recargar arma."; TT_WALLBUSTER = "\cfPrimario:\c- Disparar un cañón.\n" "\cfSecundario:\c- Disparar un cilindro.\n" @@ -639,8 +614,7 @@ TT_EVISCERATOR = TT_HELLBLAZER = "\cfPrimario:\c- Cargar / disparar cohetes.\n" "\cfSecundario:\c- Cargar / disparar granadas.\n" -"\cfZoom:\c- Seleccionar munición.\n" -"\cfRecarga:\c- Recargar / cambiar munición.\n" +"\cfRecarga:\c- Recargar arma.\n" "\cx(Más controles en la biblioteca)\c-"; TT_SPARKSTER = "\cfPrimario:\c- Disparo de orbe.\n" @@ -649,10 +623,10 @@ TT_SPARKSTER = "\cfRecarga:\c- Recarga / doble carga."; TT_SILVERBULLET = "\cfPrimario:\c- Disparar arma.\n" -"\cfSecundario:\c- Seleccionar munición.\n" "\cfZoom:\c- Usar mira.\n" -"\cfRecarga:\c- Recargar / cambiar munición.\n" -"\cfSecundario+Primario:\c- Accionar perno manualmente."; +"\cfRecarga:\c- Recargar arma.\n" +"\cfSecundario+Primario:\c- Accionar perno manualmente.\n" +"\cfSecundario+Recarga:\c- Recargar munición especial."; TT_CANDYGUN = "\cfPrimario:\c- Disparar arma.\n" "\cfSecundario:\c- Lanzar cargador.\n" @@ -825,7 +799,7 @@ SWWM_INTERTIP23 = "¿Sabías que Saya realmente odia la UAC?\n\n¿Que? ¿Ya sab SWWM_INTERTIP24 = "Puedes embestir contra enemigos para empujarlos fuera de tu camino. Los más débiles puede que mueran inmediatamente por el impacto y salgan volando."; SWWM_INTERTIP25 = "Si haces una embestida en el aire apuntando directamente al suelo, puede que aterrices con la fuerza suficiente para causar una onda de choque, apartando a la mayoría de enemigos a tu alrededor."; SWWM_INTERTIP26 = "Puedes activar objetos y abrir puertas a puñetazos. Esto también se puede hacer con la munición de Bola de Plomo del Trabuco, a excepción de los botones de salida."; -SWWM_INTERTIP27 = "Los efectos corrosivos de los Cartuchos Negros del Trabuco pueden acoplarse, hasta un grado letal si alcanzas un objetivo de lleno. Además de eso, otros objetivos cercanos puede que también noten cierto dolor extra de los humos nocivos que se desprenderán, y dispersen sus efectos incluso más allá."; +SWWM_INTERTIP27 = "El Trabuco puede ser complicado de usar, per compensa al ser mucho más destructivo que una escopeta típica."; SWWM_INTERTIP28 = "La Demolicionista pesa demasiado para nadar y se hundirá rápidamente. Pero no te preocupes, los jets propulsores también funcionan bajo el agua."; SWWM_INTERTIP29 = "El amor es lo más poderoso que existe en el mundo. No odies a los que son diferentes. Todos debemos permanecer unidos."; SWWM_INTERTIP30 = "El Silver Bullet dispara con una fuerza tal que sus balas liberan ondas de choque al atravesar el aire (y los enemigos), causando daño adicional. También puede atravesar algunas paredes."; @@ -835,7 +809,7 @@ SWWM_INTERTIP33 = "Si puedes alinearte correctamente, embestir hacia atrás har SWWM_INTERTIP34 = "Bajo los efectos de un Ragekit, tu daño al embestir será amplificado hasta un nivel tal que puedes incluso atravesar limpiamente puertas y otros obstáculos por el camino."; SWWM_INTERTIP35 = "Vivimos en un mundo en el que muchos somos discriminados por nuestra propia identidad. Es una triste realidad, y algo que no hemos elegido. Más triste es sin embargo la existencia de aquellos que nos odian."; SWWM_INTERTIP36 = "El color favorito de Demo-chan es el verde."; -SWWM_INTERTIP37 = "Los perdigones de sal de Kinylum son suficientemente potentes como para atravesar la invulnerabilidad de algunos enemigos. Esto es también cierto para todas las armas del puesto 7 en adelante."; +SWWM_INTERTIP37 = "Todas las armas del puesto 7 en adelante son capaces de dañar enemigos normalmente invulnerables."; SWWM_INTERTIP38 = "Aunque no te interese leer el lore, sigue siendo útil comprobar las entradas de armas y otros ítems para aprender más sobre su uso. Por supuesto, también puedes simplemente experimentar por tu cuenta."; SWWM_INTERTIP39 = "Si notas bajones cuando hay muchos efectos de sonido activos, se recomienda desactivar el HRTF en las opciones de OpenAL, si está activado."; SWWM_INTERTIP40 = "El Sensor de Ítems puede ayudar a detectar ítems que de otro modo serían difíciles de ver entre el caos de pilas de cuerpos tras una batalla. ¡Con una Omnivisión, puedes incluso ver donde hay ítems a través de las paredes!"; @@ -902,9 +876,9 @@ SWWM_INTERTIP103 = "Los sándwiches de queso a la plancha están realmente bueno SWWM_INTERTIP104 = "Puedes interactuar con ítems coleccionables desde la pestaña Llavero de tu Menú de Demolicionista. Ya sabes, por si te apetece jugar un poco con ellos."; SWWM_INTERTIP105 = "A las polillas les gustan las lámparas."; SWWM_INTERTIP106 = "No, cubrirte de aceite no te permitirá volar cuando llueve."; -SWWM_INTERTIP107 = "Las bolas de plomo pueden hacer críticos random. Por favor no me hagáis daño, jugadores de TF2."; +SWWM_INTERTIP107 = "\"No sabía que hubieran metido a Shakespeare en los comics.\"\n — Demo Miyamoto"; SWWM_INTERTIP108 = "Este mod puede contener horny, en pequeñas cantidades."; -SWWM_INTERTIP109 = "¿Sabías que el Hellblazer puede mostrar el estado de su cargador cuando está colocado en el mundo? No es algo realmente muy importante, pero me enorgullezco de mi obsesiva atención al detalle."; +SWWM_INTERTIP109 = "Los misiles del Hellblazer no solo causan daño directo al explotar, si no que también liberan una onda expansiva de calor abrasador."; SWWM_INTERTIP110 = "Si no lo sabías ya, el mod puede ser usado también con Heretic y Hexen. Cosas nuevas serán desbloqueadas en cada uno, a medida que progresa la historia principal del mod."; SWWM_INTERTIP111 = "El shitposting irónico sigue siendo shitposting."; SWWM_INTERTIP112 = "No hay autobuses en Gensokyo."; @@ -979,14 +953,14 @@ SWWM_INTERTIP180 = "¿Te hartan las salidas de muerte? Entonces estás de suerte SWWM_INTERTIP181 = "A diferencia de las granadas rápidas, el fuego secundario de la Pistola de Explodium rebota en las paredes, permitiéndote alcanzar objetivos a la vuelta de la esquina."; SWWM_INTERTIP182 = "La Ametralladora Sheen incendia el aire al paso de cada bala, solo con la altísima presión de la munición que usa."; SWWM_INTERTIP183 = "Los poco comunes cartuchos dorados te permiten causar destrucción extrema en un radio amplio. Eso sí, ten cuidado de no estar demasiado cerca."; -SWWM_INTERTIP184 = "Ten cuidado con tus bolas de plomo. Podrían rebotar y darte en la cara y eso duele mucho."; +SWWM_INTERTIP184 = "\"La vida a veces parece ciertamente ser como un videojuego.\"\n — Reubens C. Karnanaiahmani"; SWWM_INTERTIP185 = "Una vez incendiado por la Quadravol, la solución más rápida es sacudirse fuera las llamas. Una pena que tus enemigos no sean tan listos como para saber eso."; SWWM_INTERTIP186 = "De alguna forma, la Quadravol puede usarse bajo el agua. Uno solo puede preguntarse de qué están hechas esas bolas de fuego."; SWWM_INTERTIP187 = "El fuego alternativo de la Ray-Khom es letal en contacto con el agua. Intenta aplicar el sentido común con esta información."; SWWM_INTERTIP188 = "La Rafan-Kos puede preparar un delicioso asado de ciberdemonio en cuestión de segundos."; SWWM_INTERTIP189 = "El Rifle Mortal supuestamente usa \"munición mutante\", sea lo que sea que signifique eso."; -SWWM_INTERTIP190 = "Las cabezas nucleares de Hellblazer tuestan todo muy bien a medida que crece su onda expansiva. Toma Redención, capullo."; -SWWM_INTERTIP191 = "Los ruinadores de Hellblazer son más efectivos en espacios cerrados, ya que esto mantiene bien contenido todo el plasma ardiente."; +SWWM_INTERTIP190 = "Los demonios suelen ser muy competitivos, así que el fuego amigo puede volverlos fácilmente los unos contra los otros."; +SWWM_INTERTIP191 = "La Wallbuster tarda un poco en recargarse completamente, pero una vez quede todo hecho, tendrás una escopeta mucho más rápida en tus manos."; SWWM_INTERTIP192 = "La Demolicionista puede interactuar directamente con el Hellblazer para marcar objetivos de búsqueda. Esto funciona hasta con las granadas."; SWWM_INTERTIP193 = "La Quadravol se puede usar con una sola mano. Esto no ofrece ninguna ventaja táctica, pero puedes voltearla lo cual mola mucho, y eso es lo que importa."; SWWM_INTERTIP194 = "Las armas Xekkian son muy grandes, pero también lo es la gente que las usa."; @@ -1003,14 +977,9 @@ SWWM_INTERTIP204 = "No tengas miedo de experimentar con estilos de juego diferen SWWM_INTERTIP205 = "La Ametralladora Sheen tiene un retroceso tan intenso que dada suficiente velocidad de disparo, se puede usar para planear mientras se dispara hacia abajo."; SWWM_INTERTIP206 = "El salto de cohete con la Quadravol es perfectamente seguro. Puedes confiar en mi, soy un consejo útil al fin y al cabo."; SWWM_INTERTIP207 = "Las tres opciones de velocidad de la Ametralladora Sheen permiten un balance óptimo entre conservar munición y pura potencia de daño."; -SWWM_INTERTIP208 = "La Wallbuster es un arma que requiere de cierta planificación previa para maximizar su utilidad. Asegúrate de que la hayas cargado bien antes de enfrentarte al enemigo."; -SWWM_INTERTIP209 = "Los demonios suelen ser muy competitivos, así que el fuego amigo puede volverlos fácilmente los unos contra los otros."; -SWWM_INTERTIP210 = "\"La vida a veces parece ciertamente ser como un videojuego.\"\n — Reubens C. Karnanaiahmani"; // intermission fanart SWWM_FANART = "Arte: "; // achievements -SWWM_ACHIEVEMENT_ACID_TAG = "La Buena Efervescencia"; -SWWM_ACHIEVEMENT_ACID_TXT = "Derrite %s enemigos con Flechettes de Telebrium"; SWWM_ACHIEVEMENT_ALLCOLL_TAG = "El Set Completo"; SWWM_ACHIEVEMENT_ALLCOLL_TXT = "Obtén todos los coleccionables en una sola partida"; SWWM_ACHIEVEMENT_ALLITEMS_TAG = "Recolector"; @@ -1159,8 +1128,6 @@ SWWM_ACHIEVEMENT_REFRESH_TAG = "Siempre Fresco"; SWWM_ACHIEVEMENT_REFRESH_TXT = "Usa %s Refrescadores"; SWWM_ACHIEVEMENT_ROAST_TAG = "Ensarta en los Fuegos del Hades"; SWWM_ACHIEVEMENT_ROAST_TXT = "Realiza %s combos de bayoneta con la Quadravol"; -SWWM_ACHIEVEMENT_SALT_TAG = "Sobresalado Máximo"; -SWWM_ACHIEVEMENT_SALT_TXT = "Dispara 25 cartuchos de sal al mismo tiempo"; SWWM_ACHIEVEMENT_SANIC_TAG = "PERRITOS DE CHILE"; SWWM_ACHIEVEMENT_SANIC_TXT = "Alcanza una velocidad punta de %s km/h"; SWWM_ACHIEVEMENT_SEKIRO_TAG = "Dudar es Fracasar"; @@ -1168,8 +1135,6 @@ SWWM_ACHIEVEMENT_SEKIRO_TXT = "Muere y reinicia dos veces en el mismo mapa"; SWWM_ACHIEVEMENT_SHAME_TAG = "Vergonzoso"; SWWM_ACHIEVEMENT_SHAME_TXT = "Mata un boss usando solo el modo primario de la Deep Impact"; SWWM_ACHIEVEMENT_SHOCK_TXT = "Realiza %s combos de Biospark"; -SWWM_ACHIEVEMENT_SLAYER_TAG = "Me he Convertido en Muerte"; -SWWM_ACHIEVEMENT_SLAYER_TXT = "Mata %s enemigos con una sola Cabeza Nuclear Slayer"; SWWM_ACHIEVEMENT_SLEMG_TAG = "El Método Sledge"; SWWM_ACHIEVEMENT_SLEMG_TXT = "Activa %s interruptores a puñetazos"; SWWM_ACHIEVEMENT_SNEAKY_TAG = "Retiro Furtivo"; diff --git a/language.es_lore b/language.es_lore index 87d794273..db0f01d9b 100644 --- a/language.es_lore +++ b/language.es_lore @@ -1644,15 +1644,7 @@ SWWM_LORETXT_HELLBLAZER = "\cxClasificación:\c-\n" "\cf Lanzador de Minimisiles\c-\n" "\n" -"El \cfHellblazer\c- es la tercera encarnación del \cfCañón de Fuego Infernal\c-, una de las muchas armas que \cfImanaki Corp\c- había construido basándose en sus experimentos explotando lo que llamaron \cfEnergía Ardiente\c-, una fuente de poder de las profundidades del mismo \cfInfierno\c-. Es una mejora directa del modelo Mark 2, el \cfHellrazer\c-, poseyendo capacidades de fuego en ráfaga y un simple sistema de cargador en barril para facilitar recargas. También posee más tipos de munición esta vez:\n" -"\n" -"\cfGranadas \"Blazer\":\c- La munición estándar. Altamente explosivas a pesar de su diminuto tamaño, gracias a la Energía Ardiente superconcentrada que contienen.\n" -"\n" -"\cfGranadas en clúster \"Crackshot\":\c- Éstas explotan en granadas más pequeñas que se dispersan en el impacto, rebotando durante un tiempo antes de detonar.\n" -"\n" -"\cfGranadas incendiarias \"Ravager\":\c- Las Ravagers liberan una onda de Energía Ardiente sin refinar cuando detonan, cubriendo una zona amplia a su alrededor. Muy útiles en espacios cerrados, donde su plasma abrasador no se disipará tan fácilmente, tostando a conciencia todos los objetivos encontrados. Por razones de seguridad este tipo de munición no se puede usar en ráfaga.\n" -"\n" -"\cfCabezas nucleares \"Slayer\":\c- Un favorito de la anterior serie. Estas bombas nucleares en miniatura contienen en su interior Energía Ardiente altamente enriquecida que causará una devastación total en un radio masivo, causando la muerte segura de incluso los demonios de mayor rango en los ejércitos del Infierno. Tampoco pueden usarse en ráfaga.\n" +"El \cfHellblazer\c- es la tercera encarnación del \cfCañón de Fuego Infernal\c-, una de las muchas armas que \cfImanaki Corp\c- había construido basándose en sus experimentos explotando lo que llamaron \cfEnergía Ardiente\c-, una fuente de poder de las profundidades del mismo \cfInfierno\c-. Es una mejora directa del modelo Mark 2, el \cfHellrazer\c-, poseyendo capacidades de fuego en ráfaga y un simple sistema de cargador en barril para facilitar recargas. Como munición, emplea granadas de 25mm \"Blazer\", altamente explosivas a pesar de su diminuto tamaño, debido a los materiales que contiene.\n" "\n" "El Hellblazer fue descontinuado tras la destrucción de las oficinas de Imanaki Corp en 2009, pero el \cfInstituto Tecnológico Tach-Engine\c- ha conseguido reproducir el arma tras su caída. Sin embargo, los modelos replicados no emplean esta \"Energía Ardiente\", así que no son tan destructivos como debían ser. En su lugar, usan el altamente volátil \cfNokron\c-, uno de los dos elementos exóticos empleados en el proceso de Microfusión, ya que su potencial para el uso en explosivos es bastante notable.\n" "\n" @@ -1662,9 +1654,9 @@ SWWM_LORETXT_HELLBLAZER = "\n" "\cfFuego Secundario:\c- Lanza la munición cargada sin armar, como una granada. Pulsa para disparar una granada, mantén para precargar 2 granadas adicionales (el fuego primario cancela este proceso). La búsqueda de objetivos también afecta a las granadas, ya que intentarán guiarse hacia el objetivo con cada rebote.\n" "\n" -"\cfFuego Terciario:\c- Alterna entre las municiones a usar en la próxima recarga.\n" +"\cfFuego Terciario:\c- No hace nada a menos que el arma esté bloqueada para el tiro (ver arriba).\n" "\n" -"\cfRecarga:\c- Durante una recarga, puedes o bien rellenar el cargador actual (fácil a través del contenedor de \cfHammerspace™\c-), o cambiarlo por otro tipo de munición.\n" +"\cfRecarga:\c- Rellena el cargador actual, bastante fácil a través del contenedor de \cfHammerspace™\c-.\n" "\n" "\cfTécnicas:\c- Las granadas detonan automáticamente en proximidad a objetivos hostiles, así que todavía puedes alcanzar ese disparo aunque solo los hayas rozado. No está muy claro como detectan los objetivos, o como saben que son hostiles.\n" "\n" @@ -3530,9 +3522,9 @@ SWWM_LORETXT_SILVERBULLET = "\n" "\cfFuego Primario:\c- Dispara la bala. Cualquier objetivo alcanzado por ella queda hecho papilla. Un segundo pulsado tras disparar cargará otra bala.\n" "\n" -"\cfFuego Secundario:\c- Pulsa para alternar entre balas XSB y FCB para la siguiente recarga, si están disponibles. Mantén y luego pulsa fuego primario para accionar el perno manualmente, permitiéndote recuperar balas sin usar.\n" +"\cfFuego Secundario:\c- Mantén y luego pulsa fuego primario para accionar el perno manualmente, permitiéndote recuperar balas sin usar. Mantén y luego pulsa recarga para recargar, pero usando munición secundaria si está disponible.\n" "\n" -"\cfRecarga:\c- Recarga el arma. Cada cargador tiene 5 balas. Se puede mantener también una bala extra en la recámara.\n" +"\cfRecarga:\c- Recarga el arma. Cada cargador tiene 5 balas. Se puede mantener también una bala extra en la recámara. Ten en cuenta que si solo tienes munición secundaria, deberás usar la combinación de fuego secundario.\n" "\n" "\cfZoom:\c- Mira telescópica hecha a medida, hasta 16 aumentos. Equipada con una cubierta de espuma suave para proteger la cara del usuario durante el disparo con mira.\n" "\n" @@ -3582,36 +3574,22 @@ SWWM_LORETXT_SPREADGUN = "\n" "El \cfTrabuco\c- es una simple escopeta de un disparo con un mecanismo de recarga poco convencional. A diferencia de otras armas del mismo tipo, el Trabuco emplea una variante extraña del cañón basculante que \cfBlackmann Arms\c- ha descrito como \"cañón deslizante\", por la cual en lugar de usar una bisagra, el cañón se desliza horizontalmente al pulsar dos botones laterales, con una pequeña pieza metálica saltando y eyectando el cartucho cargado. Tras cargar el siguiente cartucho, el usuario simplemente tiene que empujar el cañón a su posición inicial. Algunos tienen dudas sobre la factibilidad de esta operación, o de su seguridad, pero han garantizado que el arma no disparará accidentalmente no importa la fuerza ejercida empujando de vuelta el cañón.\n" "\n" -"El arma emplea el ciertamente grande calibre 6, y hay un surtido exclusivo de munición que puede usar, todo manejado por Blackmann. Siendo estos:\n" +"El arma emplea el ciertamente grande calibre 6. La carga ideal que encontrarás en el campo son cartuchos de perdigones #00. Ten en cuenta que la dispersión causada por la poca longitud del cañón puede que dificulte alcanzar objetivos lejanos, pero a un rango más corto debería ser más efectivo.\n" "\n" -"\cfPerdigones Estándar:\c- Cartuchos rojos. Exactamente lo que pone. La dispersión causada por la poca longitud del cañón puede que dificulte alcanzar objetivos lejanos, pero a un rango más corto debería ser más efectivo.\n" +"También hay adicionalmente una carga secundaria exclusive, los llamados \cfCartuchos Dorados\c-, caros y muy poco comunes, con un poder destructor sin par. Cada cartucho dispara un proyectil que contiene una carga de \cfExplodium\c- de alta densidad y pureza, junto con brillantina dorada (que es aparentemente solo para quedar bonito). Se garantiza que cualquier cosa que reciba un impacto directo será vaporizada completamente por la explosión resultante.\n" "\n" -"\cfSlug Metálico:\c- Cartuchos verdes. Slugs muy potentes con una puntería decente, incluso en distancias largas. Dado su tamaño y peso, tienen el potencial de penetrar varios objetivos pequeños.\n" -"\n" -"\cfSal de Kinylum:\c- Cartuchos cian. Pequeños trozos de Kinylum en su forma natural de \"sal\". Ya disparados, dejan un rastro de plasma ardiente que permanece en el aire durante unos momentos hasta disiparse. Adicionalmente, los trozos explotarán violentamente en contacto con cualquier superficie, o una vez se \"desestabilicen\" (lo cual desafortunadamente hace que este tipo de munición pierda efectividad a larga distancia).\n" -"\n" -"\cfBola de Plomo:\c- Cartuchos violetas. Viniendo de \cfPlutoni Incorporated\c-, estos cartuchos disparan una bola pesada de dolor puro. A pesar del hecho de que son de plomo, tiende a mantener la forma da igual la fuerza de impacto contra algo (algunos dudan de que realmente sean de plomo, siendo más bien de cualquier otro material). Habiendo salido de tal lugar, no es sorprendente que tengan efectos extraños. Al parecer, en ciertas ocasiones, las bolas pueden emitir sonidos extraños al impactar, los cuales adicionalmente provocan potentes ondas de choque, incrementando su velocidad en el proceso. Este suceso extraño está listado como \"Golpes Críticos Aleatorios\" en la página de la tienda.\n" -"\n" -"\cfDardos de Telebrium:\c- Cartuchos negros. Docenas de proyectiles penetrantes cargados de Telebrium puro, un elemento exótico conocido por sus potentes efectos corrosivos al ser calentado. Los objetivos alcanzados por estos proyectiles experimentarán una muy dolorosa descarga de toxinas corrosivas por sus cuerpos (incluso los no orgánicos), aunque estos efectos se despejarán en cuestión de segundos. El uso de esta munición está altamente restringido, pero has obtenido permiso para usarla contra las fuerzas invasoras.\n" -"\n" -"\cfCartucho Dorado:\c- Cartuchos cubiertos de oro con un fuerte cuerpo metálico. Un tipo de munición caro y muy poco común, con un poder destructor sin par. Cada cartucho dispara un proyectil que contiene una carga de \cfExplodium\c- de alta densidad y pureza, junto con brillantina dorada (que es aparentemente solo para quedar bonito). Se garantiza que cualquier cosa que reciba un impacto directo será vaporizada completamente por la explosión resultante.\n" -"\n" -"El amplio rango de munición compatible hace del Trabuco un arma bastante versátil, una vez acostumbrado a su tediosa recarga manual. Hay sin embargo planes para crear una variante semiautomática más cómoda de usar, con prototipos ya probándose.\n" +"El Trabuco puede ser un arma bastante versátil, una vez acostumbrado a su tediosa recarga manual. Aun así, hay planes para crear una variante semiautomática más cómoda de usar, con prototipos ya probándose.\n" "\n" "\cfFuego Primario:\c- Dispara el cartucho cargado.\n" "\n" -"\cfFuego Secundario:\c- Pulsa para elegir el tipo de munición a usar en la siguiente recarga. Mantén y luego pulsa fuego primario para retirar el cartucho actual y dejar el arma vacía.\n" +"\cfFuego Secundario:\c- Recarga con cartuchos dorados, si están disponibles. Ten en cuenta que si el cartucho cargado no fue usado, se devolverá a su pila de munición. Si no queda suficiente espacio para almacenarlo, se dejará caer en el suelo.\n" "\n" -"\cfRecarga:\c- Retira el cartucho actual y carga uno nuevo. Si el cartucho cargado no fue gastado, se devolverá a su pila de munición. Si no queda suficiente espacio para almacenarlo, se dejará caer en el suelo.\n" +"\cfRecarga:\c- Recarga con munición estándar, si está disponible. Las mismas reglas se aplican.\n" "\n" "\cxNotas de Saya:\c-\n" -"\cfSí, la mierda esta es jodidamente poco práctica, y no sé como es que nadie se ha reventado la mano recargando la cosa esta. PERO, te deja usar toda clase de munición divertida. Tienes lo típico y normal de cada escopeta por ahí, y luego hay... Literalmente piedras de sal radioactiva, que explotan, pues sí, mola. Pero luego ves lo que hay justo después y es que... ya.\c-\n" +"\cfSí, la mierda esta es jodidamente poco práctica, y no sé como es que nadie se ha reventado la mano recargando la cosa esta. PERO es jodidamente potente, sobre todo con lo tremendamente tocho que es el calibre que usa y tal.\n" "\n" -"\cfHermann-senpai me pasó al friki por lo de los cartuchos negros, porque fueron idea suya. A ver, deja que explique. El Telebrium es... un crimen de guerra. Así de simple. Pero casi que podemos salirnos de rositas, porque lo estamos usando contra bestias desquiciadas. Me sigue sentando un poco mal, pero a ver, no lo estamos usando contra personas, a diferencia de los casos en los que REALMENTE se usó contra personas (joder, las historias sobre ese tema).\c-\n" -"\n" -"\cfEn fin, basta de hablar de crímenes, hablemos ahora de los cartuchos violetas esos. Pues resulta que en serio son un crimen, y ESOS DOS por supuesto están involucrados. Estoy segura de que esas cosas NO están hechas de plomo. Parece más ese metal raro con el que trabajan, que es que puto juro que no puedo ni pronunciar el nombre. Y tiene... sí, CRÍTICOS RANDOM. He aquí el crimen, Demo-chan. No puedo creerme que mierdas así existan ahora. Es que se me fue la olla la primera vez que lo vi en acción, y estoy segura de que a ti te pasará lo mismo.\c-\n" -"\n" -"\cfFinamente están las cosas doradas esas. No podemos comprarlas, así que el friki hizo otro de sus frikitratos y dijo que te recompensaría de vez en cuando por eliminar \"objetivos de alto nivel\" o algo así. Que ganas tengo de ver como es eso, una puta... lluvia dorada de dolor.\c-\n" +"\cfY también, está el tema de las cosas doradas esas. No podemos comprarlas, así que el friki hizo otro de sus frikitratos y dijo que te recompensaría de vez en cuando por eliminar \"objetivos de alto nivel\" o algo así. Que ganas tengo de ver como es eso, una puta... lluvia dorada de dolor.\c-\n" "\n" "\cf*tose*\c-\n" "\n" @@ -3924,17 +3902,7 @@ SWWM_LORETXT_WALLBUSTER = "\n" "Los mecanismos internos que empujan el funcionamiento de este arma tienen tal grado de complejidad que han sido descritos por algunos como \cfIngeniería Loca Alemana\c-. Solamente el propio \cfHermann E. Ischer\c- conoce todos los detalles de su operación. Con cada accionamiento del gatillo principal, el cañón superior es disparado, y luego su tambor gira a contrarreloj, con el siguiente cartucho listo para dispararse. Con una rotación completa, o cuando se usa el gatillo secundario, el cuerpo principal gira después, alternando a otro tambor.\n" "\n" -"La Wallbuster es compatible con la mayor parte de cartuchos de calibre 6, aunque hay restricciones de seguridad para algunas, específicamente los cartuchos de flechette y dorados. Esto limita el rango de munición utilizable a sólo estos cuatro tipos:\n" -"\n" -"\cfPerdigones Estándar:\c- Cartuchos rojos. Exactamente lo que pone. Bastante letal a corto rango, y con cierto alcance extra dada la longitud de los cañones del arma.\n" -"\n" -"\cfSlug Metálico:\c- Cartuchos verdes. Slugs muy potentes con una puntería decente, incluso en distancias largas. Dado su tamaño y peso, tienen el potencial de penetrar varios objetivos pequeños.\n" -"\n" -"\cfSal de Kinylum:\c- Cartuchos cian. Pequeños trozos de Kinylum en su forma natural de \"sal\". Ya disparados, dejan un rastro de plasma ardiente que permanece en el aire durante unos momentos hasta disiparse. Adicionalmente, los trozos explotarán violentamente en contacto con cualquier superficie, o una vez se \"desestabilicen\" (lo cual desafortunadamente hace que este tipo de munición pierda efectividad a larga distancia).\n" -"\n" -"\cfBola de Plomo:\c- Cartuchos violetas. Viniendo de \cfPlutoni Incorporated\c-, estos cartuchos disparan una bola pesada de dolor puro. A pesar del hecho de que son de plomo, tiende a mantener la forma da igual la fuerza de impacto contra algo (algunos dudan de que realmente sean de plomo, siendo más bien de cualquier otro material). Habiendo salido de tal lugar, no es sorprendente que tengan efectos extraños. Al parecer, en ciertas ocasiones, las bolas pueden emitir sonidos extraños al impactar, los cuales adicionalmente provocan potentes ondas de choque, incrementando su velocidad en el proceso. Este suceso extraño está listado como \"Golpes Críticos Aleatorios\" en la página de la tienda.\n" -"\n" -"A pesar de esta limitación, con solo estos cuatro tipos uno puede hacer de la Wallbuster una potente compañera. Especialmente teniendo en cuenta la naturaleza semi-automática del arma, permitiendo una rápida sucesión de disparos o incluso disparar varios cartuchos de forma simultánea.\n" +"Teniendo en cuenta la naturaleza semi-automática del arma, permitiendo una rápida sucesión de disparos o incluso disparar varios cartuchos de forma simultánea, la Wallbuster es una muy poderosa compañera.\n" "\n" "\cfFuego Primario:\c- Dispara el cañón superior.\n" "\n" @@ -3942,14 +3910,14 @@ SWWM_LORETXT_WALLBUSTER = "\n" "\cfFuego Terciario:\c- Lo dispara todo, si realmente quieres.\n" "\n" -"\cfRecarga:\c- Una vez se tira de la palanca lateral, los tambores pueden ser retirados y recargados individualmente. Para recargar por el camino, se recomienda tener un \cfCinturón Magnético Útil\c- o similar, ya que facilitará esta operación. Hay recargadores rápidos disponibles para comprar desde la página web de Blackmann Arms, o de distribuidores autorizados. Los operadores astutos también optarían por llevar encima tambores pre-cargados de repuesto.\n" +"\cfRecarga:\c- Una vez se tira de la palanca lateral, los tambores pueden ser retirados y recargados individualmente. Una rutina de recarga rápida se ejecutará y te hará llenar automáticamente lo máximo posible del arma. Pueded cancelar esto en cualquier momento pulsando el boton de recarga otra vez o cualquier boton de fuego.\n" "\n" "\cfTécnicas:\c- Tal y como su nombre indica, puedes destruir toda clase de obstáculos por el camino, siempre y cuando causes suficiente daño relativo a su tamaño (requiriendo fuego secundario o terciario). Esto incluye hasta puertas bloqueadas, por lo que nunca más necesitarás buscar llaves.\n" "\n" "\cxNotas de Saya:\c-\n" "\cfOK a ver, la puta masa de metal rompecojones esta. Sí, esto sí que es la puta repera...\c-\n" "\n" -"\cfNo te preocupes por tardar un huevo en recargarla, por cierto. DemolitionOS viene con una rutina de recarga rápida que te lo pondrá más fácil. La munición se pone ahí en cola desde el Hammerspace, y luego todo lo que tienes que hacer es poner la mano encima de los cañones, y ya se mete todo ahí. Mola, ¿verdad? Taro hizo la mayor parte del chollo, así que eso, le puedes dar las gracias. Por cierto, no te recomiendo usar la función de recarga automática, está un poco programada de forma chapucera y no es muy inteligente en cuanto a elegir munición. Aunque claro, supongo que en una emergencia sería útil, ya que funciona muy rápido.\c-\n" +"\cfNo te preocupes por tardar un huevo en recargarla, por cierto. DemolitionOS viene con una rutina de recarga rápida que te lo pondrá más fácil. La munición se pone ahí en cola desde el Hammerspace, y luego todo lo que tienes que hacer es poner la mano encima de los cañones, y ya se mete todo ahí, lleva unos 10 segundos llenarlo todo, más o menos. Mola, ¿verdad? Taro hizo la mayor parte del chollo, así que eso, le puedes dar las gracias.\c-\n" "\n" "\cfOh ya... sabes... la cosa esta, con el nombre y todo, casi que me recuerda a la abuela un poco. A ver, si cambias la primera letra... Oh, ¿puedes oír la batería y la guitarra? Porque yo sí...\c-\n" "\n" diff --git a/language.es_menu b/language.es_menu index 482955276..64fc94647 100644 --- a/language.es_menu +++ b/language.es_menu @@ -56,7 +56,6 @@ SWWM_NONE = "Ninguno"; SWWM_INTERART = "Arte de Intermisión"; SWWM_NORENDER = "Sí (Sólo Fanart)"; SWWM_NOFANART = "Sí (Sólo Renders)"; -SWWM_BALLUSE = "Las Bolas de Plomo Activan Botones"; SWWM_BTITLE = "Opciones de Balance"; SWWM_BLOOD = "Habilitar Sangre Personalizada"; SWWM_FUZZ = "Habilitar Fondo Animado de Menú"; @@ -219,7 +218,6 @@ TOOLTIP_SWWM_SHADERS = "Usa shaders de postprocesado para cosas como potenciador TOOLTIP_SWWM_REVIVE = "Permite al jugador volver a levantarse tras morir pulsando Fuego. Tiene un cooldown configurable."; TOOLTIP_SWWM_REVIVECOOLDOWN = "Tiempo en segundos tras reiniciar, durante el cual si mueres otra vez, no puedes volver a levantarte. Pon a 0 para permitir reinicios ilimitados. Alternativamente, puedes elegir que solo se permita un reinicio por mapa (forzado en dificultades expertas)."; TOOLTIP_SWWM_INTERART = "Si está activado, muestra fanart y renders oficiales aleatorios durante intermisiones. Hay opciones extra para mostrar sólo una categoría."; -TOOLTIP_SWWM_BALLUSE = "Los proyectiles de Bola de Plomo pueden activar botones utilizables remotamente (excluyendo salidas). Potencialmente roto."; TOOLTIP_SWWM_BLOOD = "Activa efectos de sangre y vísceras personalizados, adaptados de Soundless Mound. Sinceramente, recomendaría usar Nashgore, es mejor."; TOOLTIP_SWWM_FUZZ = "Desactivar esto es recomendado si estás grabando o haciendo streaming, ya que este effecto puede dañar la calidad del vídeo."; TOOLTIP_SWWM_CBTALL = "Permite a la Wallbuster y otras armas capaces de reventar geometría del mapa destruír casi cualquier cosa, no solo puertas y plataformas. Ten en cuenta que esto puede romper algunos mapas, razón de que haya esta opción."; diff --git a/language.version b/language.version index 85a4e0eff..04c693fdf 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r544 \cu(Fri 7 Oct 00:55:20 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r544 \cu(2022-10-07 00:55:20)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r545 \cu(Fri 7 Oct 19:12:41 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r545 \cu(2022-10-07 19:12:41)\c-"; diff --git a/lore/default/hellblazer.txt b/lore/default/hellblazer.txt index a4059890e..73467f4d2 100644 --- a/lore/default/hellblazer.txt +++ b/lore/default/hellblazer.txt @@ -13,15 +13,7 @@ TXT \cxClassification:\c- \cf Mini-Missile Launcher\c- -The **Hellblazer** is the third incarnation of the **Hellfire Cannon**, one of the many weapons that **Imanaki Corp** had constructed based on their experiments with harnessing what they called **Ardent Energy**, a power source from the depths of **Hell** itself. It is a direct improvement of the Mark 2 model, the **Hellrazer**, sporting burst-fire capabilities and a simple drum magazine system for easier reloads. It also features many more types of ammunition this time: - -\cf"Blazer" grenades:\c- The standard ammunition. Highly explosive despite their small size, thanks to the highly condensed Ardent Energy contained within. - -\cf"Crackshot" cluster grenades:\c- These burst into smaller grenades which will spread on impact, bouncing around for a short time before detonating. - -\cf"Ravager" incendiary grenades:\c- Ravagers release a wave of unrefined Ardent Energy on detonation, covering a very wide area around themselves. Quite useful in tight spaces, where this scorching hot plasma won't dissipate as quickly, thoroughly roasting any targets within. For safety reasons this ammunition type cannot be employed in burst-fire. - -\cf"Slayer" warheads:\c- A returning favorite from the previous series. These miniature nukes contain within themselves highly enriched Ardent Energy that will cause total devastation in a large radius, bringing swift death to even the highest ranked demons in Hell's armies. Cannot operate in burst-fire mode either. +The **Hellblazer** is the third incarnation of the **Hellfire Cannon**, one of the many weapons that **Imanaki Corp** had constructed based on their experiments with harnessing what they called **Ardent Energy**, a power source from the depths of **Hell** itself. It is a direct improvement of the Mark 2 model, the **Hellrazer**, sporting burst-fire capabilities and a simple drum magazine system for easier reloads. As its ammunition, it employs 25mm "Blazer" grenades, highly explosive despite their small size, due to the materials contained within. The Hellblazer was discontinued following the destruction of the Imanaki Corp headquarters in 2009, but the **Tach-Engine Technology Institute** had managed to reproduce this weapon following their demise. Replicated models do not actually employ this "Ardent Energy" however, so they are not as destructive as they were meant to be. Rather, they are powered by the highly volatile **Nokron**, one of the two exotic elements involved in the process of Microfusion, as its potential for use in explosives is quite notable. @@ -31,9 +23,9 @@ Unlike its predecessor, which relied on simple proximity detection, this model c \cfSecondary Fire:\c- Lobs the loaded ammunition unarmed, as a bouncing grenade. Tap to fire one grenade, hold to preload up to 2 additional grenades (primary Fire cancels this process). Target seeking also affects grenades, as they will attempt to steer themselves towards the target on bounce. -\cfTertiary Fire:\c- Cycles the ammo type for the next reload. +\cfTertiary Fire:\c- Does nothing unless the weapon is locked for fire (see above). -\cfReloading:\c- During a reload, you may either refill the current mag (quite easy through the **Hammerspace™** container), or swap it out for a different ammo type. +\cfReloading:\c- Refills the current magazine, quite easily through the **Hammerspace™** container. \cfTechniques:\c- The grenades will automatically detonate on proximity to any hostile targets (unless explicitly seeking one), so you may still land the shot even if you merely grazed them. It is unclear how exactly they detect the targets, or know that they are hostile. diff --git a/lore/default/silverbullet.txt b/lore/default/silverbullet.txt index 3cee02348..3572ddade 100644 --- a/lore/default/silverbullet.txt +++ b/lore/default/silverbullet.txt @@ -23,9 +23,9 @@ In order to compensate for its massive recoil, the weapon redirects a part of th \cfPrimary Fire:\c- Shoot the bullet. Any small targets hit by it are pretty much turned to paste. A second press after firing will chamber another round. -\cfSecondary Fire:\c- Tap to switch next reload between XSB and FCB ammunition, if available. Hold and then press primary fire to manually cock, allowing you to retrieve unfired rounds. +\cfSecondary Fire:\c- Hold and then press primary fire to manually cock, allowing you to retrieve unfired rounds. Hold and then press reload to reload, but using secondary ammunition if available. -\cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered. +\cfReloading:\c- Reloads the weapon. Each magazine holds 5 rounds. An extra round can also be kept chambered. Note that if you only have secondary ammunition available, you must use the combo with secondary fire. \cfZoom:\c- Custom-tailored adjustable telescopic sight, up to 16x. Equipped with a soft foam covering to protect the user's face during scoped fire. diff --git a/lore/default/spreadgun.txt b/lore/default/spreadgun.txt index e2b3155f1..cb4b4a905 100644 --- a/lore/default/spreadgun.txt +++ b/lore/default/spreadgun.txt @@ -14,36 +14,22 @@ TXT The **Spreadgun** is a simple single-shot shotgun with a rather unconventional reload mechanism. Unlike other weapons of the same fashion, the Spreadgun employs an odd variant of break action that **Blackmann Arms** has described as "slide-action", whereas rather than being hinged, the barrel slides horizontally at the press of two side buttons, with a small metal bit springing up and ejecting the loaded shell. After loading in another round, the user merely has to push the barrel back into its closed position. Some have doubts about the practicality of this operation, or its safety, but it's been guaranteed that the gun will not misfire no matter the force exerted to push the barrel back in. -The weapon is chambered for rather sizable 6ga shells, and there's an exclusive assortment of ammunition types it can use, all handled by Blackmann Arms themselves. They are as follows: +The weapon is chambered for rather sizable 6ga shells. The ideal load that you'll find on the field are #00 buckshot rounds. Do note that the spread caused by the shortness of the barrel may make it difficult to reach distant targets, but at close range it should be very effective. -\cfStandard Buckshot:\c- Red shells. Exactly what it says on the tin. The spread caused by the shortness of the barrel may make it difficult to reach distant targets, but at close range it should be very effective. +There is additionally an exclusive secondary load available, so-called \cfGolden Shells\c-, highly rare and expensive, with unmatched destructive power. Each round fires a sabot packing a high-grade, high-density **Explodium** charge, along with gold glitter (which is apparently just for show). Anything directly hit by it is guaranteed to be completely vaporized by the ensuing blast. -\cfMetal Slug:\c- Green shells. Very potent slugs that have a decent accuracy, even at longer ranges. Due to their size and weight, they can potentially penetrate multiple small targets. - -\cfKinylum Saltshot:\c- Teal shells. Small chunks of Kinylum in its natural "salt" form. Once shot, they leave a trail of boiling hot plasma that remains in the air for a few moments before finally dissipating. In addition, the chunks will explode violently on contact with any surface, or once they "destabilize" (which unfortunately makes this type of ammunition ineffective at longer distances). - -\cfLead Ball:\c- Purple shells. Coming from **Plutoni Incorporated**, these rounds shoot out a heavy ball of pure hurt. Despite the fact it's made of lead, it tends to keep its shape no matter how hard it hits something (some wonder if it actually IS made of lead, or if it's something else entirely). Having come out of such a place, it's no surprise that they also have some rather odd effects. It appears that, on certain occasions, the balls may emit odd sounds on impact, which in addition cause some form of potent shockwave around itself, increasing its speed in the process. This odd happening is listed as "Random Crits" in the store page. - -\cfTelebrium Flechettes:\c- Black shells. Dozens of piercing projectiles tipped with pure Telebrium, an exotic element known for its potent corrosive effects when heated. Targets hit by these projectiles will experience a very painful discharge of corrosive toxins through their bodies (even non-organic ones), although the effects of this will dissipate in a couple seconds. Use of this ammunition is highly restricted, but you have been granted permission to use it against the invading forces. - -\cfGolden Shell:\c- Gold-plated shells with a heavy metal body. A highly rare and expensive type of ammunition, with unmatched destructive power. Each round fires a sabot packing a high-grade, high-density **Explodium** charge, along with gold glitter (which is apparently just for show). Anything directly hit by it is guaranteed to be completely vaporized by the ensuing blast. - -The wide range of compatible ammunition types makes the Spreadgun a rather versatile weapon, once you look past its tedious manual reloading. There are however plans to make a much more comfortable semi-automatic, recoil operated variant of this weapon, with prototypes already being tested. +The Spreadgun can be a versatile weapon, once you look past its tedious manual reloading. Still, there are plans to make a much more comfortable semi-automatic, recoil operated variant of this weapon, with prototypes already being tested. \cfPrimary Fire:\c- Shoot the loaded shell. -\cfSecondary Fire:\c- Tap to select the next ammo type to be used on reload. Hold and then press primary fire to unload the current shell and leave the weapon empty. +\cfSecondary Fire:\c- Reloads with golden shells, if available. Note that if the currently loaded round was not spent, it will be returned to its ammo pool. Should there not be enough storage space for it, it will be dropped on the ground instead. -\cfReloading:\c- Unload the current shell and load a new one. If the loaded shell was not spent, it will be returned to its ammo pool. Should there not be enough storage space for it, it will be dropped on the ground instead. +\cfReloading:\c- Reloads with standard ammunition, if available. Same rules apply here. \cxSaya's Notes:\c- -\cfYeah, this shit looks impractical af, and I don't know how no one has shot a hole through their hand reloading the damn thing. BUT, it does let you use all sorts of fun ammo. You've got the typical bread and butter of shells there, and then there's... Literal radioactive rock salt, that explodes, yeah, amazing. But then you look at what's right after that and... yeah.\c- +\cfYeah, this shit looks impractical af, and I don't know how no one has shot a hole through their hand reloading the damn thing. BUT it's powerful as all fuck, what with the absolute girth of that caliber and all.\c- -\cfHermann-senpai redirected me to nerdboi for those black shells, because they were his idea. So, let me explain. Telebrium is... a war crime. Plain and simple. We can kind of get away with it, though, because it's just mindless beasts that you're throwing it at. Still makes me uneasy, but hey, we're not using it on people, unlike the actual cases where it WAS used on people (good god, the stories about that).\c- - -\cfAnyway, enough about crimes, let's talk about the purple bois. So these things are a serious crime, and THOSE TWO had to be involved of course. I'm pretty sure those things are NOT made of lead. This looks like that weird metal they work with, that I swear to fuck I can't even pronounce the name of. And it has... yes, RANDOM CRITS. Therein lies the crime, Demo-chan. Can't believe we've got that shit going on now. I absolutely lost it when I first saw it in action, and I'm sure you will, too.\c- - -\cfLastly there's those golden bois. We can't buy them ourselves, so nerdo made another of his nerdy deals and said that he might reward you every now and then with one for eliminating "high level targets" or something like that. Can't wait to see what that shit is like, a fucking... golden shower of pain.\c- +\cfAlso, there's the whole thing of those golden bois. We can't buy them ourselves, so nerdo made another of his nerdy deals and said that he might reward you every now and then with one for eliminating "high level targets" or something like that. Can't wait to see what that shit is like, a fucking... golden shower of pain.\c- \cf*cough*\c- diff --git a/lore/default/wallbuster.txt b/lore/default/wallbuster.txt index 493f18ad7..24022c490 100644 --- a/lore/default/wallbuster.txt +++ b/lore/default/wallbuster.txt @@ -17,17 +17,7 @@ The **Wallbuster** is a beefy beast of a shotgun, sporting a total of 25 barrels The internal mechanisms driving this weapon have such a degree of complexity that they've been described as **"Kraut Deep Space Magic"** by some. Only **Hermann E. Ischer** himself knows every detail about their operation. With each twist of the main trigger, the topmost barrel is primed, and then its cylinder spins counter-clockwise, with the next round ready for shooting. On a complete rotation, or when the secondary trigger is used, the main body spins afterwards, switching to another cylinder. -The Wallbuster is compatible with most types of 6ga shells distributed by Blackmann, although there are safety restrictions on some, namely flechettes and golden shells. This limits the range of ammunition usable to only these four types: - -\cfStandard Buckshot:\c- Red shells. Exactly what it says on the tin. Quite lethal at short range, and with some extra reach due to the length of the weapon's barrels. - -\cfMetal Slug:\c- Green shells. Very potent slugs that have a decent accuracy, even at longer ranges. Due to their size and weight, they can potentially penetrate multiple small targets. - -\cfKinylum Saltshot:\c- Teal shells. Small chunks of Kinylum in its natural "salt" form. Once shot, they leave a trail of boiling hot plasma that remains in the air for a few moments before finally dissipating. In addition, the chunks will explode violently on contact with any surface, or once they "destabilize" (which unfortunately makes this type of ammunition ineffective at longer distances). - -\cfLead Ball:\c- Purple shells. Coming from **Plutoni Incorporated**, these rounds shoot out a heavy ball of pure hurt. Despite the fact it's made of lead, it tends to keep its shape no matter how hard it hits something (some wonder if it actually IS made of lead, or if it's something else entirely). Having come out of such a place, it's no surprise that they also have some rather odd effects. It appears that, on certain occasions, the balls may emit odd sounds on impact, which in addition cause some form of potent shockwave around itself, increasing its speed in the process. This odd happening is listed as "Random Crits" in the store page. - -Despite this limitation, with just these four types one can make of the Wallbuster a quite mighty companion. Especially taking into account the semi-automatic nature of the weapon, allowing for a quick succession of shots or even shooting multiple shells simultaneously. +Taking into account the semi-automatic nature of the weapon, allowing for a quick succession of shots or even shooting multiple shells simultaneously, the Wallbuster is a quite mighty companion. \cfPrimary Fire:\c- Shoots the topmost barrel. @@ -35,14 +25,14 @@ Despite this limitation, with just these four types one can make of the Wallbust \cfTertiary Fire:\c- Shoots it all, if you really want to. -\cfReloading:\c- Once the side lever is pulled down, the cylinders can be safely detached and reloaded individually. For reloading on the go, it's recommended to have a **Magnetic Utility Belt** or similar at hand, as it will make this operation easier. Speed loaders are available for purchase from the Blackmann Arms website, or from authorized distributors. Clever operators might also choose to carry spare pre-loaded cylinders. +\cfReloading:\c- Once the side lever is pulled down, the cylinders can be safely detached and reloaded individually. A rapid reload routine will execute that automatically makes you top up the gun as much as possible. You can cancel this at any moment by pressing reload again or either fire button. \cfTechniques:\c- True to its name, you can destroy all sorts of obstacles along the way, provided you're dealing enough damage relative to their size (requiring secondary or tertiary fire). This even includes locked doors, so you won't have to bother with key hunting anymore. \cxSaya's Notes:\c- \cfOK so, this ballbusting hunk of metal. Yeah, now ain't that some good shit...\c- -\cfDon't worry about reloading this taking a long-ass time, btw. DemolitionOS comes with a quick reload routine that'll make it much easier for you. The ammo will be queued up in your Hammerspace, and then all you have to do is hold out your hand above the barrels, and they'll get deployed right inside. Nifty, huh? Taro did most of the work on that, so yeah, you can thank him. PS: I don't recommend you to use the auto-reload function, it's a bit shoddily programmed and it's not very smart with how it picks ammo. I guess in an emergency it's OK since it's really fast, though.\c- +\cfDon't worry about reloading this taking a long-ass time, btw. DemolitionOS comes with a quick reload routine that'll make it nice and easy for you. The ammo will be queued up in your Hammerspace, and then all you have to do is hold out your hand above the barrels, and they'll get deployed right inside, takes around 10 seconds to top it up, more or less. Nifty, huh? Taro did most of the work on that, so yeah, you can thank him.\c- \cfOh and... y'know... this whole thing, that name and all, kinda makes me think of grandma a bit. I mean, if you change the first letter... Oh, do you hear those drums and that guitar? 'cause I sure do...\c- diff --git a/lore/es/hellblazer.txt b/lore/es/hellblazer.txt index 52cf7d114..8f99574a7 100644 --- a/lore/es/hellblazer.txt +++ b/lore/es/hellblazer.txt @@ -7,15 +7,7 @@ TXT \cxClasificación:\c- \cf Lanzador de Minimisiles\c- -El **Hellblazer** es la tercera encarnación del **Cañón de Fuego Infernal**, una de las muchas armas que **Imanaki Corp** había construido basándose en sus experimentos explotando lo que llamaron **Energía Ardiente**, una fuente de poder de las profundidades del mismo **Infierno**. Es una mejora directa del modelo Mark 2, el **Hellrazer**, poseyendo capacidades de fuego en ráfaga y un simple sistema de cargador en barril para facilitar recargas. También posee más tipos de munición esta vez: - -\cfGranadas "Blazer":\c- La munición estándar. Altamente explosivas a pesar de su diminuto tamaño, gracias a la Energía Ardiente superconcentrada que contienen. - -\cfGranadas en clúster "Crackshot":\c- Éstas explotan en granadas más pequeñas que se dispersan en el impacto, rebotando durante un tiempo antes de detonar. - -\cfGranadas incendiarias "Ravager":\c- Las Ravagers liberan una onda de Energía Ardiente sin refinar cuando detonan, cubriendo una zona amplia a su alrededor. Muy útiles en espacios cerrados, donde su plasma abrasador no se disipará tan fácilmente, tostando a conciencia todos los objetivos encontrados. Por razones de seguridad este tipo de munición no se puede usar en ráfaga. - -\cfCabezas nucleares "Slayer":\c- Un favorito de la anterior serie. Estas bombas nucleares en miniatura contienen en su interior Energía Ardiente altamente enriquecida que causará una devastación total en un radio masivo, causando la muerte segura de incluso los demonios de mayor rango en los ejércitos del Infierno. Tampoco pueden usarse en ráfaga. +El **Hellblazer** es la tercera encarnación del **Cañón de Fuego Infernal**, una de las muchas armas que **Imanaki Corp** había construido basándose en sus experimentos explotando lo que llamaron **Energía Ardiente**, una fuente de poder de las profundidades del mismo **Infierno**. Es una mejora directa del modelo Mark 2, el **Hellrazer**, poseyendo capacidades de fuego en ráfaga y un simple sistema de cargador en barril para facilitar recargas. Como munición, emplea granadas de 25mm "Blazer", altamente explosivas a pesar de su diminuto tamaño, debido a los materiales que contiene. El Hellblazer fue descontinuado tras la destrucción de las oficinas de Imanaki Corp en 2009, pero el **Instituto Tecnológico Tach-Engine** ha conseguido reproducir el arma tras su caída. Sin embargo, los modelos replicados no emplean esta "Energía Ardiente", así que no son tan destructivos como debían ser. En su lugar, usan el altamente volátil **Nokron**, uno de los dos elementos exóticos empleados en el proceso de Microfusión, ya que su potencial para el uso en explosivos es bastante notable. @@ -25,9 +17,9 @@ A diferencia de su predecesor, el cual se basaba en simple detección de proximi \cfFuego Secundario:\c- Lanza la munición cargada sin armar, como una granada. Pulsa para disparar una granada, mantén para precargar 2 granadas adicionales (el fuego primario cancela este proceso). La búsqueda de objetivos también afecta a las granadas, ya que intentarán guiarse hacia el objetivo con cada rebote. -\cfFuego Terciario:\c- Alterna entre las municiones a usar en la próxima recarga. +\cfFuego Terciario:\c- No hace nada a menos que el arma esté bloqueada para el tiro (ver arriba). -\cfRecarga:\c- Durante una recarga, puedes o bien rellenar el cargador actual (fácil a través del contenedor de **Hammerspace™**), o cambiarlo por otro tipo de munición. +\cfRecarga:\c- Rellena el cargador actual, bastante fácil a través del contenedor de **Hammerspace™**. \cfTécnicas:\c- Las granadas detonan automáticamente en proximidad a objetivos hostiles, así que todavía puedes alcanzar ese disparo aunque solo los hayas rozado. No está muy claro como detectan los objetivos, o como saben que son hostiles. diff --git a/lore/es/silverbullet.txt b/lore/es/silverbullet.txt index 4534b66bb..cea8474df 100644 --- a/lore/es/silverbullet.txt +++ b/lore/es/silverbullet.txt @@ -17,9 +17,9 @@ Para poder compensar su masivo retroceso, el arma redirige una parte de los gase \cfFuego Primario:\c- Dispara la bala. Cualquier objetivo alcanzado por ella queda hecho papilla. Un segundo pulsado tras disparar cargará otra bala. -\cfFuego Secundario:\c- Pulsa para alternar entre balas XSB y FCB para la siguiente recarga, si están disponibles. Mantén y luego pulsa fuego primario para accionar el perno manualmente, permitiéndote recuperar balas sin usar. +\cfFuego Secundario:\c- Mantén y luego pulsa fuego primario para accionar el perno manualmente, permitiéndote recuperar balas sin usar. Mantén y luego pulsa recarga para recargar, pero usando munición secundaria si está disponible. -\cfRecarga:\c- Recarga el arma. Cada cargador tiene 5 balas. Se puede mantener también una bala extra en la recámara. +\cfRecarga:\c- Recarga el arma. Cada cargador tiene 5 balas. Se puede mantener también una bala extra en la recámara. Ten en cuenta que si solo tienes munición secundaria, deberás usar la combinación de fuego secundario. \cfZoom:\c- Mira telescópica hecha a medida, hasta 16 aumentos. Equipada con una cubierta de espuma suave para proteger la cara del usuario durante el disparo con mira. diff --git a/lore/es/spreadgun.txt b/lore/es/spreadgun.txt index b5026c9b2..68e308c47 100644 --- a/lore/es/spreadgun.txt +++ b/lore/es/spreadgun.txt @@ -10,36 +10,22 @@ TXT El **Trabuco** es una simple escopeta de un disparo con un mecanismo de recarga poco convencional. A diferencia de otras armas del mismo tipo, el Trabuco emplea una variante extraña del cañón basculante que **Blackmann Arms** ha descrito como "cañón deslizante", por la cual en lugar de usar una bisagra, el cañón se desliza horizontalmente al pulsar dos botones laterales, con una pequeña pieza metálica saltando y eyectando el cartucho cargado. Tras cargar el siguiente cartucho, el usuario simplemente tiene que empujar el cañón a su posición inicial. Algunos tienen dudas sobre la factibilidad de esta operación, o de su seguridad, pero han garantizado que el arma no disparará accidentalmente no importa la fuerza ejercida empujando de vuelta el cañón. -El arma emplea el ciertamente grande calibre 6, y hay un surtido exclusivo de munición que puede usar, todo manejado por Blackmann. Siendo estos: +El arma emplea el ciertamente grande calibre 6. La carga ideal que encontrarás en el campo son cartuchos de perdigones #00. Ten en cuenta que la dispersión causada por la poca longitud del cañón puede que dificulte alcanzar objetivos lejanos, pero a un rango más corto debería ser más efectivo. -\cfPerdigones Estándar:\c- Cartuchos rojos. Exactamente lo que pone. La dispersión causada por la poca longitud del cañón puede que dificulte alcanzar objetivos lejanos, pero a un rango más corto debería ser más efectivo. +También hay adicionalmente una carga secundaria exclusive, los llamados \cfCartuchos Dorados\c-, caros y muy poco comunes, con un poder destructor sin par. Cada cartucho dispara un proyectil que contiene una carga de **Explodium** de alta densidad y pureza, junto con brillantina dorada (que es aparentemente solo para quedar bonito). Se garantiza que cualquier cosa que reciba un impacto directo será vaporizada completamente por la explosión resultante. -\cfSlug Metálico:\c- Cartuchos verdes. Slugs muy potentes con una puntería decente, incluso en distancias largas. Dado su tamaño y peso, tienen el potencial de penetrar varios objetivos pequeños. - -\cfSal de Kinylum:\c- Cartuchos cian. Pequeños trozos de Kinylum en su forma natural de "sal". Ya disparados, dejan un rastro de plasma ardiente que permanece en el aire durante unos momentos hasta disiparse. Adicionalmente, los trozos explotarán violentamente en contacto con cualquier superficie, o una vez se "desestabilicen" (lo cual desafortunadamente hace que este tipo de munición pierda efectividad a larga distancia). - -\cfBola de Plomo:\c- Cartuchos violetas. Viniendo de **Plutoni Incorporated**, estos cartuchos disparan una bola pesada de dolor puro. A pesar del hecho de que son de plomo, tiende a mantener la forma da igual la fuerza de impacto contra algo (algunos dudan de que realmente sean de plomo, siendo más bien de cualquier otro material). Habiendo salido de tal lugar, no es sorprendente que tengan efectos extraños. Al parecer, en ciertas ocasiones, las bolas pueden emitir sonidos extraños al impactar, los cuales adicionalmente provocan potentes ondas de choque, incrementando su velocidad en el proceso. Este suceso extraño está listado como "Golpes Críticos Aleatorios" en la página de la tienda. - -\cfDardos de Telebrium:\c- Cartuchos negros. Docenas de proyectiles penetrantes cargados de Telebrium puro, un elemento exótico conocido por sus potentes efectos corrosivos al ser calentado. Los objetivos alcanzados por estos proyectiles experimentarán una muy dolorosa descarga de toxinas corrosivas por sus cuerpos (incluso los no orgánicos), aunque estos efectos se despejarán en cuestión de segundos. El uso de esta munición está altamente restringido, pero has obtenido permiso para usarla contra las fuerzas invasoras. - -\cfCartucho Dorado:\c- Cartuchos cubiertos de oro con un fuerte cuerpo metálico. Un tipo de munición caro y muy poco común, con un poder destructor sin par. Cada cartucho dispara un proyectil que contiene una carga de **Explodium** de alta densidad y pureza, junto con brillantina dorada (que es aparentemente solo para quedar bonito). Se garantiza que cualquier cosa que reciba un impacto directo será vaporizada completamente por la explosión resultante. - -El amplio rango de munición compatible hace del Trabuco un arma bastante versátil, una vez acostumbrado a su tediosa recarga manual. Hay sin embargo planes para crear una variante semiautomática más cómoda de usar, con prototipos ya probándose. +El Trabuco puede ser un arma bastante versátil, una vez acostumbrado a su tediosa recarga manual. Aun así, hay planes para crear una variante semiautomática más cómoda de usar, con prototipos ya probándose. \cfFuego Primario:\c- Dispara el cartucho cargado. -\cfFuego Secundario:\c- Pulsa para elegir el tipo de munición a usar en la siguiente recarga. Mantén y luego pulsa fuego primario para retirar el cartucho actual y dejar el arma vacía. +\cfFuego Secundario:\c- Recarga con cartuchos dorados, si están disponibles. Ten en cuenta que si el cartucho cargado no fue usado, se devolverá a su pila de munición. Si no queda suficiente espacio para almacenarlo, se dejará caer en el suelo. -\cfRecarga:\c- Retira el cartucho actual y carga uno nuevo. Si el cartucho cargado no fue gastado, se devolverá a su pila de munición. Si no queda suficiente espacio para almacenarlo, se dejará caer en el suelo. +\cfRecarga:\c- Recarga con munición estándar, si está disponible. Las mismas reglas se aplican. \cxNotas de Saya:\c- -\cfSí, la mierda esta es jodidamente poco práctica, y no sé como es que nadie se ha reventado la mano recargando la cosa esta. PERO, te deja usar toda clase de munición divertida. Tienes lo típico y normal de cada escopeta por ahí, y luego hay... Literalmente piedras de sal radioactiva, que explotan, pues sí, mola. Pero luego ves lo que hay justo después y es que... ya.\c- +\cfSí, la mierda esta es jodidamente poco práctica, y no sé como es que nadie se ha reventado la mano recargando la cosa esta. PERO es jodidamente potente, sobre todo con lo tremendamente tocho que es el calibre que usa y tal. -\cfHermann-senpai me pasó al friki por lo de los cartuchos negros, porque fueron idea suya. A ver, deja que explique. El Telebrium es... un crimen de guerra. Así de simple. Pero casi que podemos salirnos de rositas, porque lo estamos usando contra bestias desquiciadas. Me sigue sentando un poco mal, pero a ver, no lo estamos usando contra personas, a diferencia de los casos en los que REALMENTE se usó contra personas (joder, las historias sobre ese tema).\c- - -\cfEn fin, basta de hablar de crímenes, hablemos ahora de los cartuchos violetas esos. Pues resulta que en serio son un crimen, y ESOS DOS por supuesto están involucrados. Estoy segura de que esas cosas NO están hechas de plomo. Parece más ese metal raro con el que trabajan, que es que puto juro que no puedo ni pronunciar el nombre. Y tiene... sí, CRÍTICOS RANDOM. He aquí el crimen, Demo-chan. No puedo creerme que mierdas así existan ahora. Es que se me fue la olla la primera vez que lo vi en acción, y estoy segura de que a ti te pasará lo mismo.\c- - -\cfFinamente están las cosas doradas esas. No podemos comprarlas, así que el friki hizo otro de sus frikitratos y dijo que te recompensaría de vez en cuando por eliminar "objetivos de alto nivel" o algo así. Que ganas tengo de ver como es eso, una puta... lluvia dorada de dolor.\c- +\cfY también, está el tema de las cosas doradas esas. No podemos comprarlas, así que el friki hizo otro de sus frikitratos y dijo que te recompensaría de vez en cuando por eliminar "objetivos de alto nivel" o algo así. Que ganas tengo de ver como es eso, una puta... lluvia dorada de dolor.\c- \cf*tose*\c- diff --git a/lore/es/wallbuster.txt b/lore/es/wallbuster.txt index 8ec4bb789..fffd87a65 100644 --- a/lore/es/wallbuster.txt +++ b/lore/es/wallbuster.txt @@ -11,17 +11,7 @@ La **Wallbuster** es una escopeta bestial, teniendo un total de 25 cañones divi Los mecanismos internos que empujan el funcionamiento de este arma tienen tal grado de complejidad que han sido descritos por algunos como **Ingeniería Loca Alemana**. Solamente el propio **Hermann E. Ischer** conoce todos los detalles de su operación. Con cada accionamiento del gatillo principal, el cañón superior es disparado, y luego su tambor gira a contrarreloj, con el siguiente cartucho listo para dispararse. Con una rotación completa, o cuando se usa el gatillo secundario, el cuerpo principal gira después, alternando a otro tambor. -La Wallbuster es compatible con la mayor parte de cartuchos de calibre 6, aunque hay restricciones de seguridad para algunas, específicamente los cartuchos de flechette y dorados. Esto limita el rango de munición utilizable a sólo estos cuatro tipos: - -\cfPerdigones Estándar:\c- Cartuchos rojos. Exactamente lo que pone. Bastante letal a corto rango, y con cierto alcance extra dada la longitud de los cañones del arma. - -\cfSlug Metálico:\c- Cartuchos verdes. Slugs muy potentes con una puntería decente, incluso en distancias largas. Dado su tamaño y peso, tienen el potencial de penetrar varios objetivos pequeños. - -\cfSal de Kinylum:\c- Cartuchos cian. Pequeños trozos de Kinylum en su forma natural de "sal". Ya disparados, dejan un rastro de plasma ardiente que permanece en el aire durante unos momentos hasta disiparse. Adicionalmente, los trozos explotarán violentamente en contacto con cualquier superficie, o una vez se "desestabilicen" (lo cual desafortunadamente hace que este tipo de munición pierda efectividad a larga distancia). - -\cfBola de Plomo:\c- Cartuchos violetas. Viniendo de **Plutoni Incorporated**, estos cartuchos disparan una bola pesada de dolor puro. A pesar del hecho de que son de plomo, tiende a mantener la forma da igual la fuerza de impacto contra algo (algunos dudan de que realmente sean de plomo, siendo más bien de cualquier otro material). Habiendo salido de tal lugar, no es sorprendente que tengan efectos extraños. Al parecer, en ciertas ocasiones, las bolas pueden emitir sonidos extraños al impactar, los cuales adicionalmente provocan potentes ondas de choque, incrementando su velocidad en el proceso. Este suceso extraño está listado como "Golpes Críticos Aleatorios" en la página de la tienda. - -A pesar de esta limitación, con solo estos cuatro tipos uno puede hacer de la Wallbuster una potente compañera. Especialmente teniendo en cuenta la naturaleza semi-automática del arma, permitiendo una rápida sucesión de disparos o incluso disparar varios cartuchos de forma simultánea. +Teniendo en cuenta la naturaleza semi-automática del arma, permitiendo una rápida sucesión de disparos o incluso disparar varios cartuchos de forma simultánea, la Wallbuster es una muy poderosa compañera. \cfFuego Primario:\c- Dispara el cañón superior. @@ -29,14 +19,14 @@ A pesar de esta limitación, con solo estos cuatro tipos uno puede hacer de la W \cfFuego Terciario:\c- Lo dispara todo, si realmente quieres. -\cfRecarga:\c- Una vez se tira de la palanca lateral, los tambores pueden ser retirados y recargados individualmente. Para recargar por el camino, se recomienda tener un **Cinturón Magnético Útil** o similar, ya que facilitará esta operación. Hay recargadores rápidos disponibles para comprar desde la página web de Blackmann Arms, o de distribuidores autorizados. Los operadores astutos también optarían por llevar encima tambores pre-cargados de repuesto. +\cfRecarga:\c- Una vez se tira de la palanca lateral, los tambores pueden ser retirados y recargados individualmente. Una rutina de recarga rápida se ejecutará y te hará llenar automáticamente lo máximo posible del arma. Pueded cancelar esto en cualquier momento pulsando el boton de recarga otra vez o cualquier boton de fuego. \cfTécnicas:\c- Tal y como su nombre indica, puedes destruir toda clase de obstáculos por el camino, siempre y cuando causes suficiente daño relativo a su tamaño (requiriendo fuego secundario o terciario). Esto incluye hasta puertas bloqueadas, por lo que nunca más necesitarás buscar llaves. \cxNotas de Saya:\c- \cfOK a ver, la puta masa de metal rompecojones esta. Sí, esto sí que es la puta repera...\c- -\cfNo te preocupes por tardar un huevo en recargarla, por cierto. DemolitionOS viene con una rutina de recarga rápida que te lo pondrá más fácil. La munición se pone ahí en cola desde el Hammerspace, y luego todo lo que tienes que hacer es poner la mano encima de los cañones, y ya se mete todo ahí. Mola, ¿verdad? Taro hizo la mayor parte del chollo, así que eso, le puedes dar las gracias. Por cierto, no te recomiendo usar la función de recarga automática, está un poco programada de forma chapucera y no es muy inteligente en cuanto a elegir munición. Aunque claro, supongo que en una emergencia sería útil, ya que funciona muy rápido.\c- +\cfNo te preocupes por tardar un huevo en recargarla, por cierto. DemolitionOS viene con una rutina de recarga rápida que te lo pondrá más fácil. La munición se pone ahí en cola desde el Hammerspace, y luego todo lo que tienes que hacer es poner la mano encima de los cañones, y ya se mete todo ahí, lleva unos 10 segundos llenarlo todo, más o menos. Mola, ¿verdad? Taro hizo la mayor parte del chollo, así que eso, le puedes dar las gracias.\c- \cfOh ya... sabes... la cosa esta, con el nombre y todo, casi que me recuerda a la abuela un poco. A ver, si cambias la primera letra... Oh, ¿puedes oír la batería y la guitarra? Porque yo sí...\c- diff --git a/modeldef.ammo b/modeldef.ammo index 430925494..176ed379d 100644 --- a/modeldef.ammo +++ b/modeldef.ammo @@ -35,151 +35,39 @@ Model "RedShell4" FrameIndex XZW1 A 0 0 } - -Model "GreenShell" +Model "RedShell8" { Path "models" - Model 0 "ShellAmmo_One_d.3d" - Skin 0 "Shell_Slug.png" - Scale 0.024 0.024 0.024 - PitchOffset 30 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "GreenShell2" -{ - Path "models" - - Model 0 "ShellAmmo_Two_d.3d" - Skin 0 "Shell_Slug.png" + Model 0 "ShellAmmo_Eight_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "envmap/silverenv.png" Scale 0.024 0.024 0.024 ZOffset 16 ROTATING FrameIndex XZW1 A 0 0 } -Model "GreenShell4" +Model "RedShell12" { Path "models" - Model 0 "ShellAmmo_Four_d.3d" - Skin 0 "Shell_Slug.png" + Model 0 "ShellAmmo_Twelve_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "envmap/silverenv.png" Scale 0.024 0.024 0.024 ZOffset 16 ROTATING FrameIndex XZW1 A 0 0 } - -Model "BlueShell" +Model "RedShell16" { Path "models" - Model 0 "ShellAmmo_One_d.3d" - Skin 0 "Shell_Kinylum.png" - Scale 0.024 0.024 0.024 - PitchOffset 30 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "BlueShell2" -{ - Path "models" - - Model 0 "ShellAmmo_Two_d.3d" - Skin 0 "Shell_Kinylum.png" - Scale 0.024 0.024 0.024 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "BlueShell4" -{ - Path "models" - - Model 0 "ShellAmmo_Four_d.3d" - Skin 0 "Shell_Kinylum.png" - Scale 0.024 0.024 0.024 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "BlackShell" -{ - Path "models" - - Model 0 "ShellAmmo_One_d.3d" - Skin 0 "Shell_Fuck.png" - Scale 0.024 0.024 0.024 - PitchOffset 30 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "BlackShell2" -{ - Path "models" - - Model 0 "ShellAmmo_Two_d.3d" - Skin 0 "Shell_Fuck.png" - Scale 0.024 0.024 0.024 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "BlackShell4" -{ - Path "models" - - Model 0 "ShellAmmo_Four_d.3d" - Skin 0 "Shell_Fuck.png" - Scale 0.024 0.024 0.024 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} - -Model "PurpleShell" -{ - Path "models" - - Model 0 "ShellAmmo_One_d.3d" - Skin 0 "Shell_Ball.png" - Scale 0.024 0.024 0.024 - PitchOffset 30 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "PurpleShell2" -{ - Path "models" - - Model 0 "ShellAmmo_Two_d.3d" - Skin 0 "Shell_Ball.png" - Scale 0.024 0.024 0.024 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "PurpleShell4" -{ - Path "models" - - Model 0 "ShellAmmo_Four_d.3d" - Skin 0 "Shell_Ball.png" + Model 0 "ShellAmmo_Sixteen_d.3d" + SurfaceSkin 0 0 "Shell_Normal.png" + SurfaceSkin 0 1 "envmap/silverenv.png" Scale 0.024 0.024 0.024 ZOffset 16 ROTATING @@ -330,102 +218,6 @@ Model "HellblazerMissileMag" FrameIndex XZW1 A 0 0 } -Model "HellblazerCrackshots" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Cluster.png" - Scale 0.16 0.16 0.16 - PitchOffset 45 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerCrackshots2" -{ - Path "models" - - Model 0 "HellblazerDuo_d.3d" - Skin 0 "HellblazerMissile_Cluster.png" - Scale 0.16 0.16 0.16 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerCrackshotMag" -{ - Path "models" - - Model 0 "HellblazerAmmo_Three_d.3d" - SurfaceSkin 0 0 "HellblazerAmmo_Cluster.png" - SurfaceSkin 0 1 "HellblazerMissile_Cluster.png" - Scale 0.16 0.16 0.16 - PitchOffset -45 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} - -Model "HellblazerRavagers" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Fire.png" - Scale 0.16 0.16 0.16 - PitchOffset 45 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerRavagerMag" -{ - Path "models" - - Model 0 "HellblazerAmmo_Three_d.3d" - SurfaceSkin 0 0 "HellblazerAmmo_Fire.png" - SurfaceSkin 0 1 "HellblazerMissile_Fire.png" - Scale 0.16 0.16 0.16 - PitchOffset -45 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} - -Model "HellblazerWarheads" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Nuke.png" - Scale 0.16 0.16 0.16 - PitchOffset 45 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerWarheadMag" -{ - Path "models" - - Model 0 "HellblazerAmmo_Two_d.3d" - SurfaceSkin 0 0 "HellblazerAmmo_Nuke.png" - SurfaceSkin 0 1 "HellblazerMissile_Nuke.png" - Scale 0.16 0.16 0.16 - PitchOffset -45 - ZOffset 16 - ROTATING - - FrameIndex XZW1 A 0 0 -} - Model "SparkUnit" { Path "models" diff --git a/modeldef.explodiumgun2 b/modeldef.explodiumgun2 index 90c91caea..eeab554a9 100644 --- a/modeldef.explodiumgun2 +++ b/modeldef.explodiumgun2 @@ -297,18 +297,6 @@ Model "DualExplodiumGun" FrameIndex XZWM F 3 377 FrameIndex XZWM G 3 378 FrameIndex XZWM H 3 379 - // Lower - FrameIndex XZWN F 3 297 - FrameIndex XZWN G 3 298 - FrameIndex XZWN H 3 299 - FrameIndex XZWN I 3 300 - FrameIndex XZWN J 3 301 // Raise - FrameIndex XZWN K 3 302 - FrameIndex XZWN L 3 303 - FrameIndex XZWN M 3 304 - FrameIndex XZWN N 3 305 - FrameIndex XZWN O 3 306 - FrameIndex XZWN P 3 307 } Model "DualExplodiumGun" @@ -517,19 +505,6 @@ Model "DualExplodiumGun" FrameIndex XZWK B 1 377 FrameIndex XZWK C 1 378 FrameIndex XZWK D 1 379 - SurfaceSkin 1 3 "ExplodiumGun.png" - // Lower - FrameIndex XZWM U 1 297 - FrameIndex XZWM V 1 298 - FrameIndex XZWM W 1 299 - FrameIndex XZWM X 1 300 - FrameIndex XZWM Y 1 301 // Raise - FrameIndex XZWM Z 1 302 - FrameIndex XZWN A 1 303 - FrameIndex XZWN B 1 304 - FrameIndex XZWN C 1 305 - FrameIndex XZWN D 1 306 - FrameIndex XZWN E 1 307 } Model "SWWMDualWeaponGiver" diff --git a/modeldef.hellblazer b/modeldef.hellblazer index a3e2535fb..93f7ecb87 100644 --- a/modeldef.hellblazer +++ b/modeldef.hellblazer @@ -21,87 +21,6 @@ Model "HellblazerMissile2" FrameIndex XZW1 A 0 0 } -Model "HellblazerCrackshot" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Cluster.png" - Scale 0.1 0.1 0.1 - USEACTORPITCH - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerCrackshot2" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Cluster.png" - Scale 0.1 0.1 0.1 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerClusterMini" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Cluster.png" - Scale 0.05 0.05 0.05 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerRavager" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Fire.png" - Scale 0.1 0.1 0.1 - USEACTORPITCH - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerRavager2" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Fire.png" - Scale 0.1 0.1 0.1 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerWarhead" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Nuke.png" - Scale 0.1 0.1 0.1 - USEACTORPITCH - - FrameIndex XZW1 A 0 0 -} -Model "HellblazerWarhead2" -{ - Path "models" - - Model 0 "HellblazerProj_d.3d" - Skin 0 "HellblazerMissile_Nuke.png" - Scale 0.1 0.1 0.1 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 -} Model "Hellblazer" { @@ -120,24 +39,6 @@ Model "Hellblazer" SurfaceSkin 0 4 "HellblazerAmmo.png" SurfaceSkin 0 5 "HellblazerAmmo.png" FrameIndex XZW1 A 0 0 - // Crackshots - SurfaceSkin 0 2 "HellblazerAmmo_Cluster.png" - SurfaceSkin 0 3 "" - SurfaceSkin 0 4 "HellblazerAmmo_Cluster.png" - SurfaceSkin 0 5 "" - FrameIndex XZW1 B 0 0 - // Ravagers - SurfaceSkin 0 2 "HellblazerAmmo_Fire.png" - SurfaceSkin 0 3 "" - SurfaceSkin 0 4 "HellblazerAmmo_Fire.png" - SurfaceSkin 0 5 "" - FrameIndex XZW1 C 0 0 - // Warheads - SurfaceSkin 0 2 "HellblazerAmmo_Nuke.png" - SurfaceSkin 0 3 "" - SurfaceSkin 0 4 "" - SurfaceSkin 0 5 "HellblazerAmmo_Nuke.png" - FrameIndex XZW1 D 0 0 } // individual missiles for pickup model @@ -169,33 +70,6 @@ Model "HellblazerXSub" SurfaceSkin 0 10 "" SurfaceSkin 0 11 "HellblazerMissile.png" FrameIndex XZW1 F 0 0 - SurfaceSkin 0 11 "" - // Crackshots - SurfaceSkin 0 6 "HellblazerMissile_Cluster.png" - FrameIndex XZW2 A 0 0 - SurfaceSkin 0 6 "" - SurfaceSkin 0 8 "HellblazerMissile_Cluster.png" - FrameIndex XZW2 B 0 0 - SurfaceSkin 0 8 "" - SurfaceSkin 0 10 "HellblazerMissile_Cluster.png" - FrameIndex XZW2 C 0 0 - SurfaceSkin 0 10 "" - // Ravagers - SurfaceSkin 0 6 "HellblazerMissile_Fire.png" - FrameIndex XZW3 A 0 0 - SurfaceSkin 0 6 "" - SurfaceSkin 0 8 "HellblazerMissile_Fire.png" - FrameIndex XZW3 B 0 0 - SurfaceSkin 0 8 "" - SurfaceSkin 0 10 "HellblazerMissile_Fire.png" - FrameIndex XZW3 C 0 0 - SurfaceSkin 0 10 "" - // Warheads - SurfaceSkin 0 6 "HellblazerMissile_Nuke.png" - FrameIndex XZW4 A 0 0 - SurfaceSkin 0 6 "" - SurfaceSkin 0 9 "HellblazerMissile_Nuke.png" - FrameIndex XZW4 B 0 0 } Model "HellblazerX" { @@ -213,7 +87,7 @@ Model "HellblazerX" } // translucent part -Model "Hellblazer" +/*Model "Hellblazer" { Path "models" @@ -383,9 +257,9 @@ Model "Hellblazer" FrameIndex XZWR G 2 155 FrameIndex XZWR H 2 156 FrameIndex XZWR I 2 157 -} +}*/ -Model "Hellblazer" +/*Model "Hellblazer" { Path "models" @@ -977,4 +851,4 @@ Model "Hellblazer" FrameIndex XZWR L 1 155 FrameIndex XZWR M 1 156 FrameIndex XZWR N 1 157 -} +}*/ diff --git a/modeldef.misc b/modeldef.misc index 160da78e6..a792e03d4 100644 --- a/modeldef.misc +++ b/modeldef.misc @@ -242,6 +242,72 @@ Model "MykradvoSmallNullTendril" FrameIndex XZW1 M 0 12 } +Model "SaltBeam" +{ + Path "models/extra" + + Model 0 "WarpBeam2_d.3d" + Scale 0.125 0.125 0.125 + Offset 16 0 0 + DONTCULLBACKFACES + USEACTORPITCH + USEACTORROLL + + // starter + Skin 0 "SaltBeamS.png" + + // base + FrameIndex XZW1 A 0 0 + // low deviation + FrameIndex XZW1 B 0 1 + FrameIndex XZW1 C 0 2 + FrameIndex XZW1 D 0 3 + FrameIndex XZW1 E 0 4 + // mid deviation + FrameIndex XZW1 F 0 5 + FrameIndex XZW1 G 0 6 + FrameIndex XZW1 H 0 7 + FrameIndex XZW1 I 0 8 + // high deviation + FrameIndex XZW1 J 0 9 + FrameIndex XZW1 K 0 10 + FrameIndex XZW1 L 0 11 + FrameIndex XZW1 M 0 12 + + // other + Skin 0 "SaltBeam.png" + + // base + FrameIndex XZW2 A 0 0 + // low deviation + FrameIndex XZW2 B 0 1 + FrameIndex XZW2 C 0 2 + FrameIndex XZW2 D 0 3 + FrameIndex XZW2 E 0 4 + // mid deviation + FrameIndex XZW2 F 0 5 + FrameIndex XZW2 G 0 6 + FrameIndex XZW2 H 0 7 + FrameIndex XZW2 I 0 8 + // high deviation + FrameIndex XZW2 J 0 9 + FrameIndex XZW2 K 0 10 + FrameIndex XZW2 L 0 11 + FrameIndex XZW2 M 0 12 +} + +Model "TheBall" +{ + Path "models" + + Model 0 "extra/BaseSphere_d.3d" + Skin 0 "envmap/leadenv.png" + Scale 0.006 0.006 0.006 + ZOffset 1 + + FrameIndex XZW1 A 0 0 +} + Model "SWWMShadow" { Path "models/extra" diff --git a/modeldef.spreadgun b/modeldef.spreadgun index 3a02eed7e..7bb5cfd9c 100644 --- a/modeldef.spreadgun +++ b/modeldef.spreadgun @@ -12,62 +12,6 @@ Model "RedShellCasing" ZOffset 1 FrameIndex XZW1 B 0 0 } -Model "GreenShellCasing" -{ - Path "models" - - Model 0 "ShotShell_d.3d" - Skin 0 "Shell_Slug_Used.png" - Scale 0.15 0.15 0.15 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 - ZOffset 1 - FrameIndex XZW1 B 0 0 -} -Model "BlueShellCasing" -{ - Path "models" - - Model 0 "ShotShell_d.3d" - Skin 0 "Shell_Kinylum_Used.png" - Scale 0.15 0.15 0.15 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 - ZOffset 1 - FrameIndex XZW1 B 0 0 -} -Model "BlackShellCasing" -{ - Path "models" - - Model 0 "ShotShell_d.3d" - Skin 0 "Shell_Fuck_Used.png" - Scale 0.15 0.15 0.15 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 - ZOffset 1 - FrameIndex XZW1 B 0 0 -} -Model "PurpleShellCasing" -{ - Path "models" - - Model 0 "ShotShell_d.3d" - Skin 0 "Shell_Ball_Used.png" - Scale 0.15 0.15 0.15 - USEACTORPITCH - USEACTORROLL - - FrameIndex XZW1 A 0 0 - ZOffset 1 - FrameIndex XZW1 B 0 0 -} Model "GoldShellCasing" { Path "models" @@ -83,86 +27,6 @@ Model "GoldShellCasing" FrameIndex XZW1 B 0 0 } -Model "SaltBeam" -{ - Path "models/extra" - - Model 0 "WarpBeam2_d.3d" - Scale 0.125 0.125 0.125 - Offset 16 0 0 - DONTCULLBACKFACES - USEACTORPITCH - USEACTORROLL - - // starter - Skin 0 "SaltBeamS.png" - - // base - FrameIndex XZW1 A 0 0 - // low deviation - FrameIndex XZW1 B 0 1 - FrameIndex XZW1 C 0 2 - FrameIndex XZW1 D 0 3 - FrameIndex XZW1 E 0 4 - // mid deviation - FrameIndex XZW1 F 0 5 - FrameIndex XZW1 G 0 6 - FrameIndex XZW1 H 0 7 - FrameIndex XZW1 I 0 8 - // high deviation - FrameIndex XZW1 J 0 9 - FrameIndex XZW1 K 0 10 - FrameIndex XZW1 L 0 11 - FrameIndex XZW1 M 0 12 - - // other - Skin 0 "SaltBeam.png" - - // base - FrameIndex XZW2 A 0 0 - // low deviation - FrameIndex XZW2 B 0 1 - FrameIndex XZW2 C 0 2 - FrameIndex XZW2 D 0 3 - FrameIndex XZW2 E 0 4 - // mid deviation - FrameIndex XZW2 F 0 5 - FrameIndex XZW2 G 0 6 - FrameIndex XZW2 H 0 7 - FrameIndex XZW2 I 0 8 - // high deviation - FrameIndex XZW2 J 0 9 - FrameIndex XZW2 K 0 10 - FrameIndex XZW2 L 0 11 - FrameIndex XZW2 M 0 12 -} - -Model "CorrosiveFlechette" -{ - Path "models" - - Model 0 "Boolet_a.3d" - Skin 0 "Boolet_Flech.png" - Scale 0.01 0.001 0.001 - USEACTORPITCH - USEACTORROLL - AngleOffset -90 - - FrameIndex XZW1 A 0 0 -} - -Model "TheBall" -{ - Path "models" - - Model 0 "extra/BaseSphere_d.3d" - Skin 0 "envmap/leadenv.png" - Scale 0.006 0.006 0.006 - ZOffset 1 - - FrameIndex XZW1 A 0 0 -} - Model "Spreadgun" { Path "models" @@ -190,31 +54,12 @@ Model "Spreadgun" Scale 0.13 0.13 0.13 Skin 2 "ShotgMuz.png" FrameIndex XZW0 A 2 0 - // slug - Scale 0.08 0.08 0.08 - Skin 2 "ShotgMuz.png" - FrameIndex XZW0 B 2 0 - // kinylum - Scale 0.13 0.13 0.13 - Skin 2 "ShotgMuzSalt.png" - FrameIndex XZW0 D 2 0 - // flechettes - Scale 0.1 0.1 0.1 - Skin 2 "ShotgMuz.png" - FrameIndex XZW0 E 2 0 - // ball - Scale 0.06 0.06 0.06 - Skin 2 "ShotgMuz.png" - FrameIndex XZW0 F 2 0 // gold Scale 0.2 0.2 0.2 Skin 2 "GoldMuz.png" - FrameIndex XZW0 G 2 0 + FrameIndex XZW0 B 2 0 } -// AAAAAAAAAAAA -// We really need a scripted way of changing surface skins so I don't have -// to do this. Hell this damn thing uses ALL current dummy sprite names (though not all 936 frames) Model "Spreadgun" { Path "models" @@ -275,9 +120,8 @@ Model "Spreadgun" FrameIndex XZW3 N 1 40 FrameIndex XZW3 O 1 41 FrameIndex XZW3 P 1 42 - // Unload (Red) - SurfaceSkin 1 4 "Shell_Normal_Used.png" - FrameIndex XZW3 Q 1 44 + // Unload + FrameIndex XZW3 Q 1 44 // Set SurfaceSkin 4 FrameIndex XZW3 R 1 45 FrameIndex XZW3 S 1 46 FrameIndex XZW3 T 1 47 @@ -294,841 +138,179 @@ Model "Spreadgun" FrameIndex XZW4 E 1 58 FrameIndex XZW4 F 1 59 FrameIndex XZW4 G 1 60 - SurfaceSkin 1 4 "" - FrameIndex XZW4 H 1 61 - // Unload (Green) - SurfaceSkin 1 4 "Shell_Slug_Used.png" - FrameIndex XZW4 I 1 44 - FrameIndex XZW4 J 1 45 - FrameIndex XZW4 K 1 46 - FrameIndex XZW4 L 1 47 - FrameIndex XZW4 M 1 48 - FrameIndex XZW4 N 1 49 - FrameIndex XZW4 O 1 50 - FrameIndex XZW4 P 1 51 - FrameIndex XZW4 Q 1 52 - FrameIndex XZW4 R 1 53 - FrameIndex XZW4 S 1 54 - FrameIndex XZW4 T 1 55 - FrameIndex XZW4 U 1 56 - FrameIndex XZW4 V 1 57 - FrameIndex XZW4 W 1 58 - FrameIndex XZW4 X 1 59 - FrameIndex XZW4 Y 1 60 - SurfaceSkin 1 4 "" - FrameIndex XZW4 Z 1 61 - // Unload (Blue) - SurfaceSkin 1 4 "Shell_Kinylum_Used.png" - FrameIndex XZW5 S 1 44 - FrameIndex XZW5 T 1 45 - FrameIndex XZW5 U 1 46 - FrameIndex XZW5 V 1 47 - FrameIndex XZW5 W 1 48 - FrameIndex XZW5 X 1 49 - FrameIndex XZW5 Y 1 50 - FrameIndex XZW5 Z 1 51 - FrameIndex XZW6 A 1 52 - FrameIndex XZW6 B 1 53 - FrameIndex XZW6 C 1 54 - FrameIndex XZW6 D 1 55 - FrameIndex XZW6 E 1 56 - FrameIndex XZW6 F 1 57 - FrameIndex XZW6 G 1 58 - FrameIndex XZW6 H 1 59 - FrameIndex XZW6 I 1 60 - SurfaceSkin 1 4 "" - FrameIndex XZW6 J 1 61 - // Unload (Black) - SurfaceSkin 1 4 "Shell_Fuck_Used.png" - FrameIndex XZW6 K 1 44 - FrameIndex XZW6 L 1 45 - FrameIndex XZW6 M 1 46 - FrameIndex XZW6 N 1 47 - FrameIndex XZW6 O 1 48 - FrameIndex XZW6 P 1 49 - FrameIndex XZW6 Q 1 50 - FrameIndex XZW6 R 1 51 - FrameIndex XZW6 S 1 52 - FrameIndex XZW6 T 1 53 - FrameIndex XZW6 U 1 54 - FrameIndex XZW6 V 1 55 - FrameIndex XZW6 W 1 56 - FrameIndex XZW6 X 1 57 - FrameIndex XZW6 Y 1 58 - FrameIndex XZW6 Z 1 59 - FrameIndex XZW7 A 1 60 - SurfaceSkin 1 4 "" - FrameIndex XZW7 B 1 61 - // Unload (Purple) - SurfaceSkin 1 4 "Shell_Ball_Used.png" - FrameIndex XZW7 C 1 44 - FrameIndex XZW7 D 1 45 - FrameIndex XZW7 E 1 46 - FrameIndex XZW7 F 1 47 - FrameIndex XZW7 G 1 48 - FrameIndex XZW7 H 1 49 - FrameIndex XZW7 I 1 50 - FrameIndex XZW7 J 1 51 - FrameIndex XZW7 K 1 52 - FrameIndex XZW7 L 1 53 - FrameIndex XZW7 M 1 54 - FrameIndex XZW7 N 1 55 - FrameIndex XZW7 O 1 56 - FrameIndex XZW7 P 1 57 - FrameIndex XZW7 Q 1 58 - FrameIndex XZW7 R 1 59 - FrameIndex XZW7 S 1 60 - SurfaceSkin 1 4 "" - FrameIndex XZW7 T 1 61 - // Unload (Gold) - SurfaceSkin 1 4 "Shell_Gold_Used.png" - FrameIndex XZW7 U 1 44 - FrameIndex XZW7 V 1 45 - FrameIndex XZW7 W 1 46 - FrameIndex XZW7 X 1 47 - FrameIndex XZW7 Y 1 48 - FrameIndex XZW7 Z 1 49 - FrameIndex XZW8 A 1 50 - FrameIndex XZW8 B 1 51 - FrameIndex XZW8 C 1 52 - FrameIndex XZW8 D 1 53 - FrameIndex XZW8 E 1 54 - FrameIndex XZW8 F 1 55 - FrameIndex XZW8 G 1 56 - FrameIndex XZW8 H 1 57 - FrameIndex XZW8 I 1 58 - FrameIndex XZW8 J 1 59 - FrameIndex XZW8 K 1 60 - SurfaceSkin 1 4 "" - FrameIndex XZW8 L 1 61 - // Load (Red) - SurfaceSkin 1 5 "Shell_Normal.png" - FrameIndex XZW8 M 1 62 - FrameIndex XZW8 N 1 63 - FrameIndex XZW8 O 1 64 - FrameIndex XZW8 P 1 65 - FrameIndex XZW8 Q 1 66 - FrameIndex XZW8 R 1 67 - FrameIndex XZW8 S 1 68 - FrameIndex XZW8 T 1 69 - FrameIndex XZW8 U 1 70 - FrameIndex XZW8 V 1 71 - FrameIndex XZW8 W 1 72 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Normal.png" - FrameIndex XZW8 X 1 73 - FrameIndex XZW8 Y 1 74 - FrameIndex XZW8 Z 1 75 - FrameIndex XZW9 A 1 76 - FrameIndex XZW9 B 1 77 - FrameIndex XZW9 C 1 78 - FrameIndex XZW9 D 1 79 - FrameIndex XZW9 E 1 80 - FrameIndex XZW9 F 1 81 - FrameIndex XZW9 G 1 82 - FrameIndex XZW9 H 1 83 - FrameIndex XZW9 I 1 84 - FrameIndex XZW9 J 1 85 - FrameIndex XZW9 K 1 86 - FrameIndex XZW9 L 1 87 - FrameIndex XZW9 M 1 88 - FrameIndex XZW9 N 1 89 - FrameIndex XZW9 O 1 90 - FrameIndex XZW9 P 1 91 - FrameIndex XZW9 Q 1 92 - FrameIndex XZW9 R 1 93 - FrameIndex XZW9 S 1 94 - SurfaceSkin 1 4 "" - // Load (Green) - SurfaceSkin 1 5 "Shell_Slug.png" - FrameIndex XZW9 T 1 62 - FrameIndex XZW9 U 1 63 - FrameIndex XZW9 V 1 64 - FrameIndex XZW9 W 1 65 - FrameIndex XZW9 X 1 66 - FrameIndex XZW9 Y 1 67 - FrameIndex XZW9 Z 1 68 - FrameIndex XZWA A 1 69 - FrameIndex XZWA B 1 70 - FrameIndex XZWA C 1 71 - FrameIndex XZWA D 1 72 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Slug.png" - FrameIndex XZWA E 1 73 - FrameIndex XZWA F 1 74 - FrameIndex XZWA G 1 75 - FrameIndex XZWA H 1 76 - FrameIndex XZWA I 1 77 - FrameIndex XZWA J 1 78 - FrameIndex XZWA K 1 79 - FrameIndex XZWA L 1 80 - FrameIndex XZWA M 1 81 - FrameIndex XZWA N 1 82 - FrameIndex XZWA O 1 83 - FrameIndex XZWA P 1 84 - FrameIndex XZWA Q 1 85 - FrameIndex XZWA R 1 86 - FrameIndex XZWA S 1 87 - FrameIndex XZWA T 1 88 - FrameIndex XZWA U 1 89 - FrameIndex XZWA V 1 90 - FrameIndex XZWA W 1 91 - FrameIndex XZWA X 1 92 - FrameIndex XZWA Y 1 93 - FrameIndex XZWA Z 1 94 - SurfaceSkin 1 4 "" - // Load (Blue) - SurfaceSkin 1 5 "Shell_Kinylum.png" - FrameIndex XZWC H 1 62 - FrameIndex XZWC I 1 63 - FrameIndex XZWC J 1 64 - FrameIndex XZWC K 1 65 - FrameIndex XZWC L 1 66 - FrameIndex XZWC M 1 67 - FrameIndex XZWC N 1 68 - FrameIndex XZWC O 1 69 - FrameIndex XZWC P 1 70 - FrameIndex XZWC Q 1 71 - FrameIndex XZWC R 1 72 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Kinylum.png" - FrameIndex XZWC S 1 73 - FrameIndex XZWC T 1 74 - FrameIndex XZWC U 1 75 - FrameIndex XZWC V 1 76 - FrameIndex XZWC W 1 77 - FrameIndex XZWC X 1 78 - FrameIndex XZWC Y 1 79 - FrameIndex XZWC Z 1 80 - FrameIndex XZWD A 1 81 - FrameIndex XZWD B 1 82 - FrameIndex XZWD C 1 83 - FrameIndex XZWD D 1 84 - FrameIndex XZWD E 1 85 - FrameIndex XZWD F 1 86 - FrameIndex XZWD G 1 87 - FrameIndex XZWD H 1 88 - FrameIndex XZWD I 1 89 - FrameIndex XZWD J 1 90 - FrameIndex XZWD K 1 91 - FrameIndex XZWD L 1 92 - FrameIndex XZWD M 1 93 - FrameIndex XZWD N 1 94 - SurfaceSkin 1 4 "" - // Load (Black) - SurfaceSkin 1 5 "Shell_Fuck.png" - FrameIndex XZWD O 1 62 - FrameIndex XZWD P 1 63 - FrameIndex XZWD Q 1 64 - FrameIndex XZWD R 1 65 - FrameIndex XZWD S 1 66 - FrameIndex XZWD T 1 67 - FrameIndex XZWD U 1 68 - FrameIndex XZWD V 1 69 - FrameIndex XZWD W 1 70 - FrameIndex XZWD X 1 71 - FrameIndex XZWD Y 1 72 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Fuck.png" - FrameIndex XZWD Z 1 73 - FrameIndex XZWE A 1 74 - FrameIndex XZWE B 1 75 - FrameIndex XZWE C 1 76 - FrameIndex XZWE D 1 77 - FrameIndex XZWE E 1 78 - FrameIndex XZWE F 1 79 - FrameIndex XZWE G 1 80 - FrameIndex XZWE H 1 81 - FrameIndex XZWE I 1 82 - FrameIndex XZWE J 1 83 - FrameIndex XZWE K 1 84 - FrameIndex XZWE L 1 85 - FrameIndex XZWE M 1 86 - FrameIndex XZWE N 1 87 - FrameIndex XZWE O 1 88 - FrameIndex XZWE P 1 89 - FrameIndex XZWE Q 1 90 - FrameIndex XZWE R 1 91 - FrameIndex XZWE S 1 92 - FrameIndex XZWE T 1 93 - FrameIndex XZWE U 1 94 - SurfaceSkin 1 4 "" - // Load (Purple) - SurfaceSkin 1 5 "Shell_Ball.png" - FrameIndex XZWE V 1 62 - FrameIndex XZWE W 1 63 - FrameIndex XZWE X 1 64 - FrameIndex XZWE Y 1 65 - FrameIndex XZWE Z 1 66 - FrameIndex XZWF A 1 67 - FrameIndex XZWF B 1 68 - FrameIndex XZWF C 1 69 - FrameIndex XZWF D 1 70 - FrameIndex XZWF E 1 71 - FrameIndex XZWF F 1 72 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Ball.png" - FrameIndex XZWF G 1 73 - FrameIndex XZWF H 1 74 - FrameIndex XZWF I 1 75 - FrameIndex XZWF J 1 76 - FrameIndex XZWF K 1 77 - FrameIndex XZWF L 1 78 - FrameIndex XZWF M 1 79 - FrameIndex XZWF N 1 80 - FrameIndex XZWF O 1 81 - FrameIndex XZWF P 1 82 - FrameIndex XZWF Q 1 83 - FrameIndex XZWF R 1 84 - FrameIndex XZWF S 1 85 - FrameIndex XZWF T 1 86 - FrameIndex XZWF U 1 87 - FrameIndex XZWF V 1 88 - FrameIndex XZWF W 1 89 - FrameIndex XZWF X 1 90 - FrameIndex XZWF Y 1 91 - FrameIndex XZWF Z 1 92 - FrameIndex XZWG A 1 93 - FrameIndex XZWG B 1 94 - SurfaceSkin 1 4 "" - // Load (Gold) - SurfaceSkin 1 5 "Shell_Gold.png" - FrameIndex XZWG C 1 62 - FrameIndex XZWG D 1 63 - FrameIndex XZWG E 1 64 - FrameIndex XZWG F 1 65 - FrameIndex XZWG G 1 66 - FrameIndex XZWG H 1 67 - FrameIndex XZWG I 1 68 - FrameIndex XZWG J 1 69 - FrameIndex XZWG K 1 70 - FrameIndex XZWG L 1 71 - FrameIndex XZWG M 1 72 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Gold.png" - FrameIndex XZWG N 1 73 - FrameIndex XZWG O 1 74 - FrameIndex XZWG P 1 75 - FrameIndex XZWG Q 1 76 - FrameIndex XZWG R 1 77 - FrameIndex XZWG S 1 78 - FrameIndex XZWG T 1 79 - FrameIndex XZWG U 1 80 - FrameIndex XZWG V 1 81 - FrameIndex XZWG W 1 82 - FrameIndex XZWG X 1 83 - FrameIndex XZWG Y 1 84 - FrameIndex XZWG Z 1 85 - FrameIndex XZWH A 1 86 - FrameIndex XZWH B 1 87 - FrameIndex XZWH C 1 88 - FrameIndex XZWH D 1 89 - FrameIndex XZWH E 1 90 - FrameIndex XZWH F 1 91 - FrameIndex XZWH G 1 92 - FrameIndex XZWH H 1 93 - FrameIndex XZWH I 1 94 - SurfaceSkin 1 4 "" + FrameIndex XZW4 H 1 61 // Unset SurfaceSkin 4 + // Load + FrameIndex XZW4 I 1 62 // Set SurfaceSkin 5 + FrameIndex XZW4 J 1 63 + FrameIndex XZW4 K 1 64 + FrameIndex XZW4 L 1 65 + FrameIndex XZW4 M 1 66 + FrameIndex XZW4 N 1 67 + FrameIndex XZW4 O 1 68 + FrameIndex XZW4 P 1 69 + FrameIndex XZW4 Q 1 70 + FrameIndex XZW4 R 1 71 + FrameIndex XZW4 S 1 72 // Unset SurfaceSkin 5 + FrameIndex XZW4 T 1 73 // Set SurfaceSkin 4 + FrameIndex XZW4 U 1 74 + FrameIndex XZW4 V 1 75 + FrameIndex XZW4 W 1 76 + FrameIndex XZW4 X 1 77 + FrameIndex XZW4 Y 1 78 + FrameIndex XZW4 Z 1 79 + FrameIndex XZW5 A 1 80 + FrameIndex XZW5 B 1 81 + FrameIndex XZW5 C 1 82 + FrameIndex XZW5 D 1 83 + FrameIndex XZW5 E 1 84 + FrameIndex XZW5 F 1 85 + FrameIndex XZW5 G 1 86 + FrameIndex XZW5 H 1 87 + FrameIndex XZW5 I 1 88 + FrameIndex XZW5 J 1 89 + FrameIndex XZW5 K 1 90 + FrameIndex XZW5 L 1 91 + FrameIndex XZW5 M 1 92 + FrameIndex XZW5 N 1 93 + FrameIndex XZW5 O 1 94 // Unset SurfaceSkin 4 ///// PRIMED (Again) // Check out - FrameIndex XZWH J 1 96 - FrameIndex XZWH K 1 97 - FrameIndex XZWH L 1 98 - FrameIndex XZWH M 1 99 - FrameIndex XZWH N 1 100 - FrameIndex XZWH O 1 101 - FrameIndex XZWH P 1 102 - FrameIndex XZWH Q 1 103 - FrameIndex XZWH R 1 104 - FrameIndex XZWH S 1 105 - FrameIndex XZWH T 1 106 - FrameIndex XZWH U 1 107 - FrameIndex XZWH V 1 108 - FrameIndex XZWH W 1 109 - FrameIndex XZWH X 1 110 - FrameIndex XZWH Y 1 111 - FrameIndex XZWH Z 1 112 - FrameIndex XZWI A 1 113 - FrameIndex XZWI B 1 114 - FrameIndex XZWI C 1 115 - FrameIndex XZWI D 1 116 - FrameIndex XZWI E 1 117 - FrameIndex XZWI F 1 118 - FrameIndex XZWI G 1 119 - FrameIndex XZWI H 1 120 - FrameIndex XZWI I 1 121 + FrameIndex XZW5 P 1 96 + FrameIndex XZW5 Q 1 97 + FrameIndex XZW5 R 1 98 + FrameIndex XZW5 S 1 99 + FrameIndex XZW5 T 1 100 + FrameIndex XZW5 U 1 101 + FrameIndex XZW5 V 1 102 + FrameIndex XZW5 W 1 103 + FrameIndex XZW5 X 1 104 + FrameIndex XZW5 Y 1 105 + FrameIndex XZW5 Z 1 106 + FrameIndex XZW6 A 1 107 + FrameIndex XZW6 B 1 108 + FrameIndex XZW6 C 1 109 + FrameIndex XZW6 D 1 110 + FrameIndex XZW6 E 1 111 + FrameIndex XZW6 F 1 112 + FrameIndex XZW6 G 1 113 + FrameIndex XZW6 H 1 114 + FrameIndex XZW6 I 1 115 + FrameIndex XZW6 J 1 116 + FrameIndex XZW6 K 1 117 + FrameIndex XZW6 L 1 118 + FrameIndex XZW6 M 1 119 + FrameIndex XZW6 N 1 120 + FrameIndex XZW6 O 1 121 // Melee - FrameIndex XZWI J 1 123 - FrameIndex XZWI K 1 124 - FrameIndex XZWI L 1 125 - FrameIndex XZWI M 1 126 - FrameIndex XZWI N 1 127 - FrameIndex XZWI O 1 128 - FrameIndex XZWI P 1 129 - FrameIndex XZWI Q 1 130 - FrameIndex XZWI R 1 131 - FrameIndex XZWI S 1 132 - FrameIndex XZWI T 1 133 - FrameIndex XZWI U 1 134 - FrameIndex XZWI V 1 135 + FrameIndex XZW7 P 1 123 + FrameIndex XZW7 Q 1 124 + FrameIndex XZW7 R 1 125 + FrameIndex XZW7 S 1 126 + FrameIndex XZW7 T 1 127 + FrameIndex XZW7 U 1 128 + FrameIndex XZW7 V 1 129 + FrameIndex XZW7 W 1 130 + FrameIndex XZW7 X 1 131 + FrameIndex XZW7 Y 1 132 + FrameIndex XZW7 Z 1 133 + FrameIndex XZW8 A 1 134 + FrameIndex XZW8 B 1 135 ////// FIRED (Extra) // Check out - FrameIndex XZWI W 1 138 - FrameIndex XZWI X 1 139 - FrameIndex XZWI Y 1 140 - FrameIndex XZWI Z 1 141 - FrameIndex XZWJ A 1 142 - FrameIndex XZWJ B 1 143 - FrameIndex XZWJ C 1 144 - FrameIndex XZWJ D 1 145 - FrameIndex XZWJ E 1 146 - FrameIndex XZWJ F 1 147 - FrameIndex XZWJ G 1 148 - FrameIndex XZWJ H 1 149 - FrameIndex XZWJ I 1 150 - FrameIndex XZWJ J 1 151 - FrameIndex XZWJ K 1 152 - FrameIndex XZWJ L 1 153 - FrameIndex XZWJ M 1 154 - FrameIndex XZWJ N 1 155 - FrameIndex XZWJ O 1 156 - FrameIndex XZWJ P 1 157 - FrameIndex XZWJ Q 1 158 - FrameIndex XZWJ R 1 159 - FrameIndex XZWJ S 1 160 - FrameIndex XZWJ T 1 161 - FrameIndex XZWJ U 1 162 - FrameIndex XZWJ V 1 163 + FrameIndex XZW8 C 1 138 + FrameIndex XZW8 D 1 139 + FrameIndex XZW8 E 1 140 + FrameIndex XZW8 F 1 141 + FrameIndex XZW8 G 1 142 + FrameIndex XZW8 H 1 143 + FrameIndex XZW8 I 1 144 + FrameIndex XZW8 J 1 145 + FrameIndex XZW8 K 1 146 + FrameIndex XZW8 L 1 147 + FrameIndex XZW8 M 1 148 + FrameIndex XZW8 N 1 149 + FrameIndex XZW8 O 1 150 + FrameIndex XZW8 P 1 151 + FrameIndex XZW8 Q 1 152 + FrameIndex XZW8 R 1 153 + FrameIndex XZW8 S 1 154 + FrameIndex XZW8 T 1 155 + FrameIndex XZW8 U 1 156 + FrameIndex XZW8 V 1 157 + FrameIndex XZW8 W 1 158 + FrameIndex XZW8 X 1 159 + FrameIndex XZW8 Y 1 160 + FrameIndex XZW8 Z 1 161 + FrameIndex XZW9 A 1 162 + FrameIndex XZW9 B 1 163 // Melee - FrameIndex XZWJ W 1 165 - FrameIndex XZWJ X 1 166 - FrameIndex XZWJ Y 1 167 - FrameIndex XZWJ Z 1 168 - FrameIndex XZWK A 1 169 - FrameIndex XZWK B 1 170 - FrameIndex XZWK C 1 171 - FrameIndex XZWK D 1 172 - FrameIndex XZWK E 1 173 - FrameIndex XZWK F 1 174 - FrameIndex XZWK G 1 175 - FrameIndex XZWK H 1 176 - FrameIndex XZWK I 1 177 + FrameIndex XZW9 C 1 165 + FrameIndex XZW9 D 1 166 + FrameIndex XZW9 E 1 167 + FrameIndex XZW9 F 1 168 + FrameIndex XZW9 G 1 169 + FrameIndex XZW9 H 1 170 + FrameIndex XZW9 I 1 171 + FrameIndex XZW9 J 1 172 + FrameIndex XZW9 K 1 173 + FrameIndex XZW9 L 1 174 + FrameIndex XZW9 M 1 175 + FrameIndex XZW9 N 1 176 + FrameIndex XZW9 O 1 177 ////// PRIMED (Extra) - // Unload (Red) - SurfaceSkin 1 4 "Shell_Normal.png" - FrameIndex XZWK J 1 180 - FrameIndex XZWK K 1 181 - FrameIndex XZWK L 1 182 - FrameIndex XZWK M 1 183 - FrameIndex XZWK N 1 184 - FrameIndex XZWK O 1 185 - FrameIndex XZWK P 1 186 - FrameIndex XZWK Q 1 187 - FrameIndex XZWK R 1 188 - FrameIndex XZWK S 1 189 - FrameIndex XZWK T 1 190 - FrameIndex XZWK U 1 191 - FrameIndex XZWK V 1 192 - FrameIndex XZWK W 1 193 - FrameIndex XZWK X 1 194 - FrameIndex XZWK Y 1 195 - FrameIndex XZWK Z 1 196 - SurfaceSkin 1 4 "" - FrameIndex XZWL A 1 197 - // Unload (Green) - SurfaceSkin 1 4 "Shell_Slug.png" - FrameIndex XZWL B 1 180 - FrameIndex XZWL C 1 181 - FrameIndex XZWL D 1 182 - FrameIndex XZWL E 1 183 - FrameIndex XZWL F 1 184 - FrameIndex XZWL G 1 185 - FrameIndex XZWL H 1 186 - FrameIndex XZWL I 1 187 - FrameIndex XZWL J 1 188 - FrameIndex XZWL K 1 189 - FrameIndex XZWL L 1 190 - FrameIndex XZWL M 1 191 - FrameIndex XZWL N 1 192 - FrameIndex XZWL O 1 193 - FrameIndex XZWL P 1 194 - FrameIndex XZWL Q 1 195 - FrameIndex XZWL R 1 196 - SurfaceSkin 1 4 "" - FrameIndex XZWL S 1 197 - // Unload (Blue) - SurfaceSkin 1 4 "Shell_Kinylum.png" - FrameIndex XZWM L 1 180 - FrameIndex XZWM M 1 181 - FrameIndex XZWM N 1 182 - FrameIndex XZWM O 1 183 - FrameIndex XZWM P 1 184 - FrameIndex XZWM Q 1 185 - FrameIndex XZWM R 1 186 - FrameIndex XZWM S 1 187 - FrameIndex XZWM T 1 188 - FrameIndex XZWM U 1 189 - FrameIndex XZWM V 1 190 - FrameIndex XZWM W 1 191 - FrameIndex XZWM X 1 192 - FrameIndex XZWM Y 1 193 - FrameIndex XZWM Z 1 194 - FrameIndex XZWN A 1 195 - FrameIndex XZWN B 1 196 - SurfaceSkin 1 4 "" - FrameIndex XZWN C 1 197 - // Unload (Black) - SurfaceSkin 1 4 "Shell_Fuck.png" - FrameIndex XZWN D 1 180 - FrameIndex XZWN E 1 181 - FrameIndex XZWN F 1 182 - FrameIndex XZWN G 1 183 - FrameIndex XZWN H 1 184 - FrameIndex XZWN I 1 185 - FrameIndex XZWN J 1 186 - FrameIndex XZWN K 1 187 - FrameIndex XZWN L 1 188 - FrameIndex XZWN M 1 189 - FrameIndex XZWN N 1 190 - FrameIndex XZWN O 1 191 - FrameIndex XZWN P 1 192 - FrameIndex XZWN Q 1 193 - FrameIndex XZWN R 1 194 - FrameIndex XZWN S 1 195 - FrameIndex XZWN T 1 196 - SurfaceSkin 1 4 "" - FrameIndex XZWN U 1 197 - // Unload (Purple) - SurfaceSkin 1 4 "Shell_Ball.png" - FrameIndex XZWN V 1 180 - FrameIndex XZWN W 1 181 - FrameIndex XZWN X 1 182 - FrameIndex XZWN Y 1 183 - FrameIndex XZWN Z 1 184 - FrameIndex XZWO A 1 185 - FrameIndex XZWO B 1 186 - FrameIndex XZWO C 1 187 - FrameIndex XZWO D 1 188 - FrameIndex XZWO E 1 189 - FrameIndex XZWO F 1 190 - FrameIndex XZWO G 1 191 - FrameIndex XZWO H 1 192 - FrameIndex XZWO I 1 193 - FrameIndex XZWO J 1 194 - FrameIndex XZWO K 1 195 - FrameIndex XZWO L 1 196 - SurfaceSkin 1 4 "" - FrameIndex XZWO M 1 197 - // Unload (Gold) - SurfaceSkin 1 4 "Shell_Gold.png" - FrameIndex XZWO N 1 180 - FrameIndex XZWO O 1 181 - FrameIndex XZWO P 1 182 - FrameIndex XZWO Q 1 183 - FrameIndex XZWO R 1 184 - FrameIndex XZWO S 1 185 - FrameIndex XZWO T 1 186 - FrameIndex XZWO U 1 187 - FrameIndex XZWO V 1 188 - FrameIndex XZWO W 1 189 - FrameIndex XZWO X 1 190 - FrameIndex XZWO Y 1 191 - FrameIndex XZWO Z 1 192 - FrameIndex XZWP A 1 193 - FrameIndex XZWP B 1 194 - FrameIndex XZWP C 1 195 - FrameIndex XZWP D 1 196 - SurfaceSkin 1 4 "" - FrameIndex XZWP E 1 197 - // Load (Red) - SurfaceSkin 1 5 "Shell_Normal.png" - FrameIndex XZWP F 1 198 - FrameIndex XZWP G 1 199 - FrameIndex XZWP H 1 200 - FrameIndex XZWP I 1 201 - FrameIndex XZWP J 1 202 - FrameIndex XZWP K 1 203 - FrameIndex XZWP L 1 204 - FrameIndex XZWP M 1 205 - FrameIndex XZWP N 1 206 - FrameIndex XZWP O 1 207 - FrameIndex XZWP P 1 208 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Normal.png" - FrameIndex XZWP Q 1 209 - FrameIndex XZWP R 1 210 - FrameIndex XZWP S 1 211 - FrameIndex XZWP T 1 212 - FrameIndex XZWP U 1 213 - FrameIndex XZWP V 1 214 - FrameIndex XZWP W 1 215 - FrameIndex XZWP X 1 216 - FrameIndex XZWP Y 1 217 - FrameIndex XZWP Z 1 218 - FrameIndex XZWQ A 1 219 - FrameIndex XZWQ B 1 220 - FrameIndex XZWQ C 1 221 - FrameIndex XZWQ D 1 222 - FrameIndex XZWQ E 1 223 - FrameIndex XZWQ F 1 224 - FrameIndex XZWQ G 1 225 - FrameIndex XZWQ H 1 226 - FrameIndex XZWQ I 1 227 - FrameIndex XZWQ J 1 228 - FrameIndex XZWQ K 1 229 - FrameIndex XZWQ L 1 230 - SurfaceSkin 1 4 "" - // Load (Green) - SurfaceSkin 1 5 "Shell_Slug.png" - FrameIndex XZWQ M 1 198 - FrameIndex XZWQ N 1 199 - FrameIndex XZWQ O 1 200 - FrameIndex XZWQ P 1 201 - FrameIndex XZWQ Q 1 202 - FrameIndex XZWQ R 1 203 - FrameIndex XZWQ S 1 204 - FrameIndex XZWQ T 1 205 - FrameIndex XZWQ U 1 206 - FrameIndex XZWQ V 1 207 - FrameIndex XZWQ W 1 208 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Slug.png" - FrameIndex XZWQ X 1 209 - FrameIndex XZWQ Y 1 210 - FrameIndex XZWQ Z 1 211 - FrameIndex XZWR A 1 212 - FrameIndex XZWR B 1 213 - FrameIndex XZWR C 1 214 - FrameIndex XZWR D 1 215 - FrameIndex XZWR E 1 216 - FrameIndex XZWR F 1 217 - FrameIndex XZWR G 1 218 - FrameIndex XZWR H 1 219 - FrameIndex XZWR I 1 220 - FrameIndex XZWR J 1 221 - FrameIndex XZWR K 1 222 - FrameIndex XZWR L 1 223 - FrameIndex XZWR M 1 224 - FrameIndex XZWR N 1 225 - FrameIndex XZWR O 1 226 - FrameIndex XZWR P 1 227 - FrameIndex XZWR Q 1 228 - FrameIndex XZWR R 1 229 - FrameIndex XZWR S 1 230 - SurfaceSkin 1 4 "" - // Load (Blue) - SurfaceSkin 1 5 "Shell_Kinylum.png" - FrameIndex XZWT A 1 198 - FrameIndex XZWT B 1 199 - FrameIndex XZWT C 1 200 - FrameIndex XZWT D 1 201 - FrameIndex XZWT E 1 202 - FrameIndex XZWT F 1 203 - FrameIndex XZWT G 1 204 - FrameIndex XZWT H 1 205 - FrameIndex XZWT I 1 206 - FrameIndex XZWT J 1 207 - FrameIndex XZWT K 1 208 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Kinylum.png" - FrameIndex XZWT L 1 209 - FrameIndex XZWT M 1 210 - FrameIndex XZWT N 1 211 - FrameIndex XZWT O 1 212 - FrameIndex XZWT P 1 213 - FrameIndex XZWT Q 1 214 - FrameIndex XZWT R 1 215 - FrameIndex XZWT S 1 216 - FrameIndex XZWT T 1 217 - FrameIndex XZWT U 1 218 - FrameIndex XZWT V 1 219 - FrameIndex XZWT W 1 220 - FrameIndex XZWT X 1 221 - FrameIndex XZWT Y 1 222 - FrameIndex XZWT Z 1 223 - FrameIndex XZWU A 1 224 - FrameIndex XZWU B 1 225 - FrameIndex XZWU C 1 226 - FrameIndex XZWU D 1 227 - FrameIndex XZWU E 1 228 - FrameIndex XZWU F 1 229 - FrameIndex XZWU G 1 230 - SurfaceSkin 1 4 "" - // Load (Black) - SurfaceSkin 1 5 "Shell_Fuck.png" - FrameIndex XZWU H 1 198 - FrameIndex XZWU I 1 199 - FrameIndex XZWU J 1 200 - FrameIndex XZWU K 1 201 - FrameIndex XZWU L 1 202 - FrameIndex XZWU M 1 203 - FrameIndex XZWU N 1 204 - FrameIndex XZWU O 1 205 - FrameIndex XZWU P 1 206 - FrameIndex XZWU Q 1 207 - FrameIndex XZWU R 1 208 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Fuck.png" - FrameIndex XZWU S 1 209 - FrameIndex XZWU T 1 210 - FrameIndex XZWU U 1 211 - FrameIndex XZWU V 1 212 - FrameIndex XZWU W 1 213 - FrameIndex XZWU X 1 214 - FrameIndex XZWU Y 1 215 - FrameIndex XZWU Z 1 216 - FrameIndex XZWV A 1 217 - FrameIndex XZWV B 1 218 - FrameIndex XZWV C 1 219 - FrameIndex XZWV D 1 220 - FrameIndex XZWV E 1 221 - FrameIndex XZWV F 1 222 - FrameIndex XZWV G 1 223 - FrameIndex XZWV H 1 224 - FrameIndex XZWV I 1 225 - FrameIndex XZWV J 1 226 - FrameIndex XZWV K 1 227 - FrameIndex XZWV L 1 228 - FrameIndex XZWV M 1 229 - FrameIndex XZWV N 1 230 - SurfaceSkin 1 4 "" - // Load (Purple) - SurfaceSkin 1 5 "Shell_Ball.png" - FrameIndex XZWV O 1 198 - FrameIndex XZWV P 1 199 - FrameIndex XZWV Q 1 200 - FrameIndex XZWV R 1 201 - FrameIndex XZWV S 1 202 - FrameIndex XZWV T 1 203 - FrameIndex XZWV U 1 204 - FrameIndex XZWV V 1 205 - FrameIndex XZWV W 1 206 - FrameIndex XZWV X 1 207 - FrameIndex XZWV Y 1 208 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Ball.png" - FrameIndex XZWV Z 1 209 - FrameIndex XZWW A 1 210 - FrameIndex XZWW B 1 211 - FrameIndex XZWW C 1 212 - FrameIndex XZWW D 1 213 - FrameIndex XZWW E 1 214 - FrameIndex XZWW F 1 215 - FrameIndex XZWW G 1 216 - FrameIndex XZWW H 1 217 - FrameIndex XZWW I 1 218 - FrameIndex XZWW J 1 219 - FrameIndex XZWW K 1 220 - FrameIndex XZWW L 1 221 - FrameIndex XZWW M 1 222 - FrameIndex XZWW N 1 223 - FrameIndex XZWW O 1 224 - FrameIndex XZWW P 1 225 - FrameIndex XZWW Q 1 226 - FrameIndex XZWW R 1 227 - FrameIndex XZWW S 1 228 - FrameIndex XZWW T 1 229 - FrameIndex XZWW U 1 230 - SurfaceSkin 1 4 "" - // Load (Gold) - SurfaceSkin 1 5 "Shell_Gold.png" - FrameIndex XZWW V 1 198 - FrameIndex XZWW W 1 199 - FrameIndex XZWW X 1 200 - FrameIndex XZWW Y 1 201 - FrameIndex XZWW Z 1 202 - FrameIndex XZWX A 1 203 - FrameIndex XZWX B 1 204 - FrameIndex XZWX C 1 205 - FrameIndex XZWX D 1 206 - FrameIndex XZWX E 1 207 - FrameIndex XZWX F 1 208 - SurfaceSkin 1 5 "" - SurfaceSkin 1 4 "Shell_Gold.png" - FrameIndex XZWX G 1 209 - FrameIndex XZWX H 1 210 - FrameIndex XZWX I 1 211 - FrameIndex XZWX J 1 212 - FrameIndex XZWX K 1 213 - FrameIndex XZWX L 1 214 - FrameIndex XZWX M 1 215 - FrameIndex XZWX N 1 216 - FrameIndex XZWX O 1 217 - FrameIndex XZWX P 1 218 - FrameIndex XZWX Q 1 219 - FrameIndex XZWX R 1 220 - FrameIndex XZWX S 1 221 - FrameIndex XZWX T 1 222 - FrameIndex XZWX U 1 223 - FrameIndex XZWX V 1 224 - FrameIndex XZWX W 1 225 - FrameIndex XZWX X 1 226 - FrameIndex XZWX Y 1 227 - FrameIndex XZWX Z 1 228 - FrameIndex XZWY A 1 229 - FrameIndex XZWY B 1 230 - SurfaceSkin 1 4 "" - // Empty Unload - FrameIndex XZWY C 1 232 - FrameIndex XZWY D 1 233 - FrameIndex XZWY E 1 234 - FrameIndex XZWY F 1 235 - FrameIndex XZWY G 1 236 - FrameIndex XZWY H 1 237 - FrameIndex XZWY I 1 238 - FrameIndex XZWY J 1 239 - FrameIndex XZWY K 1 240 - FrameIndex XZWY L 1 241 - FrameIndex XZWY M 1 242 - FrameIndex XZWY N 1 243 - FrameIndex XZWY O 1 244 - FrameIndex XZWY P 1 245 - FrameIndex XZWY Q 1 246 - FrameIndex XZWY R 1 247 - FrameIndex XZWY S 1 248 - FrameIndex XZWY T 1 249 - FrameIndex XZWY U 1 250 - // Empty Load - FrameIndex XZWY V 1 251 - FrameIndex XZWY W 1 252 - FrameIndex XZWY X 1 253 - FrameIndex XZWY Y 1 254 - FrameIndex XZWY Z 1 255 - FrameIndex XZWZ A 1 256 - FrameIndex XZWZ B 1 257 - FrameIndex XZWZ C 1 258 - FrameIndex XZWZ D 1 259 - FrameIndex XZWZ E 1 260 - FrameIndex XZWZ F 1 261 - FrameIndex XZWZ G 1 262 - FrameIndex XZWZ H 1 263 - FrameIndex XZWZ I 1 264 - FrameIndex XZWZ J 1 265 - FrameIndex XZWZ K 1 266 - FrameIndex XZWZ L 1 267 - FrameIndex XZWZ M 1 268 - FrameIndex XZWZ N 1 269 - FrameIndex XZWZ O 1 270 - // Empty Load (Fired) - FrameIndex XZWZ P 1 272 - FrameIndex XZWZ Q 1 273 - FrameIndex XZWZ R 1 274 - FrameIndex XZWZ S 1 275 - FrameIndex XZWZ T 1 276 - FrameIndex XZWZ U 1 277 - FrameIndex XZWZ V 1 278 - FrameIndex XZWZ W 1 279 - FrameIndex XZWZ X 1 280 - FrameIndex XZWZ Y 1 281 - FrameIndex XZWZ Z 1 282 - FrameIndex XZW0 H 1 283 - FrameIndex XZW0 I 1 284 - FrameIndex XZW0 J 1 285 - FrameIndex XZW0 K 1 286 - FrameIndex XZW0 L 1 287 - FrameIndex XZW0 M 1 288 - FrameIndex XZW0 N 1 289 - FrameIndex XZW0 O 1 290 - FrameIndex XZW0 P 1 291 - FrameIndex XZW0 Q 1 292 + // Unload + FrameIndex XZW9 P 1 180 // Set SurfaceSkin 4 + FrameIndex XZW9 Q 1 181 + FrameIndex XZW9 R 1 182 + FrameIndex XZW9 S 1 183 + FrameIndex XZW9 T 1 184 + FrameIndex XZW9 U 1 185 + FrameIndex XZW9 V 1 186 + FrameIndex XZW9 W 1 187 + FrameIndex XZW9 X 1 188 + FrameIndex XZW9 Y 1 189 + FrameIndex XZW9 Z 1 190 + FrameIndex XZWA A 1 191 + FrameIndex XZWA B 1 192 + FrameIndex XZWA C 1 193 + FrameIndex XZWA D 1 194 + FrameIndex XZWA E 1 195 + FrameIndex XZWA F 1 196 + FrameIndex XZWA G 1 197 // Unset SurfaceSkin 4 + // Load + FrameIndex XZWA H 1 198 // Set SurfaceSkin 5 + FrameIndex XZWA I 1 199 + FrameIndex XZWA J 1 200 + FrameIndex XZWA K 1 201 + FrameIndex XZWA L 1 202 + FrameIndex XZWA M 1 203 + FrameIndex XZWA N 1 204 + FrameIndex XZWA O 1 205 + FrameIndex XZWA P 1 206 + FrameIndex XZWA Q 1 207 + FrameIndex XZWA R 1 208 // Unset SurfaceSkin 5 + FrameIndex XZWA S 1 209 // Set SurfaceSkin 4 + FrameIndex XZWA T 1 210 + FrameIndex XZWA U 1 211 + FrameIndex XZWA V 1 212 + FrameIndex XZWA W 1 213 + FrameIndex XZWA X 1 214 + FrameIndex XZWA Y 1 215 + FrameIndex XZWA Z 1 216 + FrameIndex XZWB A 1 217 + FrameIndex XZWB B 1 218 + FrameIndex XZWB C 1 219 + FrameIndex XZWB D 1 220 + FrameIndex XZWB E 1 221 + FrameIndex XZWB F 1 222 + FrameIndex XZWB G 1 223 + FrameIndex XZWB H 1 224 + FrameIndex XZWB I 1 225 + FrameIndex XZWB J 1 226 + FrameIndex XZWB K 1 227 + FrameIndex XZWB L 1 228 + FrameIndex XZWB M 1 229 + FrameIndex XZWB N 1 230 // Unset SurfaceSkin 4 + + // Empty unload/load frames no longer needed } diff --git a/modeldef.wallbuster b/modeldef.wallbuster index 933805365..ac8bc9dca 100644 --- a/modeldef.wallbuster +++ b/modeldef.wallbuster @@ -78,168 +78,9 @@ Model "Wallbuster" FrameIndex XZWW X 3 0 Offset 0.726079 -60 -23.3369 FrameIndex XZWW Y 3 0 - // Slug - Scale 0.08 0.08 0.08 - Skin 3 "ShotgMuz.png" - Offset 12 -60 -11 - FrameIndex XZWX A 3 0 - Offset 14.8532 -60 -13.0729 - FrameIndex XZWX B 3 0 - Offset 13.7634 -60 -16.4271 - FrameIndex XZWX C 3 0 - Offset 10.2366 -60 -16.4271 - FrameIndex XZWX D 3 0 - Offset 9.14683 -60 -13.0729 - FrameIndex XZWX E 3 0 - Offset 24.3637 -60 -19.9828 - FrameIndex XZWX F 3 0 - Offset 23.2739 -60 -23.3369 - FrameIndex XZWX G 3 0 - Offset 19.7472 -60 -23.3369 - FrameIndex XZWX H 3 0 - Offset 18.6574 -60 -19.9828 - FrameIndex XZWX I 3 0 - Offset 21.5106 -60 -17.9098 - FrameIndex XZWX J 3 0 - Offset 19.6412 -60 -34.5172 - FrameIndex XZWX K 3 0 - Offset 16.1145 -60 -34.5172 - FrameIndex XZWX L 3 0 - Offset 15.0247 -60 -31.1631 - FrameIndex XZWX M 3 0 - Offset 17.8779 -60 -29.0902 - FrameIndex XZWX N 3 0 - Offset 20.731 -60 -31.1631 - FrameIndex XZWX O 3 0 - Offset 4.35879 -60 -34.5172 - FrameIndex XZWX P 3 0 - Offset 3.26898 -60 -31.1631 - FrameIndex XZWX Q 3 0 - Offset 6.12215 -60 -29.0902 - FrameIndex XZWX R 3 0 - Offset 8.97532 -60 -31.1631 - FrameIndex XZWX S 3 0 - Offset 7.8855 -60 -34.5172 - FrameIndex XZWX T 3 0 - Offset -0.363735 -60 -19.9828 - FrameIndex XZWX U 3 0 - Offset 2.48943 -60 -17.9098 - FrameIndex XZWX V 3 0 - Offset 5.3426 -60 -19.9828 - FrameIndex XZWX W 3 0 - Offset 4.25279 -60 -23.3369 - FrameIndex XZWX X 3 0 - Offset 0.726079 -60 -23.3369 - FrameIndex XZWX Y 3 0 - // Kinylum - Scale 0.13 0.13 0.13 - Skin 3 "ShotgMuzSalt.png" - Offset 12 -60 -11 - FrameIndex XZWY A 3 0 - Offset 14.8532 -60 -13.0729 - FrameIndex XZWY B 3 0 - Offset 13.7634 -60 -16.4271 - FrameIndex XZWY C 3 0 - Offset 10.2366 -60 -16.4271 - FrameIndex XZWY D 3 0 - Offset 9.14683 -60 -13.0729 - FrameIndex XZWY E 3 0 - Offset 24.3637 -60 -19.9828 - FrameIndex XZWY F 3 0 - Offset 23.2739 -60 -23.3369 - FrameIndex XZWY G 3 0 - Offset 19.7472 -60 -23.3369 - FrameIndex XZWY H 3 0 - Offset 18.6574 -60 -19.9828 - FrameIndex XZWY I 3 0 - Offset 21.5106 -60 -17.9098 - FrameIndex XZWY J 3 0 - Offset 19.6412 -60 -34.5172 - FrameIndex XZWY K 3 0 - Offset 16.1145 -60 -34.5172 - FrameIndex XZWY L 3 0 - Offset 15.0247 -60 -31.1631 - FrameIndex XZWY M 3 0 - Offset 17.8779 -60 -29.0902 - FrameIndex XZWY N 3 0 - Offset 20.731 -60 -31.1631 - FrameIndex XZWY O 3 0 - Offset 4.35879 -60 -34.5172 - FrameIndex XZWY P 3 0 - Offset 3.26898 -60 -31.1631 - FrameIndex XZWY Q 3 0 - Offset 6.12215 -60 -29.0902 - FrameIndex XZWY R 3 0 - Offset 8.97532 -60 -31.1631 - FrameIndex XZWY S 3 0 - Offset 7.8855 -60 -34.5172 - FrameIndex XZWY T 3 0 - Offset -0.363735 -60 -19.9828 - FrameIndex XZWY U 3 0 - Offset 2.48943 -60 -17.9098 - FrameIndex XZWY V 3 0 - Offset 5.3426 -60 -19.9828 - FrameIndex XZWY W 3 0 - Offset 4.25279 -60 -23.3369 - FrameIndex XZWY X 3 0 - Offset 0.726079 -60 -23.3369 - FrameIndex XZWY Y 3 0 - // Ball - Scale 0.06 0.06 0.06 - Skin 3 "ShotgMuz.png" - Offset 12 -60 -11 - FrameIndex XZWZ A 3 0 - Offset 14.8532 -60 -13.0729 - FrameIndex XZWZ B 3 0 - Offset 13.7634 -60 -16.4271 - FrameIndex XZWZ C 3 0 - Offset 10.2366 -60 -16.4271 - FrameIndex XZWZ D 3 0 - Offset 9.14683 -60 -13.0729 - FrameIndex XZWZ E 3 0 - Offset 24.3637 -60 -19.9828 - FrameIndex XZWZ F 3 0 - Offset 23.2739 -60 -23.3369 - FrameIndex XZWZ G 3 0 - Offset 19.7472 -60 -23.3369 - FrameIndex XZWZ H 3 0 - Offset 18.6574 -60 -19.9828 - FrameIndex XZWZ I 3 0 - Offset 21.5106 -60 -17.9098 - FrameIndex XZWZ J 3 0 - Offset 19.6412 -60 -34.5172 - FrameIndex XZWZ K 3 0 - Offset 16.1145 -60 -34.5172 - FrameIndex XZWZ L 3 0 - Offset 15.0247 -60 -31.1631 - FrameIndex XZWZ M 3 0 - Offset 17.8779 -60 -29.0902 - FrameIndex XZWZ N 3 0 - Offset 20.731 -60 -31.1631 - FrameIndex XZWZ O 3 0 - Offset 4.35879 -60 -34.5172 - FrameIndex XZWZ P 3 0 - Offset 3.26898 -60 -31.1631 - FrameIndex XZWZ Q 3 0 - Offset 6.12215 -60 -29.0902 - FrameIndex XZWZ R 3 0 - Offset 8.97532 -60 -31.1631 - FrameIndex XZWZ S 3 0 - Offset 7.8855 -60 -34.5172 - FrameIndex XZWZ T 3 0 - Offset -0.363735 -60 -19.9828 - FrameIndex XZWZ U 3 0 - Offset 2.48943 -60 -17.9098 - FrameIndex XZWZ V 3 0 - Offset 5.3426 -60 -19.9828 - FrameIndex XZWZ W 3 0 - Offset 4.25279 -60 -23.3369 - FrameIndex XZWZ X 3 0 - Offset 0.726079 -60 -23.3369 - FrameIndex XZWZ Y 3 0 } -Model "Wallbuster" +/*Model "Wallbuster" { // shells Path "models" @@ -466,7 +307,7 @@ Model "Wallbuster" FrameIndex XZWH G 2 98 FrameIndex XZWH H 2 99 FrameIndex XZWH I 2 100 -} +}*/ Model "Wallbuster" { diff --git a/models/Boolet_Flech.png b/models/Boolet_Flech.png deleted file mode 100644 index 3f2c1d20e..000000000 Binary files a/models/Boolet_Flech.png and /dev/null differ diff --git a/models/HellblazerAmmo_Cluster.png b/models/HellblazerAmmo_Cluster.png deleted file mode 100644 index 9fe97e8b7..000000000 Binary files a/models/HellblazerAmmo_Cluster.png and /dev/null differ diff --git a/models/HellblazerAmmo_Fire.png b/models/HellblazerAmmo_Fire.png deleted file mode 100644 index a6c42961f..000000000 Binary files a/models/HellblazerAmmo_Fire.png and /dev/null differ diff --git a/models/HellblazerAmmo_Nuke.png b/models/HellblazerAmmo_Nuke.png deleted file mode 100644 index e0e581abd..000000000 Binary files a/models/HellblazerAmmo_Nuke.png and /dev/null differ diff --git a/models/HellblazerMissile_Cluster.png b/models/HellblazerMissile_Cluster.png deleted file mode 100644 index 8c1bfa7f6..000000000 Binary files a/models/HellblazerMissile_Cluster.png and /dev/null differ diff --git a/models/HellblazerMissile_Fire.png b/models/HellblazerMissile_Fire.png deleted file mode 100644 index d0f81a050..000000000 Binary files a/models/HellblazerMissile_Fire.png and /dev/null differ diff --git a/models/HellblazerMissile_Nuke.png b/models/HellblazerMissile_Nuke.png deleted file mode 100644 index 09464e43a..000000000 Binary files a/models/HellblazerMissile_Nuke.png and /dev/null differ diff --git a/models/ShellAmmo_Eight_a.3d b/models/ShellAmmo_Eight_a.3d new file mode 100644 index 000000000..2935bd23a Binary files /dev/null and b/models/ShellAmmo_Eight_a.3d differ diff --git a/models/ShellAmmo_Eight_d.3d b/models/ShellAmmo_Eight_d.3d new file mode 100644 index 000000000..2fba63884 Binary files /dev/null and b/models/ShellAmmo_Eight_d.3d differ diff --git a/models/ShellAmmo_Sixteen_a.3d b/models/ShellAmmo_Sixteen_a.3d new file mode 100644 index 000000000..3dac8400c Binary files /dev/null and b/models/ShellAmmo_Sixteen_a.3d differ diff --git a/models/ShellAmmo_Sixteen_d.3d b/models/ShellAmmo_Sixteen_d.3d new file mode 100644 index 000000000..d6959b43d Binary files /dev/null and b/models/ShellAmmo_Sixteen_d.3d differ diff --git a/models/ShellAmmo_Twelve_a.3d b/models/ShellAmmo_Twelve_a.3d new file mode 100644 index 000000000..06b664679 Binary files /dev/null and b/models/ShellAmmo_Twelve_a.3d differ diff --git a/models/ShellAmmo_Twelve_d.3d b/models/ShellAmmo_Twelve_d.3d new file mode 100644 index 000000000..31e2a30d2 Binary files /dev/null and b/models/ShellAmmo_Twelve_d.3d differ diff --git a/models/Shell_Ball.png b/models/Shell_Ball.png deleted file mode 100644 index 1e9432f88..000000000 Binary files a/models/Shell_Ball.png and /dev/null differ diff --git a/models/Shell_Ball_Used.png b/models/Shell_Ball_Used.png deleted file mode 100644 index d44658d45..000000000 Binary files a/models/Shell_Ball_Used.png and /dev/null differ diff --git a/models/Shell_Fuck.png b/models/Shell_Fuck.png deleted file mode 100644 index a8f034e73..000000000 Binary files a/models/Shell_Fuck.png and /dev/null differ diff --git a/models/Shell_Fuck_Used.png b/models/Shell_Fuck_Used.png deleted file mode 100644 index 5407b103a..000000000 Binary files a/models/Shell_Fuck_Used.png and /dev/null differ diff --git a/models/Shell_Kinylum.png b/models/Shell_Kinylum.png deleted file mode 100644 index f821782aa..000000000 Binary files a/models/Shell_Kinylum.png and /dev/null differ diff --git a/models/Shell_Kinylum_Used.png b/models/Shell_Kinylum_Used.png deleted file mode 100644 index 515fa3d6b..000000000 Binary files a/models/Shell_Kinylum_Used.png and /dev/null differ diff --git a/models/Shell_Slug.png b/models/Shell_Slug.png deleted file mode 100644 index 164241a4a..000000000 Binary files a/models/Shell_Slug.png and /dev/null differ diff --git a/models/Shell_Slug_Used.png b/models/Shell_Slug_Used.png deleted file mode 100644 index b51cb5f75..000000000 Binary files a/models/Shell_Slug_Used.png and /dev/null differ diff --git a/readme.txt b/readme.txt index c00e10a82..8ea0e9a57 100644 --- a/readme.txt +++ b/readme.txt @@ -132,9 +132,7 @@ You can have two of them, by the way. Slot 3. Shotgun. Coming from Instant Action 3, of all places, here's this thing. Primary fire fires (duh). -Secondary fire switches the ammo type for next reload on tap. Holding it and -tapping the fire button will unload whatever ammo you have inside, in case you -want to use it on the other shotgun weapon. +Secondary fire switches to golden shells (if you've got any). Reload does what you'd expect it to do. This thing may be unwieldy, but boy does it let you use some fun ammo types. @@ -145,7 +143,8 @@ A slight readjustment of a weapon from Total Destruction (cancelled). Primary fire fires one barrel. Secondary fire fires five barrels. Tertiary fire fires all barrels. -Reload opens the reload menu. The instructions provided are self-explanatory. +Reload will start topping up the gun with shells, one cylinder at a time, until +you press it again or any fire button. Shooting multiple barrels may allow you to bust doors, bars, and other structures, quite handy. @@ -167,8 +166,7 @@ long-awaited Mk3 model of this marriage between demonic and human technology. Primary fire shoots the rocket. You can hold it to preload a couple more for a burst attack. Tapping the opposite button while doing so will stop the preload. Secondary fire launches it as a bouncing grenade. Same deal. -Tertiary fire cycles ammo types for next reload. But if you're holding in some -rockets, it will instead select targets for seeking. +Tertiary fire, when holding in some rockets, will select targets for seeking. Reload does what you'd expect. But when holding rockets, it clears any selected seek targets. That's pretty much all. @@ -187,9 +185,9 @@ at the price of some slight unstability (you might hurt yourself with it). Slot 8. Sniper rifle. The big and bulky brother of that unwieldy thing from Ultra Suite. Primary fire (you guessed it) shoots. -Secondary fire cycles ammo types for reload on tap. On hold, tap primary fire -to manually cycle the bolt, should you need to. -Reload does what you'd expect. +Secondary fire allows for special actions when held. Combine with primary fire +to manually cycle the bolt, and with reload to reload secondary ammo (if any). +Reload does what you'd expect (as long as you have primary ammo). Tertiary fire is a zoom. Hold to keep increasing the zoom factor, up to 16x. Crouching with this weapon braces it and disengages the recoil compensator, which can definitely cause some self-hurt from how hot the jet gas can get. diff --git a/sndinfo.base b/sndinfo.base index 8954ee4ed..bdc14d6c9 100644 --- a/sndinfo.base +++ b/sndinfo.base @@ -96,6 +96,13 @@ misc/waterexit sounds/general/surfaceb.ogg misc/slimeexit sounds/general/GoopE1.ogg misc/lavaexit sounds/general/LavaE1.ogg +misc/slughit1 sounds/general/slughit1.ogg +misc/slughit2 sounds/general/slughit2.ogg +$random misc/slughit { misc/slughit1 misc/slughit2 } +misc/slughitf1 sounds/general/slughitf1.ogg +misc/slughitf2 sounds/general/slughitf2.ogg +$random misc/slughitf { misc/slughitf1 misc/slughitgf2 } + misc/ricochet1 sounds/general/ric1.ogg misc/ricochet2 sounds/general/ric2.ogg misc/ricochet3 sounds/general/ric3.ogg diff --git a/sndinfo.items b/sndinfo.items index 716cf2d2a..8a3675479 100644 --- a/sndinfo.items +++ b/sndinfo.items @@ -101,3 +101,32 @@ chancebox/explode1 sounds/items/lootexpl1.ogg chancebox/explode2 sounds/items/lootexpl2.ogg chancebox/explode3 sounds/items/lootexpl3.ogg $random chancebox/explode { chancebox/explode1 chancebox/explode2 chancebox/explode3 } + +// TBD 1.4 (Ballsy Bomb) +leadball/fire1 sounds/items/leadballfire1.ogg +leadball/fire2 sounds/items/leadballfire2.ogg +$random leadball/fire { leadball/fire1 leadball/fire2 } +$limit leadball/fire 16 +leadball/hit1 sounds/items/leadball1.ogg +leadball/hit2 sounds/items/leadball2.ogg +leadball/hit3 sounds/items/leadball3.ogg +$random leadball/hit { leadball/hit1 leadball/hit2 leadball/hit3 } +leadball/hitf1 sounds/items/leadballf1.ogg +leadball/hitf2 sounds/items/leadballf2.ogg +leadball/hitf3 sounds/items/leadballf3.ogg +$random leadball/hitf { leadball/hitf1 leadball/hitf2 leadball/hitf3 } +leadball/fly sounds/items/leadballfly.ogg + +// TBD 1.4 (Battle-Boi Sentry) +saltshot/hit1 sounds/items/salthit1.ogg +saltshot/hit2 sounds/items/salthit2.ogg +saltshot/hit3 sounds/items/salthit3.ogg +saltshot/hit4 sounds/items/salthit4.ogg +$random saltshot/hit { saltshot/hit1 saltshot/hit2 saltshot/hit3 saltshot/hit4 } +$limit saltshot/hit 32 +saltshot/trail1 sounds/items/salttrail1.ogg +saltshot/trail2 sounds/items/salttrail2.ogg +saltshot/trail3 sounds/items/salttrail3.ogg +saltshot/trail4 sounds/items/salttrail4.ogg +$random saltshot/trail { saltshot/trail1 saltshot/trail2 saltshot/trail3 saltshot/trail4 } +$limit saltshot/trail 32 diff --git a/sndinfo.weapons b/sndinfo.weapons index 9c3e631bc..1018de231 100644 --- a/sndinfo.weapons +++ b/sndinfo.weapons @@ -63,21 +63,6 @@ spreadgun/redfire1 sounds/spreadgun/spread_redfire1.ogg spreadgun/redfire2 sounds/spreadgun/spread_redfire2.ogg $random spreadgun/redfire { spreadgun/redfire1 spreadgun/redfire2 } $limit spreadgun/redfire 16 -spreadgun/greenfire1 sounds/spreadgun/spread_greenfire1.ogg -spreadgun/greenfire2 sounds/spreadgun/spread_greenfire2.ogg -$random spreadgun/greenfire { spreadgun/greenfire1 spreadgun/greenfire2 } -$limit spreadgun/greenfire 16 -spreadgun/bluefire1 sounds/spreadgun/spread_bluefire1.ogg -spreadgun/bluefire2 sounds/spreadgun/spread_bluefire2.ogg -$random spreadgun/bluefire { spreadgun/bluefire1 spreadgun/bluefire2 } -$limit spreadgun/bluefire 16 -spreadgun/blackfire1 sounds/spreadgun/spread_blackfire1.ogg -spreadgun/blackfire2 sounds/spreadgun/spread_blackfire2.ogg -$random spreadgun/blackfire { spreadgun/blackfire1 spreadgun/blackfire2 } -spreadgun/purplefire1 sounds/spreadgun/spread_purplefire1.ogg -spreadgun/purplefire2 sounds/spreadgun/spread_purplefire2.ogg -$random spreadgun/purplefire { spreadgun/purplefire1 spreadgun/purplefire2 } -$limit spreadgun/purplefire 16 spreadgun/goldfire1 sounds/spreadgun/spread_goldfire1.ogg spreadgun/goldfire2 sounds/spreadgun/spread_goldfire2.ogg $random spreadgun/goldfire { spreadgun/goldfire1 spreadgun/goldfire2 } @@ -111,38 +96,6 @@ spreadgun/pelletf5 sounds/spreadgun/spread_pelletf5.ogg spreadgun/pelletf6 sounds/spreadgun/spread_pelletf6.ogg $random spreadgun/pelletf { spreadgun/pelletf1 spreadgun/pelletf2 spreadgun/pelletf3 spreadgun/pelletf4 spreadgun/pelletf5 spreadgun/pelletf6 } $limit spreadgun/pelletf 32 -spreadgun/slug1 sounds/spreadgun/spread_slug1.ogg -spreadgun/slug2 sounds/spreadgun/spread_slug2.ogg -$random spreadgun/slug { spreadgun/slug1 spreadgun/slug2 } -spreadgun/slugf1 sounds/spreadgun/spread_slugf1.ogg -spreadgun/slugf2 sounds/spreadgun/spread_slugf2.ogg -$random spreadgun/slugf { spreadgun/slugf1 spreadgun/slugf2 } -spreadgun/corrode sounds/spreadgun/spread_poison.ogg -spreadgun/corrodepuff1 sounds/spreadgun/spread_poisonpuff1.ogg -spreadgun/corrodepuff2 sounds/spreadgun/spread_poisonpuff2.ogg -$random spreadgun/corrodepuff { spreadgun/corrodepuff1 spreadgun/corrodepuff2 } -$limit spreadgun/corrodepuff 32 -spreadgun/ball1 sounds/spreadgun/spread_ball1.ogg -spreadgun/ball2 sounds/spreadgun/spread_ball2.ogg -spreadgun/ball3 sounds/spreadgun/spread_ball3.ogg -$random spreadgun/ball { spreadgun/ball1 spreadgun/ball2 spreadgun/ball3 } -spreadgun/ballf1 sounds/spreadgun/spread_ballf1.ogg -spreadgun/ballf2 sounds/spreadgun/spread_ballf2.ogg -spreadgun/ballf3 sounds/spreadgun/spread_ballf3.ogg -$random spreadgun/ballf { spreadgun/ballf1 spreadgun/ballf2 spreadgun/ballf3 } -spreadgun/ballfly sounds/spreadgun/spread_ballfly.ogg -spreadgun/salt1 sounds/spreadgun/spread_salt1.ogg -spreadgun/salt2 sounds/spreadgun/spread_salt2.ogg -spreadgun/salt3 sounds/spreadgun/spread_salt3.ogg -spreadgun/salt4 sounds/spreadgun/spread_salt4.ogg -$random spreadgun/salt { spreadgun/salt1 spreadgun/salt2 spreadgun/salt3 spreadgun/salt4 } -$limit spreadgun/salt 32 -spreadgun/salttrail1 sounds/spreadgun/spread_bluetrail1.ogg -spreadgun/salttrail2 sounds/spreadgun/spread_bluetrail2.ogg -spreadgun/salttrail3 sounds/spreadgun/spread_bluetrail3.ogg -spreadgun/salttrail4 sounds/spreadgun/spread_bluetrail4.ogg -$random spreadgun/salttrail { spreadgun/salttrail1 spreadgun/salttrail2 spreadgun/salttrail3 spreadgun/salttrail4 } -$limit spreadgun/salttrail 32 spreadgun/goldexpl1 sounds/spreadgun/spread_goldexp1.ogg spreadgun/goldexpl2 sounds/spreadgun/spread_goldexp2.ogg $random spreadgun/goldexpl { spreadgun/goldexpl1 spreadgun/goldexpl2 } @@ -232,30 +185,11 @@ hellblazer/open sounds/hellblazer/blaze_open.ogg hellblazer/magout sounds/hellblazer/blaze_magout.ogg hellblazer/magin sounds/hellblazer/blaze_magin.ogg hellblazer/close sounds/hellblazer/blaze_close.ogg -hellblazer/hitm1 sounds/hellblazer/blaze_hitm1.ogg -hellblazer/hitm2 sounds/hellblazer/blaze_hitm2.ogg -hellblazer/hitm3 sounds/hellblazer/blaze_hitm3.ogg -$random hellblazer/hitm { hellblazer/hitm1 hellblazer/hitm2 hellblazer/hitm3 } -$limit hellblazer/hitm 32 -hellblazer/hitc1 sounds/hellblazer/blaze_hitc1.ogg -hellblazer/hitc2 sounds/hellblazer/blaze_hitc2.ogg -hellblazer/hitc3 sounds/hellblazer/blaze_hitc3.ogg -$random hellblazer/hitc { hellblazer/hitc1 hellblazer/hitc2 hellblazer/hitc3 } -$limit hellblazer/hitc 32 -hellblazer/hitcs1 sounds/hellblazer/blaze_hitcs1.ogg -hellblazer/hitcs2 sounds/hellblazer/blaze_hitcs2.ogg -hellblazer/hitcs3 sounds/hellblazer/blaze_hitcs3.ogg -$random hellblazer/hitcs { hellblazer/hitcs1 hellblazer/hitcs2 hellblazer/hitcs3 } -$limit hellblazer/hitcs 32 -hellblazer/hitr1 sounds/hellblazer/blaze_hitr1.ogg -hellblazer/hitr2 sounds/hellblazer/blaze_hitr2.ogg -hellblazer/hitr3 sounds/hellblazer/blaze_hitr3.ogg -$random hellblazer/hitr { hellblazer/hitr1 hellblazer/hitr2 hellblazer/hitr3 } -$limit hellblazer/hitr 32 -hellblazer/hitw1 sounds/hellblazer/blaze_hitw1.ogg -hellblazer/hitw2 sounds/hellblazer/blaze_hitw2.ogg -$random hellblazer/hitw { hellblazer/hitw1 hellblazer/hitw2 } -$limit hellblazer/hitw 32 +hellblazer/hit1 sounds/hellblazer/blaze_hit1.ogg +hellblazer/hit2 sounds/hellblazer/blaze_hit2.ogg +hellblazer/hit3 sounds/hellblazer/blaze_hit3.ogg +$random hellblazer/hit { hellblazer/hit1 hellblazer/hit2 hellblazer/hit3 } +$limit hellblazer/hit 16 hellblazer/bounce sounds/hellblazer/blaze_bounce.ogg hellblazer/fly sounds/hellblazer/blaze_fly.ogg hellblazer/preload sounds/hellblazer/blaze_preload.ogg diff --git a/sounds/spreadgun/spread_slug1.ogg b/sounds/general/slughit1.ogg similarity index 100% rename from sounds/spreadgun/spread_slug1.ogg rename to sounds/general/slughit1.ogg diff --git a/sounds/spreadgun/spread_slug2.ogg b/sounds/general/slughit2.ogg similarity index 100% rename from sounds/spreadgun/spread_slug2.ogg rename to sounds/general/slughit2.ogg diff --git a/sounds/spreadgun/spread_slugf1.ogg b/sounds/general/slughitf1.ogg similarity index 100% rename from sounds/spreadgun/spread_slugf1.ogg rename to sounds/general/slughitf1.ogg diff --git a/sounds/spreadgun/spread_slugf2.ogg b/sounds/general/slughitf2.ogg similarity index 100% rename from sounds/spreadgun/spread_slugf2.ogg rename to sounds/general/slughitf2.ogg diff --git a/sounds/hellblazer/blaze_hitm1.ogg b/sounds/hellblazer/blaze_hit1.ogg similarity index 100% rename from sounds/hellblazer/blaze_hitm1.ogg rename to sounds/hellblazer/blaze_hit1.ogg diff --git a/sounds/hellblazer/blaze_hitm2.ogg b/sounds/hellblazer/blaze_hit2.ogg similarity index 100% rename from sounds/hellblazer/blaze_hitm2.ogg rename to sounds/hellblazer/blaze_hit2.ogg diff --git a/sounds/hellblazer/blaze_hitm3.ogg b/sounds/hellblazer/blaze_hit3.ogg similarity index 100% rename from sounds/hellblazer/blaze_hitm3.ogg rename to sounds/hellblazer/blaze_hit3.ogg diff --git a/sounds/hellblazer/blaze_hitc1.ogg b/sounds/hellblazer/blaze_hitc1.ogg deleted file mode 100644 index 8d7f2a65b..000000000 Binary files a/sounds/hellblazer/blaze_hitc1.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitc2.ogg b/sounds/hellblazer/blaze_hitc2.ogg deleted file mode 100644 index beda5f6cd..000000000 Binary files a/sounds/hellblazer/blaze_hitc2.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitc3.ogg b/sounds/hellblazer/blaze_hitc3.ogg deleted file mode 100644 index bc9d85c51..000000000 Binary files a/sounds/hellblazer/blaze_hitc3.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitcs1.ogg b/sounds/hellblazer/blaze_hitcs1.ogg deleted file mode 100644 index a78472ca8..000000000 Binary files a/sounds/hellblazer/blaze_hitcs1.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitcs2.ogg b/sounds/hellblazer/blaze_hitcs2.ogg deleted file mode 100644 index d8f3e55d0..000000000 Binary files a/sounds/hellblazer/blaze_hitcs2.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitcs3.ogg b/sounds/hellblazer/blaze_hitcs3.ogg deleted file mode 100644 index ef725d6b3..000000000 Binary files a/sounds/hellblazer/blaze_hitcs3.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitr1.ogg b/sounds/hellblazer/blaze_hitr1.ogg deleted file mode 100644 index f8a3b9926..000000000 Binary files a/sounds/hellblazer/blaze_hitr1.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitr2.ogg b/sounds/hellblazer/blaze_hitr2.ogg deleted file mode 100644 index a2aa6df1d..000000000 Binary files a/sounds/hellblazer/blaze_hitr2.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitr3.ogg b/sounds/hellblazer/blaze_hitr3.ogg deleted file mode 100644 index 1b9bc1d17..000000000 Binary files a/sounds/hellblazer/blaze_hitr3.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitw1.ogg b/sounds/hellblazer/blaze_hitw1.ogg deleted file mode 100644 index fe530382a..000000000 Binary files a/sounds/hellblazer/blaze_hitw1.ogg and /dev/null differ diff --git a/sounds/hellblazer/blaze_hitw2.ogg b/sounds/hellblazer/blaze_hitw2.ogg deleted file mode 100644 index d1cabeccf..000000000 Binary files a/sounds/hellblazer/blaze_hitw2.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_ball1.ogg b/sounds/items/leadball1.ogg similarity index 100% rename from sounds/spreadgun/spread_ball1.ogg rename to sounds/items/leadball1.ogg diff --git a/sounds/spreadgun/spread_ball2.ogg b/sounds/items/leadball2.ogg similarity index 100% rename from sounds/spreadgun/spread_ball2.ogg rename to sounds/items/leadball2.ogg diff --git a/sounds/spreadgun/spread_ball3.ogg b/sounds/items/leadball3.ogg similarity index 100% rename from sounds/spreadgun/spread_ball3.ogg rename to sounds/items/leadball3.ogg diff --git a/sounds/spreadgun/spread_ballf1.ogg b/sounds/items/leadballf1.ogg similarity index 100% rename from sounds/spreadgun/spread_ballf1.ogg rename to sounds/items/leadballf1.ogg diff --git a/sounds/spreadgun/spread_ballf2.ogg b/sounds/items/leadballf2.ogg similarity index 100% rename from sounds/spreadgun/spread_ballf2.ogg rename to sounds/items/leadballf2.ogg diff --git a/sounds/spreadgun/spread_ballf3.ogg b/sounds/items/leadballf3.ogg similarity index 100% rename from sounds/spreadgun/spread_ballf3.ogg rename to sounds/items/leadballf3.ogg diff --git a/sounds/spreadgun/spread_purplefire1.ogg b/sounds/items/leadballfire1.ogg similarity index 100% rename from sounds/spreadgun/spread_purplefire1.ogg rename to sounds/items/leadballfire1.ogg diff --git a/sounds/spreadgun/spread_purplefire2.ogg b/sounds/items/leadballfire2.ogg similarity index 100% rename from sounds/spreadgun/spread_purplefire2.ogg rename to sounds/items/leadballfire2.ogg diff --git a/sounds/spreadgun/spread_ballfly.ogg b/sounds/items/leadballfly.ogg similarity index 100% rename from sounds/spreadgun/spread_ballfly.ogg rename to sounds/items/leadballfly.ogg diff --git a/sounds/spreadgun/spread_salt1.ogg b/sounds/items/salthit1.ogg similarity index 100% rename from sounds/spreadgun/spread_salt1.ogg rename to sounds/items/salthit1.ogg diff --git a/sounds/spreadgun/spread_salt2.ogg b/sounds/items/salthit2.ogg similarity index 100% rename from sounds/spreadgun/spread_salt2.ogg rename to sounds/items/salthit2.ogg diff --git a/sounds/spreadgun/spread_salt3.ogg b/sounds/items/salthit3.ogg similarity index 100% rename from sounds/spreadgun/spread_salt3.ogg rename to sounds/items/salthit3.ogg diff --git a/sounds/spreadgun/spread_salt4.ogg b/sounds/items/salthit4.ogg similarity index 100% rename from sounds/spreadgun/spread_salt4.ogg rename to sounds/items/salthit4.ogg diff --git a/sounds/spreadgun/spread_bluetrail1.ogg b/sounds/items/salttrail1.ogg similarity index 100% rename from sounds/spreadgun/spread_bluetrail1.ogg rename to sounds/items/salttrail1.ogg diff --git a/sounds/spreadgun/spread_bluetrail2.ogg b/sounds/items/salttrail2.ogg similarity index 100% rename from sounds/spreadgun/spread_bluetrail2.ogg rename to sounds/items/salttrail2.ogg diff --git a/sounds/spreadgun/spread_bluetrail3.ogg b/sounds/items/salttrail3.ogg similarity index 100% rename from sounds/spreadgun/spread_bluetrail3.ogg rename to sounds/items/salttrail3.ogg diff --git a/sounds/spreadgun/spread_bluetrail4.ogg b/sounds/items/salttrail4.ogg similarity index 100% rename from sounds/spreadgun/spread_bluetrail4.ogg rename to sounds/items/salttrail4.ogg diff --git a/sounds/spreadgun/spread_blackfire1.ogg b/sounds/spreadgun/spread_blackfire1.ogg deleted file mode 100644 index 376cbdd33..000000000 Binary files a/sounds/spreadgun/spread_blackfire1.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_blackfire2.ogg b/sounds/spreadgun/spread_blackfire2.ogg deleted file mode 100644 index a1b3198f2..000000000 Binary files a/sounds/spreadgun/spread_blackfire2.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_bluefire1.ogg b/sounds/spreadgun/spread_bluefire1.ogg deleted file mode 100644 index c5e7aa44d..000000000 Binary files a/sounds/spreadgun/spread_bluefire1.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_bluefire2.ogg b/sounds/spreadgun/spread_bluefire2.ogg deleted file mode 100644 index 20515c344..000000000 Binary files a/sounds/spreadgun/spread_bluefire2.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_greenfire1.ogg b/sounds/spreadgun/spread_greenfire1.ogg deleted file mode 100644 index 492a678a9..000000000 Binary files a/sounds/spreadgun/spread_greenfire1.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_greenfire2.ogg b/sounds/spreadgun/spread_greenfire2.ogg deleted file mode 100644 index 973a8606a..000000000 Binary files a/sounds/spreadgun/spread_greenfire2.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_poison.ogg b/sounds/spreadgun/spread_poison.ogg deleted file mode 100644 index fc21026b4..000000000 Binary files a/sounds/spreadgun/spread_poison.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_poisonpuff1.ogg b/sounds/spreadgun/spread_poisonpuff1.ogg deleted file mode 100644 index 08cadb551..000000000 Binary files a/sounds/spreadgun/spread_poisonpuff1.ogg and /dev/null differ diff --git a/sounds/spreadgun/spread_poisonpuff2.ogg b/sounds/spreadgun/spread_poisonpuff2.ogg deleted file mode 100644 index 9e153660f..000000000 Binary files a/sounds/spreadgun/spread_poisonpuff2.ogg and /dev/null differ diff --git a/zscript.txt b/zscript.txt index c3ef66193..5dc6df825 100644 --- a/zscript.txt +++ b/zscript.txt @@ -108,7 +108,6 @@ version "4.9" #include "zscript/weapons/swwm_shot_fx.zsc" #include "zscript/weapons/swwm_cbt.zsc" #include "zscript/weapons/swwm_cbt_fx.zsc" -#include "zscript/weapons/swwm_cbt_ui.zsc" #include "zscript/weapons/swwm_danmaku.zsc" #include "zscript/weapons/swwm_danmaku_fx.zsc" #include "zscript/weapons/swwm_blazeit.zsc" diff --git a/zscript/dlc1/swwm_ammoitems_dlc.zsc b/zscript/dlc1/swwm_ammoitems_dlc.zsc index 3226769e8..2829d0189 100644 --- a/zscript/dlc1/swwm_ammoitems_dlc.zsc +++ b/zscript/dlc1/swwm_ammoitems_dlc.zsc @@ -8,9 +8,9 @@ Class SMW05Ammo : SWWMAmmo SWWMAmmo.PickupTag "SMW05BULLET"; Stamina 600; Inventory.Amount 1; - Inventory.MaxAmount 80; + Inventory.MaxAmount 100; Ammo.BackpackAmount 20; - Ammo.BackpackMaxAmount 200; + Ammo.BackpackMaxAmount 300; Ammo.DropAmount 3; +FLOATBOB; FloatBobStrength 0.25; diff --git a/zscript/dlc1/swwm_heavymahsheengun.zsc b/zscript/dlc1/swwm_heavymahsheengun.zsc index 4695db83c..3b3497d1d 100644 --- a/zscript/dlc1/swwm_heavymahsheengun.zsc +++ b/zscript/dlc1/swwm_heavymahsheengun.zsc @@ -1,6 +1,65 @@ // Cyrus Enterprises Sheen HMG (From SWWM Platinum Expansion Pack 2) // Slot 5, spawns shared with Eviscerator +Class PiercingTracer : SpreadgunTracer +{ + double penetration; // please don't laugh + double resist; // resistance against penetration loss (1.0 = don't lose) + + override ETraceStatus TraceCallback() + { + // liquid splashes + if ( Results.CrossedWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.CrossedWater; + hl.hitpos = Results.CrossedWaterPos; + WaterHitList.Push(hl); + } + else if ( Results.Crossed3DWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.Crossed3DWater; + hl.hitpos = Results.Crossed3DWaterPos; + WaterHitList.Push(hl); + } + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignoreme ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) + { + let ent = new("HitListEntry"); + ent.hitactor = Results.HitActor; + ent.hitlocation = Results.HitPos; + ent.x = Results.HitVector; + if ( ((Results.HitActor.Health*(1.-resist)) >= penetration) || Results.HitActor.bNODAMAGE ) + { + ent.hitdamage = int(penetration); + penetration = 0; + } + else + { + int gibh = (Results.HitActor.GibHealth!=int.min)?-abs(Results.HitActor.GibHealth):-int(Results.HitActor.GetSpawnHealth()*gameinfo.gibfactor); + ent.hitdamage = min(Results.HitActor.health+abs(gibh),int(penetration)); + penetration = max(0,penetration-(ent.hitdamage*(1.-resist))); + } + hitlist.Push(ent); + if ( penetration <= 0 ) return TRACE_Stop; + return TRACE_Skip; + } + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockHitscan|Line.ML_BlockEverything)) ) + return TRACE_Stop; + ShootThroughList.Push(Results.HitLine); + return TRACE_Skip; + } + return TRACE_Stop; + } +} + Class HeavyMahSheenGun : SWWMWeapon { transient int fired; @@ -13,7 +72,7 @@ Class HeavyMahSheenGun : SWWMWeapon ui int lastfirespeed; transient ui SmoothDynamicValueInterpolator HeatInter; - transient SpreadSlugTracer st; + transient PiercingTracer st; override void HudTick() { @@ -104,7 +163,7 @@ Class HeavyMahSheenGun : SWWMWeapon [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); double a = FRandom[Sheen](0,360), s = FRandom[Sheen](.002,.02)*spreadfct; Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - if ( !invoker.st ) invoker.st = new("SpreadSlugTracer"); + if ( !invoker.st ) invoker.st = new("PiercingTracer"); let st = invoker.st; // thanks zscript st.ignoreme = self; st.penetration = 60.+invoker.barrelheat/5.; @@ -152,7 +211,7 @@ Class HeavyMahSheenGun : SWWMWeapon { st.HitList[i].HitActor.TraceBleed(realdmg,self); st.HitList[i].HitActor.SpawnBlood(st.HitList[i].HitLocation,atan2(st.HitList[i].x.y,st.HitList[i].x.x)+180,realdmg); - st.HitList[i].HitActor.A_StartSound("spreadgun/slugf",CHAN_DAMAGE,CHANF_OVERLAP,1.,2.); + st.HitList[i].HitActor.A_StartSound("misc/slughitf",CHAN_DAMAGE,CHANF_OVERLAP,1.,2.); } } if ( (st.Results.HitType != TRACE_HitNone) && (st.Results.HitType != TRACE_HasHitSky) && (st.Results.HitType != TRACE_HitActor) ) diff --git a/zscript/dlc1/swwm_notashotgun.zsc b/zscript/dlc1/swwm_notashotgun.zsc index 27c6d78e6..01f602c44 100644 --- a/zscript/dlc1/swwm_notashotgun.zsc +++ b/zscript/dlc1/swwm_notashotgun.zsc @@ -334,7 +334,7 @@ Class Quadravol : SWWMWeapon action void A_FireBayonet() { A_StartSound("quadshot/bayonetfire",CHAN_WEAPON,CHANF_OVERLAP); - A_Melee(60,"spreadgun/slug",1.5,.6,-.2,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse,null); + A_Melee(60,"misc/slughit",1.5,.6,-.2,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse,null); Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch); vel += dir*4.; A_QuakeEx(4,4,4,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75); diff --git a/zscript/handler/swwm_handler_process.zsc b/zscript/handler/swwm_handler_process.zsc index 335d8b782..9841b7be4 100644 --- a/zscript/handler/swwm_handler_process.zsc +++ b/zscript/handler/swwm_handler_process.zsc @@ -39,7 +39,6 @@ extend Class SWWMHandler override void NetworkProcess( ConsoleEvent e ) { - static const Class cbttypes[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; if ( e.Name ~== "swwmgesture" ) { if ( (e.player == -1) || !playeringame[e.player] || !players[e.player].mo ) return; @@ -500,30 +499,6 @@ extend Class SWWMHandler if ( swwm_voicelog ) SWWMFullHistory.PushMessage("\cd"..players[e.Args[0]].GetUserName().."\c-: "..StringTable.Localize(e.Name.Mid(19)),level.totaltime,PRINT_CHAT); } } - else if ( e.Name.Left(8) ~== "swwmcbt." ) - { - // from wikipedia, the free encyclopedia - if ( !playeringame[e.Args[0]] || !players[e.Args[0]].mo ) return; - let cbt = Wallbuster(players[e.Args[0]].mo.FindInventory("Wallbuster")); - if ( !cbt ) return; - cbt.reloadqueue.Clear(); - if ( e.Name.Mid(8) ~== "EMPTY" ) cbt.clearout = true; - else - { - cbt.clearout = false; - Array qs; - qs.Clear(); - String rite = e.Name.Mid(8); - rite.Split(qs,",",TOK_SKIPEMPTY); - for ( int i=0; i 3) ) continue; - cbt.reloadqueue.Push(cbttypes[qi]); - } - } - cbt.waitreload = false; - } else if ( e.Name ~== "swwmcleartransaction" ) { if ( e.Args[1] != consoleplayer ) return; diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index 831ac0c93..e78b76b2f 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -175,12 +175,12 @@ Class SWWMStatusBar : BaseStatusBar int tclabel, tcvalue, tcextra, tccompl, tcsucks; String tclabel_s, tcextra_s; - int AmmoFlash[26]; // flash when new ammo is received - int AmmoOldAmounts[26]; // to detect when to flash - int AmmoMaxFlash[26]; // flash when ammo max amount changes - int AmmoOldMaxAmounts[26]; // to detect when to flash - Class AmmoSlots[26]; // ammo type on each slot - String AmmoNames[26]; // ammo 4-letter names + int AmmoFlash[19]; // flash when new ammo is received + int AmmoOldAmounts[19]; // to detect when to flash + int AmmoMaxFlash[19]; // flash when ammo max amount changes + int AmmoOldMaxAmounts[19]; // to detect when to flash + Class AmmoSlots[19]; // ammo type on each slot + String AmmoNames[19]; // ammo 4-letter names int HealthFlash; // flash when healing int LastHealth; // to detect when to flash int LagHealth[10]; // for delayed decay bar @@ -944,7 +944,7 @@ Class SWWMStatusBar : BaseStatusBar for ( int i=9; i>0; i-- ) LagHealth[i] = LagHealth[i-1]; // ammo updates - for ( int i=0; i<26; i++ ) + for ( int i=0; i<19; i++ ) { let a = SWWMAmmo(CPlayer.mo.FindInventory(AmmoSlots[i])); int amt = 0; @@ -1289,58 +1289,44 @@ Class SWWMStatusBar : BaseStatusBar LagHealthInter = SmoothLinearValueInterpolator.Create(LastHealth,2); for ( int i=0; i<10; i++ ) LagHealth[i] = LastHealth; AmmoSlots[0] = 'RedShell'; - AmmoSlots[1] = 'GreenShell'; - AmmoSlots[2] = 'BlueShell'; - AmmoSlots[3] = 'PurpleShell'; - AmmoSlots[4] = 'BlackShell'; - AmmoSlots[5] = 'GoldShell'; - AmmoSlots[6] = 'SMW05Ammo'; - AmmoSlots[7] = 'EvisceratorShell'; - AmmoSlots[8] = 'SheenAmmo'; - AmmoSlots[9] = 'HellblazerMissiles'; - AmmoSlots[10] = 'HellblazerCrackshots'; - AmmoSlots[11] = 'HellblazerRavagers'; - AmmoSlots[12] = 'HellblazerWarheads'; - AmmoSlots[13] = 'QuadravolAmmo'; - AmmoSlots[14] = 'SparkUnit'; - AmmoSlots[15] = 'SparksterBAmmo'; - AmmoSlots[16] = 'SparksterRAmmo'; - AmmoSlots[17] = 'SilverBulletAmmo'; - AmmoSlots[18] = 'SilverBulletAmmo2'; - AmmoSlots[19] = 'RayAmmo'; - AmmoSlots[20] = 'CandyGunAmmo'; - AmmoSlots[21] = 'CandyGunSpares'; - AmmoSlots[22] = 'MisterAmmo'; - AmmoSlots[23] = 'MisterGAmmo'; - AmmoSlots[24] = 'YnykronAmmo'; - AmmoSlots[25] = 'UltimateAmmo'; + AmmoSlots[1] = 'GoldShell'; + AmmoSlots[2] = 'SMW05Ammo'; + AmmoSlots[3] = 'EvisceratorShell'; + AmmoSlots[4] = 'SheenAmmo'; + AmmoSlots[5] = 'HellblazerMissiles'; + AmmoSlots[6] = 'QuadravolAmmo'; + AmmoSlots[7] = 'SparkUnit'; + AmmoSlots[8] = 'SparksterBAmmo'; + AmmoSlots[9] = 'SparksterRAmmo'; + AmmoSlots[10] = 'SilverBulletAmmo'; + AmmoSlots[11] = 'SilverBulletAmmo2'; + AmmoSlots[12] = 'RayAmmo'; + AmmoSlots[13] = 'CandyGunAmmo'; + AmmoSlots[14] = 'CandyGunSpares'; + AmmoSlots[15] = 'MisterAmmo'; + AmmoSlots[16] = 'MisterGAmmo'; + AmmoSlots[17] = 'YnykronAmmo'; + AmmoSlots[18] = 'UltimateAmmo'; AmmoNames[0] = "SHOT"; - AmmoNames[1] = "SLUG"; - AmmoNames[2] = "SALT"; - AmmoNames[3] = "BALL"; - AmmoNames[4] = "FLCH"; - AmmoNames[5] = "GOLD"; - AmmoNames[6] = "SCRW"; - AmmoNames[7] = "FLAK"; - AmmoNames[8] = "MACH"; - AmmoNames[9] = "RCKT"; - AmmoNames[10] = "CLUS"; - AmmoNames[11] = "RAVG"; - AmmoNames[12] = "WARH"; - AmmoNames[13] = "QUAD"; - AmmoNames[14] = "BSPK"; - AmmoNames[15] = "KINY"; - AmmoNames[16] = "NOKR"; - AmmoNames[17] = "RIFL"; - AmmoNames[18] = "CHOD"; - AmmoNames[19] = "BOLT"; - AmmoNames[20] = "CAND"; - AmmoNames[21] = "CGUN"; - AmmoNames[22] = "MSTR"; - AmmoNames[23] = "MGRN"; - AmmoNames[24] = "CRYS"; - AmmoNames[25] = "ULTI"; - for ( int i=0; i<26; i++ ) + AmmoNames[1] = "GOLD"; + AmmoNames[2] = "SCRW"; + AmmoNames[3] = "FLAK"; + AmmoNames[4] = "MACH"; + AmmoNames[5] = "MISL"; + AmmoNames[6] = "QUAD"; + AmmoNames[7] = "BSPK"; + AmmoNames[8] = "KINY"; + AmmoNames[9] = "NOKR"; + AmmoNames[10] = "RIFL"; + AmmoNames[11] = "CHOD"; + AmmoNames[12] = "BOLT"; + AmmoNames[13] = "CAND"; + AmmoNames[14] = "CGUN"; + AmmoNames[15] = "MSTR"; + AmmoNames[16] = "MGRN"; + AmmoNames[17] = "CRYS"; + AmmoNames[18] = "ULTI"; + for ( int i=0; i<18; i++ ) { AmmoFlash[i] = 0; AmmoOldAmounts[i] = int.min; @@ -2708,7 +2694,7 @@ Class SWWMStatusBar : BaseStatusBar OwnedWeapons.Push(SWWMWeapon(i)); } String str; - for ( int i=25; i>=0; i-- ) + for ( int i=18; i>=0; i-- ) { let a = AmmoSlots[i]; // check if owned @@ -2761,26 +2747,23 @@ Class SWWMStatusBar : BaseStatusBar } } } - bool selected = false, used = false; + bool used = false; if ( CPlayer.ReadyWeapon && (CPlayer.ReadyWeapon is 'SWWMWeapon') ) - { - selected = SWWMWeapon(CPlayer.ReadyWeapon).IsCurrentAmmo(a); used = SWWMWeapon(CPlayer.ReadyWeapon).UsesAmmo(a); - } - int scol = mhudfontcol[selected?MCR_BRASS:MCR_WHITE]; + int scol = mhudfontcol[used?MCR_BRASS:MCR_WHITE]; int ncolor = (amt>0)?scol:mhudfontcol[MCR_RED]; int dcnt1 = 2-int(Log10(clamp(amt,1,999))); int dcnt2 = 2-int(Log10(clamp(amax,1,999))); - for ( int j=0; j0)?newdmg:dmg,self); + victim.SpawnBlood(pos,atan2(dir.y,dir.x),dmg); + } + } + else + { + A_StartSound("leadball/hit",CHAN_VOICE,CHANF_OVERLAP,(vel.length()/30.)**.5); + if ( victim ) victim.A_StartSound("leadball/hit",CHAN_DAMAGE,CHANF_OVERLAP,(vel.length()/30.)**.5); + if ( vel.length() > 15. ) + { + let s = Spawn("BallImpact",pos); + s.angle = atan2(dir.y,dir.x); + s.pitch = asin(-dir.z); + } + } + // make it so the crit does not propagate to friendlies unless we bonked a friend (you monster!) + if ( crit ) + SWWMUtility.DoExplosion(self,dmg/2,25000,150,80,((victim.isFriend(target))?0:DE_NOHURTFRIEND)|DE_NONEXPLOSIVE,crit?'CriticalConcussion':'Concussion',target,DMG_FOILINVUL); + if ( crit && victim && (victim.Health <= 0) && (victim.bBOSS || victim.FindInventory("BossMarker")) && target ) + SWWMUtility.MarkAchievement("clonk",target.player); + // only rip shootables + if ( (slamforce > girth) && is_schutt ) + { + vel *= .7; + return 1; + } + // force bounce + BlockingMobj = victim; + A_HandleBounce(); + lasthit = victim; + // pretend to pass through + return 1; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + A_StartSound("leadball/fly",CHAN_WEAPON,CHANF_LOOP,.6,3.,2.); + heat = 1.; + } + override void Tick() + { + oldvel = vel; + Super.Tick(); + if ( isFrozen() ) return; + if ( InStateSequence(CurState,ResolveState("Death")) ) + { + deadtimer++; + if ( deadtimer > 300 ) + { + let numpt = Random[Spreadgun](3,6); + for ( int i=0; i 15 ) + { + let s = Spawn("BallImpact",pos); + s.angle = atan2(HitNormal.y,HitNormal.x); + s.pitch = asin(-HitNormal.z); + } + } + gravity = .35; + if ( (vel.length() < 5) && (pos.z <= floorz) ) + { + ClearBounce(); + ExplodeMissile(); + } + } + States + { + Spawn: + XZW1 A -1; + Stop; + Bounce: + XZW1 A 0 A_HandleBounce(); + Goto Spawn; + Death: + XZW1 A -1 + { + bMOVEWITHSECTOR = true; + A_StopSound(CHAN_WEAPON); + } + Stop; + } +} + +// TBD 1.4 Battle-Boi Sentry + +Class SaltTracer : LineTracer +{ + Actor ignore; + Array ShootThroughList; + Array WaterHitList; + + override ETraceStatus TraceCallback() + { + // liquid splashes + if ( Results.CrossedWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.CrossedWater; + hl.hitpos = Results.CrossedWaterPos; + WaterHitList.Push(hl); + } + else if ( Results.Crossed3DWater ) + { + let hl = new("WaterHit"); + hl.sect = Results.Crossed3DWater; + hl.hitpos = Results.Crossed3DWaterPos; + WaterHitList.Push(hl); + } + if ( Results.HitType == TRACE_HitActor ) + { + if ( Results.HitActor == ignore ) return TRACE_Skip; + if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; + return TRACE_Skip; + } + else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) + { + if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&Line.ML_BlockHitscan) ) + return TRACE_Stop; + ShootThroughList.Push(Results.HitLine); + return TRACE_Skip; + } + return TRACE_Stop; + } +} + +Class SaltLight : PaletteLight +{ + Default + { + Tag "SaltExpl,1"; + ReactionTime 30; + Args 0,0,0,240; + } +} +Class SaltLight2 : PaletteLight +{ + Default + { + Tag "SaltExpl"; + ReactionTime 30; + Args 0,0,0,70; + } +} + +Class SaltImpact : Actor +{ + Default + { + Obituary "$O_SALTSHOT"; + DamageType "Salt"; + RenderStyle "Add"; + Radius 0.1; + Height 0; + Scale 1.8; + +NOGRAVITY; + +NOBLOCKMAP; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + +FORCEXYBILLBOARD; + +NOTELEPORT; + +FOILINVUL; + +NOINTERACTION; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + A_AlertMonsters(swwm_uncapalert?0:6000); + SWWMUtility.DoExplosion(self,30+special2*4,15000,100,40); + A_QuakeEx(3,3,3,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:0.2); + A_StartSound("saltshot/hit",CHAN_VOICE,attenuation:.35); + A_SprayDecal("ShockMarkSmall",-172); + A_SprayDecal("SaltMark",-172); + Scale *= FRandom[ExploS](0.8,1.1); + int numpt = Random[ExploS](5,9)-special1; + for ( int i=0; i 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + States + { + Spawn: + TNT1 A 0 NoDelay A_Jump(256,"Expl1","Expl2","Expl3"); + Expl1: + KSX1 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright; + Stop; + Expl2: + KSX2 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright; + Stop; + Expl3: + KSX3 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright; + Stop; + } +} + +Class SaltBeam : Actor +{ + Default + { + Obituary "$O_SALTSHOT"; + DamageType "Salt"; + RenderStyle "Add"; + Radius 0.1; + Height 0; + Stamina 9; + Speed 32; + +NOGRAVITY; + +NOBLOCKMAP; + +DONTSPLASH; + +NOTELEPORT; + +ROLLSPRITE; + +ROLLCENTER; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + +FOILINVUL; + +NOINTERACTION; + } + + void SpreadOut() + { + special1 = 1; + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + let t = new("SaltTracer"); + t.ignore = target; + t.Trace(pos,cursector,x,speed,TRACE_HitSky); + for ( int i=0; i 20) && !Random[Spreadgun](0,800/args[0]) ) + { + let i = Spawn("SaltImpact",level.Vec3Offset(pos,x*speed)); + i.angle = atan2(x.y,x.x); + i.pitch = asin(-x.z); + i.target = target; + i.special1 = (Stamina-9)/4; + i.special2 = Accuracy; + i.args[0] = args[1]; + return; + } + // next beam + if ( !(special2%4) && !Random[Spreadgun](0,Stamina) ) + Spawn("SaltLight",level.Vec3Offset(pos,x*speed/2)); + let next = Spawn("SaltBeam",level.Vec3Offset(pos,x*speed)); + double a = FRandom[Spreadgun](0,360), s = FRandom[Spreadgun](0,.06); + Vector3 dir = SWWMUtility.ConeSpread(x,y,z,a,s); + next.angle = atan2(dir.y,dir.x); + next.pitch = asin(-dir.z); + next.target = target; + next.special2 = (special2+1)%10; + next.args[0] = args[0]+1; + next.args[1] = args[1]; + next.SetStateLabel("TrailSpawn"); + } + + override void PostBeginPlay() + { + Super.PostBeginPlay(); + if ( !Random[Spreadgun](0,3) ) + A_StartSound("saltshot/trail",CHAN_VOICE,CHANF_DEFAULT,.3,4.); + } + + override void Tick() + { + if ( isFrozen() ) return; + A_FadeOut(.04); + if ( Random[Spreadgun](-2,args[2]/10) == 0 ) + SWWMUtility.DoExplosion(self,5+Accuracy,5000,speed,flags:DE_HOWL|DE_NONEXPLOSIVE,ignoreme:target); + if ( ((special2%4) || args[2]) && !special1 ) SpreadOut(); + args[2]++; + if ( !CheckNoDelay() || (tics == -1) ) return; + if ( tics > 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + + States + { + Spawn: + XZW1 A -1 Bright NoDelay + { + return FindState("StarterDev")+Random[Spreadgun](0,11)*2; + } + Stop; + TrailSpawn: + XZW2 A -1 Bright + { + return FindState("TrailerDev")+Random[Spreadgun](0,11)*2; + } + Stop; + StarterDev: + #### # 25 Bright; + XZW1 B -1 Bright; + Stop; + #### # 25 Bright; + XZW1 C -1 Bright; + Stop; + #### # 25 Bright; + XZW1 D -1 Bright; + Stop; + #### # 25 Bright; + XZW1 E -1 Bright; + Stop; + #### # 25 Bright; + XZW1 F -1 Bright; + Stop; + #### # 25 Bright; + XZW1 G -1 Bright; + Stop; + #### # 25 Bright; + XZW1 H -1 Bright; + Stop; + #### # 25 Bright; + XZW1 I -1 Bright; + Stop; + #### # 25 Bright; + XZW1 J -1 Bright; + Stop; + #### # 25 Bright; + XZW1 K -1 Bright; + Stop; + #### # 25 Bright; + XZW1 L -1 Bright; + Stop; + #### # 25 Bright; + XZW1 M -1 Bright; + Stop; + TrailerDev: + #### # 25 Bright; + XZW2 B -1 Bright; + Stop; + #### # 25 Bright; + XZW2 C -1 Bright; + Stop; + #### # 25 Bright; + XZW2 D -1 Bright; + Stop; + #### # 25 Bright; + XZW2 E -1 Bright; + Stop; + #### # 25 Bright; + XZW2 F -1 Bright; + Stop; + #### # 25 Bright; + XZW2 G -1 Bright; + Stop; + #### # 25 Bright; + XZW2 H -1 Bright; + Stop; + #### # 25 Bright; + XZW2 I -1 Bright; + Stop; + #### # 25 Bright; + XZW2 J -1 Bright; + Stop; + #### # 25 Bright; + XZW2 K -1 Bright; + Stop; + #### # 25 Bright; + XZW2 L -1 Bright; + Stop; + #### # 25 Bright; + XZW2 M -1 Bright; + Stop; + } +} diff --git a/zscript/swwm_player_items.zsc b/zscript/swwm_player_items.zsc index eb0e87a3f..7eaa2e27a 100644 --- a/zscript/swwm_player_items.zsc +++ b/zscript/swwm_player_items.zsc @@ -65,8 +65,6 @@ Class SayaCollar : SWWMArmor // EXTRA THICC as Saya requested Class AlmasteelPlating : SWWMArmor { - Inventory dbf; - Default { Inventory.Amount 1; @@ -79,27 +77,14 @@ Class AlmasteelPlating : SWWMArmor +SWWMARMOR.NOHITSOUND; +SWWMARMOR.NODRAIN; } - override void DoEffect() - { - Super.DoEffect(); - if ( !dbf ) return; - dbf.Amount = int(dbf.Amount*.95-1); // rapidly dissipate Telebrium corrosion - } override int HandleDamage( int damage, Name damageType, int flags ) { // 80% reduction for explosions double factor = (flags&DMG_EXPLOSION)?.2:1.; // 50% reduction for crushing if ( damageType == 'Crush' ) factor /= 2.; - // 66% reduction for Telebrium corrosion - else if ( damageType == 'Corroded' ) factor /= 3.; return damage-int(damage*factor); } - override void AbsorbDamage( int damage, Name damageType, out int newdamage, Actor inflictor, Actor source, int flags ) - { - if ( inflictor && (inflictor is 'CorrodeDebuff') ) dbf = Inventory(inflictor); - Super.AbsorbDamage(damage,damageType,newdamage,inflictor,source,flags); - } override bool HandlePickup( Inventory item ) { // disallow vanilla armors diff --git a/zscript/swwm_thinkers_player.zsc b/zscript/swwm_thinkers_player.zsc index 1c388cd90..840bd0555 100644 --- a/zscript/swwm_thinkers_player.zsc +++ b/zscript/swwm_thinkers_player.zsc @@ -168,11 +168,10 @@ Class SWWMStats : SWWMStaticThinker else if ( inflictor is 'AirBullet' ) which = 'DeepImpact'; else if ( (inflictor is 'HammerShockwave') || (inflictor is 'HammerRadiusShockwave') ) which = 'ItamexHammer'; else if ( (inflictor is 'ExplodiumMagArm') || (inflictor is 'ExplodiumMagProj') || (inflictor is 'ExplodiumBulletImpact') ) which = 'ExplodiumGun'; - else if ( ((inflictor is 'SaltImpact') && !inflictor.Args[0]) || ((inflictor is 'SaltBeam') && !inflictor.Args[1]) || (inflictor is 'CorrodeDebuff') || (inflictor is 'CorrosiveFlechette') || ((inflictor is 'TheBall') && !inflictor.special1) || (inflictor is 'GoldenImpact') || (inflictor is 'GoldenSubImpact') || (inflictor is 'GoldenSubSubImpact') ) which = 'Spreadgun'; - else if ( ((inflictor is 'SaltImpact') && inflictor.Args[0]) || ((inflictor is 'SaltBeam') && inflictor.Args[1]) || ((inflictor is 'TheBall') && inflictor.special1) ) which = 'Wallbuster'; + else if ( (inflictor is 'GoldenSubImpact') || (inflictor is 'GoldenSubSubImpact') ) which = 'Spreadgun'; else if ( (inflictor is 'EvisceratorChunk') || (inflictor is 'EvisceratorProj') ) which = 'Eviscerator'; else if ( inflictor is 'SheenTrail' ) which = 'HeavyMahSheenGun'; - else if ( (inflictor is 'HellblazerMissile') || (inflictor is 'HellblazerRavagerArm') || (inflictor is 'HellblazerWarheadArm') ) which = 'Hellblazer'; + else if ( (inflictor is 'HellblazerMissile') || (inflictor is 'HellblazerArm') ) which = 'Hellblazer'; else if ( (inflictor is 'QuadProj') || (inflictor is 'QuadExplArm') || (inflictor is 'OnFire') ) which = 'Quadravol'; else if ( (inflictor is 'BigBiospark') || (inflictor is 'BiosparkBall') || (inflictor is 'BiosparkBeamImpact') || (inflictor is 'BiosparkComboImpact') || (inflictor is 'BiosparkComboImpactSub') || (inflictor is 'BiosparkBeam') || (inflictor is 'BiosparkArc') || (inflictor is 'BiosparkCore') ) which = 'Sparkster'; else if ( (inflictor is 'SilverAirRip') || (inflictor is 'SilverAirRip2') || (inflictor is 'SilverImpact') || (inflictor is 'FatChodeImpact') || (inflictor is 'FatChodeExplosionArm') ) which = 'SilverBullet'; diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index c5a23ba60..7e534d0e5 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -1438,7 +1438,6 @@ Class SWWMUtility if ( !a.bMISSILE ) return false; if ( a is 'AirBullet' ) return true; if ( a is 'ExplodiumMagProj' ) return true; - if ( a is 'CorrosiveFlechette' ) return true; if ( a is 'TheBall' ) return true; if ( a is 'EvisceratorChunk' ) return true; if ( a is 'EvisceratorProj' ) return true; @@ -2247,7 +2246,8 @@ Class SWWMUtility // rocket launcher spawn static Class PickSWWMSlot6() { - return PickPair('Hellblazer','Quadravol'); + return PickPair('Quadravol','Hellblazer'); // temporarily swapped until Hellblazer is re-implemented + //return PickPair('Hellblazer','Quadravol'); } // first plasma rifle spawn static Class PickSWWMSlot7() diff --git a/zscript/weapons/swwm_baseweapon.zsc b/zscript/weapons/swwm_baseweapon.zsc index c4e2f46c9..21c08a1d6 100644 --- a/zscript/weapons/swwm_baseweapon.zsc +++ b/zscript/weapons/swwm_baseweapon.zsc @@ -574,12 +574,6 @@ Class SWWMWeapon : Weapon abstract { return (AmmoType1&&(kind is AmmoType1))||(AmmoType2&&(kind is AmmoType2)); } - // for weapons with switchable types, so the currently selected ammo is - // highlighted in a different color than the rest - virtual clearscope bool IsCurrentAmmo( Class kind ) - { - return false; - } // ensure weapons dropped by enemies only give one unit of each ammo override void ModifyDropAmount( int dropamount ) { diff --git a/zscript/weapons/swwm_baseweapon_ammobuffer.zsc b/zscript/weapons/swwm_baseweapon_ammobuffer.zsc index 20b36c200..36869678c 100644 --- a/zscript/weapons/swwm_baseweapon_ammobuffer.zsc +++ b/zscript/weapons/swwm_baseweapon_ammobuffer.zsc @@ -78,6 +78,28 @@ extend Class SWWMWeapon return 0; } + protected int CountBufferedAmmo( Class type ) + { + int cnt = 0; + for ( int i=0; i type ) + { + int cnt = 0; + for ( int i=0; i types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - int curtype = -1; - for ( int i=0; i<4; i++ ) + if ( !weap.bInitialized ) { - if ( weap.loadammo != types[i] ) continue; - curtype = i; - break; - } - static const int sofs[] = {1,7,10,13}; // offsets from SpawnState for each ammo type state label - int idx; - switch ( curtype ) - { - case 0: - idx = ridx-weap.magpos; - if ( idx > 5 ) idx -= 6; - else if ( idx < 0 ) idx += 6; - if ( weap.magstate[ridx] ) SetState(SpawnState); - else SetState(SpawnState+sofs[0]+idx); - break; - case 1: - idx = ridx-weap.magpos; - if ( idx > 2 ) idx -= 3; - else if ( idx < 0 ) idx += 3; - if ( (ridx > 2) || weap.magstate[ridx] ) SetState(SpawnState); - else SetState(SpawnState+sofs[1]+idx); - break; - case 2: - idx = ridx-weap.magpos; - if ( idx > 2 ) idx -= 3; - else if ( idx < 0 ) idx += 3; - if ( (ridx > 2) || weap.magstate[ridx] ) SetState(SpawnState); - else SetState(SpawnState+sofs[2]+idx); - break; - case 3: - idx = ridx-weap.magpos; - if ( idx > 1 ) idx -= 2; - else if ( idx < 0 ) idx += 2; - if ( (ridx > 1) || weap.magstate[ridx] ) SetState(SpawnState); - else SetState(SpawnState+sofs[3]+idx); - break; - default: - // uninitialized pickup (3 blazers) - idx = ridx; - if ( idx > 2 ) SetState(SpawnState); - else SetState(SpawnState+sofs[0]+idx); - break; + // not initialized, default to 3 loaded rockets + if ( ridx < 3 ) SetState(SpawnState+1+ridx); + else Setstate(SpawnState); + return; } + int idx = ridx-weap.magpos; + if ( idx > 5 ) idx -= 6; + else if ( idx < 0 ) idx += 6; + if ( weap.magstate[ridx] ) SetState(SpawnState); + else SetState(SpawnState+1+idx); } States { Spawn: TNT1 A -1; + Stop; Missiles: XZW1 ABCDEF -1; - Crackshots: - XZW2 ABC -1; - Ravagers: - XZW3 ABC -1; - Nukes: - XZW4 AB -1; Stop; } } @@ -91,8 +52,6 @@ Class Hellblazer : SWWMWeapon int clipcount; bool magstate[6]; // true: rocket was spent int magpos; // current rotation - Class loadammo, nextammo; - ui Class lastammo; int spinskipped; HellblazerXSub pickuprockets[6]; int preload; // additional loaded missiles (up to 2) @@ -100,29 +59,13 @@ Class Hellblazer : SWWMWeapon int seekcnt; int preloadcnt; - Property ClipCount : clipcount; - transient ui SWWMProjectionData projdata; - ui TextureID LockIcon[4]; + ui TextureID LockIcon; - override void RenderUnderlay( RenderEvent e ) + /*override void RenderUnderlay( RenderEvent e ) { Super.RenderUnderlay(e); - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - if ( !LockIcon[0] ) - { - LockIcon[0] = TexMan.CheckForTexture("graphics/HUD/HellblazerMissileLock.png"); - LockIcon[1] = TexMan.CheckForTexture("graphics/HUD/HellblazerCrackshotLock.png"); - LockIcon[2] = TexMan.CheckForTexture("graphics/HUD/HellblazerRavagerLock.png"); - LockIcon[3] = TexMan.CheckForTexture("graphics/HUD/HellblazerWarheadLock.png"); - } - int curtype = 0; - for ( int i=0; i<4; i++ ) - { - if ( loadammo != types[i] ) continue; - curtype = i; - break; - } + if ( !LockIcon ) LockIcon = TexMan.CheckForTexture("graphics/HUD/HellblazerMissileLock.png"); SWWMUtility.PrepareProjData(projdata,e.ViewPos,e.ViewAngle,e.ViewPitch,e.ViewRoll,players[consoleplayer].fov); int cliptop = projdata.viewy, clipbottom = projdata.viewy+projdata.viewh, clipleft = projdata.viewx, clipright = projdata.viewx+projdata.vieww; @@ -135,37 +78,17 @@ Class Hellblazer : SWWMWeapon Vector3 ndc = SWWMUtility.ProjectPoint(projdata,e.viewpos+level.Vec3Diff(e.viewpos,tpos+(0,0,seektarget[i].Height/2))); if ( ndc.z > 1. ) continue; Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc); - Screen.DrawTexture(LockIcon[curtype],false,vpos.x/hs,vpos.y/hs,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_CenterOffset,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); + Screen.DrawTexture(LockIcon,false,vpos.x/hs,vpos.y/hs,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_CenterOffset,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); } } - override void HudTick() - { - Super.HudTick(); - if ( lastammo && (lastammo != nextammo) && (Owner.player == players[consoleplayer]) ) - { - let bar = SWWMStatusBar(statusbar); - if ( bar ) - { - bar.ntagstr = GetDefaultByType(nextammo).GetTag(); - bar.ntagtic = level.totaltime; - bar.ntagcol = nametagcolor; - } - } - lastammo = nextammo; - } - override Vector3 GetTraceOffset( int index ) { return (10.,3.5,-5.); } - action void A_HellblazerFire( int type = 0, bool bAlt = false ) + action void A_HellblazerFire( bool bAlt = false ) { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - static const Class projs[] = {"HellblazerMissile","HellblazerCrackshot","HellblazerRavager","HellblazerWarhead", - "HellblazerMissile2","HellblazerCrackshot2","HellblazerRavager2","HellblazerWarhead2"}; - static const Color cols[] = {Color(4,3,2),Color(2,4,2),Color(4,2,2),Color(3,2,4)}; A_StartSound(bAlt?"hellblazer/altfire":"hellblazer/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:(bAlt?1.7:.8)); A_AlertMonsters(swwm_uncapalert?0:bAlt?400:1200); int qstr = bAlt?4:5; @@ -184,7 +107,7 @@ Class Hellblazer : SWWMWeapon a = FRandom[Hellblazer](0,360); s = FRandom[Hellblazer](0,bAlt?.02:.005); dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - let p = Spawn(projs[type+4*bAlt],origin); + let p = Spawn(bAlt?"HellblazerMissile2":"HellblazerMissile",origin); p.target = self; int tidx = max(0,invoker.seekcnt-(invoker.preload+1)); if ( invoker.seektarget[tidx] ) HellblazerMissile(p).seektarget = invoker.seektarget[tidx]; @@ -203,7 +126,7 @@ Class Hellblazer : SWWMWeapon s.special1 = 1; s.scale *= 2.4; s.alpha *= .4; - s.SetShade(cols[type]*Random[Hellblazer](48,63)); + s.SetShade(Color(4,3,2)*Random[Hellblazer](48,63)); s.vel += vel*.5+x*FRandom[Hellblazer](6.,10.)+y*FRandom[Hellblazer](-2,2)+z*FRandom[Hellblazer](-2,2); } for ( int i=0; i<6; i++ ) @@ -217,35 +140,16 @@ Class Hellblazer : SWWMWeapon override bool ReportHUDAmmo() { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - for ( int i=0; i<4; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; - return (clipcount>0); + return (clipcount>0)||(Ammo1.Amount>0); } override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; if ( (firemode == PrimaryFire) || (firemode == AltFire) ) - { - if ( clipcount > 0 ) return true; - for ( int i=0; i<4; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; - return false; - } + return (clipcount>0)||(Ammo1.Amount>0); return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); } - override bool UsesAmmo( Class kind ) - { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - for ( int i=0; i<4; i++ ) if ( kind is types[i] ) return true; - return false; - } - - override bool IsCurrentAmmo( Class kind ) - { - return (kind is nextammo); - } - action void A_GlassOverlay( StateLabel g ) { player.SetPSprite(PSP_WEAPON+1,invoker.FindState(g)); @@ -254,14 +158,10 @@ Class Hellblazer : SWWMWeapon A_OverlayRenderStyle(PSP_WEAPON+1,STYLE_Add); } - action state A_JumpByAmmoType( StateLabel a, StateLabel b, StateLabel c, StateLabel d, StateLabel g, StateLabel o = null ) + action state A_JumpX( StateLabel a, StateLabel g, StateLabel o = null ) { A_Overlay(-9999,o); A_GlassOverlay(g); - if ( invoker.loadammo is "HellblazerMissiles" ) return invoker.FindState(a); - if ( invoker.loadammo is "HellblazerCrackshots" ) return invoker.FindState(b); - if ( invoker.loadammo is "HellblazerRavagers" ) return invoker.FindState(c); - if ( invoker.loadammo is "HellblazerWarheads" ) return invoker.FindState(d); return invoker.FindState(a); } @@ -269,13 +169,13 @@ Class Hellblazer : SWWMWeapon { bool good = Super.PickupForAmmoSWWM(ownedWeapon); let Owner = ownedWeapon.Owner; - if ( (AmmoGive1 == 0) && loadammo ) + if ( (AmmoGive1 == 0) && (clipcount > 0) ) { // let's get this bread - Inventory cur = Owner.FindInventory(loadammo); + Inventory cur = Owner.FindInventory(AmmoType1); if ( !cur ) { - cur = Inventory(Spawn(loadammo)); + cur = Inventory(Spawn(AmmoType1)); cur.Amount = 0; cur.AttachToOwner(Owner); } @@ -290,107 +190,35 @@ Class Hellblazer : SWWMWeapon override void InitializeWeapon() { - if ( !loadammo ) - { - // 3 hellblazer missiles loaded - loadammo = "HellblazerMissiles"; - clipcount = 3; - magpos = 0; - for ( int i=0; i<6; i++ ) - magstate[i] = (i>2); - } - nextammo = loadammo; + // 3 hellblazer missiles loaded + clipcount = 3; + magpos = 0; + for ( int i=0; i<6; i++ ) + magstate[i] = (i>2); } clearscope int LoadedCapacity() const { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - static const int typeclipcount[] = {6,3,3,2}; - for ( int i=0; i<4; i++ ) - { - if ( loadammo != types[i] ) continue; - let a = Owner.FindInventory(types[i]); - return min(a.Amount+clipcount,typeclipcount[i]); - break; - } - return 0; - } - - action void A_PickNextAmmo() - { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - int curidx = 0; - for ( int i=0; i<4; i++ ) - { - if ( invoker.nextammo != types[i] ) continue; - curidx = (i+1)%4; - break; - } - Class oldammo = invoker.nextammo, newammo = invoker.loadammo; - for ( int i=0; i<4; i++ ) - { - int nidx = (i+curidx)%4; - if ( CountInv(types[nidx]) <= 0 ) continue; - newammo = types[nidx]; - break; - } - if ( newammo != oldammo ) A_StartSound("misc/invchange",CHAN_WEAPONEXTRA,CHANF_UI|CHANF_LOCAL); - invoker.nextammo = newammo; - } - - action void A_ZoomHold() - { - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - if ( player.cmd.buttons&BT_ZOOM ) return; - player.SetPSPrite(PSP_WEAPON,invoker.FindState("Ready")); + return min(Ammo1.Amount+clipcount,6); } action void A_SwapAmmo() { - let amo = FindInventory(invoker.loadammo); - // if we're loading the same ammo type, we only need to remove the needed ammo - if ( invoker.loadammo == invoker.nextammo ) - { - int takeamt = invoker.LoadedCapacity()-invoker.clipcount; - invoker.clipcount = invoker.LoadedCapacity(); - if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) - amo.Amount = max(0,amo.Amount-takeamt); - invoker.magpos = 0; - for ( int i=0; i<6; i++ ) - invoker.magstate[i] = !(invoker.clipcount > i); - return; - } - // re-add/drop any still loaded - int maxgiveamt = min(amo.MaxAmount-amo.Amount,invoker.clipcount); - int dropamt = invoker.clipcount-maxgiveamt; - if ( (dropamt > 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) amo.CreateTossable(dropamt); - amo.Amount = min(amo.MaxAmount,amo.Amount+invoker.clipcount); - // swap - invoker.clipcount = 0; - invoker.loadammo = invoker.nextammo; + int takeamt = invoker.LoadedCapacity()-invoker.clipcount; invoker.clipcount = invoker.LoadedCapacity(); + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + Ammo1.Amount = max(0,Ammo1.Amount-takeamt); invoker.magpos = 0; for ( int i=0; i<6; i++ ) invoker.magstate[i] = !(invoker.clipcount > i); - if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) - { - let namo = FindInventory(invoker.loadammo); - namo.Amount = max(0,namo.Amount-invoker.clipcount); - } + return; } action void A_HellblazerReady() { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; int flg = WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1; // can we fire? - bool canfire = (invoker.clipcount > 0); - for ( int i=0; i<4; i++ ) - { - if ( CountInv(types[i]) <= 0 ) continue; - canfire = true; - break; - } + bool canfire = (invoker.clipcount > 0) || (Ammo1.Amount > 0); if ( !canfire ) flg |= WRF_NOPRIMARY|WRF_NOSECONDARY; A_WeaponReady(flg); if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) ) @@ -400,25 +228,17 @@ Class Hellblazer : SWWMWeapon // check if weapon was dropped or interrupted in some way before the mag spin could be done action void A_CheckSpinSkip() { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - static const int magcap[] = {6,3,3,2}; for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; - for ( int i=0; i<4; i++ ) - { - if ( invoker.loadammo != types[i] ) continue; - // check preloaded rockets first (note, this theoretically would never go below zero) - invoker.magpos = max(0,invoker.magpos-invoker.preload); - invoker.preload = 0; - // do the spin - invoker.magpos = (invoker.magpos+invoker.spinskipped)%magcap[i]; - invoker.spinskipped = 0; - break; - } - } + // check preloaded rockets first (note, this theoretically would never go below zero) + invoker.magpos = max(0,invoker.magpos-invoker.preload); + invoker.preload = 0; + // do the spin + invoker.magpos = (invoker.magpos+invoker.spinskipped)%6; + invoker.spinskipped = 0; + }*/ action void A_UpdatePickup() { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; for ( int i=0; i<6; i++ ) { if ( !invoker.pickuprockets[i] ) @@ -432,17 +252,9 @@ Class Hellblazer : SWWMWeapon } invoker.pickuprockets[i].UpdateMe(); } - int curtype = 0; - for ( int i=0; i<4; i++ ) - { - if ( invoker.loadammo != types[i] ) continue; - curtype = i; - break; - } - SetState(SpawnState+curtype+1); } - action void A_CheckLockOn() + /*action void A_CheckLockOn() { if ( invoker.seekcnt > invoker.preload ) return; Vector3 x, y, z, x2, y2, z2, dir; @@ -504,7 +316,7 @@ Class Hellblazer : SWWMWeapon invoker.seekcnt++; A_StartSound("hellblazer/lock",CHAN_WEAPON,CHANF_OVERLAP); } - } + }*/ override void PreTravelled() { @@ -546,20 +358,9 @@ Class Hellblazer : SWWMWeapon MarkSound("hellblazer/magout"); MarkSound("hellblazer/magin"); MarkSound("hellblazer/close"); - MarkSound("hellblazer/hitm1"); - MarkSound("hellblazer/hitm2"); - MarkSound("hellblazer/hitm3"); - MarkSound("hellblazer/hitc1"); - MarkSound("hellblazer/hitc2"); - MarkSound("hellblazer/hitc3"); - MarkSound("hellblazer/hitcs1"); - MarkSound("hellblazer/hitcs2"); - MarkSound("hellblazer/hitcs3"); - MarkSound("hellblazer/hitr1"); - MarkSound("hellblazer/hitr2"); - MarkSound("hellblazer/hitr3"); - MarkSound("hellblazer/hitw1"); - MarkSound("hellblazer/hitw2"); + MarkSound("hellblazer/hit1"); + MarkSound("hellblazer/hit2"); + MarkSound("hellblazer/hit3"); MarkSound("hellblazer/bounce"); MarkSound("hellblazer/fly"); MarkSound("hellblazer/preload"); @@ -582,7 +383,6 @@ Class Hellblazer : SWWMWeapon Weapon.AmmoType1 "HellblazerMissiles"; Weapon.AmmoGive1 3; SWWMWeapon.DropAmmoType "SWWMRocketAmmoSmall"; - Hellblazer.ClipCount 6; +SWWMWEAPON.NOFIRSTGIVE; +WEAPON.EXPLOSIVE; Radius 24; @@ -592,73 +392,36 @@ Class Hellblazer : SWWMWeapon { Spawn: XZW1 A -1 NoDelay A_UpdatePickup(); - XZW1 ABCD -1; Stop; - Select: - XZW2 I 0 + /*Select: + XZW2 I 2 { A_CheckSpinSkip(); A_FullRaise(); - return A_JumpByAmmoType("Select_1","Select_2","Select_3","Select_4","Select_G"); + A_GlassOverlay("Select_G"); } - Select_1: - XZW2 IJKLMNOP 2; - Goto Ready_1; - Select_2: - XZW7 DEFGHIJK 2; - Goto Ready_2; - Select_3: - XZWC BCDEFGHI 2; - Goto Ready_3; - Select_4: - XZWG Z 2; - XZWH ABCDEFG 2; - Goto Ready_4; + XZW2 JKLMNOP 2; + Goto Ready; Select_G: XZWM ABCDEFGH 2; Goto Ready_G; Deselect: - XZW2 A 0 + XZW2 A 2 { A_StartSound("hellblazer/deselect",CHAN_WEAPON,CHANF_OVERLAP); - return A_JumpByAmmoType("Deselect_1","Deselect_2","Deselect_3","Deselect_4","Deselect_G"); + A_GlassOverlay("Deselect_G"); } - Deselect_1: - XZW2 ABCDEFGHI 2; + XZW2 BCDEFGHI 2; XZW2 I -1 A_FullLower(); Stop; - Deselect_2: - XZW6 VWXYZ 2; - XZW7 ABCD 2; - XZW7 D -1 A_FullLower(); - Stop; - Deselect_3: - XZWB TUVWXYZ 2; - XZWC AB 2; - XZWC B -1 A_FullLower(); - Stop; - Deselect_4: - XZWG RSTUVWXYZ 2; - XZWG Z -1 A_FullLower(); - Stop; Deselect_G: XZWL STUVWXYZ 2; XZWM A 2; Stop; Ready: - XZW2 A 0 A_JumpByAmmoType("Ready_1","Ready_2","Ready_3","Ready_4","Ready_G"); - Ready_1: + XZW2 A 0 A_GlassOverlay("Ready_G"); XZW2 A 1 A_HellblazerReady(); Wait; - Ready_2: - XZW6 V 1 A_HellblazerReady(); - Wait; - Ready_3: - XZWB T 1 A_HellblazerReady(); - Wait; - Ready_4: - XZWG R 1 A_HellblazerReady(); - Wait; Ready_G: XZWL S 1; Wait; @@ -672,8 +435,8 @@ Class Hellblazer : SWWMWeapon { if ( invoker.clipcount <= 0 ) { - if ( CountInv(invoker.nextammo) <= 0 ) A_PickNextAmmo(); - return A_JumpByAmmoType("Unload_1","Unload_2","Unload_3","Unload_4","Unload_G"); + A_GlassOverlay("Unload_G"); + return ResolveState("Unload"); } if ( player.cmd.buttons&BT_ATTACK ) { @@ -681,20 +444,23 @@ Class Hellblazer : SWWMWeapon if ( (player.cmd.buttons&BT_ALTATTACK) || ((invoker.clipcount < 2) && (invoker.preloadcnt >= 10)) ) { invoker.preloadcnt = 0; - return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G"); + A_GlassOverlay("Ready_G"); + return ResolveState("PreFire"); } if ( invoker.preloadcnt >= 10 ) { invoker.preloadcnt = 0; - return A_JumpByAmmoType("PreLoad_1","PreLoad_2","PreFire_3","PreFire_4","Ready_G"); + A_GlassOverlay("Ready_G"); + return ResolveState("PreLoad"); } return ResolveState(null); } - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + A_GlassOverlay("DoFire_G"); + return ResolveState("DoFire"); } Wait; - Fire_1: - XZW2 A 1 A_HellblazerFire(0); + DoFire: + XZW2 A 1 A_HellblazerFire(); XZW2 QRSTUVW 2; XZW2 A 0 { @@ -703,35 +469,13 @@ Class Hellblazer : SWWMWeapon { invoker.preload--; invoker.spinskipped--; - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + A_GlassOverlay("DoFire_G"); + return ResolveState("DoFire"); } return ResolveState(null); } - Goto Cycle_1; - Fire_2: - XZW6 V 1 A_HellblazerFire(1); - XZW7 LMNOPQR 2; - XZW6 V 0 - { - // chain-fire - if ( invoker.preload > 0 ) - { - invoker.preload--; - invoker.spinskipped--; - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); - } - return ResolveState(null); - } - Goto Cycle_2; - Fire_3: - XZWB T 1 A_HellblazerFire(2); - XZWC JKLMNOP 2; - Goto Cycle_3; - Fire_4: - XZWG R 1 A_HellblazerFire(3); - XZWH HIJKLMN 2; - Goto Cycle_4; - Fire_G: + Goto Cycle; + DoFire_G: XZWL S 1; XZWM IJKLMNO 2; Goto Ready_G; // state jump to cycling is done elsewhere @@ -745,8 +489,8 @@ Class Hellblazer : SWWMWeapon { if ( invoker.clipcount <= 0 ) { - if ( CountInv(invoker.nextammo) <= 0 ) A_PickNextAmmo(); - return A_JumpByAmmoType("Unload_1","Unload_2","Unload_3","Unload_4","Unload_G"); + A_GlassOverlay("Unload_G"); + return ResolveState("Unload"); } if ( player.cmd.buttons&BT_ALTATTACK ) { @@ -754,20 +498,23 @@ Class Hellblazer : SWWMWeapon if ( (player.cmd.buttons&BT_ATTACK) || ((invoker.clipcount < 2) && (invoker.preloadcnt >= 10)) ) { invoker.preloadcnt = 0; - return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G"); + A_GlassOverlay("Ready_G"); + return ResolveState("PreAltFire"); } if ( invoker.preloadcnt >= 10 ) { invoker.preloadcnt = 0; - return A_JumpByAmmoType("PreAltLoad_1","PreAltLoad_2","PreAltFire_3","PreAltFire_4","Ready_G"); + A_GlassOverlay("Ready_G"); + return ResolveState("PreAltLoad"); } return ResolveState(null); } - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + A_GlassOverlay("DoAltFire_G"); + return ResolveState("DoAltFire"); } Wait; - AltFire_1: - XZW2 A 1 A_HellblazerFire(0,true); + DoAltFire: + XZW2 A 1 A_HellblazerFire(true); XZW2 XYZ 2; XZW3 ABCD 2; XZW2 A 0 @@ -781,41 +528,18 @@ Class Hellblazer : SWWMWeapon } return ResolveState(null); } - Goto Cycle_1; - AltFire_2: - XZW6 V 1 A_HellblazerFire(1,true); - XZW7 STUVWXY 2; - XZW6 V 0 - { - // chain-fire - if ( invoker.preload > 0 ) - { - invoker.preload--; - invoker.spinskipped--; - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); - } - return ResolveState(null); - } - Goto Cycle_2; - AltFire_3: - XZWB T 1 A_HellblazerFire(2,true); - XZWC QRSTUVW 2; - Goto Cycle_3; - AltFire_4: - XZWG R 1 A_HellblazerFire(3,true); - XZWH OPQRSTU 2; - Goto Cycle_4; - AltFire_G: + Goto Cycle; + DoAltFire_G: XZWL S 1; XZWM PQRSTUV 2; Goto Ready_G; // state jump to cycling is done elsewhere - PreLoad_1: + PreLoad: XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); XZW2 A 2 { invoker.magpos = (invoker.magpos+1)%6; invoker.preload++; - A_GlassOverlay("Cycle_G1"); + A_GlassOverlay("Cycle_G"); } XZW3 E 2; XZW3 FGHI 2; @@ -824,41 +548,25 @@ Class Hellblazer : SWWMWeapon XZW2 A 1 { if ( !(player.cmd.buttons&BT_ATTACK) ) - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + { + A_GlassOverlay("DoFire_G"); + return ResolveState("DoFire"); + } if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) - return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G"); - return ResolveState("PreLoad_1"); + { + A_GlassOverlay("Ready_G"); + return ResolveState("PreFire"); + } + return ResolveState("PreLoad"); } Wait; - PreLoad_2: - XZW6 V 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); - XZW6 V 2 - { - invoker.magpos = (invoker.magpos+1)%3; - invoker.preload++; - A_GlassOverlay("Cycle_G2"); - } - XZW7 Z 2; - XZW8 ABCDEFG 2; - XZW8 G 0; - XZW8 A 2; - XZW7 Z 2; - XZW6 V 1 - { - if ( !(player.cmd.buttons&BT_ATTACK) ) - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); - if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) - return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G"); - return ResolveState("PreLoad_2"); - } - Wait; - PreAltLoad_1: + PreAltLoad: XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); XZW2 A 2 { invoker.magpos = (invoker.magpos+1)%6; invoker.preload++; - A_GlassOverlay("Cycle_G1"); + A_GlassOverlay("Cycle_G"); } XZW3 E 2; XZW3 FGHI 2; @@ -867,35 +575,19 @@ Class Hellblazer : SWWMWeapon XZW2 A 1 { if ( !(player.cmd.buttons&BT_ALTATTACK) ) - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + { + A_GlassOverlay("DoAltFire_G"); + return ResolveState("DoAltFire"); + } if ( (player.cmd.buttons&BT_ATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) - return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G"); - return ResolveState("PreAltLoad_1"); + { + A_GlassOverlay("Ready_G"); + return ResolveState("PreAltFire"); + } + return ResolveState("PreAltLoad"); } Wait; - PreAltLoad_2: - XZW6 V 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); - XZW6 V 2 - { - invoker.magpos = (invoker.magpos+1)%3; - invoker.preload++; - A_GlassOverlay("Cycle_G2"); - } - XZW7 Z 2; - XZW8 ABCDEFG 2; - XZW8 G 0; - XZW8 A 2; - XZW7 Z 2; - XZW6 V 1 - { - if ( !(player.cmd.buttons&BT_ALTATTACK) ) - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); - if ( (player.cmd.buttons&BT_ATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) - return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G"); - return ResolveState("PreAltLoad_2"); - } - Wait; - PreFire_1: + PreFire: XZW2 A 0 { invoker.seekcnt = 0; @@ -904,7 +596,10 @@ Class Hellblazer : SWWMWeapon XZW2 A 1 { if ( !(player.cmd.buttons&BT_ATTACK) ) - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + { + A_GlassOverlay("DoFire_G"); + return ResolveState("DoFire"); + } A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) A_CheckLockOn(); @@ -917,73 +612,7 @@ Class Hellblazer : SWWMWeapon return ResolveState(null); } Wait; - PreFire_2: - XZW6 V 0 - { - invoker.seekcnt = 0; - A_StartSound("hellblazer/hold",CHAN_WEAPON,CHANF_OVERLAP); - } - XZW6 V 1 - { - if ( !(player.cmd.buttons&BT_ATTACK) ) - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) - A_CheckLockOn(); - if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) - { - for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; - if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); - invoker.seekcnt = 0; - } - return ResolveState(null); - } - Wait; - PreFire_3: - XZWB T 0 - { - invoker.seekcnt = 0; - A_StartSound("hellblazer/hold",CHAN_WEAPON,CHANF_OVERLAP); - } - XZWB T 1 - { - if ( !(player.cmd.buttons&BT_ATTACK) ) - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) - A_CheckLockOn(); - if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) - { - for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; - if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); - invoker.seekcnt = 0; - } - return ResolveState(null); - } - Wait; - PreFire_4: - XZWG R 0 - { - invoker.seekcnt = 0; - A_StartSound("hellblazer/hold",CHAN_WEAPON,CHANF_OVERLAP); - } - XZWG R 1 - { - if ( !(player.cmd.buttons&BT_ATTACK) ) - return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) - A_CheckLockOn(); - if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) - { - for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; - if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); - invoker.seekcnt = 0; - } - return ResolveState(null); - } - Wait; - PreAltFire_1: + PreAltFire: XZW2 A 0 { invoker.seekcnt = 0; @@ -992,7 +621,10 @@ Class Hellblazer : SWWMWeapon XZW2 A 1 { if ( !(player.cmd.buttons&BT_ALTATTACK) ) - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + { + A_GlassOverlay("DoAltFire_G"); + return ResolveState("DoAltFire"); + } A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) A_CheckLockOn(); @@ -1005,124 +637,19 @@ Class Hellblazer : SWWMWeapon return ResolveState(null); } Wait; - PreAltFire_2: - XZW6 V 0 - { - invoker.seekcnt = 0; - A_StartSound("hellblazer/hold",CHAN_WEAPON,CHANF_OVERLAP); - } - XZW6 V 1 - { - if ( !(player.cmd.buttons&BT_ALTATTACK) ) - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) - A_CheckLockOn(); - if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) - { - for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; - if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); - invoker.seekcnt = 0; - } - return ResolveState(null); - } - Wait; - PreAltFire_3: - XZWB T 0 - { - invoker.seekcnt = 0; - A_StartSound("hellblazer/hold",CHAN_WEAPON,CHANF_OVERLAP); - } - XZWB T 1 - { - if ( !(player.cmd.buttons&BT_ALTATTACK) ) - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) - A_CheckLockOn(); - if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) - { - for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; - if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); - invoker.seekcnt = 0; - } - return ResolveState(null); - } - Wait; - PreAltFire_4: - XZWG R 0 - { - invoker.seekcnt = 0; - A_StartSound("hellblazer/hold",CHAN_WEAPON,CHANF_OVERLAP); - } - XZWG R 1 - { - if ( !(player.cmd.buttons&BT_ALTATTACK) ) - return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) - A_CheckLockOn(); - if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) - { - for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; - if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); - invoker.seekcnt = 0; - } - return ResolveState(null); - } - Wait; - Cycle_1: + Cycle: XZW2 A 2 { invoker.spinskipped--; invoker.magpos = (invoker.magpos+1)%6; - A_GlassOverlay("Cycle_G1"); + A_GlassOverlay("Cycle_G"); } XZW3 E 2; XZW3 FGHI 2; XZW3 I 0; XZW3 FE 2; - Goto Ready_1; - Cycle_2: - XZW6 V 2 - { - invoker.spinskipped--; - invoker.magpos = (invoker.magpos+1)%3; - A_GlassOverlay("Cycle_G2"); - } - XZW7 Z 2; - XZW8 ABCDEFG 2; - XZW8 G 0; - XZW8 A 2; - XZW7 Z 2; - Goto Ready_2; - Cycle_3: - XZWB T 2 - { - invoker.spinskipped--; - invoker.magpos = (invoker.magpos+1)%3; - A_GlassOverlay("Cycle_G2"); - } - XZWC X 2; - XZWC YZ 2; - XZWD ABCDE 2; - XZWD E 0; - XZWC YX 2; - Goto Ready_3; - Cycle_4: - XZWG R 2 - { - invoker.spinskipped--; - invoker.magpos = (invoker.magpos+1)%2; - A_GlassOverlay("Cycle_G3"); - } - XZWH V 2; - XZWH WXYZ 2; - XZWI ABCDEF 2; - XZWI F 0; - XZWH WV 2; - Goto Ready_4; - Cycle_G1: + Goto Ready; + Cycle_G: XZWL S 2 A_StartSound("hellblazer/shift",CHAN_WEAPON,CHANF_OVERLAP); XZWM W 2; XZWM X 2 A_StartSound("hellblazer/spin",CHAN_WEAPON,CHANF_OVERLAP); @@ -1131,83 +658,24 @@ Class Hellblazer : SWWMWeapon XZWN A 0 A_StartSound("hellblazer/shift",CHAN_WEAPON,CHANF_OVERLAP); XZWM XW 2; Goto Ready_G; - Cycle_G2: - XZWL S 2 A_StartSound("hellblazer/shift",CHAN_WEAPON,CHANF_OVERLAP); - XZWM W 2; - XZWN B 2 A_StartSound("hellblazer/spin",CHAN_WEAPON,CHANF_OVERLAP); - XZWN CD 2; - XZWN E 2 A_StartSound("hellblazer/spin",CHAN_WEAPON,CHANF_OVERLAP); - XZWN FGH 2; - XZWN H 0 A_StartSound("hellblazer/shift",CHAN_WEAPON,CHANF_OVERLAP); - XZWN B 2; - XZWM W 2; - Goto Ready_G; - Cycle_G3: - XZWL S 2 A_StartSound("hellblazer/shift",CHAN_WEAPON,CHANF_OVERLAP); - XZWM W 2; - XZWN I 2 A_StartSound("hellblazer/spin",CHAN_WEAPON,CHANF_OVERLAP); - XZWN JK 2; - XZWN L 2 A_StartSound("hellblazer/spin",CHAN_WEAPON,CHANF_OVERLAP); - XZWN MN 2; - XZWN O 2 A_StartSound("hellblazer/spin",CHAN_WEAPON,CHANF_OVERLAP); - XZWN PQR 2; - XZWN R 0 A_StartSound("hellblazer/shift",CHAN_WEAPON,CHANF_OVERLAP); - XZWN I 2; - XZWM W 2; - Goto Ready_G; Reload: XZW2 A 2 { - if ( (invoker.clipcount <= 0) && (CountInv(invoker.nextammo) <= 0) ) A_PickNextAmmo(); - if ( (invoker.clipcount >= invoker.LoadedCapacity()) && (invoker.loadammo == invoker.nextammo) ) - return A_JumpByAmmoType("Idle_1","Idle_2","Idle_3","Idle_4","Idle_G"); - return A_JumpByAmmoType("Unload_1","Unload_2","Unload_3","Unload_4","Unload_G"); + if ( invoker.clipcount >= invoker.LoadedCapacity() ) + { + A_GlassOverlay("Zoom_G"); + return ResolveState("Zoom"); + } + A_GlassOverlay("Unload_G"); + return ResolveState("Unload"); } Goto Ready; - Unload_1: + Unload: XZW2 A 2; XZW3 JKLMNOPQRSTUVWXYZ 2; XZW4 ABCDEFGHIJ 2; XZWR JKLMN 3; - XZW4 J 2 - { - A_SwapAmmo(); - return A_JumpByAmmoType("Load_1","Load_2","Load_3","Load_4","Load_G"); - } - Goto Load_1; - Unload_2: - XZW6 V 2; - XZW8 HIJKLMNOPQRSTUVWXYZ 2; - XZW9 ABCDEFGH 2; - XZWR JKLMN 3; - XZW9 H 2 - { - A_SwapAmmo(); - return A_JumpByAmmoType("Load_1","Load_2","Load_3","Load_4","Load_G"); - } - Goto Load_2; - Unload_3: - XZWB T 2; - XZWD FGHIJKLMNOPQRSTUVWXYZ 2; - XZWE ABCDEF 2; - XZWR JKLMN 3; - XZWE F 2 - { - A_SwapAmmo(); - return A_JumpByAmmoType("Load_1","Load_2","Load_3","Load_4","Load_G"); - } - Goto Load_3; - Unload_4: - XZWG R 2; - XZWI GHIJKLMNOPQRSTUVWXYZ 2; - XZWJ ABCDEFG 2; - XZWR JKLMN 3; - XZWJ G 2 - { - A_SwapAmmo(); - return A_JumpByAmmoType("Load_1","Load_2","Load_3","Load_4","Load_G"); - } - Goto Load_4; + Goto Load; Unload_G: XZWL S 2 A_StartSound("hellblazer/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZWN STU 2; @@ -1218,22 +686,10 @@ Class Hellblazer : SWWMWeapon XZWO JKLMNOPQRS 2; XZWR EFGHI 3; Goto Load_G; - Load_1: + Load: XZW4 JKLMNOPQRSTUVWXYZ 2; XZW5 ABCDEFGHIJ 2; - Goto Ready_1; - Load_2: - XZW9 HIJKLMNOPQRSTUVWXYZ 2; - XZWA ABCDEFGH 2; - Goto Ready_2; - Load_3: - XZWE FGHIJKLMNOPQRSTUVWXYZ 2; - XZWF ABCDEF 2; - Goto Ready_3; - Load_4: - XZWJ GHIJKLMNOPQRSTUVWXYZ 2; - XZWK ABCDEFG 2; - Goto Ready_4; + Goto Ready; Load_G: XZWO S 2 A_PlayerReload(); XZWO TUVWXY 2; @@ -1244,24 +700,12 @@ Class Hellblazer : SWWMWeapon XZWP M 2 A_StartSound("hellblazer/meleestop",CHAN_WEAPON,CHANF_OVERLAP); XZWP NOPQRS 2; Goto Ready_G; - Idle_1: - XZW2 A 2; + Zoom: + XZW2 A 2 A_GlassOverlay("Zoom_G"); XZW5 KLMNOPQRSTUVWXYZ 2; XZW6 A 2; - Goto Ready_1; - Idle_2: - XZW6 V 2; - XZWA IJKLMNOPQRSTUVWXY 2; - Goto Ready_2; - Idle_3: - XZWB T 2; - XZWF GHIJKLMNOPQRSTUVW 2; - Goto Ready_3; - Idle_4: - XZWG R 2; - XZWK HIJKLMNOPQRSTUVWX 2; - Goto Ready_4; - Idle_G: + Goto Ready; + Zoom_G: XZWL S 2 { A_StartSound("hellblazer/idle",CHAN_WEAPON,CHANF_OVERLAP); @@ -1272,47 +716,13 @@ Class Hellblazer : SWWMWeapon XZWP Z 2; XZWQ ABCDEFGHIJ 2; Goto Ready_G; - Zoom: - #### # 1 - { - A_PickNextAmmo(); - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - } - #### # 1 A_ZoomHold(); - Wait; User1: - XZW2 A 0 A_JumpByAmmoType("User1_1","User1_2","User1_3","User1_4","User1_G"); - User1_1: - XZW2 A 2; + XZW2 A 2 A_GlassOverlay("User_G"); XZW6 BCDE 2; XZW6 FGH 1; XZW6 IJK 2; XZW6 LMNOPQRSTU 2; - Goto Ready_1; - User1_2: - XZW6 V 2; - XZWA Z 2; - XZWB ABC 2; - XZWB DEF 1; - XZWB GHI 2; - XZWB JKLMNOPQRS 2; - Goto Ready_2; - User1_3: - XZWB T 2; - XZWF XYZ 2; - XZWG A 2; - XZWG BCD 1; - XZWG EFG 2; - XZWG HIJKLMNOPQ 2; - Goto Ready_3; - User1_4: - XZWG R 2; - XZWK YZ 2; - XZWL AB 2; - XZWL CDE 1; - XZWL FGH 2; - XZWL IJKLMNOPQR 2; - Goto Ready_4; + Goto Ready; User1_G: XZWL S 2 { @@ -1328,6 +738,6 @@ Class Hellblazer : SWWMWeapon XZWQ W 2 A_StartSound("hellblazer/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZWQ XYZ 2; XZWR ABCD 2; - Goto Ready_G; + Goto Ready_G;*/ } } diff --git a/zscript/weapons/swwm_blazeit_fx.zsc b/zscript/weapons/swwm_blazeit_fx.zsc index 470aaf129..365a9bad6 100644 --- a/zscript/weapons/swwm_blazeit_fx.zsc +++ b/zscript/weapons/swwm_blazeit_fx.zsc @@ -9,25 +9,6 @@ Class HellblazerExplLight : PaletteLight ReactionTime 25; } } -Class HellblazerExplLight2 : PaletteLight -{ - Default - { - Tag "HellExpl"; - Args 0,0,0,120; - ReactionTime 20; - } -} -Class HellblazerExplLight3 : PaletteLight -{ - Default - { - Tag "HellExpl"; - Args 0,0,0,900; - ReactionTime 60; - } -} - Class HellblazerSubExpl : Actor { Default @@ -104,19 +85,17 @@ Class HellblazerRing : Actor } } -Class HellblazerRing2 : Actor +Class HellblazerArmTrail : Actor { Default { RenderStyle "Add"; - Scale 3.; - Radius 0.1; - Height 0; - +NOGRAVITY; +NOBLOCKMAP; + +NOGRAVITY; +FORCEXYBILLBOARD; +NOTELEPORT; +NOINTERACTION; + Scale 2.5; } override void Tick() { @@ -132,11 +111,60 @@ Class HellblazerRing2 : Actor States { Spawn: - XRG3 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.1); + XEX0 ACEGIKMOQS 1 Bright; Stop; } } +Class HellblazerArm : Actor +{ + Default + { + Obituary "$O_HELLBLAZER"; + DamageType 'Fire'; + PROJECTILE; + +THRUACTORS; + +BOUNCEONWALLS; + +BOUNCEONFLOORS; + +BOUNCEONCEILINGS; + +CANBOUNCEWATER; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + -NOGRAVITY; + Gravity 0.35; + BounceFactor 1.0; + Radius 4; + Height 4; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + reactiontime = Random[ExploS](6,8); + double ang, pt; + ang = FRandom[ExploS](0,360); + pt = FRandom[ExploS](-90,90); + vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](30.,40.); + } + States + { + Spawn: + TNT1 A 1 + { + Spawn("HellblazerArmTrail",pos); + SWWMUtility.DoExplosion(self,5+reactiontime/2,300+50*reactiontime,60+4*reactiontime); + Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,5); + let s = Spawn("SWWMHalfSmoke",pos); + s.vel = pvel+vel*.2; + s.SetShade(Color(4,2,1)*Random[ExploS](48,63)); + s.special1 = Random[ExploS](0,2); + s.scale *= 3.; + s.alpha *= 0.1+.4*(ReactionTime/8.); + A_CountDown(); + } + Wait; + } +} + Class HellblazerTrail : Actor { Default @@ -206,10 +234,6 @@ Class HellblazerFlare : Actor override void PostBeginPlay() { if ( !master ) return; - State sp = FindState("Spawn"); - if ( master is 'HellblazerCrackshot' ) SetState(sp+1); - else if ( master is 'HellblazerRavager' ) SetState(sp+2); - else if ( master is 'HellblazerWarhead' ) SetState(sp+3); } override void Tick() @@ -227,7 +251,7 @@ Class HellblazerFlare : Actor States { Spawn: - HFLR ABCD -1 Bright; + HFLR A -1 Bright; Stop; } } @@ -338,8 +362,8 @@ Class HellblazerMissile : Actor A_NoGravity(); A_QuakeEx(5,5,5,15,0,1500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:500,rollIntensity:.8); A_StopSound(CHAN_BODY); - A_StartSound("hellblazer/hitm",CHAN_WEAPON,attenuation:.8); - A_StartSound("hellblazer/hitm",CHAN_VOICE,attenuation:.5); + A_StartSound("hellblazer/hit",CHAN_WEAPON,attenuation:.8); + A_StartSound("hellblazer/hit",CHAN_VOICE,attenuation:.5); A_AlertMonsters(swwm_uncapalert?0:2500); Spawn("HellblazerExplLight",pos); int numpt = Random[Hellblazer](12,24); @@ -376,266 +400,9 @@ Class HellblazerMissile : Actor { if ( special1 < 8 ) SWWMUtility.DoExplosion(self,80-special1*10,30000-special1*3000,180+special1*15,damagetype:'Fire'); special1++; - if ( (special1 > 8) || !(special1%2) ) return; - int numpt = Random[Hellblazer](0,8-special1); - double ang, pt; - for ( int i=0; i 10) || (special2%3) ) return; - int numpt = 11-special2; - for ( int i=0; i= 40 ) - { - if ( target ) SWWMUtility.AchievementProgress("slayer",invoker.nkill,target.player); - Destroy(); - } - } - Wait; + TNT1 A 0 A_BlazerMissileExplode(); + HEXP ABCDEFGHIJKLMNOPQR 1 Bright A_SubExpl(); + Stop; } } -Mixin Class HellblazerGrenade +// grenades +Class HellblazerMissile2 : HellblazerMissile { double rollvel, anglevel, pitchvel; Vector3 oldvel; @@ -832,467 +590,3 @@ Mixin Class HellblazerGrenade Goto Spawn; } } - -// grenades -Class HellblazerMissile2 : HellblazerMissile -{ - Mixin HellblazerGrenade; -} - -Class HellblazerCrackshot2 : HellblazerCrackshot -{ - Mixin HellblazerGrenade; -} - -Class HellblazerRavager2 : HellblazerRavager -{ - Mixin HellblazerGrenade; -} - -Class HellblazerWarhead2 : HellblazerWarhead -{ - Mixin HellblazerGrenade; -} - -Class HellblazerClusterMini : HellblazerMissile2 -{ - Default - { - Radius 2; - Height 4; - Speed 20; - ReactionTime 30; - } - - void A_ClusterTick( Color smokecol ) - { - special2++; - Vector3 traildir = -SWWMUtility.Vec3FromAngles(angle,pitch); - for ( int i=0; i<2; i++ ) - { - let s = Spawn("SWWMHalfSmoke",level.Vec3Offset(pos,traildir*3)); - s.SetShade(smokecol*Random[Hellblazer](48,63)); - s.scale *= FRandom[Hellblazer](.6,.8); - s.special1 = Random[Hellblazer](0,1); - s.alpha *= .4; - s.vel = .3*vel + (traildir+SWWMUtility.Vec3FromAngles(FRandom[Hellblazer](0,360),FRandom[Hellblazer](-90,90))*.4).unit()*FRandom[Hellblazer](1.,2.); - } - if ( (deto > 1) && (special2 > 5) ) - { - ExplodeMissile(); - return; - } - // proximity check - let bt = BlockThingsIterator.Create(self,200); - while ( bt.Next() ) - { - let t = bt.Thing; - if ( !t || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain') && !t.player) || (t.Health <= 0) || (target && t.IsFriend(target)) || !SWWMUtility.SphereIntersect(t,level.Vec3Offset(pos,vel),60) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; - deto++; - break; - } - } - - void A_ClusterExplode() - { - bForceXYBillboard = true; - bRollSprite = false; - A_SetRenderStyle(1.0,STYLE_Add); - A_SprayDecal("BigRocketBlast",50); - A_SetScale(2.5); - SWWMUtility.DoExplosion(self,80,200000,150,60); - A_NoGravity(); - A_QuakeEx(4,4,4,12,0,1000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:400,rollIntensity:.6); - A_StopSound(CHAN_BODY); - A_StartSound("hellblazer/hitcs",CHAN_WEAPON,attenuation:.9); - A_StartSound("hellblazer/hitcs",CHAN_VOICE,attenuation:.5); - A_AlertMonsters(swwm_uncapalert?0:2000); - Spawn("HellblazerExplLight2",pos); - int numpt = Random[Hellblazer](4,8); - for ( int i=0; i 5) || !(special1%2) ) return; - int numpt = Random[Hellblazer](0,5-special1); - double ang, pt; - for ( int i=0; i closest ) continue; - closest = dist; - whomst = t; - } - if ( !whomst ) return; - Vector3 dirto = level.Vec3Diff(pos,whomst.Vec3Offset(0,0,whomst.Height/2)); - double distto = dirto.length(); - if ( distto <= 0. ) return; - dirto /= distto; - dirto.z += .1; - double spd = vel.length(); - if ( spd <= 0. ) return; - vel /= spd; - vel = (vel*.3+dirto*.7)*spd; - } - override void A_HandleBounce() - { - Super.A_HandleBounce(); - A_Steer(); - } - States - { - Spawn: - XZW1 A 1 A_ClusterTick(Color(2,4,2)); - Wait; - Bounce: - XZW1 A 0 A_HandleBounce(); - Goto Spawn; - Death: - TNT1 A 0 A_ClusterExplode(); - HEXP ABCDEFGHIJKLMNOPQR 1 Bright A_ClusterSubExpl(); - Stop; - } -} - -Class RavagerLight : PaletteLight -{ - Default - { - Tag "DRed"; - Args 0,0,0,250; - } -} - -Class RavagerPuff : Actor -{ - Vector2 initsc; - - Default - { - RenderStyle "Add"; - Scale .8; - Alpha .7; - +NOGRAVITY; - +NOBLOCKMAP; - +DONTSPLASH; - +NOINTERACTION; - +NOTELEPORT; - +ROLLSPRITE; - +ROLLCENTER; - +FORCEXYBILLBOARD; - } - override void PostBeginPlay() - { - scale *= FRandom[Hellblazer](.8,1.); - alpha *= FRandom[Hellblazer](.8,1.); - roll = FRandom[Hellblazer](0,360); - SetState(FindState("Spawn")+Random[Hellblazer](0,19)); - initsc = scale; - } - override void Tick() - { - if ( isFrozen() ) return; - A_FadeOut((waterlevel>0)?.1:.02); - scale += initsc*.2; - if ( !CheckNoDelay() || (tics == -1) ) return; - if ( tics > 0 ) tics--; - while ( !tics ) - { - if ( !SetState(CurState.NextState) ) - return; - } - } - States - { - Spawn: - RFLM ABCDEFGHIJKLMNOPQRST -1 Bright; - Stop; - } -} - -Class HellblazerRavagerArm : Actor -{ - Vector3 oldvel; - - Default - { - Obituary "$O_HELLBLAZER"; - DamageType 'Fire'; - PROJECTILE; - +THRUACTORS; - +BOUNCEONWALLS; - +BOUNCEONFLOORS; - +BOUNCEONCEILINGS; - +CANBOUNCEWATER; - +USEBOUNCESTATE; - +NODAMAGETHRUST; - +FORCERADIUSDMG; - -NOGRAVITY; - Gravity 0.35; - BounceFactor 1.0; - Radius 2; - Height 2; - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - reactiontime = Random[ExploS](15,25); - vel = SWWMUtility.Vec3FromAngles(angle,pitch)*FRandom[ExploS](10.,15.); - } - override void Tick() - { - oldvel = vel; - Super.Tick(); - } - void A_HandleBounce() - { - Vector3 HitNormal = -vel.unit(); - F3DFloor ff; - if ( BlockingFloor ) - { - // find closest 3d floor for its normal - for ( int i=0; i= (BlockingMobj.pos.x+BlockingMobj.radius) ) - HitNormal = (1,0,0); - else if ( (pos.y+radius) <= (BlockingMobj.pos.y-BlockingMobj.radius) ) - HitNormal = (0,-1,0); - else if ( (pos.y-radius) >= (BlockingMobj.pos.y+BlockingMobj.radius) ) - HitNormal = (0,1,0); - else if ( pos.z >= (BlockingMobj.pos.z+BlockingMobj.height) ) - HitNormal = (0,0,1); - else if ( (pos.z+height) <= BlockingMobj.pos.z ) - HitNormal = (0,0,-1); - } - // undo the bounce, we need to hook in our own - vel = oldvel; - // re-do the bounce with our formula - vel = (vel dot HitNormal)*HitNormal*FRandom[Hellblazer](-1.5,-1.)+vel; - } - States - { - Spawn: - TNT1 A 1 - { - if ( waterlevel > 0 ) ReactionTime -= 2; - let p = Spawn("RavagerPuff",pos); - p.alpha *= .4+.6*(ReactionTime/25.); - p.scale *= 2.5-1.5*(ReactionTime/25.); - if ( !(ReactionTime%3) ) - { - let l = Spawn("RavagerLight",pos); - l.Args[3] = int(90+50*(ReactionTime/25.)); - l.ReactionTime = int(2+8*(ReactionTime/25.)); - l.target = p; - } - SWWMUtility.DoExplosion(self,20+reactiontime/2,2000+400*reactiontime,300-4*reactiontime,100); - double spd = min(vel.length()*1.1,50); - vel = (vel*.1+SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*.1).unit()*spd; - Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,5); - let s = Spawn("SWWMHalfSmoke",pos); - s.vel = pvel+vel*.2; - s.SetShade(Color(4,2,1)*Random[ExploS](48,63)); - s.special1 = Random[ExploS](4,8); - s.scale *= 4.; - s.alpha *= .2+.3*(ReactionTime/25.); - if ( !(ReactionTime%2) ) - { - int numpt = Random[Hellblazer](-2,4); - for ( int i=0; i 0 ) tics--; - while ( !tics ) - { - if ( !SetState(CurState.NextState) ) - return; - } - } - States - { - Spawn: - XEX0 ABCDEFGHIJKLMNOPQRS 1 Bright; - Stop; - } -} - -Class HellblazerWarheadArm : Actor -{ - Default - { - Obituary "$O_HELLBLAZER"; - DamageType 'Fire'; - PROJECTILE; - +THRUACTORS; - +BOUNCEONWALLS; - +BOUNCEONFLOORS; - +BOUNCEONCEILINGS; - +CANBOUNCEWATER; - +NODAMAGETHRUST; - +FORCERADIUSDMG; - -NOGRAVITY; - Gravity 0.35; - BounceFactor 1.0; - Radius 4; - Height 4; - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - reactiontime = Random[ExploS](20,25); - double ang, pt; - ang = FRandom[ExploS](0,360); - pt = FRandom[ExploS](-90,90); - vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](20.,35.); - } - States - { - Spawn: - TNT1 A 1 - { - Spawn("HellblazerWarheadTrail",pos); - int nhit, nkill; - [nhit, nkill] = SWWMUtility.DoExplosion(self,30+reactiontime*5,3000+500*reactiontime,120+4*reactiontime,flags:DE_COUNTENEMIES); - if ( HellblazerWarhead(master) ) HellblazerWarhead(master).nkill += nkill; - Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,5); - let s = Spawn("SWWMHalfSmoke",pos); - s.vel = pvel+vel*.2; - s.SetShade(Color(4,2,1)*Random[ExploS](48,63)); - s.special1 = Random[ExploS](1,3); - s.scale *= 6.; - s.alpha *= 0.1+.4*(ReactionTime/25.); - A_CountDown(); - } - Wait; - } -} diff --git a/zscript/weapons/swwm_cbt.zsc b/zscript/weapons/swwm_cbt.zsc index 2685fe70f..df0bf4f50 100644 --- a/zscript/weapons/swwm_cbt.zsc +++ b/zscript/weapons/swwm_cbt.zsc @@ -3,26 +3,11 @@ Class Wallbuster : SWWMWeapon { - Class loaded[25]; + bool loaded[25]; bool fired[25]; int rotation[6]; - Array > reloadqueue; - transient bool waitreload; int whichspin; - int rnum; transient bool cancelreload; - transient bool clearout; - - Class curobt; - - override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) - { - if ( curobt is 'RedShell' ) return StringTable.Localize("$O_WALLBUSTER_RED"); - if ( curobt is 'GreenShell' ) return StringTable.Localize("$O_WALLBUSTER_GREEN"); - if ( curobt is 'BlueShell' ) return StringTable.Localize("$O_WALLBUSTER_BLUE"); - if ( curobt is 'PurpleShell' ) return StringTable.Localize("$O_WALLBUSTER_PURPLE"); - return Super.GetObituary(victim,inflictor,mod,playerattack); - } override void DoEffect() { @@ -42,41 +27,25 @@ Class Wallbuster : SWWMWeapon SelectionOrder = 1400; } - override bool UsesAmmo( Class kind ) - { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - for ( int i=0; i<4; i++ ) if ( kind is types[i] ) return true; - return false; - } override bool ReportHUDAmmo() { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - for ( int i=0; i<4; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; for ( int i=0; i<25; i++ ) if ( loaded[i] && !fired[i] ) return true; - return false; + return Super.ReportHUDAmmo(); } override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; if ( (firemode == PrimaryFire) || (firemode == AltFire) ) { - for ( int i=0; i<4; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; for ( int i=0; i<25; i++ ) if ( loaded[i] && !fired[i] ) return true; - return false; + return (Ammo1.Amount > 0); } return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); } - bool CanReload() - { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - for ( int i=0; i<4; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; - return false; - } override void InitializeWeapon() { // first wallbuster has five barrels loaded for ( int i=0; i<25; i++ ) - loaded[i] = (i<5)?(Class)("RedShell"):null; + loaded[i] = (i<5); for ( int i=0; i<25; i++ ) fired[i] = false; } @@ -98,13 +67,12 @@ Class Wallbuster : SWWMWeapon A_OverlayFlags(PSP_FLASH-index,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true); A_OverlayRenderStyle(PSP_FLASH-index,STYLE_Add); } - action void ProcessTraceHit( SpreadgunTracer t, Vector3 origin, Vector3 dir, int dmg, double mm, Class impact = "SpreadImpact", int bc = 1, bool large = false, bool bust = false ) + action void ProcessTraceHit( SpreadgunTracer t, Vector3 origin, Vector3 dir, int dmg, double mm, Class impact = "SpreadImpact", int bc = 1, bool bust = false ) { // Wall busting - if ( bust ) + if ( bust || swwm_omnibust ) { int bustdmg = dmg; - if ( t is 'SpreadSlugTracer' ) bustdmg = int(SpreadSlugTracer(t).penetration); BusterWall.Bust(t.Results,bustdmg,self,t.Results.HitVector,t.Results.HitPos.z); } for ( int i=0; i types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - static const statelabel flashes[] = {"FlashRed","FlashGreen","FlashBlue","FlashPurple"}; - static const String sounds[] = {"spreadgun/redfire","spreadgun/greenfire","spreadgun/bluefire","spreadgun/purplefire"}; - static const Color cols[] = {Color(40,255,192,64),Color(36,255,192,80),Color(48,32,176,255),Color(24,255,224,96)}; - static const int louds[] = {800,1000,1100,1200,1400,600,2500}; - int redflashstr = 0; - int blueflashstr = 0; // speen if ( num == 1 ) invoker.whichspin = 1; else if ( num == 5 ) invoker.whichspin = 2; @@ -223,9 +183,9 @@ Class Wallbuster : SWWMWeapon double a, s; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); + int flashstr = 0; int alertness = 0; // second pass, play the fire effects - int salts = 0; for ( int i=0; i 4 ) gidx -= 5; idx = gidx+group*5; if ( !invoker.loaded[idx] || invoker.fired[idx] ) continue; - int which = 0; - for ( int j=0; j<4; j++ ) - { - if ( !(invoker.loaded[idx] is types[j]) ) continue; - which = j; - break; - } - A_StartSound(sounds[which],CHAN_WEAPON,CHANF_OVERLAP,1./(howmany**.65),.6-howmany*.004,1.-howmany*.015); - if ( which == 0 ) redflashstr = max(120,redflashstr+10); - else if ( which == 1 ) redflashstr = max(90,redflashstr+8); - else if ( which == 2 ) - { - blueflashstr = max(160,blueflashstr+10); - salts++; - } - else if ( which == 3 ) redflashstr = max(60,redflashstr+6); - A_CBTFlash(flashes[which],i); - if ( alertness > louds[which] ) alertness += louds[which]/4; - else alertness += louds[which]; + A_StartSound("spreadgun/redfire",CHAN_WEAPON,CHANF_OVERLAP,1./(howmany**.65),.6-howmany*.004,1.-howmany*.015); + flashstr = max(120,flashstr+10); + A_CBTFlash("FlashRed",i); + if ( alertness > 800 ) alertness += 200; + else alertness += 800; + } + if ( howmany < 3 ) + { + player.SetPsprite(PSP_WEAPON,ResolveState("FireOne")); + SWWMHandler.DoFlash(self,Color(40,255,192,64),5); + } + else if ( howmany < 15 ) + { + player.SetPsprite(PSP_WEAPON,ResolveState("FireFive")); + SWWMHandler.DoFlash(self,Color(60,255,192,64),6); + } + else + { + player.SetPsprite(PSP_WEAPON,ResolveState("FireTwentyFive")); + SWWMHandler.DoFlash(self,Color(80,255,192,64),7); } - if ( salts >= 25 ) SWWMUtility.MarkAchievement("salt",player); - if ( howmany < 3 ) player.SetPsprite(PSP_WEAPON,ResolveState("FireOne")); - else if ( howmany < 15 ) player.SetPsprite(PSP_WEAPON,ResolveState("FireFive")); - else player.SetPsprite(PSP_WEAPON,ResolveState("FireTwentyFive")); int qk = min(9,1+howmany/5); int ql = min(25,6+howmany/2); A_QuakeEx(qk,qk,qk,ql,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:qk*.15); A_BumpFOV(1.-qk*.04); A_AlertMonsters(swwm_uncapalert?0:alertness); A_PlayerFire(); - if ( redflashstr > 0 ) + if ( flashstr > 0 ) { let l = Spawn("SWWMWeaponLight",pos); - l.args[3] = redflashstr; - l.target = self; - } - if ( blueflashstr > 0 ) - { - let l = Spawn("SWWMWeaponLight",pos); - l.args[0] = 96; - l.args[1] = 224; - l.args[2] = 255; - l.args[3] = blueflashstr; + l.args[3] = flashstr; l.target = self; } // third pass, actually fire them Vector3 base = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+3.5*y-6*z); SpreadgunTracer st; - SpreadSlugTracer sst; for ( int i=0; i 4 ) gidx -= 5; idx = gidx+group*5; if ( !invoker.loaded[idx] || invoker.fired[idx] ) continue; - int which = 0; - for ( int j=0; j<4; j++ ) - { - if ( !(invoker.loaded[idx] is types[j]) ) continue; - which = j; - break; - } invoker.fired[idx] = true; double t1 = 90-int(i%5)*72; double t2 = 360-int(i/5)*72; @@ -317,137 +257,41 @@ Class Wallbuster : SWWMWeapon b.y += 3.; Vector2 n = RotateVector(b,t2); origin = level.Vec3Offset(base,n.x*y+n.y*z); - invoker.curobt = types[which]; - switch ( which ) + // the shooting + if ( !st ) st = new("SpreadgunTracer"); + st.ignoreme = self; + // attempt to uniformize expected damage while reducing traces (mainly for performance) + int expecteddmg = 180; + int numshot = max(21-howmany,5); + int individualdmg = int(ceil(expecteddmg/double(numshot))); + for ( int j=0; j1)); - for ( int i=0; i<(6-howmany/4); i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.scale *= .8; - s.alpha *= .3; - s.SetShade(Color(1,1,1)*Random[Wallbuster](96,192)); - s.vel += vel*.5+x*FRandom[Wallbuster](3.,5.); - } - for ( int i=0; i<(10-howmany/3); i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .2; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Wallbuster](4.,8.)+y*FRandom[Wallbuster](-1,1)+z*FRandom[Wallbuster](-1,1); - } - SWWMUtility.DoKnockback(self,-x,18000.); - break; - case 2: - // saltshot - for ( int j=0; j<(8-howmany/5); j++ ) - { - a = FRandom[Wallbuster](0,360); - s = FRandom[Wallbuster](0,.15); - let b = Spawn("SaltBeam",level.Vec3Offset(origin,SWWMUtility.CircleOffset(y,z,a,s))); - b.target = self; - b.angle = atan2(x2.y,x2.x); - b.pitch = asin(-x2.z); - b.Stamina += howmany*16; - b.Accuracy += 2+howmany/5; - b.Args[1] = (howmany>1)?2:1; // came from wallbuster - } - for ( int i=0; i<(16-howmany/2); i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.special1 = 1; - s.scale *= .9; - s.SetShade(Color(1,3,4)*Random[Wallbuster](32,63)); - s.A_SetRenderStyle(.3,STYLE_AddShaded); - s.vel += vel*.5+x*FRandom[Wallbuster](3.,5.)+y*FRandom[Wallbuster](-1,1)+z*FRandom[Wallbuster](-1,1); - } - for ( int i=0; i<(20-howmany/2); i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .3; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Wallbuster](4.,8.)+y*FRandom[Wallbuster](-2,2)+z*FRandom[Wallbuster](-2,2); - } - SWWMUtility.DoKnockback(self,-x,17000.); - break; - case 3: - // lead ball - a = FRandom[Wallbuster](0,360); - s = FRandom[Wallbuster](0,.005); - dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - let p = Spawn("TheBall",origin); - p.target = self; - p.angle = atan2(dir.y,dir.x); - p.pitch = asin(-dir.z); - p.vel = dir*p.speed*1.25; - p.special1 = (howmany>1)?2:1; // came from wallbuster - for ( int i=0; i<(8-howmany/4); i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.scale *= .6; - s.alpha *= .25; - s.SetShade(Color(1,1,1)*Random[Wallbuster](96,192)); - s.vel += vel*.5+x*FRandom[Wallbuster](3.,5.); - } - for ( int i=0; i<(8-howmany/4); i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .2; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Wallbuster](4.,8.)+y*FRandom[Wallbuster](-1,1)+z*FRandom[Wallbuster](-1,1); - } - SWWMUtility.DoKnockback(self,-x,7200.); - break; - default: - // buckshot - if ( !st ) st = new("SpreadgunTracer"); - st.ignoreme = self; - // attempt to uniformize expected damage while reducing traces (mainly for performance) - int expecteddmg = 180; - int numshot = max(21-howmany,5); - int individualdmg = int(ceil(expecteddmg/double(numshot))); - for ( int j=0; j1)); - } - for ( int i=0; i<(16-howmany/2); i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.special1 = 1; - s.scale *= .9; - s.alpha *= .3; - s.SetShade(Color(1,1,1)*Random[Wallbuster](96,192)); - s.vel += vel*.5+x*FRandom[Wallbuster](3.,5.)+y*FRandom[Wallbuster](-1,1)+z*FRandom[Wallbuster](-1,1); - } - for ( int i=0; i<(20-howmany/2); i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .3; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Wallbuster](4.,8.)+y*FRandom[Wallbuster](-2,2)+z*FRandom[Wallbuster](-2,2); - } - SWWMUtility.DoKnockback(self,-x,12000.); - break; + st.hitlist.Clear(); + st.shootthroughlist.Clear(); + st.waterhitlist.Clear(); + st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); + ProcessTraceHit(st,origin,dir,individualdmg,7000,bc:5+howmany/6,(howmany>1)); } + for ( int i=0; i<(16-howmany/2); i++ ) + { + let s = Spawn("SWWMSmoke",origin); + s.special1 = 1; + s.scale *= .9; + s.alpha *= .3; + s.SetShade(Color(1,1,1)*Random[Wallbuster](96,192)); + s.vel += vel*.5+x*FRandom[Wallbuster](3.,5.)+y*FRandom[Wallbuster](-1,1)+z*FRandom[Wallbuster](-1,1); + } + for ( int i=0; i<(20-howmany/2); i++ ) + { + let s = Spawn("SWWMSpark",origin); + s.scale *= .3; + s.alpha *= .4; + s.vel += vel*.5+x*FRandom[Wallbuster](4.,8.)+y*FRandom[Wallbuster](-2,2)+z*FRandom[Wallbuster](-2,2); + } + SWWMUtility.DoKnockback(self,-x,12000.); } } action void A_SpinOne() @@ -468,35 +312,8 @@ Class Wallbuster : SWWMWeapon invoker.rotation[5]--; while ( invoker.rotation[5] < 0 ) invoker.rotation[5] += 5; } - action void A_OpenMenu() - { - invoker.reloadqueue.Clear(); - invoker.waitreload = true; - if ( player == players[consoleplayer] ) - Menu.SetMenu('WallbusterReloadMenu'); - } - action void A_WaitMenu() - { - if ( invoker.waitreload ) return; - if ( invoker.clearout ) - { - bool hasshells = false; - for ( int i=0; i<25; i++ ) - { - if ( !invoker.loaded[i] || invoker.fired[i] ) continue; - hasshells = true; - break; - } - if ( hasshells ) player.SetPsprite(PSP_WEAPON,ResolveState("Detach")); - else player.SetPsprite(PSP_WEAPON,ResolveState("EndReload")); - } - else if ( (invoker.reloadqueue.Size() <= 0) ) player.SetPsprite(PSP_WEAPON,ResolveState("EndReload")); - else player.SetPsprite(PSP_WEAPON,ResolveState("Detach")); - } action void A_StartDetachOverlays() { - static const statelabel shells[] = {"DetachShell0","DetachShell1","DetachShell2","DetachShell3","DetachShell4"}; - static const statelabel shellsfired[] = {"DetachShellF0","DetachShellF1","DetachShellF2","DetachShellF3","DetachShellF4"}; for ( int i=0; i<5; i++ ) { // get physical index @@ -510,16 +327,14 @@ Class Wallbuster : SWWMWeapon gidx = (gidx+invoker.rotation[group]); while ( gidx > 4 ) gidx -= 5; idx = gidx+group*5; - if ( !invoker.loaded[idx] ) continue; - if ( invoker.fired[idx] ) - A_Overlay(PSP_WEAPON+1+i,shellsfired[i]); - else A_Overlay(PSP_WEAPON+1+i,shells[i]); + if ( !invoker.loaded[idx] ) A_ChangeModel("",1,"","",4+i,"models","",CMDL_USESURFACESKIN,-1); + else if ( invoker.fired[idx] ) A_ChangeModel("",1,"","",4+i,"models","ShellNormal_Used.png",CMDL_USESURFACESKIN,-1); + else A_ChangeModel("",1,"","",4+i,"models","ShellNormal.png",CMDL_USESURFACESKIN,-1); } A_StartSound("wallbuster/meleestart",CHAN_WEAPON,CHANF_OVERLAP); } action void A_StartAttachOverlays() { - static const statelabel shells[] = {"AttachShell0","AttachShell1","AttachShell2","AttachShell3","AttachShell4"}; for ( int i=0; i<5; i++ ) { // get physical index @@ -533,33 +348,23 @@ Class Wallbuster : SWWMWeapon gidx = (gidx+invoker.rotation[group]); while ( gidx > 4 ) gidx -= 5; idx = gidx+group*5; - if ( !invoker.loaded[idx] ) continue; - A_Overlay(PSP_WEAPON+1+i,shells[i]); + if ( !invoker.loaded[idx] ) A_ChangeModel("",1,"","",4+i,"models","",CMDL_USESURFACESKIN,-1); + else A_ChangeModel("",1,"","",4+i,"models","ShellNormal.png",CMDL_USESURFACESKIN,-1); } A_StartSound("wallbuster/meleeend",CHAN_WEAPON,CHANF_OVERLAP); } action void A_DropShells() { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - static const Class casetypes[] = {"RedShellCasing","GreenShellCasing","BlueShellCasing","PurpleShellCasing"}; for ( int i=0; i<5; i++ ) { - Class loaded = invoker.loaded[invoker.rotation[5]*5+i]; - int which = -1; - for ( int j=0; j<4; j++ ) - { - if ( loaded != types[j] ) continue; - which = j; - break; - } - if ( which != -1 ) + if ( invoker.loaded[invoker.rotation[5]*5+i] ) { if ( invoker.fired[invoker.rotation[5]*5+i] ) { Vector3 x, y, z; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-3*y-13*z); - let c = Spawn(casetypes[which],origin); + let c = Spawn("RedShellCasing",origin); c.angle = angle; c.pitch = pitch; c.vel = x*FRandom[Junk](-.2,.2)+y*FRandom[Junk](-.2,.2)-(0,0,FRandom[Junk](2,3)); @@ -567,35 +372,39 @@ Class Wallbuster : SWWMWeapon } else { - let amo = FindInventory(types[which]); - if ( !amo ) - { - amo = Inventory(Spawn(types[which])); - amo.AttachToOwner(self); - amo.Amount = 0; - } - if ( (amo.Amount >= amo.MaxAmount) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) - invoker.BufferAmmo(types[which],1); - else amo.Amount++; + if ( (invoker.Ammo1.Amount >= invoker.Ammo1.MaxAmount) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.BufferAmmo(invoker.AmmoType1,1); + else invoker.Ammo1.Amount = min(invoker.Ammo1.Amount+1,invoker.Ammo1.MaxAmount); } } invoker.loaded[invoker.rotation[5]*5+i] = null; invoker.fired[invoker.rotation[5]*5+i] = false; + A_ChangeModel("",1,"","",4+i,"models","",CMDL_USESURFACESKIN,-1); } invoker.rotation[invoker.rotation[5]] = 4; } + action int GetShellsToLoad() + { + int cnt = 25; + for ( int i=0; i<25; i++ ) cnt -= (invoker.loaded[i]&&!invoker.fired[i]); + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + { + int realammo = invoker.CountBufferedAmmo(invoker.AmmoType1)+invoker.Ammo1.Amount; + cnt = min(cnt,realammo); + } + return max(0,cnt); + } action void A_LoadShell() { - if ( invoker.reloadqueue.Size() <= 0 ) return; - Class toload = invoker.reloadqueue[invoker.reloadqueue.Size()-1]; - invoker.reloadqueue.Pop(); - invoker.loaded[invoker.rotation[5]*5+invoker.rotation[invoker.rotation[5]]] = toload; - if ( !invoker.FetchBufferedAmmo(toload,1) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + int toload = GetShellsToLoad(); + if ( toload <= 0 ) return; + invoker.loaded[invoker.rotation[5]*5+invoker.rotation[invoker.rotation[5]]] = true; + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) && !invoker.FetchBufferedAmmo(invoker.AmmoType1,1) ) { - let am = FindInventory(toload); + let am = FindInventory(invoker.AmmoType1); if ( am && (am.Amount > 0) ) am.Amount--; } - if ( (invoker.reloadqueue.Size() > 0) && (invoker.rotation[invoker.rotation[5]] > 0) ) + if ( (toload > 1) && (invoker.rotation[invoker.rotation[5]] > 0) ) // keep spinning if there's more to load invoker.rotation[invoker.rotation[5]]--; A_StartSound("wallbuster/load",CHAN_WEAPON,CHANF_OVERLAP); } @@ -609,10 +418,10 @@ Class Wallbuster : SWWMWeapon for ( int i=0; i<25; i++ ) { if ( !loaded[i] || fired[i] ) continue; - let cur = Owner.FindInventory(loaded[i]); + let cur = Owner.FindInventory(AmmoType1); if ( !cur ) { - cur = Inventory(Spawn(loaded[i])); + cur = Inventory(Spawn(AmmoType1)); cur.Amount = 0; cur.AttachToOwner(Owner); } @@ -656,7 +465,7 @@ Class Wallbuster : SWWMWeapon { Tag "$T_WALLBUSTER"; Inventory.PickupMessage "$I_WALLBUSTER"; - Obituary "$O_WALLBUSTER_RED"; + Obituary "$O_WALLBUSTER"; SWWMWeapon.Tooltip "$TT_WALLBUSTER"; SWWMWeapon.GetLine "getwallbuster"; SWWMWeapon.NumCrosshairs 25; @@ -685,7 +494,7 @@ Class Wallbuster : SWWMWeapon { int flg = WRF_ALLOWUSER1; if ( invoker.CheckAmmo(PrimaryFire,false) ) flg |= WRF_ALLOWZOOM; - if ( invoker.CanReload() ) flg |= WRF_ALLOWRELOAD; + if ( GetShellsToLoad() ) flg |= WRF_ALLOWRELOAD; A_WeaponReady(flg); if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK|BT_ZOOM) ) invoker.CheckAmmo(EitherFire,true); @@ -760,42 +569,15 @@ Class Wallbuster : SWWMWeapon XZW4 L 1 A_StartSound("wallbuster/unlock",CHAN_WEAPON,CHANF_OVERLAP); XZW4 MNOPQ 1; XZW4 RSTUV 1; - XZW4 W 1 A_OpenMenu(); - XZW4 W 1 A_WaitMenu(); - Wait; + Goto Detach; Detach: XZW4 W 0 { - invoker.rnum = invoker.reloadqueue.Size(); + int rnum = GetShellsToLoad(); invoker.cancelreload = false; A_Overlay(-9999,"CheckCancelReload"); - // clearing out? - if ( invoker.clearout ) - { - // jump to spin if current group is empty - bool hasshells = false; - for ( int i=0; i<5; i++ ) - { - // get physical index - int idx = i; - // shift based on full rotation - idx = (idx+invoker.rotation[5]*5); - while ( idx > 24 ) idx -= 25; - int group = idx/5; - // shift based on group rotation - int gidx = i%5; - gidx = (gidx+invoker.rotation[group]); - while ( gidx > 4 ) gidx -= 5; - idx = gidx+group*5; - if ( !invoker.loaded[idx] || invoker.fired[idx] ) continue; - hasshells = true; - break; - } - if ( !hasshells ) return ResolveState("DetachSpin"); - return ResolveState(null); - } // if it's a full rotation, don't hand-spin - if ( invoker.rnum > 20 ) return ResolveState(null); + if ( rnum > 20 ) return ResolveState(null); // jump to spin if current group is full int nset = 0, nsetp = 0; for ( int i=0; i<5; i++ ) @@ -838,8 +620,7 @@ Class Wallbuster : SWWMWeapon XZW5 G 1 A_StartSound("wallbuster/detach",CHAN_WEAPON,CHANF_OVERLAP); Goto DetachHold; DetachSpin: - XZWE U 0; - XZWE VWXY 1; + XZWE UVWXY 1; DetachSpinReturn: XZWE Z 1; XZWF A 2 @@ -848,35 +629,7 @@ Class Wallbuster : SWWMWeapon A_Overlay(-9999,"CheckCancelReload"); A_HandSpin(); } - XZWF BCDEF 2; - XZWF G 0 - { - if ( invoker.clearout ) - { - // jump to spin again if current group is empty - bool hasshells = false; - for ( int i=0; i<5; i++ ) - { - // get physical index - int idx = i; - // shift based on full rotation - idx = (idx+invoker.rotation[5]*5); - while ( idx > 24 ) idx -= 25; - int group = idx/5; - // shift based on group rotation - int gidx = i%5; - gidx = (gidx+invoker.rotation[group]); - while ( gidx > 4 ) gidx -= 5; - idx = gidx+group*5; - if ( !invoker.loaded[idx] || invoker.fired[idx] ) continue; - hasshells = true; - break; - } - if ( !hasshells ) return ResolveState("DetachSpinAgain"); - } - return ResolveState(null); - } - XZWF G 2; + XZWF BCDEFG 2; XZWF J 1 A_StartSound("wallbuster/detach",CHAN_WEAPON,CHANF_OVERLAP); XZWF K 0; Goto DetachHold; @@ -890,7 +643,6 @@ Class Wallbuster : SWWMWeapon { A_StartDetachOverlays(); A_PlayerReload(); - return A_JumpIf(invoker.clearout,"DetachHoldClear"); } XZW5 IJKLMNOPQ 1; XZW5 R 2 A_DropShells(); @@ -902,29 +654,9 @@ Class Wallbuster : SWWMWeapon XZW6 C 2 A_LoadShell(); XZW6 E 0 { - if ( invoker.cancelreload ) invoker.reloadqueue.Clear(); + int rnum = invoker.cancelreload?0:GetShellsToLoad(); player.SetPSprite(-9999,null); - return A_JumpIf((invoker.reloadqueue.Size()>0),"AttachSpin"); - } - Goto Attach; - DetachHoldClear: - XZW5 HIJKLMNOPQ 1; - XZW5 R 3 A_DropShells(); - XZW5 TX 3; - XZW6 A 3; - XZW6 E 0 - { - bool keepgoing = false; - // still have more shells? - for ( int i=0; i<25; i++ ) - { - if ( !invoker.loaded[i] || invoker.fired[i] ) continue; - keepgoing = true; - break; - } - if ( invoker.cancelreload ) keepgoing = false; - player.SetPSprite(-9999,null); - return A_JumpIf(keepgoing,"AttachSpin"); + return A_JumpIf(rnum,"AttachSpin"); } Goto Attach; CheckCancelReload: @@ -934,50 +666,6 @@ Class Wallbuster : SWWMWeapon invoker.cancelreload = true; } Wait; - DetachShell0: - XZWA EFGHIJKLM 1; - XZWA N 0; - Stop; - DetachShell1: - XZWB CDEFGHIJK 1; - XZWB L 0; - Stop; - DetachShell2: - XZWC ABCDEFGHI 1; - XZWC J 0; - Stop; - DetachShell3: - XZWC YZ 1; - XZWD ABCDEFG 1; - XZWD H 0; - Stop; - DetachShell4: - XZWD WXYZ 1; - XZWE ABCDE 1; - XZWE F 0; - Stop; - DetachShellF0: - XZWF LMNOPQRST 1; - XZWF U 0; - Stop; - DetachShellF1: - XZWF VWXYZ 1; - XZWG ABCD 1; - XZWG E 0; - Stop; - DetachShellF2: - XZWG FGHIJKLMN 1; - XZWG O 0; - Stop; - DetachShellF3: - XZWG PQRSTUVWX 1; - XZWG Y 0; - Stop; - DetachShellF4: - XZWG Z 1; - XZWH ABCDEFGH 1; - XZWH I 0; - Stop; Attach: XZW6 EF 2; XZW6 G 1 A_StartAttachOverlays(); @@ -1002,35 +690,7 @@ Class Wallbuster : SWWMWeapon A_Overlay(-9999,"CheckCancelReload"); A_HandSpin(); } - XZW8 EFGH 2; - XZW8 I 0 - { - if ( invoker.clearout ) - { - // jump to spin again if current group is empty - bool hasshells = false; - for ( int i=0; i<5; i++ ) - { - // get physical index - int idx = i; - // shift based on full rotation - idx = (idx+invoker.rotation[5]*5); - while ( idx > 24 ) idx -= 25; - int group = idx/5; - // shift based on group rotation - int gidx = i%5; - gidx = (gidx+invoker.rotation[group]); - while ( gidx > 4 ) gidx -= 5; - idx = gidx+group*5; - if ( !invoker.loaded[idx] || invoker.fired[idx] ) continue; - hasshells = true; - break; - } - if ( !hasshells ) return ResolveState("AttachSpinAgain"); - } - return ResolveState(null); - } - XZW8 IL 2; + XZW8 EFGHIL 2; XZW8 M 1 A_StartSound("wallbuster/detach",CHAN_WEAPON,CHANF_OVERLAP); XZW8 N 0; Goto DetachHold; @@ -1040,29 +700,13 @@ Class Wallbuster : SWWMWeapon XZW8 K 0; XZWH MNO 1; Goto DetachSpinReturn; - AttachShell0: - XZWA OPQRSTUVWXYZ 1; - XZWB A 1; - XZWB B 0; - Stop; - AttachShell1: - XZWB MNOPQRSTUVWXY 1; - XZWB Z 0; - Stop; - AttachShell2: - XZWC KLMNOPQRSTUVW 1; - XZWC X 0; - Stop; - AttachShell3: - XZWD IJKLMNOPQRSTU 1; - XZWD V 0; - Stop; - AttachShell4: - XZWE GHIJKLMNOPQRS 1; - XZWE T 0; - Stop; EndReload: - XZW4 W 1 { invoker.ClearBufferedAmmo(); } + XZW4 W 1 + { + invoker.ClearBufferedAmmo(); + for ( int i=0; i<5; i++ ) + A_ChangeModel("",1,"","",4+i,"models","",CMDL_USESURFACESKIN,-1); + } XZW8 OPQRS 1; XZW8 T 1 A_StartSound("wallbuster/lock",CHAN_WEAPON,CHANF_OVERLAP); XZW8 UVWXY 1; @@ -1143,158 +787,5 @@ Class Wallbuster : SWWMWeapon Stop; XZWW Y 2 Bright; Stop; - FlashGreen: - XZWX A 2 Bright; - Stop; - XZWX B 2 Bright; - Stop; - XZWX C 2 Bright; - Stop; - XZWX D 2 Bright; - Stop; - XZWX E 2 Bright; - Stop; - XZWX F 2 Bright; - Stop; - XZWX G 2 Bright; - Stop; - XZWX H 2 Bright; - Stop; - XZWX I 2 Bright; - Stop; - XZWX J 2 Bright; - Stop; - XZWX K 2 Bright; - Stop; - XZWX L 2 Bright; - Stop; - XZWX M 2 Bright; - Stop; - XZWX N 2 Bright; - Stop; - XZWX O 2 Bright; - Stop; - XZWX P 2 Bright; - Stop; - XZWX Q 2 Bright; - Stop; - XZWX R 2 Bright; - Stop; - XZWX S 2 Bright; - Stop; - XZWX T 2 Bright; - Stop; - XZWX U 2 Bright; - Stop; - XZWX V 2 Bright; - Stop; - XZWX W 2 Bright; - Stop; - XZWX X 2 Bright; - Stop; - XZWX Y 2 Bright; - Stop; - FlashBlue: - XZWY A 2 Bright; - Stop; - XZWY B 2 Bright; - Stop; - XZWY C 2 Bright; - Stop; - XZWY D 2 Bright; - Stop; - XZWY E 2 Bright; - Stop; - XZWY F 2 Bright; - Stop; - XZWY G 2 Bright; - Stop; - XZWY H 2 Bright; - Stop; - XZWY I 2 Bright; - Stop; - XZWY J 2 Bright; - Stop; - XZWY K 2 Bright; - Stop; - XZWY L 2 Bright; - Stop; - XZWY M 2 Bright; - Stop; - XZWY N 2 Bright; - Stop; - XZWY O 2 Bright; - Stop; - XZWY P 2 Bright; - Stop; - XZWY Q 2 Bright; - Stop; - XZWY R 2 Bright; - Stop; - XZWY S 2 Bright; - Stop; - XZWY T 2 Bright; - Stop; - XZWY U 2 Bright; - Stop; - XZWY V 2 Bright; - Stop; - XZWY W 2 Bright; - Stop; - XZWY X 2 Bright; - Stop; - XZWY Y 2 Bright; - Stop; - FlashPurple: - XZWZ A 2 Bright; - Stop; - XZWZ B 2 Bright; - Stop; - XZWZ C 2 Bright; - Stop; - XZWZ D 2 Bright; - Stop; - XZWZ E 2 Bright; - Stop; - XZWZ F 2 Bright; - Stop; - XZWZ G 2 Bright; - Stop; - XZWZ H 2 Bright; - Stop; - XZWZ I 2 Bright; - Stop; - XZWZ J 2 Bright; - Stop; - XZWZ K 2 Bright; - Stop; - XZWZ L 2 Bright; - Stop; - XZWZ M 2 Bright; - Stop; - XZWZ N 2 Bright; - Stop; - XZWZ O 2 Bright; - Stop; - XZWZ P 2 Bright; - Stop; - XZWZ Q 2 Bright; - Stop; - XZWZ R 2 Bright; - Stop; - XZWZ S 2 Bright; - Stop; - XZWZ T 2 Bright; - Stop; - XZWZ U 2 Bright; - Stop; - XZWZ V 2 Bright; - Stop; - XZWZ W 2 Bright; - Stop; - XZWZ X 2 Bright; - Stop; - XZWZ Y 2 Bright; - Stop; } } diff --git a/zscript/weapons/swwm_cbt_ui.zsc b/zscript/weapons/swwm_cbt_ui.zsc deleted file mode 100644 index db31aac3e..000000000 --- a/zscript/weapons/swwm_cbt_ui.zsc +++ /dev/null @@ -1,382 +0,0 @@ -// when you need a whole-ass menu to reload a weapon - -Class WallbusterReloadMenu : GenericMenu -{ - TextureID MainWindow, AmmoIcon[4]; - int sel0; - Array queue; - int AmmoSets[4]; - bool isrclick, multiclk; - Vector2 curmouse; - - String ttl; - BrokenLines keyl; - - Font mSmallFont, mTinyFont; - - double hs; - Vector2 ss, origin; - - override void Init( Menu parent ) - { - Super.Init(parent); - Animated = true; - if ( (gamestate != GS_LEVEL) || (players[consoleplayer].Health <= 0) || !(players[consoleplayer].ReadyWeapon is 'Wallbuster') ) - { - EventHandler.SendNetworkEvent("swwmcbt.",consoleplayer); - Close(); - return; - } - MainWindow = TexMan.CheckForTexture("graphics/HUD/WallbusterMenu.png"); - AmmoIcon[0] = TexMan.CheckForTexture("graphics/HUD/MenuShellRed.png"); - AmmoIcon[1] = TexMan.CheckForTexture("graphics/HUD/MenuShellGreen.png"); - AmmoIcon[2] = TexMan.CheckForTexture("graphics/HUD/MenuShellBlue.png"); - AmmoIcon[3] = TexMan.CheckForTexture("graphics/HUD/MenuShellPurple.png"); - mSmallFont = Font.GetFont('TewiFont'); - mTinyFont = Font.GetFont('MiniwiFont'); - MenuSound("menu/demotab"); - queue.Clear(); - sel0 = swwm_cbtlast; - ttl = StringTable.Localize("$SWWM_BUSTERTITLE"); - keyl = mTinyFont.BreakLines(StringTable.Localize("$SWWM_BUSTERKEYS"),300); - hs = max(min(floor(Screen.GetWidth()/640.),floor(Screen.GetHeight()/400.)),1.); - ss = (Screen.GetWidth(),Screen.GetHeight())/hs; - origin = (ss.x-120,ss.y-28)/2.; - } - - override void Ticker() - { - Super.Ticker(); - if ( swwm_menupause ) menuactive = Menu.On; - else menuactive = Menu.OnNoPause; - if ( (players[consoleplayer].Health > 0) && (players[consoleplayer].ReadyWeapon is 'Wallbuster') && (gamestate == GS_LEVEL) ) return; - MenuEvent(MKEY_BACK,false); - } - - private bool IsDone() - { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - if ( queue.Size() >= 25 ) return true; - for ( int i=0; i<4; i++ ) - { - if ( (players[consoleplayer].mo.CountInv(types[i])-AmmoSets[i]) > 0 ) - return false; - } - return true; - } - - private bool PushAmmo( bool autoshift = false, bool usebest = false ) - { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - if ( queue.Size() >= 25 ) return true; - if ( autoshift && usebest ) sel0 = 3; // ensure it prioritizes best ammo - if ( (players[consoleplayer].mo.CountInv(types[sel0])-AmmoSets[sel0]) <= 0 ) - { - if ( autoshift ) - { - if ( usebest ) for ( int i=3; i>=0; i-- ) - { - int idx = (sel0+i)%4; - if ( (players[consoleplayer].mo.CountInv(types[idx])-AmmoSets[idx]) > 0 ) - { - sel0 = idx; - CVar.FindCVar('swwm_cbtlast').SetInt(sel0); - return PushAmmo(true); - } - } - else for ( int i=0; i<4; i++ ) - { - int idx = (sel0+i)%4; - if ( (players[consoleplayer].mo.CountInv(types[idx])-AmmoSets[idx]) > 0 ) - { - sel0 = idx; - CVar.FindCVar('swwm_cbtlast').SetInt(sel0); - return PushAmmo(true); - } - } - } - MenuSound("menu/noinvuse"); - return false; - } - if ( !autoshift ) MenuSound("menu/demosel"); - AmmoSets[sel0]++; - queue.Push(sel0); - return true; - } - - private bool PopAmmo() - { - if ( queue.Size() <= 0 ) return false; - AmmoSets[queue[queue.Size()-1]]--; - queue.Pop(); - return true; - } - - override bool MenuEvent( int mkey, bool fromcontroller ) - { - switch ( mkey ) - { - case MKEY_BACK: - queue.Clear(); - for ( int i=0; i<4; i++ ) AmmoSets[i] = 0; - MenuSound("menu/democlose"); - EventHandler.SendNetworkEvent("swwmcbt.",consoleplayer); - Close(); - return true; - case MKEY_ENTER: - if ( queue.Size() <= 0 ) - { - int oldsel = sel0; - while ( queue.Size() < 25 ) - { - if ( !PushAmmo(true,true) ) - break; - } - sel0 = oldsel; - } - String cbt = "swwmcbt."; - for ( int i=0; i 3 ) sel0 = 0; - CVar.FindCVar('swwm_cbtlast').SetInt(sel0); - return true; - case MKEY_LEFT: - MenuSound("menu/demotab"); - sel0--; - if ( sel0 < 0 ) sel0 = 3; - CVar.FindCVar('swwm_cbtlast').SetInt(sel0); - return true; - case MKEY_PAGEUP: - if ( queue.Size() <= 0 ) - { - MenuSound("menu/noinvuse"); - return true; - } - int i = 0; - while ( (queue.Size() > 0) && (i++ < 5) ) - { - if ( !PopAmmo() ) - break; - } - MenuSound("menu/demoscroll"); - return true; - case MKEY_PAGEDOWN: - if ( IsDone() ) - { - MenuSound("menu/noinvuse"); - return true; - } - int j = 0; - while ( (queue.Size() < 25) && (j++ < 5) ) - { - if ( !PushAmmo(true) ) - return true; - } - MenuSound("menu/demosel"); - return true; - case MKEY_CLEAR: - if ( queue.Size() <= 0 ) MenuSound("menu/noinvuse"); - else - { - MenuSound("menu/demoscroll"); - queue.Clear(); - for ( int i=0; i<4; i++ ) AmmoSets[i] = 0; - } - return true; - } - return Super.MenuEvent(mkey,fromcontroller); - } - - override bool MouseEvent( int type, int mx, int my ) - { - if ( (type != MOUSE_CLICK) && (type != MOUSE_RELEASE) ) return false; - Vector2 mpos = (mx/hs,my/hs)-origin; - int wset = -1; - int ox = 6; - for ( int i=0; i<4; i++ ) - { - if ( (mpos.x >= ox) && (mpos.x < ox+27) && (mpos.y >= 0) && (mpos.y < 13) ) - { - wset = i; - break; - } - ox += 27; - } - if ( (wset != -1) && (type == MOUSE_CLICK) && (wset != sel0) ) - { - MenuSound("menu/demotab"); - sel0 = wset; - CVar.FindCVar('swwm_cbtlast').SetInt(sel0); - } - bool inside = (wset!=-1); - if ( type != MOUSE_RELEASE ) return false; - if ( (mpos.x >= 0) && (mpos.x < 120) && (mpos.y >= 15) && (mpos.y < 28) ) inside = true; - if ( isrclick ) - { - // right click inside: pop - // right click outside: clear (empty if already clear) - if ( inside || multiclk ) MenuEvent(multiclk?MKEY_PAGEUP:MKEY_UP,false); - else - { - if ( queue.Size() == 0 ) - { - for ( int i=0; i<4; i++ ) AmmoSets[i] = 0; - MenuSound("menu/democlose"); - EventHandler.SendNetworkEvent("swwmcbt.EMPTY",consoleplayer); - Close(); - } - else MenuEvent(MKEY_CLEAR,false); - } - } - else - { - // left click inside: push - // left click outside: commit - if ( inside || multiclk ) MenuEvent(multiclk?MKEY_PAGEDOWN:MKEY_DOWN,false); - else MenuEvent(MKEY_ENTER,false); - } - return false; - } - - override bool OnUiEvent( UIEvent ev ) - { - int y; - bool res; - switch ( ev.type ) - { - case UIEvent.Type_KeyDown: - if ( ev.keychar == UiEvent.Key_Del ) - { - // empty it out - queue.Clear(); - for ( int i=0; i<4; i++ ) AmmoSets[i] = 0; - MenuSound("menu/democlose"); - EventHandler.SendNetworkEvent("swwmcbt.EMPTY",consoleplayer); - Close(); - } - break; - case UIEvent.Type_LButtonDown: - isrclick = false; - multiclk = false; - MouseEvent(MOUSE_Click,ev.MouseX,ev.MouseY); - break; - case UIEvent.Type_LButtonUp: - isrclick = false; - multiclk = false; - MouseEvent(MOUSE_Release,ev.MouseX,ev.MouseY); - break; - case UIEvent.Type_RButtonDown: - isrclick = true; - multiclk = false; - MouseEvent(MOUSE_Click,ev.MouseX,ev.MouseY); - break; - case UIEvent.Type_RButtonUp: - isrclick = true; - multiclk = false; - MouseEvent(MOUSE_Release,ev.MouseX,ev.MouseY); - break; - case UIEvent.Type_WheelDown: - // wheel down: push 5 - isrclick = false; - multiclk = true; - MouseEvent(MOUSE_Click,int(curmouse.x),int(curmouse.y)); - MouseEvent(MOUSE_Release,int(curmouse.x),int(curmouse.y)); - break; - case UIEvent.Type_WheelUp: - // wheel up: pop 5 - isrclick = true; - multiclk = true; - MouseEvent(MOUSE_Click,int(curmouse.x),int(curmouse.y)); - MouseEvent(MOUSE_Release,int(curmouse.x),int(curmouse.y)); - break; - case UIEvent.Type_MouseMove: - curmouse = (ev.MouseX,ev.MouseY); - break; - } - return false; - } - - override void Drawer() - { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; - Super.Drawer(); - Screen.DrawTexture(MainWindow,false,origin.x,origin.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - int ox = 27, oy = 2; - for ( int i=0; i<4; i++ ) - { - Screen.DrawTexture(AmmoIcon[i],false,origin.x+ox,origin.y+oy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==sel0)?Color(0,0,0,0):Color(128,0,0,0)); - String astr = String.Format("%3d",players[consoleplayer].mo.CountInv(types[i])-AmmoSets[i]); - Screen.DrawText(mSmallFont,Font.CR_FIRE,origin.x+ox-(mSmallFont.StringWidth(astr)+1),origin.y+oy-1,astr,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==sel0)?Color(0,0,0,0):Color(128,0,0,0)); - ox += 27; - } - int siz = queue.Size()-1; - ox = 2; - oy = 17; - for ( int i=siz; i>=0; i-- ) - { - Screen.DrawTexture(AmmoIcon[queue[i]],false,origin.x+ox,origin.y+oy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - ox += 4; - if ( !((siz-(i-1))%5) ) ox += 4; - } - // text stuff - String str; - int boxw, sw; - double x, y; - str = ttl; - sw = mSmallFont.StringWidth(str); - boxw = sw; - str = "(C)2148 Akari Labs"; - sw = mTinyFont.StringWidth(str); - if ( sw > boxw ) boxw = sw; - x = floor((ss.x-boxw)/2.); - y = origin.y-30; - Screen.Dim("Black",.8,int((x-2)*hs),int((y-1)*hs),int((boxw+4)*hs),int(25*hs)); - str = ttl; - sw = mSmallFont.StringWidth(str); - x = floor((ss.x-sw)/2.); - Screen.DrawText(mSmallFont,Font.CR_FIRE,x,y,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - y += 14; - str = "(C)2148 Akari Labs"; - sw = mTinyFont.StringWidth(str); - x = floor((ss.x-sw)/2.); - Screen.DrawText(mTinyFont,Font.CR_GOLD,x,y,str,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - y = origin.y+38; - boxw = 0; - for ( int i=0; i boxw ) boxw = sw; - } - x = floor((ss.x-boxw)/2.); - Screen.Dim("Black",.8,int((x-2)*hs),int((y-2)*hs),int((boxw+4)*hs),int((9*keyl.Count()+2)*hs)); - for ( int i=0; i= penetration) || Results.HitActor.bNODAMAGE ) - { - ent.hitdamage = int(penetration); - penetration = 0; - } - else - { - int gibh = (Results.HitActor.GibHealth!=int.min)?-abs(Results.HitActor.GibHealth):-int(Results.HitActor.GetSpawnHealth()*gameinfo.gibfactor); - ent.hitdamage = min(Results.HitActor.health+abs(gibh),int(penetration)); - penetration = max(0,penetration-(ent.hitdamage*(1.-resist))); - } - hitlist.Push(ent); - if ( penetration <= 0 ) return TRACE_Stop; - return TRACE_Skip; - } - return TRACE_Skip; - } - else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) - { - if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BlockHitscan|Line.ML_BlockEverything)) ) - return TRACE_Stop; - ShootThroughList.Push(Results.HitLine); - return TRACE_Skip; - } - return TRACE_Stop; - } -} - Class Spreadgun : SWWMWeapon { bool fired; // shell was used - transient bool wasfired; // for hammer priming + bool wasfired; // for hammer priming bool chambered; // a shell is actually loaded - bool emptyup; // next reload will keep the chamber empty - Class loadammo, nextammo; // currently loaded shell, next shell to load - ui Class lastammo; - - override void HudTick() - { - Super.HudTick(); - if ( lastammo && (lastammo != nextammo) && (Owner.player == players[consoleplayer]) ) - { - let bar = SWWMStatusBar(statusbar); - if ( bar ) - { - bar.ntagstr = GetDefaultByType(nextammo).GetTag(); - bar.ntagtic = level.totaltime; - bar.ntagcol = nametagcolor; - } - } - lastammo = nextammo; - } + bool goldload; // a golden shell is loaded (buckshot otherwise) + bool wasgold; // for what ammo/shell to drop + bool loadgold; // hint for switching to gold shells on next load override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) { - if ( loadammo is 'RedShell' ) return StringTable.Localize("$O_SPREADGUN_RED"); - if ( loadammo is 'GreenShell' ) return StringTable.Localize("$O_SPREADGUN_GREEN"); - if ( loadammo is 'BlueShell' ) return StringTable.Localize("$O_SPREADGUN_BLUE"); - if ( loadammo is 'PurpleShell' ) return StringTable.Localize("$O_SPREADGUN_PURPLE"); - if ( loadammo is 'BlackShell' ) return StringTable.Localize("$O_SPREADGUN_BLACK"); - if ( loadammo is 'GoldShell' ) return StringTable.Localize("$O_SPREADGUN_GOLD"); + if ( goldload ) return StringTable.Localize("$O_SPREADGUN_GOLD"); return Super.GetObituary(victim,inflictor,mod,playerattack); } @@ -158,137 +78,85 @@ Class Spreadgun : SWWMWeapon Super.DoEffect(); // push back selection order if weapon is unloaded (or has a golden shell loaded) if ( !bInitialized ) SelectionOrder = default.SelectionOrder; - else SelectionOrder = ((chambered&&!fired)&&!(loadammo is 'GoldShell'))?default.SelectionOrder:1500; + else SelectionOrder = (chambered&&!fired&&!goldload)?default.SelectionOrder:1500; } override bool ReportHUDAmmo() { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - for ( int i=0; i<6; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; - return (!fired && chambered); + if ( !fired && chambered ) return true; + return Super.ReportHUDAmmo(); } override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; if ( (firemode == PrimaryFire) || (firemode == EitherFire) ) { if ( !fired && chambered ) return true; - for ( int i=0; i<6; i++ ) if ( Owner.CountInv(types[i]) > 0 ) return true; + if ( (Ammo1.Amount > 0) || (Ammo2.Amount > 0) ) return true; if ( autoswitch ) PlayerPawn(Owner).PickNewWeapon(null); return false; } return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); } - override bool UsesAmmo( Class kind ) - { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - for ( int i=0; i<6; i++ ) if ( kind is types[i] ) return true; - return false; - } - - override bool IsCurrentAmmo( Class kind ) - { - return (kind is nextammo); - } - action void A_SelectUnloadState() { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - static const statelabel primedstates[] = {"UnloadRed", "UnloadGreen", "UnloadBlue", "UnloadPurple", "UnloadBlack", "UnloadGold"}; - static const statelabel firedstates[] = {"UnloadRedFired", "UnloadGreenFired", "UnloadBlueFired", "UnloadPurpleFired", "UnloadBlackFired", "UnloadGoldFired"}; - int amidx = 0; - for ( int i=0; i<6; i++ ) + if ( invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState("UnloadFired")); + else player.SetPSprite(PSP_WEAPON,invoker.FindState("Unload")); + if ( invoker.chambered ) { - if ( invoker.loadammo != types[i] ) continue; - amidx = i; - break; + A_ChangeModel("",1,"","",4,"models",String.Format("Shell_%s%s.png",invoker.wasgold?"Gold":"Normal",invoker.fired?"_Used":""),CMDL_USESURFACESKIN,-1); + A_Overlay(-9999,"UnloadDummy"); + } + else + { + A_ChangeModel("",1,"","",4,"models","",CMDL_USESURFACESKIN,-1); + A_Overlay(-9999,"UnloadDummyEmpty"); } - if ( !invoker.chambered ) player.SetPSprite(PSP_WEAPON,invoker.FindState("UnloadEmpty")); // no "fired" one for this, as it can never happen - else if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState(primedstates[amidx])); - else player.SetPSprite(PSP_WEAPON,invoker.FindState(firedstates[amidx])); - if ( invoker.chambered ) A_Overlay(-9999,"UnloadDummy"); - else A_Overlay(-9999,"UnloadDummyEmpty"); A_StartSound("spreadgun/deselect",CHAN_WEAPON,CHANF_OVERLAP); } action void A_SelectLoadState() { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - static const statelabel primedstates[] = {"LoadRed", "LoadGreen", "LoadBlue", "LoadPurple", "LoadBlack", "LoadGold"}; - static const statelabel firedstates[] = {"LoadRedFired", "LoadGreenFired", "LoadBlueFired", "LoadPurpleFired", "LoadBlackFired", "LoadGoldFired"}; - int amidx = 0; - for ( int i=0; i<6; i++ ) - { - if ( invoker.nextammo != types[i] ) continue; - amidx = i; - break; - } invoker.wasfired = false; - if ( invoker.emptyup ) - { - if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState("LoadEmpty")); - else player.SetPSprite(PSP_WEAPON,invoker.FindState("LoadEmptyFired")); - } - else if ( !invoker.fired ) player.SetPSprite(PSP_WEAPON,invoker.FindState(primedstates[amidx])); - else + A_ChangeModel("",1,"","",4,"models","",CMDL_USESURFACESKIN,-1); + A_ChangeModel("",1,"","",5,"models",String.Format("Shell_%s.png",invoker.loadgold?"Gold":"Normal"),CMDL_USESURFACESKIN,-1); + if ( invoker.fired ) { invoker.wasfired = true; - player.SetPSprite(PSP_WEAPON,invoker.FindState(firedstates[amidx])); + player.SetPSprite(PSP_WEAPON,invoker.FindState("LoadFired")); } - if ( invoker.emptyup ) A_Overlay(-9999,"LoadDummyEmpty"); - else A_Overlay(-9999,"LoadDummy"); - invoker.emptyup = false; + else player.SetPSprite(PSP_WEAPON,invoker.FindState("Load")); + A_Overlay(-9999,"LoadDummy"); } action void A_DropShell() { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - static const Class casetypes[] = {"RedShellCasing","GreenShellCasing","BlueShellCasing","PurpleShellCasing","BlackShellCasing","GoldShellCasing"}; if ( !invoker.fired ) { - for ( int i=0; i<6; i++ ) - { - if ( invoker.loadammo != types[i] ) continue; - let amo = FindInventory(types[i]); - if ( !amo ) - { - amo = Inventory(Spawn(types[i])); - amo.AttachToOwner(self); - amo.Amount = 0; - } - if ( (amo.Amount >= amo.MaxAmount) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) - invoker.BufferAmmo(types[i],1); - else amo.Amount++; - break; - } - } - else - { - for ( int i=0; i<6; i++ ) - { - if ( invoker.loadammo != types[i] ) continue; - Vector3 x, y, z; - [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); - Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-10*z); - let c = Spawn(casetypes[i],origin); - c.angle = angle; - c.pitch = pitch; - c.vel = x*FRandom[Junk](-.2,.2)+y*FRandom[Junk](-.2,.2)-(0,0,FRandom[Junk](2,3)); - c.vel += vel*.5; - break; - } + let amo = invoker.wasgold?invoker.Ammo2:invoker.Ammo1; + let amotype = invoker.wasgold?invoker.AmmoType2:invoker.AmmoType1; + if ( (amo.Amount >= amo.MaxAmount) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.BufferAmmo(amotype,1); + else amo.Amount = min(amo.Amount+1,amo.MaxAmount); + return; } + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-10*z); + let c = Spawn(invoker.wasgold?"GoldShellCasing":"RedShellCasing",origin); + c.angle = angle; + c.pitch = pitch; + c.vel = x*FRandom[Junk](-.2,.2)+y*FRandom[Junk](-.2,.2)-(0,0,FRandom[Junk](2,3)); + c.vel += vel*.5; } - action void ProcessTraceHit( SpreadgunTracer t, Vector3 origin, Vector3 dir, int dmg, double mm, Class impact = "SpreadImpact", int bc = 1, bool large = false ) + action void ProcessTraceHit( SpreadgunTracer t, Vector3 origin, Vector3 dir, int dmg, double mm, Class impact = "SpreadImpact", int bc = 1 ) { if ( swwm_omnibust ) { // Wall busting int bustdmg = dmg; - if ( t is 'SpreadSlugTracer' ) bustdmg = int(SpreadSlugTracer(t).penetration); BusterWall.Bust(t.Results,bustdmg,self,t.Results.HitVector,t.Results.HitPos.z); } for ( int i=0; i types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - static const statelabel flashes[] = {"FlashRed","FlashGreen","FlashBlue","FlashPurple","FlashBlack","FlashGold"}; - static const String sounds[] = {"spreadgun/redfire","spreadgun/greenfire","spreadgun/bluefire","spreadgun/purplefire","spreadgun/blackfire","spreadgun/goldfire"}; - static const int louds[] = {800,1000,1200,600,1400,2500}; - static const int quakes[] = {3,4,4,1,3,6}; - static const Color cols[] = {Color(40,255,192,64),Color(36,255,192,80),Color(48,32,176,255),Color(24,255,224,96),Color(72,255,128,16),Color(96,255,224,16)}; - for ( int i=0; i<6; i++ ) + if ( invoker.goldload ) { - if ( invoker.loadammo != types[i] ) continue; - A_SWWMFlash(flashes[i]); - A_StartSound(sounds[i],CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6); - A_AlertMonsters(swwm_uncapalert?0:louds[i]); - A_QuakeEx(quakes[i],quakes[i],quakes[i],9,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2*quakes[i]); - A_BumpFOV(1.-quakes[i]*.04); - A_PlayerFire(); - SWWMHandler.DoFlash(self,cols[i],5); - Vector3 x, y, z; - [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); - Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+2*y-2*z); - Vector3 x2, y2, z2; - [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); - double a, s; - Vector3 dir; - SpreadgunTracer st; - SpreadSlugTracer sst; - switch ( i ) + A_SWWMFlash("FlashGold"); + A_StartSound("spreadgun/goldfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6); + A_AlertMonsters(swwm_uncapalert?0:2500); + A_QuakeEx(6,6,6,9,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.2); + A_BumpFOV(.76); + SWWMHandler.DoFlash(self,Color(96,255,224,16),5); + } + else + { + A_SWWMFlash("FlashRed"); + A_StartSound("spreadgun/redfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6); + A_AlertMonsters(swwm_uncapalert?0:800); + A_QuakeEx(3,3,3,9,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); + A_BumpFOV(.88); + SWWMHandler.DoFlash(self,Color(40,255,192,64),5); + } + A_PlayerFire(); + Vector3 x, y, z; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+2*y-2*z); + Vector3 x2, y2, z2; + [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); + double a, s; + Vector3 dir; + if ( invoker.goldload ) + { + a = FRandom[Spreadgun](0,360); + s = FRandom[Spreadgun](0,.01); + dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); + FLineTraceData d; + LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); + SWWMBulletTrail.DoTrail(self,origin,dir,10000,2,true); + if ( d.HitType != TRACE_HitNone ) { - case 1: - sst = new("SpreadSlugTracer"); - sst.ignoreme = self; - sst.penetration = 200.; - a = FRandom[Spreadgun](0,360); - s = FRandom[Spreadgun](0,.01); - dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - sst.hitlist.Clear(); - sst.shootthroughlist.Clear(); - sst.waterhitlist.Clear(); - sst.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); - ProcessTraceHit(sst,origin,dir,0,12000,"SlugImpact",1,true); - for ( int i=0; i<6; i++ ) + Vector3 hitnormal = -d.HitDir; + if ( d.HitType == TRACE_HitFloor ) { - let s = Spawn("SWWMSmoke",origin); - s.scale *= .8; - s.alpha *= .3; - s.SetShade(Color(1,1,1)*Random[Spreadgun](96,192)); - s.vel += vel*.5+x*FRandom[Spreadgun](3.,5.); + if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; + else hitnormal = d.HitSector.floorplane.Normal; } - for ( int i=0; i<10; i++ ) + else if ( d.HitType == TRACE_HitCeiling ) { - let s = Spawn("SWWMSpark",origin); - s.scale *= .2; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Spreadgun](4.,8.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); + if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; + else hitnormal = d.HitSector.ceilingplane.Normal; } - SWWMUtility.DoKnockback(self,-x,25000.); - break; - case 2: - for ( int j=0; j<8; j++ ) + else if ( d.HitType == TRACE_HitWall ) { - a = FRandom[Spreadgun](0,360); - s = FRandom[Spreadgun](0,.3); - let b = Spawn("SaltBeam",level.Vec3Offset(origin,SWWMUtility.CircleOffset(y,z,a,s))); - b.target = self; - b.angle = atan2(x2.y,x2.x); - b.pitch = asin(-x2.z); + hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); + if ( !d.LineSide ) hitnormal *= -1; } - for ( int i=0; i<16; i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.special1 = 1; - s.scale *= .9; - s.SetShade(Color(1,3,4)*Random[Spreadgun](32,63)); - s.A_SetRenderStyle(.3,STYLE_AddShaded); - s.vel += vel*.5+x*FRandom[Spreadgun](3.,5.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); - } - for ( int i=0; i<20; i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .3; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Spreadgun](4.,8.)+y*FRandom[Spreadgun](-2,2)+z*FRandom[Spreadgun](-2,2); - } - SWWMUtility.DoKnockback(self,-x,23000.); - break; - case 3: - a = FRandom[Spreadgun](0,360); - s = FRandom[Spreadgun](0,.03); - dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - let b = Spawn("TheBall",origin); + let p = Spawn("SWWMBulletImpact",d.HitLocation+hitnormal); + p.angle = atan2(hitnormal.y,hitnormal.x); + p.pitch = asin(-hitnormal.z); + p.target = self; + if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); + let b = Spawn("GoldenImpact",d.HitLocation+hitnormal*4.); + b.angle = atan2(hitnormal.y,hitnormal.x); + b.pitch = asin(-hitnormal.z); b.target = self; - b.angle = atan2(dir.y,dir.x); - b.pitch = asin(-dir.z); - b.vel = dir*b.speed; - for ( int i=0; i<8; i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.scale *= .6; - s.alpha *= .25; - s.SetShade(Color(1,1,1)*Random[Spreadgun](96,192)); - s.vel += vel*.5+x*FRandom[Spreadgun](3.,5.); - } - for ( int i=0; i<8; i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .2; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Spreadgun](4.,8.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); - } - SWWMUtility.DoKnockback(self,-x,9500.); - break; - case 4: - for ( int j=0; j<50; j++ ) - { - a = FRandom[Spreadgun](0,360); - s = FRandom[Spreadgun](0,.1); - dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - let p = Spawn("CorrosiveFlechette",origin); - p.target = self; - p.angle = atan2(dir.y,dir.x); - p.pitch = asin(-dir.z); - p.vel = dir*p.speed*FRandom[Spreadgun](1.,1.5); - } - for ( int i=0; i<10; i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.scale *= .7; - s.alpha *= .3; - s.SetShade(Color(1,1,1)*Random[Spreadgun](48,128)); - s.vel += vel*.5+x*FRandom[Spreadgun](3.,12.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); - } - for ( int i=0; i<20; i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .3; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Spreadgun](4.,12.)+y*FRandom[Spreadgun](-2,2)+z*FRandom[Spreadgun](-2,2); - } - SWWMUtility.DoKnockback(self,-x,15000.); - break; - case 5: - a = FRandom[Spreadgun](0,360); - s = FRandom[Spreadgun](0,.01); - dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - FLineTraceData d; - LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d); - SWWMBulletTrail.DoTrail(self,origin,dir,10000,2,true); - if ( d.HitType != TRACE_HitNone ) - { - Vector3 hitnormal = -d.HitDir; - if ( d.HitType == TRACE_HitFloor ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; - else hitnormal = d.HitSector.floorplane.Normal; - } - else if ( d.HitType == TRACE_HitCeiling ) - { - if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; - else hitnormal = d.HitSector.ceilingplane.Normal; - } - else if ( d.HitType == TRACE_HitWall ) - { - hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); - if ( !d.LineSide ) hitnormal *= -1; - } - let p = Spawn("SlugImpact",d.HitLocation+hitnormal); - p.angle = atan2(hitnormal.y,hitnormal.x); - p.pitch = asin(-hitnormal.z); - if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation); - let b = Spawn("GoldenImpact",d.HitLocation+hitnormal*4.); - b.angle = atan2(hitnormal.y,hitnormal.x); - b.pitch = asin(-hitnormal.z); - b.target = self; - } - for ( int i=0; i<6; i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.scale *= .8; - s.alpha *= .3; - s.SetShade(Color(1,1,1)*Random[Spreadgun](96,192)); - s.vel += vel*.5+x*FRandom[Spreadgun](3.,5.); - } - for ( int i=0; i<10; i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .2; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Spreadgun](4.,8.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); - } - for ( int i=0; i<50; i++ ) - { - let s = Spawn("FancyConfetti",origin); - s.bAMBUSH = true; - s.vel += vel*.5+x*FRandom[Spreadgun](1.,20.)+y*FRandom[Spreadgun](-2,2)+z*FRandom[Spreadgun](-2,2); - } - SWWMUtility.DoKnockback(self,-x,30000.); - SWWMUtility.AchievementProgressInc("golden",1,player); - break; - default: - st = new("SpreadgunTracer"); - st.ignoreme = self; - for ( int j=0; j<20; j++ ) - { - a = FRandom[Spreadgun](0,360); - s = FRandom[Spreadgun](0,.12); - dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); - st.hitlist.Clear(); - st.shootthroughlist.Clear(); - st.waterhitlist.Clear(); - st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); - ProcessTraceHit(st,origin,dir,8,7000,bc:5); - } - for ( int i=0; i<16; i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.special1 = 1; - s.scale *= .9; - s.alpha *= .3; - s.SetShade(Color(1,1,1)*Random[Spreadgun](96,192)); - s.vel += vel*.5+x*FRandom[Spreadgun](3.,5.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); - } - for ( int i=0; i<20; i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .3; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Spreadgun](4.,8.)+y*FRandom[Spreadgun](-2,2)+z*FRandom[Spreadgun](-2,2); - } - SWWMUtility.DoKnockback(self,-x,20000.); - break; } - break; + for ( int i=0; i<6; i++ ) + { + let s = Spawn("SWWMSmoke",origin); + s.scale *= .8; + s.alpha *= .3; + s.SetShade(Color(1,1,1)*Random[Spreadgun](96,192)); + s.vel += vel*.5+x*FRandom[Spreadgun](3.,5.); + } + for ( int i=0; i<10; i++ ) + { + let s = Spawn("SWWMSpark",origin); + s.scale *= .2; + s.alpha *= .4; + s.vel += vel*.5+x*FRandom[Spreadgun](4.,8.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); + } + for ( int i=0; i<50; i++ ) + { + let s = Spawn("FancyConfetti",origin); + s.bAMBUSH = true; + s.vel += vel*.5+x*FRandom[Spreadgun](1.,20.)+y*FRandom[Spreadgun](-2,2)+z*FRandom[Spreadgun](-2,2); + } + SWWMUtility.DoKnockback(self,-x,30000.); + SWWMUtility.AchievementProgressInc("golden",1,player); + } + else + { + SpreadgunTracer st = new("SpreadgunTracer"); + st.ignoreme = self; + for ( int j=0; j<20; j++ ) + { + a = FRandom[Spreadgun](0,360); + s = FRandom[Spreadgun](0,.12); + dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); + st.hitlist.Clear(); + st.shootthroughlist.Clear(); + st.waterhitlist.Clear(); + st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); + ProcessTraceHit(st,origin,dir,9,7000,bc:5); + } + for ( int i=0; i<16; i++ ) + { + let s = Spawn("SWWMSmoke",origin); + s.special1 = 1; + s.scale *= .9; + s.alpha *= .3; + s.SetShade(Color(1,1,1)*Random[Spreadgun](96,192)); + s.vel += vel*.5+x*FRandom[Spreadgun](3.,5.)+y*FRandom[Spreadgun](-1,1)+z*FRandom[Spreadgun](-1,1); + } + for ( int i=0; i<20; i++ ) + { + let s = Spawn("SWWMSpark",origin); + s.scale *= .3; + s.alpha *= .4; + s.vel += vel*.5+x*FRandom[Spreadgun](4.,8.)+y*FRandom[Spreadgun](-2,2)+z*FRandom[Spreadgun](-2,2); + } + SWWMUtility.DoKnockback(self,-x,20000.); } A_StartSound("spreadgun/hammer",CHAN_WEAPON,CHANF_OVERLAP); invoker.fired = true; @@ -601,15 +355,19 @@ Class Spreadgun : SWWMWeapon action void A_LoadShell() { + A_ChangeModel("",1,"","",5,"models","",CMDL_USESURFACESKIN,-1); + A_ChangeModel("",1,"","",4,"models",String.Format("Shell_%s.png",invoker.loadgold?"Gold":"Normal"),CMDL_USESURFACESKIN,-1); A_StartSound("spreadgun/shellin",CHAN_WEAPON,CHANF_OVERLAP); - if ( !invoker.FetchBufferedAmmo(invoker.nextammo,1) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.goldload = invoker.loadgold; + invoker.loadgold = false; + let amot = invoker.goldload?invoker.AmmoType2:invoker.AmmoType1; + if ( !invoker.FetchBufferedAmmo(amot,1) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) { - let amo = FindInventory(invoker.nextammo); - if ( amo && (amo.Amount > 0) ) amo.Amount--; + let amo = invoker.goldload?invoker.Ammo2:invoker.Ammo1; + if ( amo.Amount > 0 ) amo.Amount--; } invoker.chambered = true; invoker.fired = false; - invoker.loadammo = invoker.nextammo; invoker.ClearBufferedAmmo(); } @@ -617,14 +375,30 @@ Class Spreadgun : SWWMWeapon { if ( invoker.fired || invoker.wasfired ) A_StartSound("spreadgun/hammer",CHAN_WEAPON,CHANF_OVERLAP); + A_ChangeModel("",1,"","",5,"models","",CMDL_USESURFACESKIN,-1); + } + + action State A_SpreadgunReady() + { + int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1|WRF_NOSECONDARY; + if ( ((invoker.Ammo1.Amount > 0) || sv_infiniteammo && FindInventory('PowerInfiniteAmmo',true)) && (invoker.fired || !invoker.chambered || invoker.goldload) ) + flg |= WRF_ALLOWRELOAD; + if ( ((invoker.Ammo2.Amount > 0) || sv_infiniteammo && FindInventory('PowerInfiniteAmmo',true)) && (invoker.fired || !invoker.chambered || !invoker.goldload) ) + flg &= ~WRF_NOSECONDARY; + if ( invoker.fired || !invoker.chambered ) flg |= WRF_NOPRIMARY; // until 1.4, dry-fire animation not implemented + A_WeaponReady(flg); + if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) ) + invoker.CheckAmmo(EitherFire,true); + return ResolveState(null); } override bool PickupForAmmoSWWM( SWWMWeapon ownedWeapon ) { bool good = Super.PickupForAmmoSWWM(ownedWeapon); let Owner = ownedWeapon.Owner; - if ( (AmmoGive1 == 0) && loadammo && !fired && chambered ) + if ( (AmmoGive1 == 0) && !fired && chambered ) { + let loadammo = goldload?AmmoType2:AmmoType1; let cur = Owner.FindInventory(loadammo); if ( !cur ) { @@ -642,87 +416,9 @@ Class Spreadgun : SWWMWeapon override void InitializeWeapon() { - if ( !loadammo ) loadammo = "RedShell"; fired = false; chambered = true; - } - - override void AttachToOwner( Actor other ) - { - Super.AttachToOwner(other); - // setup which ammo type is first selected - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - for ( int i=0; i<6; i++ ) - { - Ammo a = Ammo(other.FindInventory(types[i])); - if ( !a || (a.Amount <= 0) ) continue; - nextammo = types[i]; - return; - } - nextammo = AmmoType1; - } - - action void A_SwitchAmmoType( bool rev = false ) - { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; - int cur = 0, next = 0; - for ( int i=0; i<6; i++ ) - { - if ( invoker.nextammo != types[i] ) continue; - cur = i; - break; - } - int ridx = -1; - if ( rev ) - { - // check backwards from what we currently had - for ( int i=cur; i>=0; i-- ) - { - if ( CountInv(types[i]) <= 0 ) continue; - ridx = i; - break; - } - if ( ridx == -1 ) - { - // check forwards instead, but avoid golden shells - for ( int i=0; i<5; i++ ) - { - if ( CountInv(types[i]) <= 0 ) continue; - ridx = i; - break; - } - } - if ( ridx != -1 ) next = ridx; - } - else - { - for ( int i=0; i<6; i++ ) - { - ridx = (i+cur+1)%6; - if ( CountInv(types[ridx]) <= 0 ) continue; - next = ridx; - break; - } - } - if ( invoker.nextammo != types[next] ) A_StartSound("misc/invchange",CHAN_WEAPONEXTRA,CHANF_UI|CHANF_LOCAL); - invoker.nextammo = types[next]; - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - } - - action void A_AltHold() - { - A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); - // tap fire to unload round - if ( invoker.chambered && (player.cmd.buttons&BT_ATTACK) ) - { - invoker.emptyup = true; - player.SetPSPrite(PSP_WEAPON,invoker.FindState("Reload")); - return; - } - if ( player.cmd.buttons&BT_ALTATTACK ) return; - A_SwitchAmmoType(); - if ( !invoker.fired ) player.SetPSPrite(PSP_WEAPON,invoker.FindState("Ready")); - else player.SetPSPrite(PSP_WEAPON,invoker.FindState("ReadyFired")); + goldload = false; } override void ModifyDropAmount( int dropamount ) @@ -730,7 +426,7 @@ Class Spreadgun : SWWMWeapon Super.ModifyDropAmount(dropamount); // toss some ammo while we're at it if ( Random[Spreadgun](0,1) ) - A_DropItem(Random[Spreadgun](0,2)?"RedShell":"GreenShell",Random[Spreadgun](1,2)); + A_DropItem("RedShell",Random[Spreadgun](1,2)); } override void MarkPrecacheSounds() @@ -744,14 +440,6 @@ Class Spreadgun : SWWMWeapon MarkSound("spreadgun/deselect"); MarkSound("spreadgun/redfire1"); MarkSound("spreadgun/redfire2"); - MarkSound("spreadgun/greenfire1"); - MarkSound("spreadgun/greenfire2"); - MarkSound("spreadgun/bluefire1"); - MarkSound("spreadgun/bluefire2"); - MarkSound("spreadgun/blackfire1"); - MarkSound("spreadgun/blackfire2"); - MarkSound("spreadgun/purplefire1"); - MarkSound("spreadgun/purplefire2"); MarkSound("spreadgun/goldfire1"); MarkSound("spreadgun/goldfire2"); MarkSound("spreadgun/checkgun"); @@ -778,40 +466,8 @@ Class Spreadgun : SWWMWeapon MarkSound("spreadgun/pelletf4"); MarkSound("spreadgun/pelletf5"); MarkSound("spreadgun/pelletf6"); - MarkSound("spreadgun/slug1"); - MarkSound("spreadgun/slug2"); - MarkSound("spreadgun/slugf1"); - MarkSound("spreadgun/slugf2"); - MarkSound("spreadgun/corrode"); - MarkSound("spreadgun/corrodepuff1"); - MarkSound("spreadgun/corrodepuff2"); - MarkSound("spreadgun/ball1"); - MarkSound("spreadgun/ball2"); - MarkSound("spreadgun/ball3"); - MarkSound("spreadgun/ballf1"); - MarkSound("spreadgun/ballf2"); - MarkSound("spreadgun/ballf3"); - MarkSound("spreadgun/salt1"); - MarkSound("spreadgun/salt2"); - MarkSound("spreadgun/salt3"); - MarkSound("spreadgun/salt4"); - MarkSound("spreadgun/salttrail1"); - MarkSound("spreadgun/salttrail2"); - MarkSound("spreadgun/salttrail3"); - MarkSound("spreadgun/salttrail4"); MarkSound("spreadgun/goldexpl1"); MarkSound("spreadgun/goldexpl2"); - MarkSound("misc/clonk1"); - MarkSound("misc/clonk2"); - MarkSound("misc/clonk3"); - MarkSound("misc/clonk4"); - MarkSound("misc/clonk5"); - MarkSound("misc/clonk6"); - MarkSound("misc/clonk7"); - MarkSound("misc/clonk8"); - MarkSound("misc/clonk9"); - MarkSound("misc/clonk10"); - MarkSound("misc/clonk11"); } Default @@ -826,6 +482,8 @@ Class Spreadgun : SWWMWeapon Weapon.SelectionOrder 500; Weapon.AmmoType1 "RedShell"; Weapon.AmmoGive1 1; + Weapon.AmmoType2 "GoldShell"; + Weapon.AmmoGive2 0; SWWMWeapon.DropAmmoType "SWWMShellAmmoSmall"; Stamina 15000; +SWWMWEAPON.NOFIRSTGIVE; @@ -864,34 +522,14 @@ Class Spreadgun : SWWMWeapon XZW3 HIJKLMNOP 1; Goto ReadyFired; Ready: - XZW2 A 1 - { - if ( CountInv(invoker.nextammo) <= 0 ) A_SwitchAmmoType(true); - int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1; - if ( invoker.nextammo && (CountInv(invoker.nextammo) > 0) && ((invoker.loadammo != invoker.nextammo) || !invoker.chambered) ) - flg |= WRF_ALLOWRELOAD; - A_WeaponReady(flg); - return ResolveState(null); - } + XZW2 A 1 A_SpreadgunReady(); Wait; ReadyFired: - XZW2 Z 1 - { - if ( CountInv(invoker.nextammo) <= 0 ) A_SwitchAmmoType(true); - int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1; - if ( invoker.nextammo && (CountInv(invoker.nextammo) > 0) ) - flg |= WRF_ALLOWRELOAD; - else flg |= WRF_NOPRIMARY; - A_WeaponReady(flg); - if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) ) - invoker.CheckAmmo(EitherFire,true); - return ResolveState(null); - } + XZW2 Z 1 A_SpreadgunReady(); Wait; Fire: - #### # 1 + XZW2 A 1 { - if ( invoker.fired || !invoker.chambered ) return ResolveState("Reload"); A_FireShell(); return ResolveState(null); } @@ -899,12 +537,20 @@ Class Spreadgun : SWWMWeapon XZW2 VWXY 2; Goto ReadyFired; AltFire: - #### # 1 A_AltHold(); - Wait; - Reload: - #### # 1 + #### # -1 { A_PlayerReload(); + invoker.wasgold = invoker.goldload; + invoker.loadgold = true; + A_SelectUnloadState(); + } + Stop; + Reload: + #### # -1 + { + A_PlayerReload(); + invoker.wasgold = invoker.goldload; + invoker.loadgold = false; A_SelectUnloadState(); } Stop; @@ -921,95 +567,24 @@ Class Spreadgun : SWWMWeapon TNT1 A 11; TNT1 A 14 A_StartSound("spreadgun/open",CHAN_WEAPON,CHANF_OVERLAP); Stop; - UnloadRedFired: + UnloadFired: XZW2 Z 2; XZW3 QRST 2; XZW3 UVWXYZ 1; XZW4 ABCDEFGH 1; - XZW8 M 1; + XZW4 I 1; Goto Reload2; - UnloadGreenFired: - XZW2 Z 2; - XZW4 IJKL 2; - XZW4 MNOPQRSTUVWXYZ 1; - XZW9 T 1; - Goto Reload2; - UnloadBlueFired: - XZW2 Z 2; - XZW5 STUV 2; - XZW5 WXYZ 1; - XZW6 ABCDEFGHIJ 1; - XZWC H 1; - Goto Reload2; - UnloadBlackFired: - XZW2 Z 2; - XZW6 KLMN 2; - XZW6 OPQRSTUVWXYZ 1; - XZW7 AB 1; - XZWD O 1; - Goto Reload2; - UnloadPurpleFired: - XZW2 Z 2; - XZW7 CDEF 2; - XZW7 GHIJKLMNOPQRST 1; - XZWE V 1; - Goto Reload2; - UnloadGoldFired: - XZW2 Z 2; - XZW7 UVWX 2; - XZW7 YZ 1; - XZW8 ABCDEFGHIJKL 1; - XZWG C 1; - Goto Reload2; - UnloadRed: + Unload: XZW2 A 2; - XZWK JKLM 2; - XZWK NOPQRSTUVWXYZ 1; - XZWL A 1; - XZWP F 1; - Goto Reload2; - UnloadGreen: - XZW2 A 2; - XZWL BCDE 2; - XZWL FGHIJKLMNOPQRS 1; - XZWQ M 1; - Goto Reload2; - UnloadBlue: - XZW2 A 2; - XZWM LMNO 2; - XZWM PQRSTUVWXYZ 1; - XZWN ABC 1; - XZWT A 1; - Goto Reload2; - UnloadBlack: - XZW2 A 2; - XZWN DEFG 2; - XZWN HIJKLMNOPQRSTU 1; - XZWU H 1; - Goto Reload2; - UnloadPurple: - XZW2 A 2; - XZWN VWXY 2; - XZWN Z 1; - XZWO ABCDEFGHIJKLM 1; - XZWV O 1; - Goto Reload2; - UnloadGold: - XZW2 A 2; - XZWO NOPQ 2; - XZWO RSTUVWXYZ 1; - XZWP ABCDE 1; - XZWW V 1; - Goto Reload2; - UnloadEmpty: - XZW2 A 2; - XZWY CDEF 2; - XZWY GHIJKLMNOPQRSTU 1; + XZW9 PQRS 2; + XZW9 TUVWXYZ 1; + XZWA ABCDEFG 1; + XZWA H 1; Goto Reload2; Reload2: - #### # 1 A_SelectLoadState(); + #### # -1 A_SelectLoadState(); Stop; - LoadDummy: // overlay with shared functions for all load anims + LoadDummy: TNT1 A 9; TNT1 A 12 A_LoadShell(); TNT1 A 2 A_StartSound("spreadgun/close",CHAN_WEAPON,CHANF_OVERLAP); @@ -1022,63 +597,13 @@ Class Spreadgun : SWWMWeapon TNT1 A 2 A_Prime(); TNT1 A 1 { invoker.PlayUpSound(self); } Stop; - LoadRedFired: - XZW8 MNOPQRSTUVWXYZ 1; - XZW9 ABCDEFGHIJKLMNOPQRS 1; + LoadFired: + XZW4 IJKLMNOPQRSTUVWXYZ 1; + XZW5 ABCDEFGHIJKLMNO 1; Goto Ready; - LoadGreenFired: - XZW9 TUVWXYZ 1; - XZWA ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; - Goto Ready; - LoadBlueFired: - XZWC HIJKLMNOPQRSTUVWXYZ 1; - XZWD ABCDEFGHIJKLMN 1; - Goto Ready; - LoadBlackFired: - XZWD OPQRSTUVWXYZ 1; - XZWE ABCDEFGHIJKLMNOPQRSTU 1; - Goto Ready; - LoadPurpleFired: - XZWE VWXYZ 1; - XZWF ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; - XZWG AB 1; - Goto Ready; - LoadGoldFired: - XZWG CDEFGHIJKLMNOPQRSTUVWXYZ 1; - XZWH ABCDEFGHI 1; - Goto Ready; - LoadRed: - XZWP FGHIJKLMNOPQRSTUVWXYZ 1; - XZWQ ABCDEFGHIJKL 1; - Goto Ready; - LoadGreen: - XZWQ MNOPQRSTUVWXYZ 1; - XZWR ABCDEFGHIJKLMNOPQRS 1; - Goto Ready; - LoadBlue: - XZWT ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; - XZWU ABCDEFG 1; - Goto Ready; - LoadBlack: - XZWU HIJKLMNOPQRSTUVWXYZ 1; - XZWV ABCDEFGHIJKLMN 1; - Goto Ready; - LoadPurple: - XZWV OPQRSTUVWXYZ 1; - XZWW ABCDEFGHIJKLMNOPQRSTU 1; - Goto Ready; - LoadGold: - XZWW VWXYZ 1; - XZWX ABCDEFGHIJKLMNOPQRSTUVWXYZ 1; - XZWY AB 1; - Goto Ready; - LoadEmpty: - XZWY UVWXYZ 1; - XZWZ ABCDEFGHIJKLMNO 1; - Goto Ready; - LoadEmptyFired: - XZWZ PQRSTUVWXYZ 1; - XZW0 HIJKLMNOPQ 1; + Load: + XZWA HIJKLMNOPQRSTUVWXYZ 1; + XZWB ABCDEFGHIJKLMN 1; Goto Ready; Zoom: XZW2 A 1 @@ -1087,17 +612,16 @@ Class Spreadgun : SWWMWeapon A_PlayerCheckGun(); return A_JumpIf(invoker.fired,"ZoomFired"); } - XZWH JKLMNOPQRST 1; - XZWH UVWXYZ 2; - XZWI ABC 2; - XZWI DEFGHI 1; + XZW5 PQRSTUVWXYZ 1; + XZW6 ABCDEFGHI 2; + XZW6 JKLMNO 1; Goto Ready; ZoomFired: XZW2 Z 1; - XZWI WXYZ 1; - XZWJ ABCDEFG 1; - XZWJ HIJKLMNOP 2; - XZWJ QRSTUV 1; + XZW8 CDEFGHIJKLM 1; + XZW8 NOPQRSTUV 2; + XZW8 WXYZ 1; + XZW9 AB 1; Goto ReadyFired; DummyMelee: TNT1 A 3 @@ -1113,34 +637,35 @@ Class Spreadgun : SWWMWeapon A_StartSound("spreadgun/deselect",CHAN_WEAPON,CHANF_OVERLAP); return A_JumpIf(invoker.fired,"User1Fired"); } - XZWI JK 2; + XZW7 PQ 2; User1Hold: - XZWI L 1 + XZW7 R 1 { A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP); A_Overlay(-9999,"DummyMelee"); } - XZWI MNOP 2; - XZWI QR 3; - XZWI S 0 A_JumpIf(player.cmd.buttons&BT_USER1,"User1Hold"); - XZWI S 0 { invoker.PlayUpSound(self); } - XZWI STUV 2; + XZW7 STUV 2; + XZW7 WX 3; + XZW7 Y 0 A_JumpIf(player.cmd.buttons&BT_USER1,"User1Hold"); + XZW7 Y 0 { invoker.PlayUpSound(self); } + XZW7 Y 2; + XZW7 Z 2; + XZW8 AB 2; Goto Ready; User1Fired: XZW2 Z 2; - XZWJ WX 2; + XZW9 CD 2; User1FiredHold: - XZWJ Y 1 + XZW9 E 1 { A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP); A_Overlay(-9999,"DummyMelee"); } - XZWJ Z 2; - XZWK ABC 2; - XZWK DE 3; - XZWK F 0 A_JumpIf(player.cmd.buttons&BT_USER1,"User1FiredHold"); - XZWK F 0 { invoker.PlayUpSound(self); } - XZWK FGHI 2; + XZW9 FGHI 2; + XZW9 JK 3; + XZW9 L 0 A_JumpIf(player.cmd.buttons&BT_USER1,"User1FiredHold"); + XZW9 L 0 { invoker.PlayUpSound(self); } + XZW9 LMNO 2; Goto ReadyFired; FlashRed: XZW0 A 2 Bright @@ -1150,43 +675,8 @@ Class Spreadgun : SWWMWeapon l.target = self; } Stop; - FlashGreen: - XZW0 B 2 Bright - { - let l = Spawn("SWWMWeaponLight",pos); - l.args[3] = 90; - l.target = self; - } - Stop; - FlashBlue: - XZW0 D 2 Bright - { - let l = Spawn("SWWMWeaponLight",pos); - l.args[0] = 96; - l.args[1] = 224; - l.args[2] = 255; - l.args[3] = 160; - l.target = self; - } - Stop; - FlashBlack: - XZW0 E 2 Bright - { - let l = Spawn("SWWMWeaponLight",pos); - l.args[3] = 60; - l.target = self; - } - Stop; - FlashPurple: - XZW0 F 2 Bright - { - let l = Spawn("SWWMWeaponLight",pos); - l.args[3] = 60; - l.target = self; - } - Stop; FlashGold: - XZW0 G 2 Bright + XZW0 B 2 Bright { let l = Spawn("SWWMWeaponLight",pos); l.args[3] = 300; diff --git a/zscript/weapons/swwm_shot_fx.zsc b/zscript/weapons/swwm_shot_fx.zsc index fcb829d2b..9a1f6ab8a 100644 --- a/zscript/weapons/swwm_shot_fx.zsc +++ b/zscript/weapons/swwm_shot_fx.zsc @@ -12,10 +12,6 @@ Class RedShellCasing : SWWMCasing heat = 0; } } -Class GreenShellCasing : RedShellCasing {} -Class BlueShellCasing : RedShellCasing {} -Class BlackShellCasing : RedShellCasing {} -Class PurpleShellCasing : RedShellCasing {} Class GoldShellCasing : RedShellCasing { Default @@ -69,1143 +65,6 @@ Class SpreadImpact : Actor } } -Class SlugImpact : Actor -{ - Default - { - Radius 0.1; - Height 0; - +NOGRAVITY; - +NOCLIP; - +NOTELEPORT; - +NOINTERACTION; - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - A_StartSound("spreadgun/slug",CHAN_VOICE); - A_SprayDecal("Pock",-20); - int numpt = Random[Spreadgun](5,10)-special1; - Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); - for ( int i=0; i ShootThroughList; - Array WaterHitList; - - override ETraceStatus TraceCallback() - { - // liquid splashes - if ( Results.CrossedWater ) - { - let hl = new("WaterHit"); - hl.sect = Results.CrossedWater; - hl.hitpos = Results.CrossedWaterPos; - WaterHitList.Push(hl); - } - else if ( Results.Crossed3DWater ) - { - let hl = new("WaterHit"); - hl.sect = Results.Crossed3DWater; - hl.hitpos = Results.Crossed3DWaterPos; - WaterHitList.Push(hl); - } - if ( Results.HitType == TRACE_HitActor ) - { - if ( Results.HitActor == ignore ) return TRACE_Skip; - if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; - return TRACE_Skip; - } - else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) - { - if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&Line.ML_BlockHitscan) ) - return TRACE_Stop; - ShootThroughList.Push(Results.HitLine); - return TRACE_Skip; - } - return TRACE_Stop; - } -} - -Class SaltLight : PaletteLight -{ - Default - { - Tag "SaltExpl,1"; - ReactionTime 30; - Args 0,0,0,240; - } -} -Class SaltLight2 : PaletteLight -{ - Default - { - Tag "SaltExpl"; - ReactionTime 30; - Args 0,0,0,70; - } -} - -Class SaltImpact : Actor -{ - Default - { - Obituary "$O_SPREADGUN_BLUE"; - DamageType "Salt"; - RenderStyle "Add"; - Radius 0.1; - Height 0; - Scale 1.8; - +NOGRAVITY; - +NOBLOCKMAP; - +NODAMAGETHRUST; - +FORCERADIUSDMG; - +FORCEXYBILLBOARD; - +NOTELEPORT; - +FOILINVUL; - +NOINTERACTION; - } - override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) - { - if ( args[0] >= 1 ) return StringTable.Localize("$O_WALLBUSTER_BLUE"); - return Super.GetObituary(victim,inflictor,mod,playerattack); - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - A_AlertMonsters(swwm_uncapalert?0:6000); - SWWMUtility.DoExplosion(self,30+special2*4,15000,100,40); - A_QuakeEx(3,3,3,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:0.2); - A_StartSound("spreadgun/salt",CHAN_VOICE,attenuation:.35); - A_SprayDecal("ShockMarkSmall",-172); - A_SprayDecal("SaltMark",-172); - Scale *= FRandom[ExploS](0.8,1.1); - int numpt = Random[ExploS](5,9)-special1; - for ( int i=0; i 0 ) tics--; - while ( !tics ) - { - if ( !SetState(CurState.NextState) ) - return; - } - } - States - { - Spawn: - TNT1 A 0 NoDelay A_Jump(256,"Expl1","Expl2","Expl3"); - Expl1: - KSX1 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright; - Stop; - Expl2: - KSX2 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright; - Stop; - Expl3: - KSX3 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] 1 Bright; - Stop; - } -} - -Class SaltBeam : Actor -{ - Default - { - Obituary "$O_SPREADGUN_BLUE"; - DamageType "Salt"; - RenderStyle "Add"; - Radius 0.1; - Height 0; - Stamina 9; - Speed 32; - +NOGRAVITY; - +NOBLOCKMAP; - +DONTSPLASH; - +NOTELEPORT; - +ROLLSPRITE; - +ROLLCENTER; - +NODAMAGETHRUST; - +FORCERADIUSDMG; - +FOILINVUL; - +NOINTERACTION; - } - - override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) - { - if ( args[1] >= 1 ) return StringTable.Localize("$O_WALLBUSTER_BLUE"); - return Super.GetObituary(victim,inflictor,mod,playerattack); - } - void SpreadOut() - { - special1 = 1; - Vector3 x, y, z; - [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); - let t = new("SaltTracer"); - t.ignore = target; - t.Trace(pos,cursector,x,speed,TRACE_HitSky); - for ( int i=0; i 20) && !Random[Spreadgun](0,800/args[0]) ) - { - let i = Spawn("SaltImpact",level.Vec3Offset(pos,x*speed)); - i.angle = atan2(x.y,x.x); - i.pitch = asin(-x.z); - i.target = target; - i.special1 = (Stamina-9)/4; - i.special2 = Accuracy; - i.args[0] = args[1]; - return; - } - // next beam - if ( !(special2%4) && !Random[Spreadgun](0,Stamina) ) - Spawn("SaltLight",level.Vec3Offset(pos,x*speed/2)); - let next = Spawn("SaltBeam",level.Vec3Offset(pos,x*speed)); - double a = FRandom[Spreadgun](0,360), s = FRandom[Spreadgun](0,.06); - Vector3 dir = SWWMUtility.ConeSpread(x,y,z,a,s); - next.angle = atan2(dir.y,dir.x); - next.pitch = asin(-dir.z); - next.target = target; - next.special2 = (special2+1)%10; - next.args[0] = args[0]+1; - next.args[1] = args[1]; - next.SetStateLabel("TrailSpawn"); - } - - override void PostBeginPlay() - { - Super.PostBeginPlay(); - if ( !Random[Spreadgun](0,3) ) - A_StartSound("spreadgun/salttrail",CHAN_VOICE,CHANF_DEFAULT,.3,4.); - } - - override void Tick() - { - if ( isFrozen() ) return; - A_FadeOut(.04); - if ( Random[Spreadgun](-2,args[2]/10) == 0 ) - SWWMUtility.DoExplosion(self,5+Accuracy,5000,speed,flags:DE_HOWL|DE_NONEXPLOSIVE,ignoreme:target); - if ( ((special2%4) || args[2]) && !special1 ) SpreadOut(); - args[2]++; - if ( !CheckNoDelay() || (tics == -1) ) return; - if ( tics > 0 ) tics--; - while ( !tics ) - { - if ( !SetState(CurState.NextState) ) - return; - } - } - - States - { - Spawn: - XZW1 A -1 Bright NoDelay - { - return FindState("StarterDev")+Random[Spreadgun](0,11)*2; - } - Stop; - TrailSpawn: - XZW2 A -1 Bright - { - return FindState("TrailerDev")+Random[Spreadgun](0,11)*2; - } - Stop; - StarterDev: - #### # 25 Bright; - XZW1 B -1 Bright; - Stop; - #### # 25 Bright; - XZW1 C -1 Bright; - Stop; - #### # 25 Bright; - XZW1 D -1 Bright; - Stop; - #### # 25 Bright; - XZW1 E -1 Bright; - Stop; - #### # 25 Bright; - XZW1 F -1 Bright; - Stop; - #### # 25 Bright; - XZW1 G -1 Bright; - Stop; - #### # 25 Bright; - XZW1 H -1 Bright; - Stop; - #### # 25 Bright; - XZW1 I -1 Bright; - Stop; - #### # 25 Bright; - XZW1 J -1 Bright; - Stop; - #### # 25 Bright; - XZW1 K -1 Bright; - Stop; - #### # 25 Bright; - XZW1 L -1 Bright; - Stop; - #### # 25 Bright; - XZW1 M -1 Bright; - Stop; - TrailerDev: - #### # 25 Bright; - XZW2 B -1 Bright; - Stop; - #### # 25 Bright; - XZW2 C -1 Bright; - Stop; - #### # 25 Bright; - XZW2 D -1 Bright; - Stop; - #### # 25 Bright; - XZW2 E -1 Bright; - Stop; - #### # 25 Bright; - XZW2 F -1 Bright; - Stop; - #### # 25 Bright; - XZW2 G -1 Bright; - Stop; - #### # 25 Bright; - XZW2 H -1 Bright; - Stop; - #### # 25 Bright; - XZW2 I -1 Bright; - Stop; - #### # 25 Bright; - XZW2 J -1 Bright; - Stop; - #### # 25 Bright; - XZW2 K -1 Bright; - Stop; - #### # 25 Bright; - XZW2 L -1 Bright; - Stop; - #### # 25 Bright; - XZW2 M -1 Bright; - Stop; - } -} - -Class BallImpact : Actor -{ - Default - { - Radius 0.1; - Height 0; - +NOGRAVITY; - +NOCLIP; - +DONTSPLASH; - +NOTELEPORT; - +NOINTERACTION; - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - A_QuakeEx(3,3,3,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3); - A_StartSound("spreadgun/ball",CHAN_VOICE); - A_SprayDecal("WallCrack",-20); - int numpt = Random[Spreadgun](5,10); - Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); - for ( int i=0; i 0) ) Owner.Howl(); - double maxrad = max(Owner.radius,Owner.height); - int defh = Owner.GetSpawnHealth(); - int flg = DMG_THRUSTLESS; - if ( Owner is 'Centaur' ) flg |= DMG_FOILINVUL; // you're melting, that shield is worthless - Owner.DamageMobj(self,instigator?instigator:Actor(self),clamp(Amount/8,1,50),'Corroded',flg); - bool justdied = (wasalive && (!Owner || (Owner.Health <= 0))); - if ( justdied ) - { - maxrad += 60; - Amount = min(Amount+int(defh**.5),MaxAmount); - A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT); - } - if ( !wasalive ) maxrad += 25; - SWWMUtility.DoExplosion(self,clamp(Amount/8,1,50),0,maxrad*1.2,maxrad*.9,DE_NOBLEED|DE_NOSPLASH|DE_HOWL|DE_NONEXPLOSIVE,'Corroded',Owner); - if ( !Owner ) return; // yeah this can happen - int smokefact = int(clamp(maxrad/32.,1,8)); - int numpt = Random[Corrode](0,2*smokefact); - if ( justdied ) numpt = Random[Corrode](8,12)*smokefact; - for ( int i=0; i 0); - cnt3++; - if ( !(cnt3%20) ) A_StartSound("spreadgun/corrodepuff",CHAN_BODY,CHANF_OVERLAP,min(Amount/200.,1.),2.,FRandom[Corrode](.8,1.2)-min(Amount/200.,.4)); - cnt2++; - if ( cnt2 < 3 ) return; - cnt2 = (!Owner||(Owner.Health<=Owner.GetGibHealth()))?-2:0; // slower decay when gibbed - Amount -= 1; - if ( Amount > 100 ) Amount -= max(0,Amount/50-1); - if ( !Owner ) return; - if ( Owner.Health > 0 ) Amount -= 1; - if ( Owner.bNOBLOOD ) Amount -= 2; - } -} - -Class FlechetteTracer : LineTracer -{ - Actor ignore; - Array ShootThroughList; - Array WaterHitList; - - override ETraceStatus TraceCallback() - { - // liquid splashes - if ( Results.CrossedWater ) - { - let hl = new("WaterHit"); - hl.sect = Results.CrossedWater; - hl.hitpos = Results.CrossedWaterPos; - WaterHitList.Push(hl); - } - else if ( Results.Crossed3DWater ) - { - let hl = new("WaterHit"); - hl.sect = Results.Crossed3DWater; - hl.hitpos = Results.Crossed3DWaterPos; - WaterHitList.Push(hl); - } - if ( Results.HitType == TRACE_HitActor ) - { - if ( Results.HitActor == ignore ) return TRACE_Skip; - if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; - return TRACE_Skip; - } - else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) - { - if ( !Results.HitLine.sidedef[1] || (Results.HitLine.Flags&(Line.ML_BLOCKEVERYTHING|Line.ML_BLOCKPROJECTILE)) ) - return TRACE_Stop; - ShootThroughList.Push(Results.HitLine); - return TRACE_Skip; - } - return TRACE_Stop; - } -} - -Class CorrosiveSplash : Actor -{ - Default - { - Radius 0.1; - Height 0; - +NOGRAVITY; - +NOCLIP; - +NOTELEPORT; - +NOINTERACTION; - } - override int DoSpecialDamage( Actor target, int Damage, Name DamageType ) - { - // spread ourselves - let c = CorrodeDebuff(target.FindInventory("CorrodeDebuff")); - if ( !c ) - { - c = CorrodeDebuff(Spawn("CorrodeDebuff",target.pos)); - c.AttachToOwner(target); - c.cnt = 5; // slight delay - } - c.Amount = min(c.Amount+Damage,c.MaxAmount); - c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT,min(c.Amount/100.,1.)); - c.instigator = self.target; - return 0; // no direct damage - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - SWWMUtility.DoExplosion(self,20,0,50,15,DE_NOBLEED|DE_NOSPLASH|DE_HOWL|DE_NONEXPLOSIVE,'Corroded',tracer); - Destroy(); - } -} - -Class CorrosiveFlechette : Actor -{ - transient FlechetteTracer t; - Actor lasthit; - - Default - { - Obituary "$O_SPREADGUN_BLACK"; - +NOBLOCKMAP; - +DONTSPLASH; - +NOTELEPORT; - +NODAMAGETHRUST; - +NOINTERACTION; - +INTERPOLATEANGLES; - Speed 100; - Radius .1; - Height 0.; - Gravity .35; - } - - override void Tick() - { - prev = pos; // interpolation - if ( isFrozen() ) return; - if ( CurState == SpawnState ) - { - // bullet trace - if ( (pos.z < floorz) || (pos.z > ceilingz) ) - { - // the fuck just happened??? - SetStateLabel("Death"); - return; - } - Vector3 dir = vel; - double dist = vel.length(); - if ( dist < 1. ) - { - // somehow have no velocity while alive, just die - SetStateLabel("Death"); - return; - } - dir /= dist; - if ( !t ) t = new("FlechetteTracer"); - if ( lasthit ) t.ignore = lasthit; - else if ( !bHITOWNER ) t.ignore = target; - else t.ignore = null; - t.shootthroughlist.Clear(); - t.waterhitlist.Clear(); - t.Trace(pos,CurSector,dir,dist,TRACE_HitSky); - for ( int i=0; i 0) ) - { - let c = CorrodeDebuff(a.FindInventory("CorrodeDebuff")); - if ( !c ) - { - c = CorrodeDebuff(Spawn("CorrodeDebuff",a.pos)); - c.AttachToOwner(a); - } - c.Amount = min(c.Amount+25,c.MaxAmount); - c.cnt = 0; - c.instigator = target; - c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT,min(c.Amount/100.,1.)); - } - int dmg = 3; - int amt = 3; - if ( a.bSHOOTABLE ) - { - SWWMUtility.DoKnockback(a,t.Results.HitVector,1000); - let p = SWWMPuff.Setup(t.Results.HitPos,t.Results.HitVector,self,target,a); - SWWMDamageAccumulator.Accumulate(a,dmg,p,target,'Shot',flags:DMG_INFLICTOR_IS_PUFF); - amt = SWWMDamageAccumulator.GetAmount(a); - } - if ( !a.bSHOOTABLE || a.bNOBLOOD || a.bDORMANT || a.bINVULNERABLE ) - { - let p = Spawn("SpreadImpact",t.Results.HitPos); - A_SetAngle(atan2(hitnormal.y,hitnormal.x),SPF_INTERPOLATE); - A_SetPitch(asin(-hitnormal.z),SPF_INTERPOLATE); - } - else - { - a.TraceBleed(dmg,self); - a.SpawnBlood(t.Results.HitPos,atan2(t.Results.HitVector.y,t.Results.HitVector.x)+180,dmg); - A_StartSound("spreadgun/pelletf",CHAN_VOICE,CHANF_DEFAULT,.5,2.); - } - let s = Spawn("CorrosiveSplash",t.Results.HitPos); - s.target = target; - s.tracer = a; - // chance to pierce - int posthealth = a.health-amt; - double hratio = posthealth/double(a.GetSpawnHealth()); - if ( (!a.bSHOOTABLE && !Random[Corrode](0,2)) || (posthealth <= 0) || (FRandom[Corrode](hratio,1.) < .5) ) - { - SetOrigin(t.Results.HitPos,true); - dir = t.Results.HitVector; - A_SetAngle(atan2(dir.y,dir.x),SPF_INTERPOLATE); - A_SetPitch(asin(-dir.z),SPF_INTERPOLATE); - vel = dir*dist; - bHITOWNER = true; - lasthit = t.Results.HitActor; - } - else SetStateLabel("Death"); - return; - } - else - { - // Wall busting - if ( swwm_omnibust ) - BusterWall.Bust(t.Results,3,target,t.Results.HitVector,t.Results.HitPos.z); - // check what we hit - Vector3 hitnormal = -t.Results.HitVector; - if ( t.Results.HitType == TRACE_HitFloor ) - { - if ( t.Results.ffloor ) hitnormal = -t.Results.ffloor.top.Normal; - else hitnormal = t.Results.HitSector.floorplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitCeiling ) - { - if ( t.Results.ffloor ) hitnormal = -t.Results.ffloor.bottom.Normal; - else hitnormal = t.Results.HitSector.ceilingplane.Normal; - } - else if ( t.Results.HitType == TRACE_HitWall ) - { - hitnormal = (-t.Results.HitLine.delta.y,t.Results.HitLine.delta.x,0).unit(); - if ( !t.Results.Side ) hitnormal *= -1; - t.Results.HitLine.RemoteActivate(target,t.Results.Side,SPAC_Impact,t.Results.HitPos); - } - if ( t.Results.HitType != TRACE_HasHitSky ) - { - let p = Spawn("SpreadImpact",t.Results.HitPos+hitnormal); - p.angle = atan2(hitnormal.y,hitnormal.x); - p.pitch = asin(-hitnormal.z); - if ( t.Results.HitType == TRACE_HitFloor ) p.CheckSplash(40); - let s = Spawn("CorrosiveSplash",t.Results.HitPos+hitnormal); - s.target = target; - } - // can we bounce? - if ( t.Results.HitVector dot hitnormal > -.35 ) - { - SetOrigin(t.Results.HitPos+hitnormal,true); - dir = t.Results.HitVector-2*hitnormal*(t.Results.HitVector dot hitnormal); - A_SetAngle(atan2(dir.y,dir.x),SPF_INTERPOLATE); - A_SetPitch(asin(-dir.z),SPF_INTERPOLATE); - vel = dir*dist; - bHITOWNER = true; - lasthit = null; - } - else SetStateLabel("Death"); - return; - } - } - if ( !CheckNoDelay() || (tics == -1) ) return; - if ( tics > 0 ) tics--; - while ( !tics ) - { - if ( !SetState(CurState.NextState) ) - return; - } - } - States - { - Spawn: - XZW1 A -1; - Stop; - Death: - TNT1 A 35; - Stop; - } -} - -Class TheBall : Actor -{ - double heat; - int deadtimer; - Vector3 oldvel; - Actor lasthit; - - Default - { - Obituary "$O_SPREADGUN_PURPLE"; - PROJECTILE; - +BOUNCEONWALLS; - +BOUNCEONFLOORS; - +BOUNCEONCEILINGS; - +CANBOUNCEWATER; - +USEBOUNCESTATE; - +DONTBOUNCEONSKY; - +NODAMAGETHRUST; - +ALLOWBOUNCEONACTORS; - +DONTBOUNCEONSHOOTABLES; - -NOGRAVITY; - Speed 80; - Gravity 0.1; - BounceFactor 1.0; - Radius 2; - Height 4; - } - override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) - { - if ( special1 >= 1 ) return StringTable.Localize("$O_WALLBUSTER_PURPLE"); - return Super.GetObituary(victim,inflictor,mod,playerattack); - } - override int SpecialMissileHit( Actor victim ) - { - if ( (vel.length() <= 5) || ((victim == target) && !bHITOWNER) || (victim == lasthit) || (!victim.bSHOOTABLE && !victim.bSOLID) ) - return 1; - // check if we should rip or bounce - // girthitude - double girth = (victim.radius+victim.height)/2.*max(50,victim.mass)*(victim.health/double(victim.GetSpawnHealth())); - // how hard this damn thing is going to slam - double slamforce = vel.length()*350.+heat*120; - int dmg = int(vel.length()*4.5+heat*45); - bool is_schutt = victim.bSHOOTABLE; - // critical hit! - bool crit = false; - if ( is_schutt && !Random[Spreadgun](0,9) ) - { - Spawn("SWWMItemFog",pos); - int whichclonk = Random[Spreadgun](1,11); - String snd = String.Format("misc/clonk%d",whichclonk); - A_AlertMonsters(swwm_uncapalert?0:2500); - A_StartSound(snd,CHAN_VOICE,CHANF_OVERLAP,1.,.2); - A_StartSound(snd,CHAN_VOICE,CHANF_OVERLAP,1.,.2); - victim.A_QuakeEx(8,8,8,8,0,3000,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollIntensity:1.); - victim.A_StartSound(snd,CHAN_DAMAGE,CHANF_OVERLAP,1.,.2); - slamforce *= 4; - dmg *= 4; - vel *= 1.1; - let numpt = Random[Spreadgun](20,30); - for ( int i=0; i0)?newdmg:dmg,self); - victim.SpawnBlood(pos,atan2(dir.y,dir.x),dmg); - } - } - else - { - A_StartSound("spreadgun/ball",CHAN_VOICE,CHANF_OVERLAP,(vel.length()/30.)**.5); - if ( victim ) victim.A_StartSound("spreadgun/ball",CHAN_DAMAGE,CHANF_OVERLAP,(vel.length()/30.)**.5); - if ( vel.length() > 15. ) - { - let s = Spawn("BallImpact",pos); - s.angle = atan2(dir.y,dir.x); - s.pitch = asin(-dir.z); - } - } - // make it so the crit does not propagate to friendlies unless we bonked a friend (you monster!) - if ( crit ) - SWWMUtility.DoExplosion(self,dmg/2,25000,150,80,((victim.isFriend(target))?0:DE_NOHURTFRIEND)|DE_NONEXPLOSIVE,crit?'CriticalConcussion':'Concussion',target,DMG_FOILINVUL); - if ( crit && victim && (victim.Health <= 0) && (victim.bBOSS || victim.FindInventory("BossMarker")) && target ) - SWWMUtility.MarkAchievement("clonk",target.player); - // only rip shootables - if ( (slamforce > girth) && is_schutt ) - { - vel *= .7; - return 1; - } - // force bounce - BlockingMobj = victim; - A_HandleBounce(); - lasthit = victim; - // pretend to pass through - return 1; - } - override void PostBeginPlay() - { - Super.PostBeginPlay(); - A_StartSound("spreadgun/ballfly",CHAN_WEAPON,CHANF_LOOP,.6,3.,2.); - heat = 1.; - } - override void Tick() - { - oldvel = vel; - Super.Tick(); - if ( isFrozen() ) return; - if ( InStateSequence(CurState,ResolveState("Death")) ) - { - deadtimer++; - if ( deadtimer > 300 ) - { - let numpt = Random[Spreadgun](3,6); - for ( int i=0; i 15) && swwm_balluse ) - { - int locknum = SWWMUtility.GetLineLock(BlockingLine); - // remotely activate unlocked lines (that aren't exits) - if ( (!locknum || (target && target.CheckKeys(locknum,false,true))) && !SWWMUtility.IsExitLine(BlockingLine) ) - BlockingLine.RemoteActivate(target,wside,SPAC_Use,pos); - } - } - else if ( BlockingMobj ) - { - Vector3 diff = level.Vec3Diff(BlockingMobj.Vec3Offset(0,0,BlockingMobj.Height/2),pos); - HitNormal = diff.unit(); - } - // send the needed data for a bust - if ( (special1 == 2) || swwm_omnibust ) - { - int dmg = int(oldvel.length()*4.2+heat*80); - BusterWall.ProjectileBust(self,dmg,oldvel.unit()); - } - // undo the bounce, we need to hook in our own - vel = oldvel; - // re-do the bounce with our formula - double bcefact = .9; - if ( BlockingMobj ) - { - bcefact *= .7; - if ( !BlockingMobj.bINVULNERABLE && !BlockingMobj.bNOBLOOD && !BlockingMobj.bDORMANT ) - bcefact *= .6; - } - vel = (vel dot HitNormal)*HitNormal*FRandom[Spreadgun](-1.8,-1.)+vel; - vel += SWWMUtility.Vec3FromAngles(FRandom[Spreadgun](0,360),FRandom[Spreadgun](-90,90))*.4; - vel *= bcefact; - // slam jam - if ( !BlockingMobj ) - { - A_StartSound("spreadgun/ball",CHAN_VOICE,CHANF_OVERLAP,max(0.,(vel.length()/30.-.2))**.5); - if ( vel.length() > 15 ) - { - let s = Spawn("BallImpact",pos); - s.angle = atan2(HitNormal.y,HitNormal.x); - s.pitch = asin(-HitNormal.z); - } - } - gravity = .35; - if ( (vel.length() < 5) && (pos.z <= floorz) ) - { - ClearBounce(); - ExplodeMissile(); - } - } - States - { - Spawn: - XZW1 A -1; - Stop; - Bounce: - XZW1 A 0 A_HandleBounce(); - Goto Spawn; - Death: - XZW1 A -1 - { - bMOVEWITHSECTOR = true; - A_StopSound(CHAN_WEAPON); - } - Stop; - } -} - Class GExploLight : PaletteLight { Default @@ -1248,7 +107,6 @@ Class GExploRing : Actor } } - Class GoldenImpact : Actor { Default diff --git a/zscript/weapons/swwm_thiccboolet.zsc b/zscript/weapons/swwm_thiccboolet.zsc index df3bc800b..0d45c318e 100644 --- a/zscript/weapons/swwm_thiccboolet.zsc +++ b/zscript/weapons/swwm_thiccboolet.zsc @@ -26,8 +26,9 @@ Class AuxiliarySilverBulletTracer : LineTracer } } -Class SilverBulletTracer : SpreadSlugTracer +Class SilverBulletTracer : SpreadgunTracer { + double penetration; // please don't laugh bool pastwall, fullstop; Array WallPenetrateList; Vector3 exitpoint; @@ -238,7 +239,7 @@ Class SilverBullet : SWWMWeapon Property ClipCount : clipcount; - override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) + /*override String GetObituary( Actor victim, Actor inflictor, Name mod, bool playerattack ) { if ( fcbchambered ) return StringTable.Localize("$O_SILVERBULLET2"); return Super.GetObituary(victim,inflictor,mod,playerattack); @@ -917,7 +918,7 @@ Class SilverBullet : SWWMWeapon } } return good; - } + }*/ override void MarkPrecacheSounds() { @@ -987,7 +988,7 @@ Class SilverBullet : SWWMWeapon XZW1 A -1 NoDelay A_JumpIf(invoker.fcbloaded,1); XZW1 B -1; Stop; - Select: + /*Select: XZW2 G 0 A_JumpIf(invoker.fcbloaded,"Select2"); XZW2 G 2 A_FullRaise(); XZW2 HIJKLMN 2; @@ -1521,6 +1522,6 @@ Class SilverBullet : SWWMWeapon l.args[3] = 200; l.target = self; } - Stop; + Stop;*/ } } diff --git a/zscript/weapons/swwm_weapons_hud.zsc b/zscript/weapons/swwm_weapons_hud.zsc index c9fe9d962..f7321ae2e 100644 --- a/zscript/weapons/swwm_weapons_hud.zsc +++ b/zscript/weapons/swwm_weapons_hud.zsc @@ -55,42 +55,28 @@ extend Class DualExplodiumGun // Spreadgun extend Class Spreadgun { - ui TextureID WeaponBox, RoundTex[6]; + ui TextureID WeaponBox, RoundTex[2]; override void DrawWeapon( double TicFrac, double bx, double by, double hs, Vector2 ss ) { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell","BlackShell","GoldShell"}; if ( !WeaponBox ) WeaponBox = TexMan.CheckForTexture("graphics/HUD/SpreadgunDisplay.png"); if ( !RoundTex[0] ) RoundTex[0] = TexMan.CheckForTexture("graphics/HUD/ShellRed.png"); - if ( !RoundTex[1] ) RoundTex[1] = TexMan.CheckForTexture("graphics/HUD/ShellGreen.png"); - if ( !RoundTex[2] ) RoundTex[2] = TexMan.CheckForTexture("graphics/HUD/ShellBlue.png"); - if ( !RoundTex[3] ) RoundTex[3] = TexMan.CheckForTexture("graphics/HUD/ShellPurple.png"); - if ( !RoundTex[4] ) RoundTex[4] = TexMan.CheckForTexture("graphics/HUD/ShellBlack.png"); - if ( !RoundTex[5] ) RoundTex[5] = TexMan.CheckForTexture("graphics/HUD/ShellGold.png"); + if ( !RoundTex[1] ) RoundTex[1] = TexMan.CheckForTexture("graphics/HUD/ShellGold.png"); Screen.DrawTexture(WeaponBox,false,bx-13,by-8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); if ( !chambered ) return; - for ( int i=0; i<6; i++ ) - { - if ( loadammo != types[i] ) continue; - Screen.DrawTexture(RoundTex[i],false,bx-11,by-6,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(fired?128:0,0,0,0)); - break; - } + Screen.DrawTexture(RoundTex[goldload],false,bx-11,by-6,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(fired?128:0,0,0,0)); } } // Wallbuster (less of a fuck in the alt hud) extend Class Wallbuster { - ui TextureID WeaponBox, RoundTex[4], CursorTex; + ui TextureID WeaponBox, RoundTex, CursorTex; override void DrawWeapon( double TicFrac, double bx, double by, double hs, Vector2 ss ) { - static const Class types[] = {"RedShell","GreenShell","BlueShell","PurpleShell"}; if ( !WeaponBox ) WeaponBox = TexMan.CheckForTexture("graphics/HUD/WallbusterDisplay.png"); - if ( !RoundTex[0] ) RoundTex[0] = TexMan.CheckForTexture("graphics/HUD/ShellRedSmall.png"); - if ( !RoundTex[1] ) RoundTex[1] = TexMan.CheckForTexture("graphics/HUD/ShellGreenSmall.png"); - if ( !RoundTex[2] ) RoundTex[2] = TexMan.CheckForTexture("graphics/HUD/ShellBlueSmall.png"); - if ( !RoundTex[3] ) RoundTex[3] = TexMan.CheckForTexture("graphics/HUD/ShellPurpleSmall.png"); + if ( !RoundTex ) RoundTex = TexMan.CheckForTexture("graphics/HUD/ShellRedSmall.png"); if ( !CursorTex ) CursorTex = TexMan.CheckForTexture("graphics/HUD/WallbusterCursor.png"); Screen.DrawTexture(WeaponBox,false,bx-12,by-75,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); int curpos = 73-(rotation[5]*15+rotation[rotation[5]]*2); @@ -99,12 +85,7 @@ extend Class Wallbuster { curpos = 73-(i*2+(i/5)*5); if ( !loaded[i] ) continue; - for ( int j=0; j<4; j++ ) - { - if ( loaded[i] != types[j] ) continue; - Screen.DrawTexture(RoundTex[j],false,bx-8,by-curpos,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(fired[i]?128:0,0,0,0)); - break; - } + Screen.DrawTexture(RoundTex,false,bx-8,by-curpos,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,Color(fired[i]?128:0,0,0,0)); } } } @@ -129,58 +110,18 @@ extend Class Eviscerator // Hellblazer extend Class Hellblazer { - ui TextureID WeaponBox, RoundTex[4]; + ui TextureID WeaponBox, RoundTex; override void DrawWeapon( double TicFrac, double bx, double by, double hs, Vector2 ss ) { - static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; if ( !WeaponBox ) WeaponBox = TexMan.CheckForTexture("graphics/HUD/HellblazerDisplay.png"); - if ( !RoundTex[0] ) RoundTex[0] = TexMan.CheckForTexture("graphics/HUD/HellblazerMissile.png"); - if ( !RoundTex[1] ) RoundTex[1] = TexMan.CheckForTexture("graphics/HUD/HellblazerCrackshot.png"); - if ( !RoundTex[2] ) RoundTex[2] = TexMan.CheckForTexture("graphics/HUD/HellblazerRavager.png"); - if ( !RoundTex[3] ) RoundTex[3] = TexMan.CheckForTexture("graphics/HUD/HellblazerWarhead.png"); + if ( !RoundTex ) RoundTex = TexMan.CheckForTexture("graphics/HUD/HellblazerMissile.png"); Screen.DrawTexture(WeaponBox,false,bx-13,by-29,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - int curtype = 0; - for ( int i=0; i<4; i++ ) - { - if ( loadammo != types[i] ) continue; - curtype = i; - break; - } int yy = 27; - switch ( curtype ) + for ( int i=0; i<6; i++ ) { - case 0: - for ( int i=0; i<6; i++ ) - { - Screen.DrawTexture(RoundTex[0],false,bx-11,by-yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(128,0,0,0):Color(0,0,0,0):magstate[i]?Color(160,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); - yy -= 4; - } - break; - case 1: - yy = 25; - for ( int i=0; i<3; i++ ) - { - Screen.DrawTexture(RoundTex[1],false,bx-11,by-yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(128,0,0,0):Color(0,0,0,0):magstate[i]?Color(160,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); - yy -= 8; - } - break; - case 2: - yy = 25; - for ( int i=0; i<3; i++ ) - { - Screen.DrawTexture(RoundTex[2],false,bx-11,by-yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(128,0,0,0):Color(0,0,0,0):magstate[i]?Color(160,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); - yy -= 8; - } - break; - case 3: - yy = 23; - for ( int i=0; i<2; i++ ) - { - Screen.DrawTexture(RoundTex[3],false,bx-11,by-yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(128,0,0,0):Color(0,0,0,0):magstate[i]?Color(160,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); - yy -= 12; - } - break; + Screen.DrawTexture(RoundTex,false,bx-11,by-yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(128,0,0,0):Color(0,0,0,0):magstate[i]?Color(160,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); + yy -= 4; } } }