mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-06-05 22:31:04 +01:00
ed94de4ddf7edad8694badefc577392e0f762bf5
333 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
4c99fb2ebb |
Coroner additions and tweaks (#76534)
## About The Pull Request Serrated bone shovels can be created with any kind of shovel now, not just a spade (???) Serrated bone shovels can be used in place of circular saw in most surgeries. Added a duller (still deadly) variant of the serrated bone shovel as coroner mail. Autopsy scanners now act as advanced health analyzers on dead and seemingly-dead people. Increased the force, throwforce, and wound bonus of inert ritual knives and scythes. Coroner gloves can quickly apply medicine like nitrile gloves. ## Why It's Good For The Game > Serrated bone shovels can be created with any kind of shovel now, not just a spade (???) Weird ass bug. > Serrated bone shovels can be used in place of circular saw in most surgeries. It's serrated, it's cool, it's rare, it has a fast toolspeed. > Added a duller (still deadly) variant of the serrated bone shovel as coroner mail. Very thematic for the coroner, should probably also be a heirloom item but whatevs. Weaker so there's still a reason to seek out the OG. > Autopsy scanners now act as advanced health analyzers on dead and seemingly-dead people. Scanning corpses is pretty important during surgery - it tells you how much blood they have, organ damage, diseases... these things don't appear in the surgical computer readout, which means the coroner has to go out of his cave to pick up a boring light blue meatbag wound scanner. This also incentivizes coroners to do their job by giving them something cool that only works on dead bodies. > Increased the force, throwforce, and wound bonus of inert ritual knives and scythes. These two options in the MortiDrobe are pretty frickin' badass, especially with how SICK the Coroner looks with them, double especially in combat.  However, there's the large issue that as actual weapons they're really, really weak. Not enough damage, when I use them in combat I both feel badass but also get a nagging feeling in the back of my mind that I'm intentionally gimping myself, and with only 10 damage I can *really* feel it. I find it unfair that these are objectively worse than a welding tool or even a Butcher's Cleaver when they're a lot more involved to find, and scarce besides. These arguments apply equally to the Wizard's ritual knife, and the scythe. Additionally on the scythe, the crew really needs more good ghetto weaponry that isn't the boring same ol' of baseball bats, spears, cleavers... and making scythes useful is a great way to help bridge that gap. They deal a satisfying amount of damage now, with the clear downside, of course, being that they're bulky and hard to lug around. > Coroner gloves can quickly apply medicine like nitrile gloves. 'Fast medicine' doesn't just cover sutures, it also covers medical gel. Specifically, sterilizer gel. I find it annoying that the Coroner is encouraged to give up his drip for the boring life-saver nitrile gloves, because the difference in applying time really does make a difference - it makes gel applying go from annoying to smooth, which is important considering the whole purpose of sterilizer gel is to make surgeries go faster. The Coroner has surgery and thus medical locker access to begin with, so this isn't a balance problem, (and nitrile gloves are found by the dozen anyways) especially with how rare the coroner gloves are. ## Changelog 🆑 fix: Serrated bone shovels can be created with any kind of shovel now, not just a spade (???) add: Serrated bone shovels can be used in place of circular saw in most surgeries. add: Added a duller (still deadly) variant of the serrated bone shovel as coroner mail. add: Autopsy scanners now act as advanced health analyzers on dead and seemingly-dead people. add: Increased the force, throwforce, and wound bonus of inert ritual knives and scythes. add: Coroner gloves can quickly apply medicine like nitrile gloves. /🆑 |
||
|
|
eac3c9d91c |
Emergency Relief Capsule (#76457)
## About The Pull Request Getting back into coding by making some soul PRs. Adds a new kind of bluespace capsule which replaces the default one when the "budget pods" station trait runs, and is available from the vendor for a (marginal) discount.   The Nanotrasen Emergency Relief Capsule provides a port in the storm for people with an urgent need, and very little else. ## Why It's Good For The Game This one is mostly just kind of funny I'll be honest. I guess it uuuuuuuh provides a kind of pod with no GPS signal if you really want to go off the grid? But anything I write here is secondary to the point of "someone suggested it on the forums and I liked it". ## Changelog 🆑 add: Budget cuts can sometimes effect the station's supply of Emergency Bluespace Shelters. /🆑 |
||
|
|
2600f23ebb |
Coroner Update: Pickle-Eating Morbid Weirdo Obsessed with Death and Perfectionism (#76318)
This PR introduces a whole bunch of Coroner and Morbid related content. Firstly, Morbid is now a mind trait, and specifically, coroners start with it. Coroners also have a liver trait that allows them to heal toxins (very slowly) from eating pickles and drinking pickle juice. They also can...drink formaldehyde. I guess. Dissections is thirsty work. Coroners gain a whole set of special tools specifically for use in any surgeries marked as interests of the Morbid. This is determined by the ``surgery_flag`` called ``SURGERY_MORBID_CURIOSITY``. Currently, these surgeries are included; dissections, autospies, revival surgery, plastic surgery, organ/feature manipulations, amputations To fit the theme, TRAIT_MORBID also applies the reduction to eye snatchers. While using their special tools, and the surgery is a morbid curiosity, the coroner/anyone who is morbid gains a 30% speed boost! This stacks with the dissection speed boost. Otherwise, the tools are just regular tools with a special name (though the scalpel is better at killing undead, because, you know, you're watching over the dead). The coroner's special medkit, which is the only one you can get in a round, can fit their autopsy scanners and tools. Anything that comes standard with their kit can go back into it. Anyone who is morbid can safely retrieve the secrets of the elephant graveyard. The serrated shovel, notably, is a much better tool and notably better at killing organics, but not inorganics (like the dead). (Gives roboticists secure morgue access during skeleton crew pop totals) |
||
|
|
82cf9ea499 |
Removes shitty "status" variable on organs, makes them use organ_flags instead (#76350)
## About The Pull Request Title. ## Why It's Good For The Game Seriously this shit pisses me off, why are ORGAN_SYNTHETIC and ORGAN_ROBOTIC two different things? ## Changelog not applicable unless i fucked up --------- Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> |
||
|
|
68a5a6f46c |
You can now revive dead fishes, bees and mice with a lazarus injector (#76252)
## About The Pull Request This PR introduces a signal sent to the target when a lazarus injector is being used on them, hence read the title. EDIT: I've forgotten to add that Tom no longer counts toward the mice population cap now, being unique. ## Why It's Good For The Game Being items rather than simple/basic mobs, dead mice (without a mind datum), bees and fishes cannot be revived by the lazarus injector. While I agree that spending one for this may be an egregious waste of mining points, it's still fleshing out the feature a bit. ## Changelog 🆑 add: You can now revive dead fishes, bees and (mindless) mice with a lazarus injector. balance: Tom, the mouse, no longer counts toward the mice population cap. /🆑 |
||
|
|
d48f8c53f7 |
Fix crusher harddel (#76096)
## About The Pull Request Fixes #60047 ## Why It's Good For The Game Hard del and bricking things are bad. Guess it's still an issue that burning tropheys are a thing but Shrug ## Changelog 🆑 Melbert fix: Fixed hard delete with Kinetic Crusher causing the projectile function to brick /🆑 |
||
|
|
c88d6b2666 |
Replaces antag softsuits with alternatives and balances some gun loot in space ruins (#75762)
Next part of my pass on space loot. This touches a few of the higher powered ones I found with the help of Donglesplonge. The main goal here was to replace a few significantly powerful items with less powerful or harder to carry variants while retaining most of their value as well as removing a few blatant antag-only items. The affected ruins and what was changed: Caravan Ambush - Replaced a mini energy gun with a survival knife. There's apparently a chameleon kit here but I'm actually okay with these staying - their relative impact on the round is low and they can be used for creative drip reasons by crewmembers. Old Infiltrator - Replaced the black-and-red softsuit with the Contractor suit. It's in one of the suit storage units, which you'll need a crowbar to open up. Waystation - Removed a magazine from the WT-550 Autorifle crate. There's still a Syndicate combat medkit and a set of night-vision goggles here but they're behind multiple pod turrets. I want to get input on how hard these are to get, but it seems relatively difficult, and I'm okay with "a better medkit and night visions" as space loot. You outright can't get the M1911 in antag stuff (as far as I can tell) so it stays. The Faceoff - Replacing the syndie spacesuit/gear in the mining lockers up north with unique Syndicate variants of the mining gear. Thanks to necromanceranne for the sprites. |
||
|
|
6e5ae1cc24 |
Fixing a few minor maintenance hindrances. (#75594)
## About The Pull Request See the title and relative issue reports mentioned in the section below. ## Why It's Good For The Game Closes #75461, closes #75462, closes #75467. ## Changelog 🆑 fix: Capturing CTF control points no longer requires the active hand to be empty. /🆑 |
||
|
|
1a918a2e14 |
Golem Rework (#74197)
This PR implements this design document: https://hackmd.io/@Y6uzGFDGSXKRaWDNicSiEg/BkRr176st Put briefly, this will remove every existing golem subtype and consolidate golems into a single species with cool new sprites. NOT implemented from that PR is the ability to eat Telecrystals, I couldn't come up with an appropriate visual that can stack with the existing ones, but that should be a reasonably trivial add for a future artist & developer. New Golems have a food-based mechanic where their hunger decays pretty quickly and can only be replenished by eating minerals. They start moving slower as they get hungrier, until eventually they become completely immobilised and need to be rescued. Eating different kinds of minerals will visually change your sprite and give you a special effect in a similar way to old golems, but temporary. While transformed, you can't eat any other kind of mineral which would transform you (but can still consume glass). To see the full list of effects, look at the hackmd above. In service of these sprites working I have refactored the `species/offset_features` feature by killing it and delegating that responsibility to limbs instead. Rather than applying an offset to items due to your species, it is due to your weird head or arms. This makes overall more sense to me, but it inflates the code changes in this PR somewhat. It doesn't make a lot of sense to atomise unfortunately because that code also seemed to be entirely unused until I tried to use it in this PR, so you wouldn't be able to tell if my changes broke anything. I might make a downstream sad by doing this. All of the actual numbers in this PR are made up and only loosely tested, it will need some testmerges to gather feedback about whether it sucks or not. Other relevant changes: I reworked how bioscrambling works based off bodypart bodytypes, to automatically exclude golem limbs in either direction. There's really no way to have those work on humans or vice versa. Organs still fly though. |
||
|
|
f2fd69a49a |
Minerals have been refactored so costs and minerals in items are now in terms of mineral defines. (#75052)
Ladies, Gentlemen, Gamers. You're probably wondering why I've called you all here (through the automatic reviewer request system). So, mineral balance! Mineral balance is less a balance and more of a nervous white dude juggling spinning plates on a high-wire on his first day. The fact it hasn't failed after going on this long is a miracle in and of itself. This PR does not change mineral balance. What this does is moves over every individual cost, both in crafting recipes attached to an object over to a define based system. We have 3 defines: `sheet_material_amount=2000` . Stock standard mineral sheet. This being our central mineral unit, this is used for all costs 2000+. `half_sheet_material_amount=1000` . Same as above, but using iron rods as our inbetween for costs of 1000-1999. `small_material_amount=100` . This hits 1-999. This covers... a startlingly large amount of the codebase. It's feast or famine out here in terms of mineral costs as a result, items are either sheets upon sheets, or some fraction of small mats. Shout out to riot darts for being the worst material cost in the game. I will not elaborate. Regardless, this has no functional change, but it sets the groundwork for making future changes to material costs much, MUCH easier, and moves over to a single, standardized set of units to help enforce coding standards on new items, and will bring up lots of uncomfortable balance questions down the line. For now though, this serves as some rough boundaries on how items costs are related, and will make adjusting these values easier going forward. Except for foam darts. I did round up foam darts. Adjusting mineral balance on the macro scale will be as simple as changing the aforementioned mineral defines, where the alternative is a rats nest of magic number defines. ~~No seriously, 11.25 iron for a foam dart are you kidding me what is the POINT WHY NOT JUST MAKE IT 11~~ Items individual numbers have not been adjusted yet, but we can standardize how the conversation can be held and actually GET SOMEWHERE on material balance as opposed to throwing our hands up or ignoring it for another 10 years. |
||
|
|
0d4ec59197 |
Miner Style Points 2: Style on Everyone (#74690)
## About The Pull Request A re-open of https://github.com/tgstation/tgstation/pull/66326 with Fikou's permission Adds the style meter, it can be bought from the mining vendor for 1500 points, it is an attachment to your glasses. The style meter creates a display on your hud, with your recent actions, like attacking enemies, killing them, mining ore etc. Actions like spinning or flipping increase your score multiplier, making you get more points. Your style meter affects how much ore you get from mining rocks. By default with the meter, you get 20% less ore, but at the highest, you can get 1.2x the ore from mining. In addition, on B-tier or above, you can "hotswap" items, by attacking an item in your backpack with one in your hand (should it fit and all that). Also features a leaderboard for highest style point count! New streamable: https://streamable.com/eewi6l The following are sources of points: - Killing things - Killing big things - Killing small things - Punching things - Melee'ing things - Mining rocks and ores - Having matrix traps detonate - Hit, defuse, and detonate gibtonite - Detonate crusher marks - Scan geysers - Parry projectiles (others or your own) Oh, right. While wearing the style meter, you're able to parry any lavaland-based projectile by clicking on it or the tile it is on, which reflects it back in a 7 degree arc, making it 20% faster and 15% more damaging. Usually not very easy. Maybe-plan in the future for some syndicate variant of this (with bullet parrying and appropriate style sources, etc.), but not for this PR Thanks to Arcane, multitooling the style meter will make it play some sounds on rank-up.  https://streamable.com/nheaky Parrying in action ## Why It's Good For The Game Makes miners bring more ore in a fun way. ## Changelog 🆑 Fikou, Zonespace, Arcane for voicing add: The mining vendor now has a style meter. This meter gauges your style points and uses them to improve your ore yield. /🆑 --------- Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com> |
||
|
|
71ef04efa0 |
Fire Proof Goliath Cloak (#74954)
## About The Pull Request Right so, I was trying to imagine why goliath cloak isn't fire proof when goliaths can quite literally bathe in lava. So I decided it must be an oversight. So now they're fireproof.  ## Why It's Good For The Game Fireproof mob leather is actually fireproof ## Changelog 🆑 fix: fixed an oversight - Made Goliath Cloak and Goliath Cloak Hood fireproof. And Goliath hide. /🆑 |
||
|
|
4b28abfd4d |
Adjustable Goliath Cloaks (#74709)
## About The Pull Request I've enabled goliath cloaks to be alt clicked to adjust it to neck slot instead of over clothing slot. While adjusted to neck slot, it has no armor values for balance purposes, while in over clothing slot, it has the same armor values as usual. The hood has the same values as usual, as it still inhabits the same slot as usual.    ## Why It's Good For The Game It enables a cloak to function like a cloak. It gives people the option to use it not for armor, but for fashion. ## Changelog 🆑 add: Goliath cloak can be worn as a cloak that doesn't provide any armor benefits /🆑 |
||
|
|
4c48966ff8 |
Renames delta time to be a more obvious name (#74654)
This tracks the seconds per tick of a subsystem, however note that it is not completely accurate, as subsystems can be delayed, however it's useful to have this number as a multiplier or ratio, so that if in future someone changes the subsystem wait time code correctly adjusts how fast it applies effects regexes used git grep --files-with-matches --name-only 'DT_PROB' | xargs -l sed -i 's/DT_PROB/SPT_PROB/g' git grep --files-with-matches --name-only 'delta_time' | xargs -l sed -i 's/delta_time/seconds_per_tick/g' |
||
|
|
9b401a87be |
[MDB IGNORE] UpdatePaths to convert directional pane windows to their proper subtypes, also creates the /south spawner for consistency (#74517)
## About The Pull Request Title. ## Why It's Good For The Game 1. This nukes a lot of silly var edits, and cleans up maps 2. The south spawner *isn't* really needed, but having it is nice for consistency and clarity 3. Sometime ago I forget which map but one of them had var edited directional subtypes and that made me cry ## Changelog 🆑 Jolly fix: Maps internally had the code for the "directional" windows altered a bit. If you see stacked window panes or things look incorrectly, please file a bug report as that isn't intentional!! /🆑 |
||
|
|
d6ad857255 |
Gives plasmamen proper masks depending on their job. (#74468)
## About The Pull Request Adds gasmasks plasma filter subtypes for sechailer, explorer and atmos. Atmosians won't have any updates, it's just to fix ERP Constructor Plasmaman loadout spawning with mask that won't allow you to breath. And so med plasmamen will have medical masks. There will be sechailers for sec (except for the detective). And the miners will have explorer masks. Oriented on job_boxes and what jobs spawn with which boxes. ## Why It's Good For The Game Some love for living plasma mold. And i just think that it should be this way. ## Changelog 🆑 add: Plasmamen will now spawn with proper masks depending on the job. /🆑 |
||
|
|
b533bc4349 |
Rebalances a vast oversight with one of the game's weapons (#74283)
## About The Pull Request Makes sure the game is fairly balanced again. ## Why It's Good For The Game Honestly I'm surprised this weapon went unchanged for so long with no downsides. ## Changelog 🆑 Wallem balance: Fixes a glaring oversight with the entrenching tool's balancing. /🆑 |
||
|
|
f9fe79a307 |
Organ Unit Tests & Bugfixes (#73026)
## About The Pull Request This PR adds a new unit test for all organs, a new unit test for lungs, and includes improvements for the existing breath and organ_set_bonus tests. Using the tests, I was able to root out bugs in the organs. This PR includes an advanced refactor of several developer-facing functions. This PR certainly represents a "quality pass" for organs which will make them easier to develop from now on. ### Synopsis of changes: 1. Fixed many fundamental bugs in organ code, especially in `Insert()`/`Remove()` and their overrides. 2. Added two new procs to `/obj/item/organ` named `on_insert` and `on_remove`, each being called after `Insert()`/`Remove()`. 3. Added `organ_effects` lazylist to `/obj/item/organ`. Converted `organ_traits` to lazylist. 2x less empty lists per organ. 4. Adding `SHOULD_CALL_PARENT(TRUE)` to `Insert()`/`Remove()` was very beneficial to stability and overall code health. 5. Created unit test `organ_sanity` for all usable organs in the game. Tests insertion and removal. 6. Created unit test `lungs_sanity` for `/obj/item/organ/internal/lungs`. 7. Improved `breath_sanity` unit tests with additional tests and conditions. 8. Improved `organ_set_bonus_sanity` unit tests with better documentation and maintainable code. --- ### Granular bug/fix list: - A lot of organs are overriding `Insert()` to apply unique side-effects, but aren't checking the return value of the parent proc which causes the activation of side-effects even if the insertion technically fails. I noticed the use-case of applying "unique side-effects" is repeated across a lot of organs in the game, and by overriding `Insert()` the potential for bugs is very high; I solved this problem with inversion-of-control by adding two new procs to `/obj/item/organ` named `on_insert` and `on_remove`, each being called after `Insert()` and `Remove()` succeed. - Many organs, such as abductor "glands", cursed heart, demon heart, alien hive-node, alien plasma-vessel, etc, were not returning their parent's `Insert()` proc return value at all, and as a result those organs `Insert()`s were always returning `null`. I have been mopping those bugs up in my last few PRs, and now the unit test reveals it all. Functions such as those in surgery expect a truthy value to be returned from `Insert()` to represent insertion success, and otherwise it force-moves the organ out of the mob. - Fixed abductor "glands" which had a hard-del bug due to their `Remove()` not calling the parent proc. - Fixed cybernetic arm implants which had a hard-del bug due to `Remove()` not resetting their `hand` variable to `null`. - Fixed lungs gas exchange implementation, which was allowing exhaled gases to feedback into the inhaled gases, which caused Humans to inhale much more gas than intended and not exhale expected gases. ### Overview of the `organ_sanity` unit test: - The new `organ_sanity` unit test gathers all "usable" organs in the game and tests to see if their `Insert()` and `Remove()` functions behave as we expect them to. - Some organs, such as the Nightmare Brain, cause the mob's species to change which subsequently swaps out all of their organs; the unit test accounts for these organs via the typecache `species_changing_organs`. - Some organs are not usable in-game and can't be unit tested, so the unit test accounts for them via the typecache `test_organ_blacklist`. ### Overview of the `lungs_sanity` unit test: - This unit test focuses on `/obj/item/organ/internal/lungs` including Plasmaman and Ashwalker lungs. The test focuses on testing the lungs' `check_breath()` proc. - The tests are composed of calling `check_breath` with different gas mixes to test breathing and suffocation. - Includes gas exchange test for inhaled/exhaled gases, such as O2 to CO2. ### Improvements to the `breath_sanity` unit tests: - Added additional tests for suffocation with empty internals, pure Nitrogen internals, and a gas-less turf. - Includes slightly more reliable tests for internals tanks. ## Why It's Good For The Game **Organs and Lungs were mostly untested. Too many refactors have been submitted without the addition of unit tests to prove the code works at all.** Time to stop. _Time to get some help_. Due to how bad the code health is in organs, any time we've tried to work with them some sort of bug caused them to blow up in our faces. I am trying to fix some of that by establishing some standard testing for organs. These tests have revealed and allowed me to fix lot of basic developer errors/oversights, as well as a few severe bugs.  ## Changelog 🆑 A.C.M.O. fix: Fixed lungs gas exchange implementation, so you always inhale and exhale the correct gases. fix: Fixed a large quantity of hard-deletes which were being caused by organs and cybernetic organs. fix: Fixed many organs which were applying side-effects regardless of whether or not the insertion failed. code: Added unit tests for Organs. code: Added unit tests for Lungs. code: Improved unit tests for breathing. code: Improved unit tests for DNA Infuser organs. /🆑 |
||
|
|
60e85fa947 |
Polishes some side sources of light and color (#73936)
## About The Pull Request [Circuit Floor Polish](https://github.com/tgstation/tgstation/commit/6b0ee9813271f693ceb44ad42277c36ef2e71268) Circuit floors glow! but it looks like crap cause it's dim and the colors are washed out. I'd like to make them look nicer. Let's make them more intense and longer range, and change the colors over to more vivid replacements. While I'm here, these should really use power and turn on and off based off that. Simple enough to do, just need to hook into a signal (and add a setter for turf area, which cleans up other code too). [Desklamp Upgrade](https://github.com/tgstation/tgstation/commit/8506b13b9c97bf740c3e97db04450555387dd126) Desklamps look bad. They're fullwhite, have a way too large range.Crummy. Let's lower their lightrange from 5 to 3.5, and make the ornate ones warmer, and the more utilitarian ones cooler. The clown one can be yellow because it's funny I'm renaming a color define here so I'm touching more files then you'd expect [Brightens Niknacks](https://github.com/tgstation/tgstation/pull/73936/commits/835bae28e9eb9946be53c9f5dac0a0a39f15ef21) Increases the light range of request consoles, status displays, newscasters, and air alarms (keycard machines too, when they're awaiting input at least) Increases the brightness of air alarms, I think they should be on par with apcs, should be able to tell when they're good/bad. Increases the brightness of vending machines (I want them to light up the tiles around them very lightly, I think it's a vibe) Fixes a bug with ai status displays where they'd display an emissive even if they didn't have anything on their screen, looking stupid. This was decently easy but required a define. Looked really bad tho ## Why It's Good For The Game Pretty <details> <summary> Circuit Floors </summary> Old   New   </details> <details> <summary> Desk Lights </summary> Old   New   </details> The niknack changes are more minor so I'm not gonna grab photos for them. I can if you'd like but I don't think it's necessary. Mostly a vibes in dark spaces sorta thing ## Changelog 🆑 add: I made circuit floors brighter and more vivid. add: Made air alarms, vending machines, newscasters, request consoles, status displays and keycard machines slightly "brighter" (larger light range, tho I did make air alarms a bit brighter too) add: Tweaked desklamps. Lower range, and each type gets its own coloring instead of just fullwhite. fix: AI displays are no longer always emissive, they'll stop doing it if they aren't displaying anything. Hopefully this'll look nicer /🆑 |
||
|
|
d755b70d76 |
Removes bad nodamage var from projectiles, fixes Juggernaut / Rust Walker projectiles doing zero damage (#73806)
## About The Pull Request
- Juggernaut and Rust Walker projectiles were subtyped off of magic,
which is `nodamage`.
- The juggernaut actually had a copy+paste error with their type
`on_hit` which caused none of their special effects on hit ("relative
patching catches this")
- Then I realized projectiles have this var `nodamage` which is, for all
intents and purposes, just `damage > 0`. it's not checked for pacifism,
it's just that. This is dumb. So very dumb, so I removed it.
- There are, however, a few situations which used it in a unique way,
such as the blast wave cannon. This is why I replaced it with a proc,
`is_hostile_projectile`, for certain situations to actually find out if
the projectile is damaging. Projectiles can override this on a per type
basis by default, damaging projectiles = hostile.
- This has a chance to break some things, but I ... kinda doubt it will.
Fixes #73756
## Why It's Good For The Game
Projectiles that act as they should, less dumb vars
## Changelog
🆑 Melbert
fix: Fixes Juggernaut / Rust Walker projectiles doing zero damage
fix: Fixes Juggernaut projectiles not doing bonus damage to nearby
structures
code: Removed projectile nodamage var, replaces it with just checking
for damage
/🆑
|
||
|
|
8a01308322 |
Removes Cult perms from Survival pods (#73757)
## About The Pull Request Removes Cult permitted from survival pods, as it's very uninteresting to have cult bases in places no one will check. This doesn't affect the mining base itself. ## Why It's Good For The Game One of the drawbacks of Cult is that they get stronger at the cost of being more easy to spot, so being to completely bypass the negative part makes it unfair to fight cult if there's a single shaft miner, or literally anyone if it's icebox. ## Changelog 🆑 balance: Cult can no longer draw runes in survival pods. /🆑 |
||
|
|
a1ada2c9ef |
Refactor, improve, and rename canUseTopic to be can_perform_action (#73434)
This builds on what #69790 did and improved the code even further. Notable things: - `Topic()` is a deprecated proc in our codebase (replaced with Javascript tgui) so it makes sense to rename `canUseTopic` to `can_perform_action` which is more straightforward in what it does. - Positional and named arguments have been converted into a easier to use `action_bitflag` - The bitflags adds some new checks you can use like: `NEED_GRAVITY | NEED_LITERACY | NEED_LIGHT` when you want to perform an action. - Redundant, duplicate, or dead code has been removed. - Fixes several runtimes where `canUseTopic` was being called without a proper target (IV drips, gibber, food processor) - Better documentation for the proc and bitflags with examples |
||
|
|
66cb9133c4 |
Dominate & Lazarus Inject basic mobs. Lazarus Injected mobs don't fight each other. (#72440)
## About The Pull Request Fixes #72404 The Lazarus Injector doesn't currently work on basic mobs, but should. Problem: The EMPed state of the Lazarus Injector is intended to make a revived mob hostile to everyone except you, including other mobs you have revived wtih an EMPed Lazarus Injector. This is trivial to achieve for Simple Mobs which essentially all share the same AI, but I could not think of a single workable solution for Basic Mobs which don't, or at least any which didn't come with a tedious requirement to closely consider this niche item when programming any additional AI. Solution: Change the default behaviour of the Lazarus Injector so this is not a problem. If all it does it make the mob loyal to you _and_ friendly to other mobs which are loyal to you, then it's pretty easy because we can just use the existing faction flags. This is unambiguously a buff to using the item for nefarious purposes as now if you revive four ice drakes and fulton them onto the station they won't kill each other until only one is left, but is the only workable solution I could really think of. A lot of the very dangerous mining fauna can't be dragged so transporting your army to the station still poses a question. The alternate solution was just to replace the AI controller of any emp-revived basic mob with a "zombie" AI controller, but this has the problem that A- It would now make things like cows and dogs into hostile creatures when they previously weren't. B- It loses any interesting behaviour the mob previously had and for cases like Bileworms doesn't even make any sense (they'd try to walk and just get stuck in place). This ultimately leads to needing to make bespoke versions for various mobs, which doesn't seem desirable from a maintainability standpoint. As a side note it's still not a great idea to revive Bileworms _anyway_ as, their ability to move is tied to their ability to attack so once they don't have a target they will just kind of sit there and if they _do_ get a target their attempts to help you fight are difficult to distinguish from attempts to kill you... but at least being able to revive them makes it easier to make one sapient if you really want to trap a player's mind inside a body which is incapable of leaving lavaland. Additional edit: At Fikou's suggestion I've also added a sentience comparison proc to `mob/living` and removed some code duplication which dealt with this problem in the sentience/mind transfer potions, as well as added it to the Dominate spell. ## Why It's Good For The Game This device is meant to revive mobs and it shouldn't be required for players to memorise an arbitrary list of which mobs it does and doesn't work on. Especially as the goal is eventually that all simple mobs should be basic mobs. This way of working is more intuitive, even if it is also stronger. I was surprised when I used EMPed injectors and my "new minions" just killed each other. ## Changelog 🆑 fix: You can now revive 'basic mobs' with a Lazarus Injector, such as dogs, cows, axolotls, or carp. fix: The same category of mobs can also now be effected by the Runic Golem Dominate spell. fix: Basic Mobs will switch target if they can no longer attack their current target; meaning that if you become a Bileworm's friend it will stop attacking you. balance: Mobs injected with the Lazarus Injector while it is EMPed will no longer attack other mobs revived by EMPed Lazarus Injectors. /🆑 |
||
|
|
617b447890 |
Add pickaxe to basic tools techweb (#72938)
## About The Pull Request Adds the pickaxe to basic tools techweb that can be printed the cargo lathe or autolathe. ## Why It's Good For The Game This is a basic mining tool and should be available at roundstart. It wasn't possible to create pickaxes, despite it being a T1 item. It should be as easy to make as a shovel since these usually are mapped together. I was tempted to put this into mining technology, but that already has advanced drills that are T2 versions of the pickaxe. ## Changelog 🆑 qol: Add pickaxe to basic tools techweb /🆑 |
||
|
|
f54dcda1c0 |
afterattack now returns a flag if it's reasonable to suspect the user intends to act on an item (#72320)
Necessary for #72292 to work effectively, and probably not very useful out of that context. Split out of its own PR because this is long and boring. I want to make sure that we're catching actual mistakes there, and not just experiencing side effects of how shitty the attack chain is. |
||
|
|
6a0c884410 |
[no gbp] removes all duplicate armor datums (#72354)
## About The Pull Request closes #72348 Title ## Why It's Good For The Game My bad ## Changelog Heres the script I used this time if you want to ```cs var baseDir = Environment.CurrentDirectory; var allFiles = Directory.EnumerateFiles($@"{baseDir}\code", "*.dm", SearchOption.AllDirectories).ToList(); var known = new Dictionary<string, List<KeyValuePair<string, int>>>(); foreach (var file in allFiles) { var fileLines = File.ReadAllLines(file); for (var i = 0; i < fileLines.Length; i++) { var line = fileLines[i]; if (line.StartsWith("/datum/armor/")) { var armorName = line.Replace("/datum/armor/", "").Trim(); if (!known.ContainsKey(armorName)) known[armorName] = new List<KeyValuePair<string, int>>(); var knownList = known[armorName]; knownList.Add(new KeyValuePair<string, int>(file, i)); } } } Console.WriteLine($"There are {known.Sum(d => d.Value.Count)} duplicate armor datums."); var duplicates = new Dictionary<string, List<int>>(); foreach (var (_, entries) in known) { var actuals = entries.Skip(1).ToList(); foreach (var actual in actuals) { if (!duplicates.ContainsKey(actual.Key)) duplicates[actual.Key] = new List<int>(); duplicates[actual.Key].Add(actual.Value); } } Console.WriteLine($"There are {duplicates.Count} files to update."); foreach (var (file, idxes) in duplicates) { var fileContents = File.ReadAllLines(file).ToList(); foreach (var idx in idxes.OrderByDescending(i => i)) { string line; do { line = fileContents[idx]; fileContents.RemoveAt(idx); } while (!String.IsNullOrWhiteSpace(line)); } File.WriteAllLines(file, fileContents); } ``` |
||
|
|
e9351f6ae0 |
Add lints for idiomatic balloon alert usage (#72280)
Adds lints for `balloon_alert(span_xxx(...))` (which is always wrong), and balloon alert where the first letter is a capital (which is usually wrong). Fixes everything that failed them. As a reminder, abbreviations like "AI" and "GPS" shouldn't be capitalized in a balloon alert. In cases where this is intentional for flavor (there was one case), you can `UNLINT` like so: Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> |
||
|
|
8a75aa216f |
adds an admin combat-ready miner outfit (#72286)
## About The Pull Request adds an admin outfit intended for easy spawn ins as a shaft miner, to test megafauna and whatnot included are: bone bracers, bone talisman both suit and hood are fully goliath plated webbing with 2 lux pens, 2 standard pens and 2 legion cores gps, advanced scanner kinetic accelerator with bayonet and seclite, compact kinetic crusher (normal sized), upgraded resonator night vision medhud mesons mini extinguisher all the trophies and 10 copies of every modkit ## Why It's Good For The Game makes localhost megafauna fights require less preptime ## Changelog 🆑 admin: adds an admin combat-ready miner outfit /🆑 |
||
|
|
72add64520 |
Refactors armor into dedicated subtypes (#71986)
## About The Pull Request See title. ## Why It's Good For The Game Code is cleaner, and more readable/intuitive Technically closes https://github.com/tgstation/dev-cycles-initiative/issues/8 ## Changelog 🆑 refactor: armor, from the ground up basically /🆑 Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> |
||
|
|
912ac7b29d |
Basic Mobs can run away (#71963)
## About The Pull Request That's right I'm still atomising #71421, some day I might even post something related to carp. This PR adds various behaviours to basic mobs allowing them to run away, in a couple of variations. Mice will flee from anyone who doesn't share their factions, at all times (so they will scatter from most humans, but not regal rats). Rabbits and Sheep will flee from anyone who has attacked them. Pigs will run away from people who have attacked them, but only if they're below half health. https://user-images.githubusercontent.com/7483112/207127135-d1737f91-d3f7-468a-ac60-7c7ae5d6623d.mp4 Mice are still plenty catchable because they don't run _very far_ (or very fast) but I think the chase will be good enrichment. To achieve this I had to change the signal COMSIG_CARBON_HEALTH_UPDATE into COMSIG_LIVING_HEALTH_UPDATE but frankly the latter seems more sensible anyway. ## Why It's Good For The Game More behaviours to use later when designing mobs, gradually gives mobs more things to do rather than just sort of moving aimlessly around the area you left them in. It'll give people hunting rats in maintenance some exercise. ## Changelog 🆑 add: Mice will now run away from you, you have to catch them if you want to eat them. Use those traps! add: Rabbits, Sheep, and Pigs likewise won't just sit there and let you pulverise them if they can see an escape route. /🆑 |
||
|
|
75439c71f2 |
Smoothing groups optimization, save 265ms with configs, more on production & w/ space ruins (#71989)
This one is fun. On every /turf/Initialize and /atom/Initialize, we try to set `smoothing_groups` and `canSmoothWith` to a cached list of bitfields. At the type level, these are specified as lists of IDs, which are then `Join`ed in Initialize, and retrieved from the cache (or built from there). The problem is that the cache only misses about 60 times, but the cache hits more than a hundred thousand times. This means we eat the cost of `Join` (which is very very slow, because strings + BYOND), as well as the preliminary `length` checks, for every single atom. Furthermore, as you might remember, if you have any list variable set on a type, it'll create a hidden `(init)` proc to create the list. On turfs, that costs us about 60ms. This PR does a cool trick where we can completely eliminate the `Join` *and* the lists at the cost of a little more work when building the cache. The trick is that we replace the current type definitions with this: ```patch - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_ASH, SMOOTH_GROUP_CLOSED_TURFS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ASH + canSmoothWith = SMOOTH_GROUP_FLOOR_ASH + SMOOTH_GROUP_CLOSED_TURFS ``` These defines, instead of being numbers, are now segments of a string, delimited by commas. For instance, if ASH used to be 13, and CLOSED_TURFS used to be 37, this used to equal `list(13, 37)`. Now, it equals `"13,37,"`. Then, when the cache misses, we take that string, and treat it as part of a JSON list, and decode it from there. Meaning: ```java // Starting value "13,37," // We have a trailing comma, so add a dummy value "13,37,0" // Make it an array "[13,37,0]" // Decode list(13, 37, 0) // Chop off the dummy value list(13, 37) // Done! ``` This on its own eliminates 265ms *without space ruins*, with the combined savings of turf/Initialize, atom/Initialize, and the hidden (init) procs that no longer exist. Furthermore, there's some other fun stuff we gain from this approach emergently. We previously had a difference between `S_TURF` and `S_OBJ`. The idea is that if you have any smoothing groups with `S_OBJ`, then you will gain the `SMOOTH_OBJ` bitflag (though note to self, I need to check that the cost of adding this is actually worth it). This is achieved by the fact that `S_OBJ` simply takes the last turf, and adds onto that, meaning that if the biggest value in the sorting groups is greater than that, then we know we're going to be smoothing to objects. This new method provides a limitation here. BYOND has no way of converting a number to a string at compile time, meaning that we can't evaluate `MAX_S_TURF + offset` into a string. Instead, in order to preserve the nice UX, `S_OBJ` now instead opts to make the numbers negative. This means that what used to be something like: ```dm smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WEEDS) ``` ...which may have been represented as ```dm smoothing_groups = list(15, MAX_S_TURF + 3) ``` ...will now become, at compile time: ```dm smoothing_groups = "15,-3," ``` Except! Because we guarantee smoothing groups are sorted through unit testing, this is actually going to look like: ```dm smoothing_groups = "-3,15," ``` Meaning that we can now check if we're smoothing with objects just by checking if `smoothing_groups[1] == "-"`, as that's the only way that is possible. Neat! Furthermore, though much simpler, what used to be `if (length(smoothing_groups))` (and canSmoothWith) on every single atom/Initialize and turf/Initialize can now be `if (smoothing_groups)`, since empty strings are falsy. `length` is about 15% slower than doing nothing, so in procs as hot as this, this gives some nice gains just on its own. For developers, very little changes. Instead of using `list`, you now use `+`. The order might change, as `S_OBJ` now needs to come first, but unit tests will catch you if you mess up. Also, you will notice that all `S_OBJ` have been increased by one. This is because we used to have `S_TURF(0)` and `S_OBJ(0)`, but with this new trick, -0 == 0, and so they conflicted and needed to be changed. |
||
|
|
852b973f6d |
fixes hollow survival pod window spawners (#72000)
## About The Pull Request they used fulltile survival pods so it just spawned 4 full windows in one place ## Why It's Good For The Game i use them on my map and it upsets me ## Changelog 🆑 fix: fixes hollow survival pod window spawners /🆑 |
||
|
|
8510bd078c |
Buffs implanted mining organs (#71863)
## About The Pull Request In [70546](https://github.com/tgstation/tgstation/pull/70546) I added some new implantable organs to mining creatures which didn't drop anything on death. I didn't really want these to make miners way better at station PvP so I gave them some pretty hefty downsides. I went too far and this meant nobody would ever implant one of them ever, which sort of negates the point of adding it. The implanted Brimdust Sac has now been redesigned. It no longer sets you on fire if activated on the station, nor does it explode if you catch fire. Instead, if you're in an unpressurised environment (like space or Lavaland) it will add one stack of the buff every 30 seconds automatically. The buff still does reduced damage on the station _and_ hurts you as much as it hurts anyone else. In addition, instead of catching fire, you will be slowed for four seconds. Additionally I cut the cooldown for both organs in half because there wasn't really any reason for it to be that long. ## Why It's Good For The Game  Encourages miners to go interact with medbay in between delivering ore, while they're waiting for their shit to get posted. Now when someone indignantly posts "When was the last time there was a mining _buff_" in #coding-general you can link them to this PR. ## Changelog 🆑 balance: Rush Gland and Brimdust Sac can be used more frequently when implanted. balance: An implanted Brimdust Sac will stack the buff on you automatically while on lavaland. Triggering the buff on the station will make you walk slower for a short duration. balance: Implanted Bimrdust Sacs no longer set you on fire, nor do they explode if you catch fire. /🆑 |
||
|
|
329921639a |
Rewrites how action buttons icons are generated, makes them layer nicer. Allows observers to see a mob's action buttons. (#71339)
## About The Pull Request
- Rewrites how action button icons are generated.
- Prior, generated an action button icon was fairly simplistic and
didn't allow for many changes. Someone recently added the option for
overlays to be generated over action buttons, but the framework was very
weak.
- Now, action button icon generation is split across multiple procs,
like atom icon updates.
- The background of action buttons are underlays
- The actual icon of the action button is the icon and icon state of the
action button movable
- The rim / border of the button is an overlay, layered overtop the
button.
- Allows observers to see what action buttons a mob has. They even
update in real time! And no, the observers cannot click on them.
## Why It's Good For The Game
- Runechat text of action buttons are no longer hidden behind the actual
icon. This was very ugly with cooldown actions, as the cooldown text was
hidden behind a lot of spell icons.
- Cuts down on a lot of icon duplication.
- Gives much finer control over action button icons
- Saves a bit of processing from generating full action button icons
when not necessary. Not implemented in many places, but is in some.


## Changelog
🆑 Melbert
add: Observers can now see what action buttons an observed mob has. No,
you can't click them. And no it doesn't show EVERY action.
refactor: Refactored how action button icons are generated. Some actions
will now use a colored border when active instead of just turning green.
Cooldown text will also appear on the top layer of actions too. If you
see any funky lookin' icons (namely their borders), let me know.
refactor: Bluespace Golem's teleport action is now a cooldown action.
fix: Construct actions go to the middle of the screen like expected.
/🆑
|
||
|
|
84f69359a0 |
More horrible 515 proc compatibility. (#71333)
So i left over some basic `/whatever/proc/format` uses in the original PR this fixes it. Notable exceptions to the rule: - Paths in add_verb/remove_verb, we need full path instead of a name there to access verb metadata so we can't use proc ref macros there. - regex.Replace, found out that it does not accept call by name. Instead i added new REGEX_REPLACE_HANDLER so we can at least try to mark these. There's still leftover global procs that do not use GLOBAL_PROC_REF but they functionally equivalent so that's for later. I don't see any reasonable way to grep for this. But if you got any ideas please share. |
||
|
|
79ffefa06d |
Allows Fully Heal to be passed a series of flags, fixes Adminordrazine being horrible (#71123)
## About The Pull Request - Fully heal can be passed a series of flags detailing what all is healed by the proc. This allows for things to provide almost-but-not-quite fully heals. - Uses this in Adminordrazine, so that it stops being a pain to update every time fully heal is updated. This includes some small balance changes which i'll go over, nothing extremely noticable. ## Why It's Good For The Game Allows for more precise control over full heals. ## Changelog 🆑 Melbert refactor: Fully heal can be passed a series of flags. As a result, some things which previously did a full heal might heal slightly less, or some things which did partial full heals might do slightly more. fix: Adminordrazine will no longer completely break every facet of a person admin: Ahealing a changeling will refill all of their chems. /🆑 |
||
|
|
eb6c2a9707 |
[NO GBP] Monster organs were extending the wrong proc following a refactor. (#71231)
## About The Pull Request During a refactor of the lavaland monster organ PR I split one proc into two and then called the wrong one on all of the children, oops. This led to the Rush Gland experiencing no cooldown when triggering itself at low health, which is unquestionably more useful but not how it is supposed to work. ## Why It's Good For The Game Implanting the organ shouldn't grant you unlimited super speed while at low health, even if you're very likely to run into a wall and crit yourself as a result. ## Changelog 🆑 fix: Lobstrosity Rush Glands now correctly apply their action cooldown when they trigger from low health. /🆑 |
||
|
|
4d6a8bc537 |
515 Compatibility (#71161)
Makes the code compatible with 515.1594+
Few simple changes and one very painful one.
Let's start with the easy:
* puts call behind `LIBCALL` define, so call_ext is properly used in 515
* Adds `NAMEOF_STATIC(_,X)` macro for nameof in static definitions since
src is now invalid there.
* Fixes tgui and devserver. From 515 onward the tmp3333{procid} cache
directory is not appened to base path in browser controls so we don't
check for it in base js and put the dev server dummy window file in
actual directory not the byond root.
* Renames the few things that had /final/ in typepath to ultimate since
final is a new keyword
And the very painful change:
`.proc/whatever` format is no longer valid, so we're replacing it with
new nameof() function. All this wrapped in three new macros.
`PROC_REF(X)`,`TYPE_PROC_REF(TYPE,X)`,`GLOBAL_PROC_REF(X)`. Global is
not actually necessary but if we get nameof that does not allow globals
it would be nice validation.
This is pretty unwieldy but there's no real alternative.
If you notice anything weird in the commits let me know because majority
was done with regex replace.
@tgstation/commit-access Since the .proc/stuff is pretty big change.
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
|
||
|
|
ad5debaaa1 |
Add investigate_deaths (#71112)
## About The Pull Request Adds INVESTIGATE_DEATHS, an investigate category intended to better show causes of death.   Also makes suicide_act take a `mob/living` as an argument instead of a `mob`, and some minor style improvements since apparently I hate atomicity. ## Why It's Good For The Game Inspired by a mysterious death and dusting. More logging and leads for admins investigating deaths. Also fixes #59028 ## Changelog 🆑 Tattle admin: added investigate deaths to shed some more light on unusual demises, dustings, and gibbings /🆑 Co-authored-by: tattle <article.disaster@gmail.com> |
||
|
|
83c75cac2c |
Brimdemons & Lobstrosities drop (slightly) useful organs (#70546)
Goliaths, Legions, Watchers, and (as of recently) Bileworms all drop something vaguely useful when they die. Brimdemons and Lobstrosities do not. This PR aims to fix that, so that there's at least some vague benefit to hunting them. In this case it takes the form of organs you get when you butcher them, similar to the regenerative core from Legions. As they're similar to the regenerative core, I modified the regenerative core to extend from a new common "monster core" typepath which these two new organs also extend. Like the regenerative core, both of these items do something when used and something slightly different if you go to the effort of having someone implant them into your body. They also decay over time, and you can use stabilising serum to prevent this from happening. https://user-images.githubusercontent.com/7483112/195967746-55a7d04d-224e-412d-aedc-3a0ec754db3d.mp4 The Rush Gland from the Lobstrosity lets you do a little impression of their charging attack, making you run very fast for a handful of seconds and ignoring slowdown effects. Unlike a lobstrosity you aren't actually built to do this so if you run into a mob you will fall over, and if you are doing this on the space station running into any dense object will also make you fall over (it shouldn't make you _too_ much of a pain for security to catch). The idea here is that you use this to save time running back and forth from the mining base. The Brimdust Sac from the Brimdemon covers you in exploding dust. The next three times you take Brute damage some of the dust will explode, dealing damage equal to an unupgraded PKA shot to anything near you (but not you). If you do this in a space station not only is the damage proportionally lower (still matching the PKA), but it _does_ effect you and also it sets you on fire. You can remove the buff by showering it off. The idea here is that you use this for minor revenge damage on enemies whose attacks you don't manage to dodge. https://user-images.githubusercontent.com/7483112/195967811-0b362ba9-2da0-42ac-bd55-3809473cbc74.mp4 If you implant the Rush Gland then you can use it once every 3 minutes without consuming it, and the buff lasts very slightly longer. It will automatically trigger itself if your health gets low, which might be good (helps you escape a rough situation) or bad (didn't want to use it yet). https://user-images.githubusercontent.com/7483112/195967888-f63f7cbd-60cd-4309-8004-203afc5b2153.mp4 If you implant the Brimdust Sac then you can use it once every 3 minutes to shake off cloud of dust which gives the buff to everyone nearby, if you want to kit out your miner squad. The dust cloud also makes you cough if you stand in it, and it's opaque. If you catch fire with this organ inside you and aren't in mining atmosphere then it will explode inside of your abdomen, which should probably be avoided, resultingly it is very risky to use this on the space station. |
||
|
|
2878345ebb | Swaps sleep() to use SECONDS define, changes some sleep(1) to sleep(1 TICKS) (#70452) | ||
|
|
41ca4962db |
Moves cleaning to an atom proc to afterattack signal (#70239)
* Hopefully fixes Cleaning * Cleaning off window blood is now handled by the Window itself * Cleanbots now have an advanced mop built into them, I am hoping in the future we can make cleanbots have their mops taken off, but I'm not good at spriting so it isn't a thing yet. * Adds a pre_clean_callback to replace the should_clean arg (mostly) * Removes the atom cleaning proc, replaces it with a signal for afterattack on a cleaning tool. * Fixes and improvements * adds a new define that allows pre_clean_callback to cancel cleaning entirely, used for mops to check for being wet or attacking buckets and such. * Fixes cleanbots not properly working, removing their mop and just registering for a signal that bots send instead. * Changes cleaner component to take proximity into account, that way we don't have to check it on each item's individual afterattacks, that way we don't have to call parent at the end either. * Improves check_allowed_items a little bit because I hated how it was used for soap. * Update cleaner.dm * reviews |
||
|
|
c7dde06668 |
[MDB Ignore]Hats DMI split (#70060)
Splits head dmi into separate files for both mob and obj icons. Kept similar to suit split categorization + some more. New files include beanie, bio, chaplain, costume, cowboy, default, hats(softcaps, fedoras, head caps, generic hats), helmet(helmets and other armored headgear/hoods), spacehelm, utility(hardhats, mostly work related hats), wizard. Moves animal/pet head sitting icons to 1 folder, pets_head.dmi Renames PAI head sitting icon file to pai_head.dmi |
||
|
|
1a32f60cf4 |
[ready] adds unit test for missing inhand icons. fixes a bunch of missing inhand icons (#70037)
fix: Fixed a bunch of missing inhand icons. fix: Fixed cables in electrical toolboxes not randomizing their colors. fix: Fixed the wrong colored icon showing when trying to make cable cuffs out of cables. fix: The collectable SWAT helmet is now using the proper icon again! refactor: Pipecleaners and power cables now share a unified color system, so they're once again available in ALL the same colors. imageadd: Updated the screwdriver belt overlay to represent the newer sprite. imageadd: Added a bunch of new inhand icons. Special thanks to Twaticus for doing the helmets! <3 fix: Wirecutters now have an icon when inside a belt again! admin: Added a new omnitool subtype that allows you to spawn all items in a typepath! fix: Explorer gaskmasks now properly reflect their adjusted state when held. fix: Fixed balaclavas having the wrong icon when pulled up. fix: Fixed the base energy sword (admin spawn only) being invisible. fix: The rainbow energy sword is now a little bit more rainbowy! fix: Fixed an tk exploit with orange handcuffed shoes. fix: The traitor outfit in the select equipment panel is now actually functional! |
||
|
|
91f02f2a6b |
canUseTopic now uses TRUE/FALSE instead of defines that just say TRUE (#69790)
* canUseTopic now uses TRUE/FALSE instead of defines that just say TRUE The most idiotic thing I've seen is canUseTopic's defines, they literally just define TRUE, you can use it however you want, it doesn't matter, it just means TRUE. You can mix and match the args and it will set that arg to true, despite the name. It's so idiotic I decided to remove it, so now I can reclaim a little bit of my sanity. |
||
|
|
243231eb48 |
Properly checks flags with & instead of == (#70130)
* Makes flags properly check themselves Byond ref: https://www.byond.com/docs/ref/#/operator/& Basically, flags should use & instead of == We can have more than 1 slot on any item, so it's preferred that we do this instead. Even if it doesn't immediately fix any problems, it's something that should be the standard anyways to prevent it from ever being a problem. Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> |
||
|
|
23bfdec8f4 |
Multiz Rework: Human Suffering Edition (Contains PLANE CUBE) (#69115)
About The Pull Request I've reworked multiz. This was done because our current implementation of multiz flattens planes down into just the openspace plane. This breaks any effects we attach to plane masters (including lighting), but it also totally kills the SIDE_MAP map format, which we NEED for wallening (A major 3/4ths resprite of all wall and wall adjacent things, making them more then one tile high. Without sidemap we would be unable to display things both in from of and behind objects on map. Stupid.) This required MASSIVE changes. Both to all uses of the plane var for reasons I'll discuss later, and to a ton of different systems that interact with rendering. I'll do my best to keep this compact, but there's only so much I can do. Sorry brother. Core idea OK: first thing. vis_contents as it works now squishes the planes of everything inside it down into the plane of the vis_loc. This is bad. But how to do better? It's trivially easy to make copies of our existing plane masters but offset, and relay them to the bottom of the plane above. Not a problem. The issue is how to get the actual atoms on the map to "land" on them properly. We could use FLOAT_PLANE to offset planes based off how they're being seen, in theory this would allow us to create lens for how objects are viewed. But that's not a stable thing to do, because properly "landing" a plane on a desired plane master would require taking into account every bit of how it's being seen, would inherently break this effect. Ok so we need to manually edit planes based off "z layer" (IE: what layer of a z stack are you on). That's the key conceit of this pr. Implementing the plane cube, and ensuring planes are always offset properly. Everything else is just gravy. About the Plane Cube Each plane master (except ones that opt out) is copied down by some constant value equal to the max absolute change between the first and the last plane. We do this based off the max z stack size detected by SSmapping. This is also where updates come from, and where all our updating logic will live. As mentioned, plane masters can choose to opt out of being mirrored down. In this case, anything that interacts with them assuming that they'll be offset will instead just get back the valid plane value. This works for render targets too, since I had to work them into the system as well. Plane masters can also be temporarily hidden from the client's screen. This is done as an attempt at optimization, and applies to anything used in niche cases, or planes only used if there's a z layer below you. About Plane Master Groups BYOND supports having different "maps" on screen at once (IE: groups of items/turfs/etc) Plane masters cannot cover 2 maps at once, since their location is determined by their screen_loc. So we need to maintain a mirror of each plane for every map we have open. This was quite messy, so I've refactored it (and maps too) to be a bit more modular. Rather then storing a list of plane masters, we store a list of plane master group datums. Each datum is in charge of the plane masters for its particular map, both creating them, and managing them. Like I mentioned, I also refactored map views. Adding a new mapview is now as simple as newing a /atom/movable/screen/map_view, calling generate_view with the appropriate map id, setting things you want to display in its vis_contents, and then calling display_to on it, passing in the mob to show ourselves to. Much better then the hardcoded pattern we used to use. So much duplicated code man. Oh and plane master controllers, that system we have that allows for applying filters to sets of plane masters? I've made it use lookups on plane master groups now, rather then hanging references to all impacted planes. This makes logic easier, and prevents the need to manage references and update the controllers. image In addition, I've added a debug ui for plane masters. It allows you to view all of your own plane masters and short descriptions of what they do, alongside tools for editing them and their relays. It ALSO supports editing someone elses plane masters, AND it supports (in a very fragile and incomplete manner) viewing literally through someone else's eyes, including their plane masters. This is very useful, because it means you can debug "hey my X is yorked" issues yourself, on live. In order to accomplish this I have needed to add setters for an ungodly amount of visual impacting vars. Sight flags, eye, see_invis, see_in_dark, etc. It also comes with an info dump about the ui, and plane masters/relays in general. Sort of on that note. I've documented everything I know that's niche/useful about our visual effects and rendering system. My hope is this will serve to bring people up to speed on what can be done more quickly, alongside making my sin here less horrible. See https://github.com/LemonInTheDark/tgstation/blob/multiz-hell/.github/guides/VISUALS.md. "Landing" planes Ok so I've explained the backend, but how do we actually land planes properly? Most of the time this is really simple. When a plane var is set, we need to provide some spokesperson for the appearance's z level. We can use this to derive their z layer, and thus what offset to use. This is just a lot of gruntwork, but it's occasionally more complex. Sometimes we need to cache a list of z layer -> effect, and then use that. Also a LOT of updating on z move. So much z move shit. Oh. and in order to make byond darkness work properly, I needed to add SEE_BLACKNESS to all sight flags. This draws darkness to plane 0, which means I'm able to relay it around and draw it on different z layers as is possible. fun darkness ripple effects incoming someday I also need to update mob overlays on move. I do this by realiizing their appearances, mutating their plane, and then readding the overlay in the correct order. The cost of this is currently 3N. I'm convinced this could be improved, but I've not got to it yet. It can also occasionally cause overlays to corrupt. This is fixed by laying a protective ward of overlays.Copy in the sand, but that spell makes the compiler confused, so I'll have to bully lummy about fixing it at some point. Behavior changes We've had to give up on the already broken gateway "see through" effect. Won't work without managing gateway plane masters or something stupid. Not worth it. So instead we display the other side as a ui element. It's worse, but not that bad. Because vis_contents no longer flattens planes (most of the time), some uses of it now have interesting behavior. The main thing that comes to mind is alert popups that display mobs. They can impact the lighting plane. I don't really care, but it should be fixable, I think, given elbow grease. Ah and I've cleaned up layers and plane defines to make them a bit easier to read/reason about, at least I think. Why It's Good For The Game <visual candy> Fixes #65800 Fixes #68461 Changelog cl refactor: Refactored... well a lot really. Map views, anything to do with planes, multiz, a shit ton of rendering stuff. Basically if you see anything off visually report it admin: VV a mob, and hit View/Edit Planes in the dropdown to steal their view, and modify it as you like. You can do the same to yourself using the Edit/Debug Planes verb /cl |
||
|
|
39fec22107 |
Adds an examine hint to explorer gas masks (#69646)
* Gives examine text to unfolded gas masks that folded ones fit in bags. |
||
|
|
9d772c4f13 |
Dimensional Anomaly (#69512)
About The Pull Request Everyone has been asking: "When will there be an anomaly like the bioscrambler, but for the space station? Please, we need more things which replace objects with different objects from the same typepath." Well I made it and it looked like ass because non-tiling floor and walls look terrible, so then I made this instead. Dimensional.mp4 The "dimensional anomaly" shifts matter into a parallel dimension where objects are made out of something else. Like the Bioscrambler anomaly, it does not expire on its own and only leaves when someone signals it or uses an anomaly remover. When it spawns it picks a "theme" and converts terrain around it until it covers a 7x7 square, then it teleports somewhere else and picks a new theme. A lot of these themes are relatively benign like "meat", "fancy carpet", or "gold". Some of them are kind of annoying like "icebox" because it creates floor which slows you down, or "clown" because bananium is intentionally annoying. Some of them are actively dangerous, mostly "uranium" and "plasma". The main problem this will usually cause for crewmembers is decreasing area security. When it replaces doors it replaces them with ones which don't have any access control, and it will also replace RWalls with normal and much more vulnerable walls which will make breaking and entering significantly easier until someone has taken the time to fix the damage. But also sometimes it will irradiate them, you never know. The fact that sometimes the changes are benign (or provide uncommon materials) and might be happening in places you don't care about access to might encourage people to push their luck and leave it alone until it starts turning the captain's office into a bamboo room or repainting medbay a fetching shade of flammable purple, which I would consider a success. Armour.mp4 If you successfully harvest the anomaly core you can place it into the reactive armour to get Reactive Barricade Armour, which shifts your dimension when you take damage and attempts to place some randomised (not terribly durable) objects between you and hopefully your attacker (it really just picks up to four random unoccupied tiles next to you). If you're EMPed then the changes it make to the environment will often be as unpleasant for you as they are for a pursuer, and significantly more likely to harm both of you rather than just provide obstacles. Other changes: I split anomalies out into their own dmi file, seems to be all the rage lately. I moved the anomaly placing code into a datum instead of the event because I wanted to reuse it but if you have a better idea about where I could have put it let me know. This also fixes a bug where the material spreader component wasn't working when I applied plasma materials to something, the extra whitespace was parsing as another argument for some reason and meant it would runtime. Supermatter delamination was still pointing to Delimber anomalies instead of Bioscrambler. |
||
|
|
943c04bae5 |
Save 2.2s minimum (with zero ruins, likely a good bit more in production) of atom init time (#69564)
Pre-sort smoothing_groups and canSmoothWith Without any ruins, these sorts were taking more than 0.6s, and the bulk of the runtime cost of sortTim during init time. This only happens on init and they are never changed apart from that, so pre-sorts everything and adds a unit test (in the form of #ifdef UNIT_TESTS, because you can't initial a list) to ensure that they are proper. Keep visibilityChanged() to mapload only for turf/Initialize Saves about 0.4s worst case scenario (e.g. with no ruins). Very expensive code (175k loop iterations) for 0 side effects. Space areas now have the fullbright overlay, not the space turfs Saves about 0.8s worst case scenario. Seems to work fine with starlight. Remove is_station_level check for window spawners assigning RCD memory. Saves about 0.3s worst case scenario. The logic for this isn't consistent since neither walls nor floors check this (for performance), plus some minor micro-opts to spawners. Optimize is_station_level Doubles in speed, used heavily in /turf/open/floor and in other initialization procs. Bit hard to tell exactly how much is saved, though. |