diff --git a/README.md b/README.md index 79d8f66e2..f05ef49e5 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Additional features: - **Targetting Array:** Tracks nearby foes and provides basic information on their health. Compatible with **Omnisight™** mapping modules for tracking key items and nearby exits. Can also highlight nearby pickups by holding a dedicated button. - **Akari Labs CuteEmotion™ Display:** Equipped onto your visor to show a wide range of predefined facial expressions in order to convey simple emotions to others. - **Akari Labs LoudBoi™ Voicebox:** Allows you to **EMIT**. Easily moddable to allow alternate voicepack add-ons *(If someone were to make them)*. Your usual voice is quite robotty, due to a built-in filter. - - **On-demand Item Obtainers:** AKA "hands". You can pick up the mod's items from a distance by pressing Use *(this is mainly a workaround for any quirks that might come from them having modified collision)*. + - **On-demand Item Obtainers:** AKA "hands". You can pick up the mod's items from a distance by pressing Use *(this is mainly a workaround for any quirks that might come from them having modified collision)*. Furthermore, if you hold Use for a while, you will also attract nearby dropped items towards you as well. **Note:** Since you're a robutt you pretty much can swim indefinitely and are also immune to poison. diff --git a/language.def_base b/language.def_base index 91483d2d1..8ec9a0125 100644 --- a/language.def_base +++ b/language.def_base @@ -903,7 +903,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 = "200"; +SWWM_NINTERTIP = "210"; 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."; @@ -954,7 +954,7 @@ SWWM_INTERTIP46 = "Finding (or buying) a second Explodium Gun will allow you to SWWM_INTERTIP47 = "The duration of powerup effects will stack with each use."; SWWM_INTERTIP48 = "Having been alone for so long in this vast world, humanity has made an enemy out of itself. It's nothing short of pathetic that we've invented so many ways to divide and exclude each other. Regardless of race, language or religion, we are all equal."; SWWM_INTERTIP49 = "The quick grenade button will allow you to readily throw an Explodium Mag at any given moment, no matter what other weapon you were using. If looking at a wall or the floor, you will instead plant the mag there, quite useful for setting up traps."; -SWWM_INTERTIP50 = "\"Capitalism is a disease, a cancer that will bring this world to its ruin if we don't excise it soon.\" — Hynnykka the Great Witch"; +SWWM_INTERTIP50 = "\"Capitalism is a disease, a cancer that will bring this world to its ruin if we don't excise it soon.\"\n — Hynnykka the Great Witch"; SWWM_INTERTIP51 = "If an item is ever so slightly out of reach to be picked up by touch, you can press use to manually take it. Do note that this only works for items from this mod. Do also note that walk triggers will still be activated, so you're not going to avoid any traps this way."; SWWM_INTERTIP52 = "Lucky Chanceboxes may sometimes appear in secret areas, rewarding you with lots of goodies, including unique collectibles."; SWWM_INTERTIP53 = "Mid-reload and have a Pinky trying to bite your face off? Just dash into it to shove it out of the way."; @@ -966,7 +966,7 @@ SWWM_INTERTIP58 = "Always keep your GZDoom up to date. Especially for mods like SWWM_INTERTIP59 = "The Reinforced Combat Hammer is pretty strong on its own, but with a Ragekit active, it will be boosted into a beastly headsmasher."; SWWM_INTERTIP60 = "Despite its seemingly puny size, the Plasma Blaster has a lot of destructive potential, especially through its charged alt fire."; SWWM_INTERTIP61 = "The Puntzer guns can easily pierce through solid objects or even thin walls. No enemy will ever be safe behind cover."; -SWWM_INTERTIP62 = "\"The Sheen HMG is such a delicious festival of dakka that the mere sound of it firing makes me unleash Leviathan in my panties, and you can quote me on that.\" — Saya Miyamoto"; +SWWM_INTERTIP62 = "\"The Sheen HMG is such a delicious festival of dakka that the mere sound of it firing makes me unleash Leviathan in my panties, and you can quote me on that.\"\n — Saya Miyamoto"; SWWM_INTERTIP63 = "Pressing fire immediately after hitting something with the Quadravol's blades will result in a boosted point-blank explosion that'll send whatever's at the other end of the gun flying."; SWWM_INTERTIP64 = "Holding down the triggers with the Sparkster Rifle will gradually increase firing potency upon release. Fortunately, there is no potential here for the weapon to blow up if you keep them held long enough, only badly designed human weaponry could be so haphazard."; SWWM_INTERTIP65 = "The Sparkster Rifle can fire both ammo types simultaneously, blending them together into a deadly combo projectile."; @@ -975,10 +975,10 @@ SWWM_INTERTIP67 = "The Mortal Rifle (\"Mister\" for short) was devised as a pote SWWM_INTERTIP68 = "The Rafan-Kos is truly an Ultimate Weapon, as its name implies."; SWWM_INTERTIP69 = "Nice."; SWWM_INTERTIP70 = "Did you know that even with seat belts people die all the time in car crashes? I thought that was interesting."; -SWWM_INTERTIP71 = "\"On the internet nobody can hear you being subtle.\" — Linus Torvalds"; +SWWM_INTERTIP71 = "\"On the internet nobody can hear you being subtle.\"\n — Linus Torvalds"; SWWM_INTERTIP72 = "There are approximately 9.3 billion demons bred solely for warfare in Hell. That is eight hundred and seventy six thousand times the monster count of nuts.wad, and that's terrible."; SWWM_INTERTIP73 = "People die if they are killed. But legends never die, they get back up and pwn you."; -SWWM_INTERTIP74 = "\"TREEEEEEEEEES!\" — Marty"; +SWWM_INTERTIP74 = "\"TREEEEEEEEEES!\"\n — Marty"; SWWM_INTERTIP75 = "Kobolds are small little creechers that go yip."; SWWM_INTERTIP76 = "I showed you my intermission tip pls respond."; SWWM_INTERTIP77 = "AAA gaming is rotten to the core, riddled with corporate torture of honest workers. Support small developers whenever you can."; @@ -988,7 +988,7 @@ SWWM_INTERTIP80 = "Ceci n'est pas un conseil."; SWWM_INTERTIP81 = "Age only affects appearance, and has no bearing on ability. Gender has no bearing on ability. Everyone has imperfections, prejudice births malcontents, become a dark spirit.\nTime for crab."; SWWM_INTERTIP82 = "\"IF THE ZOO BANS ME FOR HOLLERING AT THE ANIMALS I WILL FACE GOD AND WALK BACKWARDS INTO HELL\" — dril"; SWWM_INTERTIP83 = "This is truly some weird weapons mod for GZDoom."; -SWWM_INTERTIP84 = "\"In its vastness, the universe is no more than a mere grain of sand when compared to the limitless bounds of one's imagination.\" — Zanaveth Nekuraku III"; +SWWM_INTERTIP84 = "\"In its vastness, the universe is no more than a mere grain of sand when compared to the limitless bounds of one's imagination.\"\n — Zanaveth Nekuraku III"; SWWM_INTERTIP85 = "You can shuffle the intermission art with Zoom, and these tips with Reload. Holding Altfire will hide the UI so you can see the art in full."; SWWM_INTERTIP86 = "Add minced garlic, white pepper and basil to your tomato sauce, goes really well with pasta, you can thank me later."; SWWM_INTERTIP87 = "This mod is compatible with H-Doom. No, seriously."; @@ -1070,7 +1070,7 @@ SWWM_INTERTIP162 = "See those counters in the center of the screen over there? S SWWM_INTERTIP163 = "Skill levels exist for a reason. If you think only one specific skill is valid, I cordially invite you to ingest an entire porcupine."; SWWM_INTERTIP164 = "Not everything made of warm is for sits."; SWWM_INTERTIP165 = "Be wary of people posting YouTube links with the id \"dQw4w9WgXcQ\"."; -SWWM_INTERTIP166 = "\"When you can't think straight, do you think gay?\" — Demo Miyamoto"; +SWWM_INTERTIP166 = "\"When you can't think straight, do you think gay?\"\n — Demo Miyamoto"; SWWM_INTERTIP167 = "GZDoom isn't unoptimized, it just has a lot of code. They're different animals."; SWWM_INTERTIP168 = "You can turn off these tips in the mod options menu."; SWWM_INTERTIP169 = "This mod won't mock you for cheating. If a map gives you shit, it's justified."; @@ -1105,6 +1105,16 @@ SWWM_INTERTIP197 = "Homing projectiles will switch targets when deflected. Final SWWM_INTERTIP198 = "You can disable pausing while the Demolitionist Menu is open. You'd be surprised how much this changes the whole experience. It's very... \"Souls-like\"."; SWWM_INTERTIP199 = "Brutal Doom is really mediocre. You people need to play other mods."; SWWM_INTERTIP200 = "There are other Demolitionists, but Demo-chan is the very first."; +SWWM_INTERTIP201 = "The Combat Hammer's spin attack is almost impossible to control, but against an ambush, it can be devastating."; +SWWM_INTERTIP202 = "Holding the Use key for about a second will start to suck in nearby item drops. Sometimes one can't be bothered to pick them all up manually in the aftermath of a big fight."; +SWWM_INTERTIP203 = "The Quadravol's built-in display uses Xekkas numerals, but fortunately you're smart enough to figure them out, right?"; +SWWM_INTERTIP204 = "Do not be afraid to experiment with different play styles. Mix and match your weaponry to your heart's content. Figuring things out is part of the fun."; +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"; diff --git a/language.def_menu b/language.def_menu index 68e399d0d..61d50fead 100644 --- a/language.def_menu +++ b/language.def_menu @@ -261,7 +261,7 @@ TOOLTIP_SWWM_SINGLEFIRST = "For weapons that have dual-wield variants, enabling TOOLTIP_SWWM_UNIQSTATS = "Clears duplicate map entries in the mission stats tab, useful to unclutter the list when moving back and forth in hubs."; TOOLTIP_SWWM_FILTERACHIEVEMENTS = "Filters out achievements at 0% in the Demolitionist Menu, if you'd rather avoid spoiling the fun. The 'Obfuscate' option is recommended, as it will at least leave a hint of things to be discovered."; TOOLTIP_SWWM_PLAYTIME = "Your total play time with this mod loaded."; -TOOLTIP_SWWM_USETOPICKUP = "Prevents picking up mod items through touch, exclusively requiring a use action instead."; +TOOLTIP_SWWM_USETOPICKUP = "Prevents picking up mod items through touch, exclusively requiring a use action instead. Note that this disables the \"dropped item magnet\" feature when holding Use."; TOOLTIP_SWWM_BUTTSFX = "The Demolitionist's buttcheeks will VERY AUDIBLY clap upon executing a successful buttslam."; TOOLTIP_SWWM_BUMPSTRENGTH = "Controls how strong the bumping of the FOV is from weapon recoil and other actions."; TOOLTIP_SWWM_ENGINE = "Don't touch this."; @@ -627,6 +627,6 @@ SWWM_HELP_TIPS = "Additional Tips"; SWWM_HELP_TIPSTXT = "Do note that you can also activate doors and switches by punching or dashing into them. The option is there, should you really want to, and are feeling especially intense.\n" "\n" -"Another thing to know is that items from this mod happen to have rather non-standard sized collision boxes, which might cause certain issues where you just can't pick them up by walking into them. In cases like these... just use your hands, obviously. You can press Use to pick up whatever you're looking at, as long as it's an item from this mod.\n" +"Another thing to know is that items from this mod happen to have rather non-standard sized collision boxes, which might cause certain issues where you just can't pick them up by walking into them. In cases like these... just use your hands, obviously. You can press Use to pick up whatever you're looking at, as long as it's an item from this mod. Furthermore, should you find a lot of scattered item drops in the battlefield, you can hold Use to pull them towards you.\n" "\n" "Last but not least, did you know you can pet certain enemies to turn them into allies? I don't think I need to tell you which ones you can pet. They're red, round and shaped like friends. You can also pet the dog, should a map you're playing employ MBF helper dogs (this tends to be rare, though)."; diff --git a/language.es_base b/language.es_base index c0ce0672e..e8e6c5a91 100644 --- a/language.es_base +++ b/language.es_base @@ -988,6 +988,16 @@ SWWM_INTERTIP197 = "Los proyectiles buscadores cambiarán de objetivo al ser ref SWWM_INTERTIP198 = "Puedes desactivar el pausado mientras se usa el Menú de Demolicionista. Te sorprendería lo mucho que esto cambia toda la experiencia. Es muy... \"Souls-like\"."; SWWM_INTERTIP199 = "Brutal Doom es realmente mediocre. A la peña os hace falta jugar otros mods."; SWWM_INTERTIP200 = "Hay otros Demolicionistas, pero Demo-chan es la primera de todos."; +SWWM_INTERTIP201 = "El ataque giratorio del Martillo de Combate es casi imposible de controlar, pero contra una emboscada, puede ser devastador."; +SWWM_INTERTIP202 = "Manteniendo pulsada la tecla de Usar durante al menos un segundo succionará drops de ítem cercanos. A veces a uno no le apetece recogerlos todos a mano despues de una gran batalla."; +SWWM_INTERTIP203 = "La pantalla integrada de la Quadravol usa números Xekkas, pero afortunadamente eres lo suficientemente inteligente como para entenderlos, verdad?"; +SWWM_INTERTIP204 = "No tengas miedo de experimentar con estilos de juego diferentes. Mezcla tu arsenal a placer. Aprender estas cosas es parte de la diversión."; +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 diff --git a/language.es_menu b/language.es_menu index 338516b10..8844eca00 100644 --- a/language.es_menu +++ b/language.es_menu @@ -259,7 +259,7 @@ TOOLTIP_SWWM_SINGLEFIRST = "Para armas que tienen variantes duales, activando es TOOLTIP_SWWM_UNIQSTATS = "Elimina entradas duplicadas de mapa en la pestaña de estadísticas de misión, útil para despejar la lista al moverse por hubs."; TOOLTIP_SWWM_FILTERACHIEVEMENTS = "Filtra logros al 0% en el Menú de Demolicionista, si prefieres no estropear la sorpresa. La opción de 'Ofuscar' es la recomendada, ya que al menos dejará pistas de cosas que quedan por descubrir."; TOOLTIP_SWWM_PLAYTIME = "Tu tiempo de juego total con este mod cargado."; -TOOLTIP_SWWM_USETOPICKUP = "Evita recoger ítems del mod al tocarlos, en su lugar requiriendo exclusivamente una acción de uso."; +TOOLTIP_SWWM_USETOPICKUP = "Evita recoger ítems del mod al tocarlos, en su lugar requiriendo exclusivamente una acción de uso. Ten en cuenta que esto deshabilita el \"imán de ítems dropeados\" al mantener la tecla de Usar."; TOOLTIP_SWWM_BUTTSFX = "Las nalgas de la Demolicionista emitiran un azote MUY SONORO al ejecutar exitosamente un golpe de culo."; TOOLTIP_SWWM_BUMPSTRENGTH = "Controla lo intensa que es la sacudida del FOV por el retroceso de armas y otras acciones."; TOOLTIP_SWWM_ENGINE = "No toques esto."; @@ -586,6 +586,6 @@ SWWM_HELP_TIPS = "Consejos Adicionales"; SWWM_HELP_TIPSTXT = "Ten en cuenta que puedes activar puertas y palancas a base de puñetazos o embistiendo contra ellas. La opción está ahí, si realmente quieres, y sientes una especial intensidad.\n" "\n" -"Otro tema a saber es que los ítems de este mod tienen colisiones un poco no-estándar, lo cual puede causar problemas al no poder recogerlos a pie. En casos como estos... simplemente usa las manos, obviamente. Puedes pulsar Usar para recoger cualquier cosa que tengas delante, siempre y cuando sea un ítem de este mod.\n" +"Otro tema a saber es que los ítems de este mod tienen colisiones un poco no-estándar, lo cual puede causar problemas al no poder recogerlos a pie. En casos como estos... simplemente usa las manos, obviamente. Puedes pulsar Usar para recoger cualquier cosa que tengas delante, siempre y cuando sea un ítem de este mod. Además, si te encuentras con muchos drops dispersos por el campo de batalla, puedes mantener Usar para atraerlos hacia ti.\n" "\n" "Por último pero no menos importante, ¿sabías que puedes acariciar ciertos enemigos para convertirlos en aliados? No creo que haga falta que te diga cuales. Son rojos, redondos y con forma de amigo. También puedes acariciar perros, si el mapa en el que estas resulta usar perros MBF (aunque esto suele ser poco común)."; diff --git a/language.version b/language.version index 2c127a244..7ea8fd419 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r322 \cu(Mon 15 Aug 12:29:35 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r322 \cu(2022-08-15 12:29:35)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r324 \cu(Mon 15 Aug 15:07:27 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r324 \cu(2022-08-15 15:07:27)\c-"; diff --git a/sndinfo.base b/sndinfo.base index f259161f1..b0814dc9e 100644 --- a/sndinfo.base +++ b/sndinfo.base @@ -75,12 +75,13 @@ misc/gibhit5 sounds/general/gibP6.ogg $random misc/gibhit { misc/gibhit1 misc/gibhit2 misc/gibhit3 misc/gibhit4 misc/gibhit5 } misc/blooddrop sounds/general/bloddrop.ogg misc/bodythump sounds/general/thump.ogg -misc/flame1 sounds/misc/onfire1.ogg -misc/flame2 sounds/misc/onfire2.ogg -misc/flame3 sounds/misc/onfire3.ogg -misc/flame4 sounds/misc/onfire4.ogg +misc/flame1 sounds/general/onfire1.ogg +misc/flame2 sounds/general/onfire2.ogg +misc/flame3 sounds/general/onfire3.ogg +misc/flame4 sounds/general/onfire4.ogg $random misc/flame { misc/flame1 misc/flame2 smisc/flame3 misc/flame4 } $limit misc/flame 32 +misc/magitem sounds/general/magitem.ogg misc/underwater sounds/general/uWater1a.ogg misc/underslime sounds/general/uGoop1.ogg diff --git a/sounds/general/magitem.ogg b/sounds/general/magitem.ogg new file mode 100644 index 000000000..0f335522c Binary files /dev/null and b/sounds/general/magitem.ogg differ diff --git a/zscript/items/swwm_funstuff.zsc b/zscript/items/swwm_funstuff.zsc index ed6889b3c..bcb588c46 100644 --- a/zscript/items/swwm_funstuff.zsc +++ b/zscript/items/swwm_funstuff.zsc @@ -944,8 +944,6 @@ Class Chancebox : Actor // spawn another smaller chancebox // (chance increases for the inner box, up until a scale factor of 50% is reached) let a = Spawn("Chancebox",pos+(0,0,3*scale.y)); - a.bDROPPED = false; - a.bNOGRAVITY = false; a.vel.z = FRandom[Chancebox](2,4); a.angle = angle; a.scale *= scale.x-.125; @@ -964,7 +962,13 @@ Class Chancebox : Actor if ( !vipitemdrop ) vipitemdrop = "GrilledCheeseSandwich"; let a = Spawn((!Random[Chancebox](0,2)&&vipammodrop)?vipammodrop:vipitemdrop,pos); a.bDROPPED = false; - a.bNOGRAVITY = false; + a.vel.z = FRandom[Chancebox](2,4); + } + else if ( !Random[Chancebox](0,2) && SWWMUtility.CheckNeedsItem("ItamexHammer") ) + { + // sometimes mapsets don't have chainsaw spawns for whatever reason + let a = Spawn("ItamexHammer",pos); + a.bDROPPED = false; a.vel.z = FRandom[Chancebox](2,4); } else if ( !Random[Chancebox](0,2) && SWWMUtility.ItemExists("CandyGun") ) @@ -972,8 +976,7 @@ Class Chancebox : Actor for ( int i=0; i<=6; i++ ) { let a = Spawn((i==0)?"CandyGun":"CandyGunBullets",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = (i!=0); a.vel.z = FRandom[Chancebox](2,4); if ( i > 0 ) a.vel.xy = (cos(i*60),sin(i*60))*FRandom[Chancebox](1,2); } @@ -983,16 +986,14 @@ Class Chancebox : Actor for ( int i=0; i<3; i++ ) { let a = Spawn("SilverBullets2",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); a.vel.xy = (cos(i*120),sin(i*120))*FRandom[Chancebox](1,2); } for ( int i=0; i<6; i++ ) { let a = Spawn("SilverBullets",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); a.vel.xy = (cos(i*60),sin(i*60))*FRandom[Chancebox](3,4); } @@ -1000,65 +1001,87 @@ Class Chancebox : Actor else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("Hellblazer") ) { let a = Spawn("HellblazerWarheads",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); for ( int i=0; i<3; i++ ) { a = Spawn("HellblazerRavagers",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); a.vel.xy = (cos(i*120),sin(i*120))*FRandom[Chancebox](1,2); } for ( int i=0; i<5; i++ ) { a = Spawn("HellblazerCrackshots",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); a.vel.xy = (cos(i*72),sin(i*72))*FRandom[Chancebox](3,4); } for ( int i=0; i<8; i++ ) { a = Spawn("HellblazerMissiles",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); a.vel.xy = (cos(i*45),sin(i*45))*FRandom[Chancebox](5,6); } } + else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("HeavyMahSheenGun") ) + { + let a = Spawn("SheenBigAmmo",pos); + a.bDROPPED = true; + a.vel.z = FRandom[Chancebox](2,4); + for ( int i=0; i<5; i++ ) + { + a = Spawn("SheenSmallAmmo",pos); + a.bDROPPED = true; + a.vel.z = FRandom[Chancebox](2,4); + a.vel.xy = (cos(i*72),sin(i*72))*FRandom[Chancebox](3,4); + } + } else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("Spreadgun") ) { let a = Spawn("BlackShell",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); for ( int i=0; i<8; i++ ) { a = Spawn((i%2)?"PurpleShell":"BlueShell",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*72),sin(i*72))*FRandom[Chancebox](2,3); + a.vel.xy = (cos(i*45),sin(i*45))*FRandom[Chancebox](2,3); } for ( int i=0; i<12; i++ ) { a = Spawn((i%2)?"RedShell":"GreenShell",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); a.vel.xy = (cos(i*30),sin(i*30))*FRandom[Chancebox](4,5); } } + else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("Wallbuster") ) + { + for ( int i=0; i<12; i++ ) + { + let a = Spawn((i%2)?"PurpleShell":"BlueShell",pos); + a.bDROPPED = true; + a.vel.z = FRandom[Chancebox](2,4); + a.vel.xy = (cos(i*30),sin(i*30))*FRandom[Chancebox](2,3); + } + for ( int i=0; i<20; i++ ) + { + let a = Spawn((i%2)?"RedShell":"GreenShell",pos); + a.bDROPPED = true; + a.vel.z = FRandom[Chancebox](2,4); + a.vel.xy = (cos(i*18),sin(i*18))*FRandom[Chancebox](4,5); + } + } else if ( Random[Chancebox](0,1) ) { Class which = Random[Chancebox](1,0)?"HealthNuggetItem":"ArmorNuggetItem"; for ( int i=0; i<20; i++ ) { let a = Spawn(which,pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,8); a.vel.xy = (cos(i*18),sin(i*18))*FRandom[Chancebox](1,8); } @@ -1068,8 +1091,7 @@ Class Chancebox : Actor for ( int i=0; i<=15; i++ ) { let a = Spawn((i==0)?"RefresherItem":(i%3)?"HealthNuggetItem":"ArmorNuggetItem",pos); - a.bDROPPED = false; - a.bNOGRAVITY = false; + a.bDROPPED = (i!=0); a.vel.z = FRandom[Chancebox](2,4); if ( i > 0 ) a.vel.xy = (cos(i*24),sin(i*24))*FRandom[Chancebox](1,2); } @@ -1080,7 +1102,6 @@ Class Chancebox : Actor // pop one at random let a = Spawn(candidates[Random[Chancebox](0,candidates.Size()-1)],pos); a.bDROPPED = false; - a.bNOGRAVITY = false; a.vel.z = FRandom[Chancebox](2,4); } int numpt = Random[ExploS](16,32); diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 3b020836c..3e89ea44e 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -118,6 +118,10 @@ Class Demolitionist : PlayerPawn transient CVar tagcolor; int oldtagcolor; + transient int magtime; + SWWMMagItem magitem; + int magitem_cnt; + Default { Tag "$T_DEMOLITIONIST"; @@ -857,6 +861,75 @@ Class Demolitionist : PlayerPawn rings += 2; } } + void CheckItemMagnet() + { + if ( magtime > 40 ) + { + if ( !(player.cmd.buttons&BT_USE) || swwm_usetopickup ) + { + magtime = 0; + SWWMMagItem mi = magitem; + while ( mi ) + { + let next = mi.next; + mi.Destroy(); + mi = next; + } + magitem_cnt = 0; + return; + } + if ( !swwm_usetopickup ) + { + let bt = BlockThingsIterator.Create(self,400); + while ( bt.Next() ) + { + let t = bt.Thing; + if ( !t || !(t is 'Inventory') || !t.bSPECIAL || !t.bDROPPED || t.bINVISIBLE || Inventory(t).Owner || !SWWMUtility.SphereIntersect(t,pos,400) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + continue; + let i = Inventory(t); + Class cls = i.GetClass(); + if ( i is 'Ammo' ) cls = Ammo(i).GetParentAmmo(); + else if ( i is 'MaGammo' ) cls = MagAmmo(i).GetParentMagAmmo(); + let oi = FindInventory(cls); + if ( !i.bALWAYSPICKUP && oi && (oi.Amount >= oi.MaxAmount) ) continue; + bool addme = true; + for ( SWWMMagItem mi=magitem; mi; mi=mi.next ) + { + if ( mi.item != i ) continue; + addme = false; + break; + } + if ( !addme ) continue; + let nmi = new("SWWMMagItem"); + nmi.target = self; + nmi.item = i; + nmi.next = magitem; + i.A_StartSound("misc/magitem",CHAN_AMBEXTRA,CHANF_LOOP,.2,3.,.2); + magitem = nmi; + magitem_cnt++; + } + bt.Destroy(); + } + SWWMMagItem itm = magitem; + SWWMMagItem prev = null, next; + while ( itm ) + { + next = itm.next; + if ( itm.Tick() ) + { + if ( prev ) prev.next = next; + else magitem = next; + if ( itm.item ) itm.item.A_StopSound(CHAN_AMBEXTRA); + itm.Destroy(); + magitem_cnt--; + } + else prev = itm; + itm = next; + } + return; + } + if ( player.cmd.buttons&BT_USE ) magtime++; + } void CheckUnderwaterAmb( bool restore = false ) { Vector3 headpos = Vec3Offset(0,0,player.viewheight); @@ -1227,6 +1300,7 @@ Class Demolitionist : PlayerPawn } CheckUnderwaterAmb(); SenseItems(); + CheckItemMagnet(); if ( vel.length() > mystats.topspeed ) mystats.topspeed = vel.length(); if ( vel.length() > ((3600*GameTicRate)/32000.) ) SWWMUtility.AchievementProgress("sanic",int((vel.length()*3600*GameTicRate)/32000.),player); @@ -3219,6 +3293,23 @@ Class Demolitionist : PlayerPawn { // clean up attached actors if ( selflight ) selflight.Destroy(); + // clean up our objects + SWWMItemSense si = itemsense; + while ( si ) + { + let next = si.next; + si.Destroy(); + si = next; + } + itemsense_cnt = 0; + SWWMMagItem mi = magitem; + while ( mi ) + { + let next = mi.next; + mi.Destroy(); + mi = next; + } + magitem_cnt = 0; // disable death exits if ( player && (player.playerstate == PST_DEAD) ) { diff --git a/zscript/swwm_player_fx.zsc b/zscript/swwm_player_fx.zsc index da2bcfaf8..01fb9b330 100644 --- a/zscript/swwm_player_fx.zsc +++ b/zscript/swwm_player_fx.zsc @@ -223,6 +223,41 @@ Class AmmoOrbTrail : SlayerOrbTrail } } +// simple object for moving a dropped item towards the player +Class SWWMMagItem play +{ + SWWMMagItem next; + Inventory item; + Demolitionist target; + + bool Tick() + { + if ( !target || (target.Health <= 0) ) return true; + if ( !item || item.Owner || !item.bSPECIAL ) return true; + Class cls = item.GetClass(); + if ( item is 'Ammo' ) cls = Ammo(item).GetParentAmmo(); + else if ( item is 'MaGammo' ) cls = MagAmmo(item).GetParentMagAmmo(); + let oi = target.FindInventory(cls); + if ( !item.bALWAYSPICKUP && oi && (oi.Amount >= oi.MaxAmount) ) return true; + Vector3 dirto = level.Vec3Diff(item.pos,target.Vec3Offset(0,0,target.height/2)); + double dist = dirto.length(); + if ( SWWMUtility.BoxIntersect(item,target) ) + { + item.Touch(target); + return false; + } + dirto /= dist; + double fact = clamp(dist/400.,0.,1.)**.5; + item.vel += dirto*SWWMUtility.Lerp(4.,.1,fact); + item.A_SoundVolume(CHAN_AMBEXTRA,1.-.8*fact); + item.A_SoundPitch(CHAN_AMBEXTRA,SWWMUtility.Lerp(1.5,.2,fact)); + let s = item.Spawn("SWWMHalfSmoke",item.pos); + s.vel += dirto*8.*fact; + s.alpha *= .2*fact; + return false; + } +} + Class DashTrail : Actor { Default