Commit Graph

2995 Commits

Author SHA1 Message Date
Ghom
149de112f6 Fixing two fishing issues. (#91444) 2025-06-06 23:12:03 -04:00
Bloop
2bae025bfe Audits wash/cleaning signals + refactors wash() to ensure no needless mob updates occur (#91259)
## About The Pull Request

This has the potential to create a lot of needless mob updates which is
not great. Now should only update a mob's clothing if it was actually
washed.

This PR

1) ensures that all wash() procs return a bitflag.
2) ensures that `wash()` proccalls which result in expensive operations
like icon updates only do so when it is necessary

## Why It's Good For The Game

Updating mob sprites is expensive, and doing it when nothing has been
changed is bad.

## Changelog

Nothing really player facing
2025-06-02 18:54:53 +00:00
Ghom
4f6727024d Crafting refactor, implementing materials (#89465)
## About The Pull Request
My original plan was to just implement materials into crafting so that
items would inherit the materials of their components, allowing for some
interesting stuff if the material flags of the item allow it. However to
my dismay crafting is a pile of old tech debt, starting from the old
`del_reqs` and `CheckParts` which still contain lines about old janky
bandaids that are no longer in use nor reachable, up to the
`customizable_reagent_holder` component which has some harddel issues
when your custom food is sliced, and items used in food recipes not
being deleted and instead stored inside the result with no purpose as
well as other inconsistencies like stack recipes that transfer materials
having counterparts in the UI that don't do that.

EDIT: Several things have come up while working on this, so I apologise
that it ended up changing over 100+ files. I managed to atomize some of
the changes, but it's a bit tedious.

EDIT: TLDR because I was told this section is too vague and there's too
much going on. This PR:
- Improves the dated crafting code (not the UI).
- replaced `atom/CheckParts` and `crafting_recipe/on_craft_completion`
with `atom/on_craft_completion`.
- Reqs used in food recipes are now deleted by default and not stored
inside the result (they did nothing).
- Renames the customizable_reagent_holder comp and improves it (No
harddels/ref issues).
- Adds a unit test that tries to craft all recipes to see what's wrong
(it skips some of the much more specific reqs for now).
- In the unit test is also the code to make sure materials of the
crafted item and a non-crafted item of the same type are roughly the
same, so far only applied to food.
- Some mild material/food refactoring around the fact that food item
code has been changed to support materials.

## Why It's Good For The Game
Improving the backbone of the crafting system. Also materials and food
code.

## Changelog

🆑
refactor: Refactored crafting backend. Report possible pesky bugs.
balance: the MEAT backpack (from the MEAT cargo pack) may be a smidge
different because of code standardization.
/🆑
2025-06-01 16:37:43 -07:00
SmArtKar
b4061f1800 [MDB IGNORE] Blood Refactor Chapter 2: Collector's Edition (#91054)
## About The Pull Request

Refactors most of blood handling code untouched by #90593 and completely
rewrites all blood decals, components and reagents.

- Blood types now have behavioral flags which allow them to control
where they leave decals/DNA/viruses. Oil no longer transfers DNA and
viruses with it, while podpeople water-blood doesn't leave visible
decals on turfs and items, but still can be picked up by DNA scanners.
- Multiple blood types have received unique handling - liquid
electricity blood now glows in the dark, oil trails are flammable and
lube ones are slippery. Oil blood can be restored with fuel, lube with
silicon and slime with stable plasma (as normal plasma already passively
regenerates their blood), instead of everything using iron. Saline
solution only supplements on iron-based blood and won't do anything to
help with bloodloss for species who rely on different blood types.
(Roundstart this applies only to Ethereals)
- All blood logic has been moved away from the blood reagent itself into
a blood element that is assigned to the blood reagent by default, and to
any reagent that's drawn from a mob as their "blood" (in
``transfer_blood_to``). This means that blood you draw from lizards will
be green and have lizard's blood description instead of mentioning red
blood cells, Ethereal "blood" will actually contain their DNA and genes,
etc.
- Refactored all blood decals. Blood states are no more, everything is
now handled via blood DNA. Credits to MrMelbert and Maplestation, as a
significant amount of code has been taken from
https://github.com/MrMelbert/MapleStationCode/pull/436 and many of his
followup PRs. Oil and xenomorph splatters are now subtypes of blood,
blood drying is now animated, blood trails now curve and can be
diagonal.
- Rewrote bloodysoles and bloody_spreader components, credits to Melbert
again for the former, while latter now makes more sense with its
interactions. Bloody soles no longer share blood DNA with your hands.
- Ported Melbert's bloody footprint sprites and bot-blood-spreading
functionality.
- Removed all species-side reagent interactions, instead they're handled
by said species' livers. (This previously included exotic blood
handling, thus the removal)
- Slightly optimized human rendering by removing inbetween overlay
holders for clothing when they're not needed.
- Blood-transmitted diseases will now get added to many more decals than
before.
- Cleaned up and partially refactored replica pods, fixed an issue where
monkeys/manipulators were unable to harvest mindless pods.
- Exotic bloodtype on species now automatically assigns their blood
reagent, without the need to assign them separately.
- Clown mobs now bleed (with colorful reagent instead of blood during
april fools), and so do vatbeasts (lizard blood)
- Implemented generic procs for handling bleeding checks, all sorts of
scanners now also correctly call your blood for what it is.
- Podpeople's guts are now lime-green like their organs, instead of
being weirdly greyish like their water-blood. (Their bleeding overlays
are still grey, as they're bleeding water)
- Slimepeople now can bleed. Their jelly is pale purple in color, but
their wound overlays copy their body color.
- Injecting/spraying/splashing/etc mob with a reagent preserves its
data, so you could theoretically recycle fine wines from someone's
bloodstream
- Fixed burdened chaplain's sect never actually giving a blessing when
applying effects, and giving a blessing when nothing can be healed.
Inverted check strikes again.

- Closes #91039 

#### Examples

A lot of blood here has dried, visually the blood colors are almost
exactly the same as before either of the blood refactors.


![dreamseeker_BSP7FE9pRB](https://github.com/user-attachments/assets/45711fa0-ae65-4ec2-9e89-753fa7dd876f)

![dreamseeker_zyv9ssh5VN](https://github.com/user-attachments/assets/7b112854-b7e3-4bfe-b78b-199a55b5b051)
2025-05-31 19:38:07 -05:00
Jeremiah
9db2f6916b Sets prettier to run on the repo (#91379)
## About The Pull Request
Prettier (an auto formatter) is set to only run within the tgui folder
currently. This removes that limitation, allowing it to automatically
format all supported files in the repo (.js, .html, .yml
[etc](https://prettier.io/docs/))

I made a few exceptions for bundled and generated files
## Why It's Good For The Game
I'm of the opinion that code should look uniform and am lazy enough to
want CTRL-S to format files without having to think beyond that
## Changelog
2025-05-29 21:23:59 -07:00
John Willard
7b04440de1 Re-adds the Dragoon tomb ruin & Spear (#90781)
## About The Pull Request

It was removed in https://github.com/tgstation/tgstation/pull/27799
because the spear was broken and the Flans' AI sucked with not-great
sprites and was all just one big reference. Original addition:
https://github.com/tgstation/tgstation/pull/22270

This re-adds it, updates the map (now using airless turfs) with extra
ambiance, using ash whelps (lavaland variation of ice whelps) instead of
Flans, re-adds the spear, and adds armor as well this time around.

The spear gives you a jump ability to crash down upon a player below
you, rather than teleporting to wherever you throw the spear at. You
can't attack while mid-air, you can go through tables but not
walls/doors, and you also can't un-dualwield or drop the spear mid-jump.
Landing on a mob deals double damage to them (36 to unarmored people),
while landing on objects deals 150 damage to them (taken from savannah's
jump ability, which was in turn taken from hulk's punching)
It's also got some extra throw force (24 compared to default spear's 20)

The armor has basic security-level armor but covers your whole body.
Does not include space protection, and can be worn by Ian.

Video demonstration


https://github.com/user-attachments/assets/a77c3a0d-17d2-4e8d-88b6-cdbca8b1f2c3

New sprites demonstration

https://github.com/user-attachments/assets/0e465351-5484-406f-8adc-ffa1ac180daf

Armor demonstration

https://github.com/user-attachments/assets/abdfcac6-65bf-443c-bde2-27d157ee3a80

Map

![436285657-104a555f-60dc-46f0-8283-a92db2ca5352](https://github.com/user-attachments/assets/a1677c9a-7157-4562-9703-5ad44c923e8d)

With the changes in https://github.com/tgstation/tgstation/pull/90771 I
had to mess with ash whelp abilities a bit, I decided to make them use
cold fire instead of hardcoding blue color on top of the fire sprites,
and it now acts accordingly too


https://github.com/user-attachments/assets/cfca0d70-d13d-4c73-996d-2d4a7519866d

The jump was taken from Savannah Ivanov, and Goof's bunny jumping.

##### Code bounty by Ezel/Improvedname

## Why It's Good For The Game

This Re-implements a old spear that got removed for its buggyness/bad
mapping and on the authors request as well not wanting to deal with it.

Re-introduces the SkyBulge as a space ruin, referencing Dragoons from
Final Fantasy. this just like any normal spear, but using the savannah
jump mechanic, this allows you to close distances with the spear
avoiding ranged projectiles in the jump, and if you directly land on
your target you will do double the damage.

##### -Ezel/Improvedname

## Changelog

🆑 Ezel/Improvedname, Toriate, JohnFulpWillard
add: Re-added the Dragoon Tomb lair, now has a Skybulge spear and
Drachen armor.
balance: Ice whelps now spit out cold fire.
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
2025-05-30 11:36:38 +10:00
SmArtKar
7cec560b20 Neruwhine can no longer roll voidwalker traumas, fixes high gravity persisting after curing the trauma (#91147)
## About The Pull Request
Neruwhine can no longer roll Cosmic Neural Pattern or its stable
subtype.
Fixed the planetary gravity damage status effect not clearing itself
when you lose the voided trauma.
Closes #90702

## Why It's Good For The Game

Cosmic Neural Pattern is a voidwalker exclusive and is more of a magical
status effect than an actual brain trauma, so having it be temporarily
rollable is a bit stupid.

## Changelog
🆑
balance: Neruwhine can no longer roll voidwalker traumas.
fix: Fixed the planetary gravity damage status effect not clearing
itself when you lose the voided trauma.
/🆑
2025-05-27 18:11:13 +02:00
Y0SH1M4S73R
9b54dbf974 Adds usb support to advanced camera consoles (#91235)
## About The Pull Request

This PR adds usb functionality to advanced camera consoles.

The advanced camera console component gets the last valid position
viewed from the console, which is usually the current viewed position,
unless you move the view into static.

The advanced camera target intercept outputs the position you left/right
click (except shift-clicking), and what you clicked on. This only works
for atoms the camera can actually see, even if you somehow glitch your
way into not seeing static on your client.

Equipment action components on circuits attached to a camera console
will add their actions to be used from the console.

## Why It's Good For The Game

Expands the use cases for the advanced camera console, providing a means
to extend their functionality, as well as a potentially powerful source
of input data for circuit users able to acquire illegal tech (or get the
board from a space ruin).

## Changelog

🆑
add: Advanced camera consoles now have usb ports. Connected circuits can
get the position the camera is viewing, get the location of targeted
entities, and provide the console with actions that the user can
activate.
/🆑

---------

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2025-05-27 14:06:13 +12:00
Roxy
7d08da9fd6 Refactor split_stack to two separate procs, fixes a hard delete in the process (#91306)
## About The Pull Request

I was trying to fix a hard delete and it became a whole thing
- Reworks `/obj/item/stack/proc/split_stack` to no longer also try to
put it in the user's hands, or take a user at all. The proc now purely
splits the stack and returns the new one
- Creates `/obj/item/stack/proc/split_n_take` which uses `split_stack`
and does the other behaviors like fingerprint adding and putting in the
user's hands
- Update usages of `split_stack` to either properly use it and remove
the code added to get around the put in hands behavior, or change them
to use `split_n_take` instead
- Fix a random bug in pipe bomb building I noticed while testing

## Why It's Good For The Game

Ultimately this fixes a hard delete with goldgrubs eating a piece of ore
while sitting on top of another piece of ore of the same type (the put
in hands behavior of split stack would cause the ore being consumed to
drop to the ground briefly, merge with the ore there, and then qdel
while still being moved to the goldgrub contents), but also added bonus
that it makes `split_stack` just split the stack and not some other
stuff too. Also a pipe bomb bug fix

## Changelog

🆑
fix: fixed being able to add seemingly infinite refined bluespace
crystals to pipe bombs
refactor: /obj/item/stack/split_stack no longer tries to move the stack
into the user's hands, use /obj/item/stack/split_n_take for that
/🆑
2025-05-25 03:14:53 +03:00
fleur
8e667c7c7d Monkey plush (#91154) 2025-05-24 23:18:38 +00:00
Bloop
cb51a652a9 Adds automatic GAGS icon generation for mapping and the loadout menu (#90940)
## About The Pull Request

Revival of https://github.com/tgstation/tgstation/pull/86482, which is
even more doable now that we have rustg iconforge generation.

What this PR does:

- Sets up every single GAGS icon in the game to have their own preview
icon autogenerated during compile. This is configurable to not run
during live. The icons are created in `icons/map_icons/..`
- This also has the side effect of providing accurate GAGS icons for
things like the loadout menu. No more having to create your own
previews.


![FOuGL6ofxC](https://github.com/user-attachments/assets/e5414971-7f13-4883-9f7f-a8a212b46fe8)

<details><summary>Mappers rejoice!</summary>


![StrongDMM_1oeMSoRHXT](https://github.com/user-attachments/assets/83dcfe4c-31be-4953-98f3-dff90268bbc4)


![StrongDMM_uyqu3CggPn](https://github.com/user-attachments/assets/7896f99e-2656-40e1-a9da-3a513882365a)

</details>

<details><summary>Uses iconforge so it does not take up much time during
init</summary>


![dreamdaemon_u4Md3Dqwge](https://github.com/user-attachments/assets/17baaff8-5d5e-4a4d-ba8f-9dd548024155)

</details>

---

### Copied from https://github.com/tgstation/tgstation/pull/86482 as
this still applies:

Note for Spriters:

After you've assigned the correct values to vars, you must run the game
through init on your local machine and commit the changes to the map
icon dmi files. Unit tests should catch all cases of forgetting to
assign the correct vars, or not running through init.

Note for Server Operators:

In order to not generate these icons on live I've added a new config
entry which should be disabled on live called GENERATE_ASSETS_IN_INIT in
the config.txt


## Why It's Good For The Game

No more error icons in SDMM and loadout.

## Changelog

🆑
refactor: preview icons for greyscale items are now automatically
generated, meaning you can see GAGS as they actually appear ingame while
mapping or viewing the loadout menu.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-05-24 15:21:02 -07:00
MrMelbert
5261efb67f Re-refactors batons / Refactors attack chain force modifiers (#90809)
## About The Pull Request

Melee attack chain now has a list passed along with it,
`attack_modifiers`, which you can stick force modifiers to change the
resulting attack

This is basically a soft implementation of damage packets until a more
definitive pr, but one that only applies to item attack chain, and not
unarmed attacks.

This change was done to facilitate a baton refactor - batons no longer
hack together their own attack chain, and are now integrated straight
into the real attack chain. This refactor itself was done because batons
don't send any attack signals, which has been annoying in the past (for
swing combat).

## Changelog

🆑 Melbert
refactor: Batons have been refactored again. Baton stuns now properly
count as an attack, when before it was a nothing. Report any oddities,
particularly in regards to harmbatonning vs normal batonning.
refactor: The method of adjusting item damage mid-attack has been
refactored - some affected items include the Nullblade and knives.
Report any strange happenings with damage numbers.
refactor: A few objects have been moved to the new interaction chain -
records consoles, mawed crucible, alien weeds and space vines, hedges,
restaurant portals, and some mobs - to name a few.
fix: Spears only deal bonus damage against secure lockers, not all
closet types (including crates)
/🆑
2025-05-19 13:32:12 +10:00
Y0SH1M4S73R
80ec197457 Fixes USB ports/cables erroneously detaching when shuttles move (#91043)
## About The Pull Request

When a shuttle moves, usb ports now wait for the shuttle to finish
moving all of its contents to determine whether they should detach from
whatever they are connected to.

This PR also adds a new signal whose registered handlers can affect what
gets moved when part of a shuttle moves, but until a handler for that
signal actually needs to do so, that behavior only really matters in the
sense that it is now exposed to lua scripting.
2025-05-16 21:49:57 -05:00
Y0SH1M4S73R
429a3bbf04 Adds the craftable MOD soul shard core. (#91023)
## About The Pull Request

If you examine a soul shard closely, you can learn to craft the MOD soul
shard core. It takes the same basic ingredients as other MOD cores, but
uses a soul shard. It is powered by your own soul, which drains your
sanity to provide charge (if mood is disabled in the config, it's
practically equivalent to an infinite core).

Crafting one ejects any shades in the shard (because that's the simplest
behavior that doesn't require a substantial refactor to crafting or
modsuit code).

Depending on the kind of shard used, certain roles get negatively
impacted by using a modsuit with such a core.
- Cult soul shards wrack non-magical roles (anyone that isn't a cultist,
heretic, heretic minion, or wizard) with horrible agony (a -20 moodlet
that expires 10 seconds after turning the suit off)
- Holy soul shards wrack cultists and heretics with horrible agony,
while wizards are put at unease (-3 mood)
- Wizard soul shards have no negative impact on anyone
- If someone were to VV a soul shard to have the heretic theme (only
used by rusted harvesters), it would be functionally identical to the
cult shard

Soulless mobs (liches, people who lost with the cursed russian revolver,
and people who died from casting Soul Tap too many times) have no soul
for the core to draw power from.

Also gives the wizard modsuit a soul core.

## Why It's Good For The Game

Provides a neat but caveat-rich way to utilize soul shards, especially
for players who have no way to obtain construct shells absent a cult or
wizard to create them.
2025-05-16 21:49:23 -05:00
MrMelbert
685ca9db69 [MDB Ignore] Damp Rag can now get dirty / Repaths damp rag (it's no longer a cup) (#90700)
## About The Pull Request

- Damp rag is now no longer god's perfect cleaning tool. After blood,
the damp rag will collect it, and after cleaning a lot of blood, you can
no longer clean with the rag until you wash it in a sink (or with
cleaner or however you want)
- This means the rag will collect DNA in it as you clean, which gives
detectives an opportunity to investigate.
- It also means the DNA it collects will occasionally spread onto you,
meaning you will have to clean your gloves or hands.
- Cleaning vomit and such is (currently) unaffected (and does not dirty
the rag).
- Diseases are not currently transferred to the rag (but this would be
fun to add)

- Gauze now gets dirty when using it to wrap bleeding wounds. This is
just visual, though blood DNA gets transferred. It can be washed in a
sink.

- Removed gauze on sink / cloth on sink interaction.
   - Can't really wash gauze with it, plus it's redundant.

- Damp rag is no longer a cup.

## Why It's Good For The Game

Damp rag is just "soap without any downsides", which is kinda lame. 
I thought about going a step further and making it require you wet it
first but then it just becomes "mop but small" which is also lame.

Instead, you're required to clean it, which gives janitors / crewmembers
an alternate cleaning method:
- Soap: Small, finite, limited. Can't be replenished.
- Cleaner: Small, finite, even more limited, ranged. Can be refilled
with chemistry's help.
- Mop: Large, infinite, limited. Needs a water bucket.
- Damp Rag: Small, infinite, limited. Need to clean it after a few goes.

## Changelog

🆑 Melbert
balance: Damp Rags can now get dirty when using them to clean blood,
passing blood DNA along.
add: Gauze now gets dirty when apply it to actively bleeding wounds.
Doesn't spread disease or anything, just passes blood DNA. It can be
cleaned in a sink.
del: Removed cloth on sink / gauze on sink interaction to make rags.
Just use the crafting menu
/🆑
2025-05-16 13:49:27 -07:00
MrMelbert
d1fffd9b47 Analyzer blood printout uses conditional tooltips as god intended (also fixes some) (#90970)
Health Analyzer tells you what type of blood your target can
accept.
2025-05-16 14:48:17 -04:00
SmArtKar
352c7ecdd7 Refactors ITEM_SLOT_BACKPACK and ITEM_SLOT_BELTPACK out of inventory code (#90869)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

So yesterday I've spotted that we had wrong SLOTS_AMT value set, and
went a bit down a rabbit hole and found how abhorrent our
ITEM_SLOT_BACKPACK and ITEM_SLOT_BELTPACK usage is. They're not real
inventory slots, but just "hints" at items being located in backpacks or
belts, or instructions to put an item into a belt/backpack. This PR
rewrites all usages of them as "hints", and adds an equip_to_storage
proc used to equip an item into a storage positioned in a certain slot,
so ``equip_to_slot_if_possible(item, ITEM_SLOT_BACKPACK)`` is now
``equip_to_storage(item, ITEM_SLOT_BACK)``

## Why It's Good For The Game

Its really stupid and we shouldn't have those as slot flags,
ITEM_SLOT_HANDS at least makes sense but those two are just absurd.
Should make equipping things into non-backpack storage a bit easier too,
in case we end up going through with the idea of suit/uniform pockets
being a major part of player inventory.

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
refactor: Refactored how backpack and belt contents are handled in mob
inventory code, report any issues with lingering item effects or
inability to equip things into them!
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2025-05-15 01:07:41 +01:00
RosSample
6e989e783f Callouts after death fix (#91067)
## About The Pull Request

Fixes https://github.com/tgstation/tgstation/issues/90931

## Why It's Good For The Game

Can't callout while incapacitated (dead, stunned, etc.). While cuffed
reverts to proper "leg" pointing.

## Changelog

🆑
fix: callouts no longer work while you are incapacitated
/🆑
2025-05-12 20:37:17 -07:00
Jacquerel
96976c0b9a Regal Rat cleanup & minor changes (#91012)
## About The Pull Request

Since #90505 added another entry to it the Regal Rat Riot ability, which
turns maintenance creatures into versions loyal to the rat, has become
sort of unmanageable (and to be honest it was a bit gross to start
with).
Instead of having a big if/else list (which was making the same range
check multiple times...) that sets stats on a bunch of mobs, I delegated
it to the mobs themselves and instead of changing some stats of the
existing mobs we just turn them into a new mob which can be spawned or
placed separately by mappers or admins if they want.

Other stuff I changed:

Riot (the ability which transforms mobs into minions) no longer spawns a
mouse if it fails to find anything. Instead you have a chance to fish
mice out of disposals bins while digging out trash and items.

Domain is now a toggle which activates itself every 6 seconds rather
than a button you manually click every 6 seconds.

Riot makes a visual effect when used.

Rare Pepe randomisation is done via a random spawner instead of the mob
modifying a bunch of its own properties in Initialise.

A bunch of mobs now automatically follow you after being tamed. I wrote
this assuming I was going to add it to the rioted mobs but then didn't
end up doing that because you might want them to immediately attack
someone.
My rule of thumb is that if I think you'd want the mob to attack someone
the moment it is befriended I didn't add this and if you wouldn't I did.

I changed some of the regal rat minion names, and some of them can now
spawn from gold slime which couldn't before.

## Why It's Good For The Game

This proc sucked and now it's nicer.

As for the other changes;
- A tamed mob immediately following you is nice feedback and saves you a
click as it's likely to be your first action. Also removes some admin
panel shitcode I added.
- I changed Domain to a toggle because you generally want to use it on
cooldown and someone suggested it on this PR and it sounded like a good
idea.
- I saw someone in Discord complaining that the previous flow of
recruiting rats by hitting Riot with nothing around to summon one,
waiting, hitting it again to convert one rat, and waiting again was
tedious and annoying which I agree with.
This method improves the quality of life by separating these two actions
but _also_ as a side effect reduces a regal rat's ability to secretly
stockpile 50 rats in a hidden maintenance room because most disposal
bins are in slightly more visible areas, they'll actually need to go and
make a mess somewhere someone can see them.


## Changelog

🆑
balance: Regal Rats can now grab mice out of disposal bins, and no
longer spawn them with the Riot ability.
balance: The Riot ability no longer needs to be used once for each
slightly different kind of mob in your radius.
balance: The Regal Rat Domain ability is now toggled on and off.
balance: Several kinds of mob will immediately start following you once
tamed.
balance: Rats, hostile frogs, and evil snails can be created via gold
slime reaction.
/🆑
2025-05-11 04:52:20 +03:00
SmArtKar
2ff025b97a Fixes transparent_protection being used incorrectly almost everywhere (#90894)
## About The Pull Request

``transparent_protection`` is a set of cover flags which are supposed to
be used for things that can be seen, but cannot be accessed. Replaced
the argument in ``check_obscured_slots`` with a separate
``check_covered_slots`` proc for clarity.

Closes #90827

Also went a bit down a rabbit hole and fixed some UI issues with the
strip menu, as I found out that covered slots also counted as obscured.
Covered, but not obscured slots are now semi-transparent, images are
pixel-perfect, and action buttons no longer are offset. Also slots with
items in them don't have the background, akin to how inventory slots
function in-game.
2025-05-08 21:52:31 -05:00
Jacquerel
409794c481 Feeding the supermatter a nuke will make it explode (#90875)
## About The Pull Request

Feeding the nuclear bomb (or its radioactive core) to the Supermatter
will cause an oversized radiation pulse, generate a large amount of
energy, and immediately damage the supermatter sufficiently to start
delaminating.
If the core isn't in the bomb it won't do this (meaning that the beer
nuke doesn't do it sorry)

I wish there was a nicer interface for these special supermatter
interactions but I also can't be bothered to figure one out right now

ALSO for some reason `consume_returns` was being called twice if a
living mob hit the crystal which seems like an unintended bug that has
been in the codebase for three years?
I fixed this but also doubled the values being passed into it because at
this point I guess those are the values we expect to get for mobs
running into the supermatter

## Why It's Good For The Game

Someone posted a clip today of a group of people pushing a nuke into the
supermatter and then it ate it and nothing happened.
That is sad, if you feed the supermatter a big bomb full of energy then
it should explode.

Damaging it immediately enough for it to explode might be over the top
in which case let me know, but having a movable bomb around is
reasonably uncommon if nukies aren't on the station as the station one
is not usually movable. Traitors extracting the nuke core also cannot be
done without a specific traitor objective giving you special tools.
Doing like 90 damage would, with a default supermatter setup, generally
just make it yell loudly but then slowly heal itself without any
required input which made me sad.

## Changelog

🆑
balance: The supermatter will react negatively to being fed nuclear
fissile materials
/🆑
2025-05-08 12:13:04 -06:00
Goat
bd0fa34b4e Fixes barometers (#90881) 2025-05-08 07:26:01 +02:00
Lucy
37ec7f8054 Changes all uses of notify_ghosts to use the real names of mobs (#90919)
## About The Pull Request

Quite simple - this changes every direct mention of a mob in a
`notify_ghosts` message to use `[mob.real_name]` instead of just `[mob]`

## Why It's Good For The Game

makes things less confusing - ghosts can see easily their actual
identity anyways, so it's not like there's much of a reason _not_ to do
this.

## Changelog
🆑
qol: Ghost notifications will now use the real names of mobs when
something happens (i.e no more "Unknown has completed an ascension
ritual!")
/🆑
2025-05-08 00:48:52 +00:00
Jacquerel
52ed369990 Improve Ice Whelp behaviour (#90771)
## About The Pull Request

Fixes #90767
This PR redesigns ice whelps somewhat

As before they have two fire breath attacks, one of which is a line and
one of which is a point blank AOE
Unlike before, the aspect of forecasting that the attack is coming is
now part of the ability and not a component only used by ice whelps (I
didn't like the component) and comes with visuals


![dreamseeker_cANE799XYB](https://github.com/user-attachments/assets/bd10926f-d136-40dd-8d21-8a8e9c14bafa)

![dreamseeker_O8hjbivgT0](https://github.com/user-attachments/assets/21f78e1b-727b-438a-b013-a6f9d8c210f8)

Also unlike before, the line breath is longer and comes out faster
(because it's frankly pretty trivial to avoid) and the point blank
effect has been upgraded to effect every tile in a circular area within
3 spaces of the drake

The drake will now use the "every nearby tile" attack if you are close
by when its abilities come off cooldown, and the longer ranged one if
you're not

## Why It's Good For The Game

This fixes Ice Drakes using their breath attack literally once and never
again and might make them slightly more interesting to fight
Their slow speed and inaccurate targeting I think still means that
they're not very threatening on their own, but that'd need a more
substantial redesign to fix

## Changelog

🆑
balance: Ice Whelps now switch between their breath attacks depending on
the situation
fix: Ice Whelps will use their breath attacks more than once per
encounter
/🆑
2025-05-04 14:41:50 -07:00
John Willard
138a61cba0 Chaplains can deaconize one person, everyone else loses bible perms (#90686) 2025-05-04 16:49:36 +02:00
SmArtKar
b0aaeca5ae Merges crusher retool kits into one, datumizes crusher skins, gives dagger and blaster unique animations (#90742)
## About The Pull Request

Merges sword, harpoon, glaive and dagger crusher retools into a single
item which allows you to pick the skin you want upon being applied to a
crusher by converting crusher skins into datums.
I've also improved sprites for all skins and redid the retool kit
itself, as well as gave dagger and blaster unique animations - you swing
with a dagger for normal attacks, stab to rupture the mark, and firing a
shot point-blank does a stabbing animation with the blaster.

![dreamseeker_5nPyNKqzoC](https://github.com/user-attachments/assets/c8858a71-3c0f-49a0-8577-cb8a9e64e0a0)


https://github.com/user-attachments/assets/2d243daf-f1d8-48bf-a661-8a9ac990837c

(Apologies for lack of robust gameplay, I was trying to show the
animations, not kill the goliath)

The harpoon crusher skin now does stabbing animation instead of slashing
one, and I've also fixed animations playing incorrectly when attacking
large mobs/objects

## Why It's Good For The Game

Having multiple items for reskinning crushers feels clunky, and unique
animations are just something that makes sense. Having a swinging
animation for both dagger and blaster looked odd, as you'd probably only
swing one of them at the opponent, so I decided to spice them up.

## Changelog
🆑
add: Dagger-blaster and harpoon crusher skins have received unique
attack animations.
add: Four base crusher retool kits have been merged into one item.
image: Resprited crusher skins and the crusher retool kit
fix: Fixed attack animations being offset when attacking large objects
or mobs.
/🆑
2025-05-04 15:36:27 +03:00
_0Steven
7eca9a710e Custom emotes actually use +|_ emphasis formatting, your own emotes don't trip highlights (#90858)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

So I was running into the bit where custom emotes actually don't get the
`+|_` emphasis formatting applied to them, _except_ for the runechat
portion which *does*.
This felt annoying, especially given I've seen a lot of people try it
and have it not work.
Add to that that your own emotes would keep getting highlighted,
blotting out other people mentioning your highlighted messages, and
here's this pr.

In this pr we add a few flags to audible/visible messages,
`WITH_EMPHASIS_MESSAGE` and `BLOCK_SELF_HIGHLIGHT_MESSAGE`, which
respectively apply emphasis formatting and block highlighting the
message to oneself.
We're doing this with flags because I felt always applying this would be
unnecessary. Most audible/visible messages won't need to check for
formatting, and quite a lot we *do* want to be highlighted.

As such, we apply these flags as need be.
For emotes we do this by having `get_message_flags(intentional)`, which
applies `BLOCK_SELF_HIGHLIGHT_MESSAGE` based on whether the message is
intentional, and on the custom emote subtype applies
`WITH_EMPHASIS_MESSAGE`.

Because it's not just for _say_ anymore, and already was also used for
emote runechats, we rename `say_emphasis(input)` into
`apply_message_emphasis(input)`. We additionally move it down to `/atom`
from `/atom/movable`, such that visible/audible messages can in fact
call it.

That resolves our issues.

We also apply `BLOCK_SELF_HIGHLIGHT_MESSAGE` to sign language tone
messages, as they're essentially a part of speech.

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game

Being able to do `+|_` emphasis formatting on your emotes is nice, I've
seen a lot of people try it and have it not work.
Especially weird given it DOES apply to the runechat message, just not
the text chat message.

It's annoying when your own emotes trip your own highlights! Like if you
have a name highlight, your own emotes getting constantly highlighted
would blot out other people talking to you.
So having your own emotes not trip it just like your own talking makes
that less of a pain.
But sometimes emotes are forced, and in that case I think it's better to
keep the highlight because it's just like other people's messages
information the player might want to be notified of.
Generally, I think if it's the player's input it probably shouldn't be
highlighted, while if it isn't the player's input it probably should.

There's no need for us to ever highlight our own sign language tone
messages, because they're essentially a part of our talking.

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
add: When performing a custom emote, `+|_` emphasis formatting applies
to the text chat message instead of just the runechat message.
qol: Intentional emotes don't trip your own highlights.
qol: Sign language tone messages don't trip your own highlights.
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2025-05-03 02:47:43 +02:00
necromanceranne
1c3c50c9e9 DRAGnet; new sprite, new functionality (#90713)
## About The Pull Request


![image](https://github.com/user-attachments/assets/9e143b3c-3435-430b-a949-04a354a46688)

New sprites for the DRAGnet, coming alongside some functionaltiy
changes.

DRAGnets are now bulky, and do not fit in backpacks. They also cannot be
dual-wielded.

DRAGnet no longer have the trap snare functionality. You know, the
infamous bola bullet.

DRAGnets now have two functions; 
The first function is straight up a scatter disabler blast that does a
total of 55 stamina damage point blank (it's like, 5 less than what it
did before).

The second function is a single bolt that, when it hits a living mob,
dealing 30 damage and staggering it briefly slowing it down. It also
places down a wide net of transportation fields around the target, much
like the net functionality does on live (but that's attached to the
scatter function, not the single bolt)


![image](https://github.com/user-attachments/assets/336585d3-924e-4d4c-9c29-c16e7de88990)

### Misc Changes

DRAGnets now cost more form cargo, at 3600 credits. (This barely matters
for departmental orders)

## Why It's Good For The Game

The sprite is ancient. Like nearing two decades old ancient. I believe
the INTENTION was this thing


![a3ec8cabc5d93992168a57ad48d21996d037e67f_00](https://github.com/user-attachments/assets/bc29c2ad-dc93-4503-83e3-8997f4e625c1)

It didn't really work out that way.


![image](https://github.com/user-attachments/assets/db2bcc94-902f-476f-8ed4-b90883519bc9)

Either way, the new sprite is cool and more unique in my opinion.
Fitting its status as an energy weapon.

As for balance changes; I've wanted to do this for a very long time but
put it off a lot. I think this is about the most moderate approach I
have. It otherwise functions pretty much as expected, maintaining the
cool niche functionality while exorcising the problem bits; one-handed
energy shotgun bit, and the bola shot bit.

I think I've spent at least the last...four or so years hammering on
about the horror that is this gun for balance? And even when it was
seeing more widespread use from people who recognized how bullshit it
really was, I didn't really want to get rid of the bit I actually quite
liked, which was the teleportation field.

I'm happy with this version.

## Changelog
🆑 NecromancerAnne (Code, Mild Sprite Edits) Michiyamenotehifunana
(Sprites)
image: Replaces the decrepit DRAGnet sprite with something newer and
more interesting.
balance: Completely reworks the DRAGnet. They are now bulky energy guns.
balance: Snare is now a single shot bolt that deals 30 stamina force,
staggers the target and lays out a net of teleportation fields that can
transport anyone standing on them for too long to a DRAGnet beacon.
balance: Net has been replaced with a scattershot disabler round. 
/🆑
2025-04-30 13:31:39 +01:00
John Willard
853c9196b6 Removes 'thrownby' var on items (#90877)
## About The Pull Request

Fully removes thrownby as a var on items, and is now instead handled by
throwingdatums' ``get_thrower()`` proc

Also replaces the early return for throwing things at yourself (it now
only prevents the call for check_block and therefore hit reaction
stuff), since the only way to throw things at yourself is with
boomerangs, which currently only works because it doesn't pass you as
the thrower for boomerang's return

Speaking of, boomerangs now see the thrower as thrower on returns

Before (Boomerangs don't pass you as the thrower, so it shows you as
being hit by nothing):

![image](https://github.com/user-attachments/assets/44c17c02-5618-44c6-b821-2089752946c8)

After (Boomerangs pass you and you can affect yourself, so it sees you
hitting yourself & it still batons you):

![image](https://github.com/user-attachments/assets/dafe6212-cf58-4a9d-aae1-3ef97faa5dbd)

This is gonna be used for
https://github.com/tgstation/tgstation/pull/90689 as well.

## Why It's Good For The Game

Better logging for boomeranged items, removes a deprecated var and
better consistency for thrown items leaving better readability.

## Changelog
🆑
admin: People throwing boomeranged items and hitting themselves now logs
it as them hitting themselves (rather than being hit by the air).
/🆑
2025-04-30 10:29:29 +01:00
Jacquerel
f2b07029ef Readds Cloning (#90754) 2025-04-29 08:35:02 -06:00
Ghom
ec20e7fac2 Aquariums have now three different modes (Manual/Assisted/Stasis) (#90605)
## About The Pull Request
This PR replaces the toggleable safe mode with Manual, Assisted and
Stasis.

Manual and Stasis mode works much like the old safe mode being off and
on respectively. The real addition here is the new default assisted
mode, which automatically sets fluid and temperature based on what
combination of these two settings would keep the most fish alive. It can
also temporarily enable stasis if over half of the fish population is at
risk of dying.
The main difference with stasis is that it doesn't necessarily prevent
fish death if it's a minority of the general population, rather just
make aquarium easier for players to manage.

Also added a line about fluid and temp when examining aquariums.

Still have to test it, definitely a WIP.

## Why It's Good For The Game
I want to make aquariums a bit easier and more accessible, since the
benefits are fairly meager for the efforts needed to maintain one,
excluding the power generator. I'll probably look into fish traits and
fish reproduction next, who knows...

## Changelog

🆑
add: Aquariums can now be switched between three different modes
(Manual/Assisted/Stasis) to replace the old Safe Mode toggle.
/🆑
2025-04-28 16:09:44 +01:00
Bloop
3d01e86e29 There will be (colorful) blood: datumizes bloodtypes, greyscales blood sprites, and fixes a lot of inconsistencies with gibs and forensic data (#90593)
## About The Pull Request


This PR:

- Converts all of the blood types into their own datums, which can be
set up to have their own colors, descriptions, and other fun unique
properties. For example, the clown blood that is constantly randomizing
itself.

- Converts all the blood decals into greyscale, which in turn eliminates
the need for separate xeno sprites. They both use the same ones now.

- Audit of blood splatters/gibs/bodyparts/organs to make sure that they
are getting the correct forensic data applied to them.

- For the admins: Adds a clown blood smite.

My primary goal with was to make the appearance of the new sprites look
almost indistinguishable to the original ones.

I consider this a "first pass", as in there are still some further
refactors I would like to do on the backend side, but am satisfied with
it enough to push it forward as a first step towards a better blood
system! I didn't want to do too much at once because of A) fatigue and
B) easier to test things to make sure I'm not breaking something
important this way.

This has been test-merged on Nova for over a week now and has been going
great, so I finally got around to upstreaming the bones to TG. Although
I did test it a bit you may want to TM it just in case I missed some
things when copying it over.
2025-04-28 00:57:59 -05:00
Jacquerel
527910d845 Fix faulty wielded force checks (#90837)
## About The Pull Request

Fixes #90836
Fixes #90841

In a recent merge some checks in `component/two_handed` were changed
from `if(!value)` to `if(isnull(value))`.
This change was in error because these values are never null, they
default to 0.
I have changed them to more sensible and appropriate numerical checks.

## Changelog

🆑
fix: Holding a two-handed weapon in both hands will now once again
appropriately modify its attack power.
/🆑
2025-04-27 03:26:39 +10:00
SyncIt21
c135b48114 Makes check_teleport_valid pure & signal clean up (#90738)
## About The Pull Request
- Closes #90704

The following changes were implemented for this
- Moved sending signals `COMSIG_MOVABLE_TELEPORTING` &
`COMSIG_ATOM_INTERCEPT_TELEPORTING` from `check_teleport_valid` into
`do_teleport`. These 2 signals were causing all the side effects
- Removed signals `COMSIG_ATOM_INTERCEPT_TELEPORTED` &
`COMSIG_MOVABLE_TELEPORTED` as the above 2 signals can do their jobs &
block the teleport if needed so these signals became obsolete
- Removed define `COMPONENT_BLOCK_TELEPORT` in favour of returning a
positive value if teleport was successfully blocked. Having 2 signals
located in 2 separate files use this same define doesn't look great.


## Changelog
🆑
code: cleans up teleportation code. `check_teleport_valid` is now a pure
function with no side effects
/🆑
2025-04-26 16:37:57 +02:00
SmArtKar
fdad28e19d Fixes inconsistent PKC descriptions and broken bubblegum/wendigo trophies (#90736)
## About The Pull Request
Bubblegum trophy has attempted to modify its' *own* dual wielding, so if
you attached and detached it you were able to have a tiny 20 force two
handed weapon. Yeah. This PR implements a way for trophies to
consistently modify their damage, and fixes some oversights (values not
being assigned/updating) in two handed component code.

Closes #90731

## Changelog
🆑
fix: Fixed inconsistent proto-kinetic crusher descriptions
fix: Fixed Bubblegum and Wendigo crusher trophies sometimes not working.
/🆑
2025-04-25 15:36:00 +00:00
Tim
1200c26ce1 Allow boats to travel over water (#90823)
## About The Pull Request
Since we now have deep water that makes people drown, it makes sense to
go the extra mile and incorporate the ability for boats to travel over
water. This should allow some cool mapping stuff where you can make
islands that are only reachable by boat.

## Why It's Good For The Game
Mapping benefits.

## Changelog
🆑
add: Allow boats to travel over water
/🆑
2025-04-25 14:25:32 +00:00
Ghom
339616ae78 You can now interact with held mobs beside wearing them (feat: "minor" melee attack chain cleanup) (#90080)
## About The Pull Request
People can now pet held mothroaches and pugs if they want to, or use
items on them, hopefully without causing many issues. After all, it only
took about a couple dozen lines of code to make...

...Oh, did the 527 files changed or the 850~ lines added/removed perhaps
catch your eye? Made you wonder if I accidentally pushed the wrong
branch? or skewed something up big time? Well, nuh uh. I just happen to
be fed up with the melee attack chain still using stringized params
instead of an array/list. It was frankly revolting to see how I'd have
had to otherwise call `list2params` for what I'm trying to accomplish
here, and make this PR another tessera to the immense stupidity of our
attack chain procs calling `params2list` over and over and over instead
of just using that one call instance from `ClickOn` as an argument. It's
2025, honey, wake up!

I also tried to replace some of those single letter vars/args but there
are just way too many of them.

## Why It's Good For The Game
Improving old code. And I want to be able to pet mobroaches while
holding them too.

## Changelog

🆑
qol: You can now interact with held mobs in more ways beside wearing
them.
/🆑
2025-04-23 20:18:26 +00:00
SmArtKar
81a74c88bd Fixes AI not getting creampie face decals (#90762)
## About The Pull Request

Closes #90749 

## Changelog
🆑
fix: Fixed AI not getting creampie face decals
/🆑
2025-04-23 16:03:05 +00:00
Goat
9fa83a7701 Fixes megacarp not moving in space while ridden (#90760)
## About The Pull Request
adds a single line (`override_allow_spacemove = TRUE`) to the megacarp
movement datum
## Why It's Good For The Game
it's a big ass fucking shark if the small carp can carry me through
space so can the megacarp. if i remember correctly it used to be able to
so why not. i want to ride my cool ass shark through space
## Changelog
🆑 Goat
fix: The megacarp (shark) will now be able to fly through space when
ridden like its smaller carp siblings.
/🆑
2025-04-22 16:06:35 +02:00
John Willard
7e3074a10b Drawing narsie updates your loc (#90727) 2025-04-20 13:32:56 +02:00
ariaworld
ae774d8dbd [FIX]: Allows surgery initiator items to be used while laying down, not just surgery drapes (#90622) 2025-04-19 12:28:42 +02:00
Bloop
3454ef7791 Stops the squeak component from playing step sounds when you are not walking (#90513)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2025-04-18 15:40:29 +02:00
MrMelbert
61801b3d33 You can rotate scanner gates (#90597) 2025-04-15 10:34:12 -07:00
Ben10Omintrix
a5b3e64c41 holograms now momentarily glitch out when u interact with them (#89689)
## About The Pull Request
adds a new visual effect for holograms ,such as holosigns and several
holoanimals, where they'll glitch out when walked through, attacked, or
when a thrown object passes through them


https://github.com/user-attachments/assets/5c18e48e-6ea5-4e57-a7d4-6a9323e317f5



## Why It's Good For The Game
i think its good for the sake of immersion. also, if pai players feel
like this might get annoying i have no problems excluding them from this
effect.

## Changelog
🆑
add: adds a new glitch-out effect for holograms when they're interacted
with
/🆑
2025-04-15 11:25:57 +01:00
SmArtKar
dcae40e4e6 Invisible walls can be leaned on (#90564)
By dragging yourself onto a tile with an invisible wall on it, you can
lean on one.
2025-04-13 00:58:43 -04:00
SmArtKar
f00caffd90 Better metalgen logging and some behavior fixes (#90546)
## About The Pull Request

Metalgen imprinting is now logged, foam and smoke have better logging
and so do plasma metalgenned things, metalgen no longer causes a ton of
runtimes on almost everything and foam and smoke no longer affect
abstract objects.
Also ***hopefully*** solves the issue with infinite hotspot loops, but I
don't think anyone knows what exactly occured there.

## Why It's Good For The Game

If servers explode, admins need to know who did it and coders need to
know how they did it.

## Changelog
🆑
fix: Metalgen foam/smoke no longer cause an absurd amount of runtimes
fix: Foam and smoke no longer affect abstract objects like landmarks
admin: Metalgen imprinting is now logged
admin: Improved logging for foam and smoke, and plasma metalgenned
objects
/🆑
2025-04-12 14:57:46 +01:00
Ben10Omintrix
bf12b5b55d fixes being able to pull mobs while riding them (#90300) 2025-04-10 20:14:17 +02:00
John Willard
63e652eb37 Space cola removes rust (#90452) 2025-04-08 12:07:21 -07:00
TiviPlus
ada8b6392d balloon alerts and puzzgrids only spatial search for clients (#90477) 2025-04-08 12:04:34 -07:00
SmArtKar
b680b62929 Fixes watcher crusher trophies not applying their effects on basicmobs (#90466)
## About The Pull Request

Was missing a source arg, thus trying to get mob's bonus_value var and
runtiming.

## Changelog
🆑
fix: Fixed watcher crusher trophies not applying their effects on
basicmobs
/🆑
2025-04-08 16:40:26 +02:00