* Adds an IS_CHANGELING helper (#81228)
## About The Pull Request
What it says on the tin. I also replaced checks with it everywhere I
found appropriate, hopefully without accidentally breaking anything.
## Why It's Good For The Game
We have a helper for most other antags, and it makes code a lot cleaner
and easier to read. I'm surprised we didn't have this one already.
## Changelog
🆑
code: added an IS_CHANGELING() helper and used it where applicable
/🆑
* Adds an IS_CHANGELING helper
* skyrat stuff
---------
Co-authored-by: A miscellaneous Fern <80640114+FernandoJ8@users.noreply.github.com>
Co-authored-by: jjpark-kb <mccorvey.norman@gmail.com>
Kicks Martial Arts out of the attack chain (yippee), makes it use signals, plus a large clean up of existing martial arts (#81097)
- Kicks Martial Arts out of the attack chain.
- All Martial Arts attacks are now handled via unarmed attack or grab
signals
- This means all martial arts are now technically on the living level,
allowing any mob that can unarmed attack to martial arts. Sort of. YMMV.
- All martial arts block checking is now handled by the arts themselves,
meaning you can selectively decide for a martial arts strike to not be
blocked. Maybe good for the future.
- A comprehensive cleanup of all existing martial arts. Improving var
names, code, adding some missing animation calls, etc.
Fixes#74829
Untangles the mess that is martial arts, making it a lot easier to work
with the attack chain and making it overall a ton more consistent.
🆑 Melbert
refactor: Big martial arts refactor, they should now overall act a ton
more consistent. Also technically any mob can do martial arts. Let me
know if something is funky.
/🆑
---------
Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* Dynamic Husk Icons (#81080)
Husk icons are now generated dynamically by greyscaling the limbs and
applying the husk blood overlay
rather than everything using the same husk sprite
Less sprites needed, also good for nonhuman races especially those with
non-humanoid shapes
All that is needed for a husk icon now is a blood overlay instead of an
entire limb set
Human, Lizard, Moth, Monkey husks
PIC IS A BIT OUTDATED, THE BLOOD IN PIC IS DARKER THAN HUSK BLOOD
(fixed) AND IT DOESNT "FIT" TO LIMB SPRITE (fixed)

🆑
refactor: Husk icons are now dynamically generated. See if you can
identify what species it was!
/🆑
* Design datum time cleanup (#81133)
Fast little PR, with the autolathe and design datum time changes, I saw
that we didn't have design datums moved over to using time defines
uniformly, and in a few cases the times were using material quantity
defines (oops!), so I've quickly moved those over to using our correct
time defines as guided by common sense.
Cleans up the code for this section going forward so that when everyone
copypastes a new design datum for the next feature at least we're using
consistent and correct standards.
No player facing changes.
* Hmmm
* uh oh not yet
* Yo, this should do the trick.
---------
Co-authored-by: 13spacemen <46101244+13spacemen@users.noreply.github.com>
Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
* split area.contained_turfs up by zlevel, make init 10 seconds faster (#80941)
## About The Pull Request
Situation: areas have a list of all turfs in their area.
Problem: `/area/space` is an area and has a 6 to 7 digit count of turfs
that has to be traversed for every turf we need to remove from it. This
can take multiple byond ticks just to preform this action for a single
space rune
Solution: split the list by zlevel, and only search the right zlevel
list when removing turfs from areas.
replaces `area.get_contained_turfs()` with a few new procs:
* `get_highest_zlevel()` - returns the highest zlevel the area contains
turfs in. useful for use with `get_turfs_by_zlevel`
* `get_turfs_by_zlevel(zlevel)` - returns a list of turfs in the area in
a given zlevel. Useful for code that only cares about a specific zlevel
or changes behavior based on zlevel like lighting init.
* `get_turfs_from_all_zlevels()` - the replacement for
`get_contained_turfs()`, renamed as such so anybody copying/cargo
culting code gets a hint that a zlevel specific version might exist.
Still used in for loops that type checked so byond would do that all at
once
* `get_zlevel_turf_lists()` - returns the area's zlevel lists of lists
but only for non-empty zlevels. very useful for for loops.
The area contents unit test has been rewritten to ensure any improper
data triggers failures or runtimes by not having it use the helpers
above (some of which ensure a list is always returned) and access the
lists directly.
* split area.contained_turfs up by zlevel, make init 10 seconds faster
* eeyes
* Update area_spawn_subsystem.dm
* Unshits turf contain code slightly (#81023)
Literally just implements my reviews from #80941
I am frankly a smidge pissed that the pr was merged without them being
handled. No code is worth merging past known issues, and if the author
is just gonna dip then that's life.
I don't like privileging mso on stuff like this, especially because
frankly I'm kinda mad at him rn but also because when a pr is made the
onus on finishing it falls to the person who made it.
Should not need to clean up after someone as a maintainer, and shouldn't
normalize doing it. I'm not like mad at zypher directly mind he offered
to do this too, just the idea he was espousing here.
---------
Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fixes assorted head harddels, removes specific organ vars in head (#80950)
Fixes#80926, fixes#80372
The tongue, eyes, ears and brain vars were also being updated and
cleared elsewhere, runtiming whenever a regular head got dismembered and
then emptied, which would eventually cause a harddel due to improper
clean-up
I've fixed the errant proc and just removed those vars because I don't
like having duplicate references for no reason (they should always
already be in contents)
Not player facing
* Fixes assorted head harddels, removes specific organ vars in head
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
* Optimizes Reftracking (Bigly) (Plus harddel fixes) (#80443)
## About The Pull Request
### Reftracking BS
Alllright so reftracking is slow, really really slow.
That's a problem for me, both because I want it to be fast so I can more
efficiently torture players by running it on live, but also because it
impedes both local and CI runs.
So I've set out to micro optimize the DoSearchVar proc, one of the
hottest in the game.
I've done this in a few different ways.
#### The simple shit
Removing redundant proc args
Yeeting assoc arg setting (extra cost)
Moving if statements around to prioritize the more common case
Ignoring empty lists.
#### The not simple shit
Throwing our snowflake list checking into the sun
(Background, byond has some special lists that cannot be accessed like
an assoc list, trying to will lead to runtimes)
The way we handle this involves inspecting their ref string, and it eats
a LOT of time.
Faster then to mark all the lists we know are special by var name, and
then use try/catch to detect and silence anything that sneaks through
(this is on the order of like 1/3 per run, kinda curious what they are
tbh)
Thanks to MSO for the idea for this btw.
Removes the vars and logic that tied ref searching to clients.
It's not how this code is used, and it slows everything else down for
really no reason
Added support for handing in a known "hanging reference" count, and then
searching for that.
This lets us early exit the ref search if we find everything we were
looking for, which is REALLY powerful, and why I asked for refcount() in
the first place.
### Harddel Fixes
[Fixes some harddels w gulag stuff born of the 515 one way ref
issues](046d7daa03)
[Ensures proximity cameras clean their ref to their proximity datum if
it's
deleted](ff607e9ccb)
[Deleting a pipe connected via the gas_machine_connector datum to a
machine should also delete that machine (harddel
fix)](9eecca22e7)
## Why It's Good For The Game
All this combined speeds up refsearching massively, on the order of
hundreds of seconds, and makes it far less time consuming for both CI
and running on live.
I'll be bullying some servers semi soon, want to see what I can cut out.
* Optimizes Reftracking (Bigly) (Plus harddel fixes)
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Yeets Hallucination GFI for Images (#80859)
## About The Pull Request
THEY PRODUCE IMAGES ANYWAY WE CAN JUST COPY THE MA
AHHHHHHHHHHH
* Yeets Hallucination GFI for Images
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
* Fixes confetti shotgun shells (#174)
* initial
* fix confetti shell
* donkpocket sprites and more
* this is for a different PR
* forgot these
* ..()
* reviews
* // instead of /// for overrides
---------
Co-Authored-By: Bloop <13398309+vinylspiders@users.noreply.github.com>
* New Quirk: Appendicitis Survivor (#77)
## About The Pull Request
Title.
## How This Contributes To The Nova Sector Roleplay Experience
Spontaneous appendicitis is.. an event!
This adds the Appendicitis Survivor quirk from my server,
[TaleStation](https://github.com/TaleStation/TaleStation).
Its a positive (-2) quirk, while low impact, some people may appreciate.
Its also another low cost quirk, so people could pick it up if so
desired.
## Proof of Testing
<details>
<summary>Screenshots/Videos</summary>

</details>
## Changelog
🆑 Jolly
add: New quirk for those who hate their appendix: Appendicitis Survivor!
A positive (-2) quirk.
/🆑
* Improves the names, descriptions, and extended descriptions of nearly all my firearms (#90)
<!-- 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. -->
Three steps
1. Guns no longer list their company in their name, this made some gun
names too long to refer to or just look weird.
2. Every gun now tells you what it fires in its examine if it didn't
before.
3. Every gun's examine text now hints that you can double examine for
more info on the weapon.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
Makes a lot of information about these weapons more convenient or more
apparent than they were before, and removes some unneeded information
(like we didnt really have to have the guys that made the gun displayed
straight in the name, you can see the company that makes them in the
examine text already).
<!-- Please add a short description of why you think these changes would
benefit the game and the roleplay atmosphere of the server. If you can't
justify it in words, it might not be worth adding. -->
<!-- Include any screenshots/videos/debugging steps of the code
functioning successfully, between the </summary> and </details> code
blocks. -->
<!-- To our mappers and spriters: Posting screenshots of content INSIDE
EDITORS (aseprite, PDN, SDMM, ect) is NOT valid proof of testing. Please
make sure that you COMPILE the game and provide PROOF you tested your
edits. -->
<details>
<summary>Screenshots/Videos</summary>


</details>
<!-- 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 it's 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. -->
🆑
qol: The names and descriptions of every paxilmaniac weapon have been
improved to be shorter (names) and mention at least what bullet the
weapon fires (description)
qol: Every weapon with an extended description has a hint in its normal
examine telling you that you can look further to get more info on the
weapon
code: Two instances of now-deleted weapons paths (which i found out
about through someone getting one in a christmas tree) existing due to
manufacturer examines of all things have been cleaned up, players wont
notice this one i think
/🆑
<!-- 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. -->
* Re-adding Cat Scream (Normalized) (#123)
* Re-adding Cat Scream (Normalized)
* Update modular_nova/modules/emotes/code/scream_datums.dm
Renamed the file from cat.ogg to cat_scream.ogg
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
* Renamed cat.ogg to cat_scream.ogg
* removed cat.ogg and replaced with cat_scream.ogg
* Removes old scream sounds, renames it properly
---------
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
* [MODULAR] Fixes clockcult slab ui, some runtimes (#122)
Fixes slab ui, some runtimes
* [MODULAR] Fixes colonial cloaks not being able to hold any suit storage items (#129)
* Fixes imperial police cloak not being able to hold any suit storage items
* Moves this to the NRI police cloak
* Moves this to the NRI police cloak
* Update clothing.dm
* Update modular_nova/modules/novaya_ert/code/police_outfit.dm
---------
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
* Resprited Vox Clothing (Nova Station Edition) (#97)
* Resprited Vox Clothing
* Update screenshot_humanoids__datum_species_vox_primalis.png
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Chitter emote is the TG chitter sound unless you're a moth (#111)
<!-- 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. -->
Changes the *chitter emote to play the standard TG chitter sfx, unless
you're a moth, then it plays the moth chitter.
TG chitter is cute.
<!-- Include any screenshots/videos/debugging steps of the code
functioning successfully, between the </summary> and </details> code
blocks. -->
<!-- To our mappers and spriters: Posting screenshots of content INSIDE
EDITORS (aseprite, PDN, SDMM, ect) is NOT valid proof of testing. Please
make sure that you COMPILE the game and provide PROOF you tested your
edits. -->
<details>
<summary>Screenshots/Videos</summary>
https://github.com/NovaSector/NovaSector/assets/77534246/eae4fc45-d104-4588-8537-394da9304151
</details>
<!-- 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 it's 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: Chitter emote has a different sound effect, unless you're a moth
/🆑
* Adds fancy masquerade masks (#180)
* Adds masquerade masks, making them available in the AutoDrobe
Thanks to Crumpaloo for the sprites!
* Early mirror of https://github.com/tgstation/tgstation/pull/80663
They're not properly usable otherwise
* Updates the sprites so they've got transparent eyes
* Adds the masks to the loadout
* Fixes variation flags and muzzled GAGS config, makes it act as internals
* Adjust some of the sprites a bit more, making snouted ones have smaller eyeholes, and vox ones looking more like masquerade masks
* Updates the sprites for the Vox Primalis!
---------
* Update greyscale_configs.dm
* Fixes Niftsoft Settings Panel (#208)
Fixes Niftsoft Settings
* 0
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Kyogon <30851775+Kyogon@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
Co-authored-by: HalcyonicWolf <mmeade362@gmail.com>
Co-authored-by: SomeRandomOwl <2568378+SomeRandomOwl@users.noreply.github.com>
* hygeienbots basic bots (#80435)
## About The Pull Request
turns hygenic bots into basic bots. also now PAIs and people can play as
hygeinebots. and they can wear hats
## Why It's Good For The Game
transforms hyginebots into basic bots. their old AI used to handle all
the logic. i moved some of the logic to the mob itself so players can
also clean (or burn) things. also this pr will add pathing limits to
bots, in the case the jps movement thinks it can reach something, but
actually cant, in which case the bot will give up the chase
## Changelog
🆑
refactor: hygeinebots are now basic bots. please report all the bugs
fix: fixes hygenebots not being able to patrol
add: hygeinebots can now be controlled by Players
/🆑
* hygeienbots basic bots
---------
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
* Creates a unit test for loadout item duplicates
* Update loadout_dupes.dm
* Update loadout_dupes.dm
* Update loadout_dupes.dm
* Update loadout_datum_under.dm
* I'm going to put the cargo shorts under misc/under
* Revert "I'm going to put the cargo shorts under misc/under"
This reverts commit e4cdbd80e42424091ad76be67502ced2cbadec13.
* Deletes unused hydroponics code (#80156)
## About The Pull Request
`/obj/item/seeds/sample` was completely unused, ever since it's
inception in #16082
(d513f52244)
as far as I can tell
(Me when "adds plant samples for future use" never makes use of them in
the future)
All this does is complicate hydro code so it dies.
Anything it is doing should be handled by genes probably
While I was here I made sure nothing in `can_add` will break and touched
up the code a tiny tiny bit. I kept it as `SHOULD_CALL_PARENT` even
though it doesn't make use of it at the moment because every trait
currently calls parent / respects return value, so sure, why not
## Changelog
Not necessary
* Deletes unused hydroponics code
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
* Adds medical record descriptions for quirks without any
* Fix Conflict, Preserve SR edit
* Updates Ration Ticket with medical Records
* Two more quirks
---------
Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com>
Co-authored-by: SomeRandomOwl <somerandomowl@ratchtnet.com>
* basic cats and mini kitchen helpers (#79800)
## About The Pull Request
this pr transforms cats into basic pets! cats now have some new
behavior. they can carry fish and hunted mice in their mouths to deliver
it to kittens, and kittens will eat them.


if a kitten sees you holding food, it will point at you and meow loudly
until u give it the food.
becareful when putting male cats near each other, there is a small
chance they get into a heated argument and meow loudly at each other
until one of them flees.
also added a new small cat house for cats. cats will use these homes if
u build one near them (using 5 wood planks)

Chefs can craft the cake cat and breadcat. these are useful cats because
they can help the chef around in the kitchen. they will turn stoves and
grills off when food is ready, so they dont burn. and the cake cat will
help the chef decorate his donuts
## Why It's Good For The Game
refactors cats into basic mobs and gives them a deeper ai
## Changelog
🆑
refactor: cats are now basic pets. please report any bugs.
add: the cake cat and bread cat can now help the chef around in the
kitchen
/🆑
* basic cats and mini kitchen helpers
* Modular
---------
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Bumps compile to 515 (#79134)
## About The Pull Request
LSP supports it, let's GOOOOOO
I've removed the 515 tests since they're stable, alongside the libcall
wrapper. left the rustgcall wrapper cause yaknow memes
Just removed all the 515 and 514 particular define wrappers. gaming
## Changelog
🆑
server: Minimum compile version has been bumped to 515. clients still
support 514 but we're gonna start using 515 restricted features for
serverside now.
/🆑
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
* Bumps compile to 515
* Fixes a TGS regression in its API
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
* Fixes failure state indication message (#79988)
This is actually determining if the item was deleted before it had a
chance to Initialize.
* Fixes failure state indication message
---------
Co-authored-by: oranges <email@oranges.net.nz>
* Add the space turf type to the space unittest (#79986)
This might seem pointless, but it helps identify spurious failures due
to something else blowing a hole in the station before this test runs.
* Add the space turf type to the space unittest
---------
Co-authored-by: oranges <email@oranges.net.nz>
* Fixes hearing messages from speakers on another z level (515 fix) (#79888)
515 changed get_dist to return inf when either end is on another z
level, instead of just the maximum range. `/mob/living/Hear` early
returns when the speaker is too far away to hear. Previously we would
get around this by passing in INFINITY as the range for the message, but
the INFINITY define is just a very large number instead of real infinity
which is what byond gives back for get_dist.
I also improved the unit test a little while debugging this.
* Fixes hearing messages from speakers on another z level (515 fix)
---------
Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com>
* Monkey Business actually spawns monkeys on the station. (#79276)
## About The Pull Request
The monkey business unit test was apparently not actually spawning
monkeys on the station like it was supposed to. It was trying to find
open turfs inside of area _typepaths_, which obviously do not contain
turfs. Functionally, this means it was summoning a number of monkeys
into the same turf of the unit test z-level equal to the number of areas
on the station map. Now it will actually place one monkey in every area
of the station itself.
This was an incidental discovery while trying to diagnose #79147 with
Jacquerel. We still don't know what's causing that one, and I doubt this
will do anything about it, but nonetheless the unit test wasn't working
right.
## Why It's Good For The Game
Makes a unit test do what it was actually intended to do, which is put a
bunch of monkeys all over the station and see if they ruin anything.
This might actually cause _more_ test failures since they're being put
in a less controlled environment, but we'll see.
## Changelog
Nothing player facing.
* Monkey Business actually spawns monkeys on the station.
---------
Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Reworks transformation sting to be temporarily in living mobs, forever in dead mobs
* Modular updates
* Recaches the icons generated in the `changeling` unit test
* Pain
* More tweaks
* Disable unit test
* Let's see if we can pass test temporarily
* Makes transformation sting unobtainable more cleanly
* Unit test
* Cursed proc
* Kill the unholy copy pasta
Seriously this stuff is just awful. This is not maintainable.
* test this
* Update comments
* Fixing the screenshot test, maybe?
* grrr
* Update changeling.dm
* Attempt to fix this nonsense
* Update changeling.dm
* Update changeling.dm
* Update changeling.dm
* Update dna.dm
* Fixes it?
* Screenshot test
* Update _traits.dm
* Update _traits.dm
* Fix this
* Update dna.dm
* Update dna.dm
* Hmm
* This proc needs a new name
* I want to scream but I have no mutant parts
* Fix
* Update species.dm
* Update species.dm
* Update species.dm
* Update species.dm
* Some touch ups
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Jolly <70232195+Jolly-66@users.noreply.github.com>
* Refactors Parrots into Basic Mobs (ft. Ben10Omintrix/Kobsamobsa)
* UpdatePaths
* Modular, cleanup, porting parrot commands into the new system
* makes poly slightly less of a dick
* Update parrot.dm
* Update parrot.dm
* Update tgstation.dme
* Revert "Update tgstation.dme"
This reverts commit a8b40c4aba524c271db02c271089664649dea1eb.
---------
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Calls Allocate on the spawn humans unit test humans (#79827)
## About The Pull Request
I have found a unit test that spawn instances of
`/mob/living/carbon/human/consistent`, without using `allocate`, so they
won't get into the list of things to be deleted when CI finishes
running. This PR ensures that they won't stick around after the unit
test has finished.
I kept them picking a random tile from the unit test room, instead of
going with `allocate`'s default of the test area's bottom left corner.
Could have maybe swapped it to pick_n_take so there is no chance of them
piling up, but that is not relevant to the CI issue.
## Why It's Good For The Game
Maybe this will stop the random CI failures where
`/mob/living/carbon/human/consistent` fails to be deleted.
## Changelog
Nothing player facing
* Calls Allocate on the spawn humans unit test humans
---------
Co-authored-by: Profakos <profakos@gmail.com>
* Fixes bug with high luminosity eyes, & fixes eyes being on the wrong side of the head! (#79760)
* Fixes bug with high luminosity eyes, & fixes eyes being on the wrong side of the head!
* Screenshot test
* Merge skew
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Splits placeontop proc (#79702)
## About The Pull Request
I find the proc hard to read honestly. There's no reason we can't split
this into two functions - the secondary functionality is used only once,
in reader.dmm.
## Why It's Good For The Game
Code improvement
Glorious snake case
## Changelog
N/A nothing player facing
---------
Co-authored-by: san7890 <34697715+san7890@ users.noreply.github.com>
* Splits placeontop proc
* Update brass_spreader.dm
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: san7890 <34697715+san7890@ users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Fixes the EMP Barsign sprite not displaying (#79599)
## About The Pull Request
The logic that sets the icon_state had an error in it. When the sign got
emp'd, they'd get the `NOPOWER` flag which was causing them to get the
`empty` `icon_state` instead of that of the emped barsign.
This just fixes that by adding a conditional check for `EMPED`, and also
resprites the emissive lightmask for the emped barsign to match the
individual signs that make up its sprite, where previously it was just a
static square.
Also added it to the barsigns unit tests because I can see someone
breaking this again.
## Why It's Good For The Game
Fixes bug where emped barsigns would show the turned off sprite instead
of their animated sprite. Also improves the light mask:
Note: this is in complete darkness. The colored backdrops of the signs
are not supposed to be emissive.
<details> <summary>Before </summary>

</details>
<details> <summary>After </summary>

</details>

## Changelog
🆑
fix: emped bar signs will now display the correct sprite
image: added a more detailed lightmask for the emp bar sign sprite
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@ users.noreply.github.com>
Co-authored-by: orange man <61334995+comfyorange@ users.noreply.github.com>
Co-authored-by: Profakos <profakos@ gmail.com>
Co-authored-by: Changelogs <action@ github.com>
Co-authored-by: Jacquerel <hnevard@ gmail.com>
Co-authored-by: Andrew <mt.forspam@ gmail.com>
Co-authored-by: DaCoolBoss <142358580+DaCoolBoss@ users.noreply.github.com>
* Fixes the EMP Barsign sprite not displaying
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@ users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@ users.noreply.github.com>
Co-authored-by: orange man <61334995+comfyorange@ users.noreply.github.com>
Co-authored-by: Profakos <profakos@ gmail.com>
Co-authored-by: Changelogs <action@ github.com>
Co-authored-by: Jacquerel <hnevard@ gmail.com>
Co-authored-by: Andrew <mt.forspam@ gmail.com>
Co-authored-by: DaCoolBoss <142358580+DaCoolBoss@ users.noreply.github.com>
* Lemon fixes ci (#79384)
## About The Pull Request
Sets up moveloops to better catch issues with duplicated loops
Letting people modify the timer var AND have it track what bucket we're
in was a bad idea.
So instead let's store the queued time separate. Also makes
allowed_to_move return true/false instead of flags
This fixed? the null loop issue locally, I honestly have no damn idea
why. I'm gonna be working on the rest of ci here, left trackers so if it
pops up between now and merge I'll know what the issue is.
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
Co-authored-by: Emmett Gaines <ninjanomnom@ gmail.com>
* Lemon fixes ci
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com>
Co-authored-by: Emmett Gaines <ninjanomnom@ gmail.com>
* Basic Guardians/Holoparasites (#79473)
## About The Pull Request
Fixes#79485Fixes#77552
Converts Guardians (aka Holoparasites) into Basic Mobs.
Changes a bunch of their behaviours into actions or components which we
can reuse.
Replaces some verbs it would give to you and hide in the status panel
with action buttons that you may be able to find more quickly.
They _**should**_ work basically like they did before but a bit
smoother. It is not unlikely that I made some changes by accident or
just by changing framework though.
My one creative touch was adding random name suggestions.
The Wizard federation have a convention of naming their arcane spirit
guardians by combining a colour and a major arcana of the tarot. The
Syndicate of course won't truck with any of that mystical claptrap and
for their codenames use the much more sensible construction of a colour
and a gamepiece.
This lets you be randomly assigned such creative names as "Sparkling
Hermit", "Bloody Queen", "Blue World", or "Purple Diamond".
You can of course still ignore this entirely and type "The Brapmaster"
into the box if so desired.
I made _one_ other intentional change, which is to swap to Mothblocks'
nice leash component instead of instantly teleporting guardians back to
you when they are pulled out of the edge of their range. They should now
be "dragged" along behind you until they can't path, at which point they
will teleport. This should make the experience a bit less disorienting,
you have the recall button if you _want_ to instantly catch up.
This is unfortunately a bumper-sized PR because it did not seem
plausible to not do all of it at once, but I can make a project branch
for atomisation if people think this is too much of a pain in the ass to
review.
Other changes:
- Some refactoring to how the charge action works so I could
individually override "what you can hit" and "what happens when you hit"
instead of those being the same proc
- Lightning Guardian damage chain is now a component
- Explosive Guardian explosive trap is now a component
- Added even more arguments to the Healing Touch component to allow it
to heal tox/oxy damage and require a specific click modifier
- Life Link component which implements the Guardian behaviour of using
another mob as your health bar
- Moved some stuff about deciding what guardians look and are described
like into a theming datum
- Added a generic proc which can return whether your mob is meant to
apply some kind of damage multiplier to a certain damage type. It's not
perfect because I couldn't figure out how ot cram limb modifiers in
there, which is where most of it is on carbons. Oh well.
- Riders of vehicles now inherit all movement traits of those vehicles,
so riding a charging holoparasite will let you cross chasms. Also works
if you piggyback someone with wings, probably.
## Changelog
🆑
refactor: Guardians/Powerminers/Holoparasites now use the basic mob
framework. Please report any unexpected changes or behaviour.
qol: The verbs used to communicate with, recall, or banish your Guardian
are now action buttons.
balance: If (as a Guardian) your host moves slightly out of range you
will now be dragged back into range if possible, rather than being
instantly teleported to them.
balance: Protectors now have a shorter leash range rather than a longer
one, in order to more easily take advantage of their ability to drag
their charge out of danger.
balance: Ranged Guardians can now hold down the mouse button to fire
automatically.
balance: People riding vehicles or other mobs now inherit all of their
movement traits, so riding a flying mob (or vehicle, if we have any of
those) will allow you to cross chasms and lava safely.
/🆑
---------
Co-authored-by: san7890 <the@ san7890.com>
* Basic Guardians/Holoparasites
* Modular
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: san7890 <the@ san7890.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Better modularized barsigns
* Update barsigns.dmi
* Update barsigns.dm
* Update barsigns.dm
* Convert to 64x32
* Update barsigns96x96.dmi
* Update barsigns.dm
* Update barsigns.dmi
* Found the missing D on the meadbay sign
* meadbay sign again
* Fix the unit test
* More light masks + removes duplicate empty and emp sprites
* More light masks
* Tardis light mask, some fixes for stray pixels
* Cleaned up some pixels
* A few more light masks
* Update barsigns.dm
* Update barsigns.dm
* Mafia now starts without admin intervention (#79348)
## About The Pull Request
Mafia should now start without the need of admin intervention.
I made a unit test that should always have a PDA and a ghost spawning in
a game of Mafia and having it run through basic setup to confirm they
both successfully sign up and the game starts.
I had to change a lot of things in order to get this working, such as
giving unique ckeys to mock clients, fixing harddels in Mafia, and
plenty of minor fixes. This is the first time any of this code is put in
CI, so a lot of uncaught errors are now showing their faces.
Because loading maps mid-round runtimes due to smoothing, I have mafia
their own unit test-only map that doesn't use smoothing.
I also split the mafia ui code into its own file, and moved a single
helper that was sitting around in mafia's file into a helpers file.
I also added some comments to explain why certain things are the way
they are, because I wrote some undocumented code previously and forgot a
few things, leading to self-inflicted wasted time.
## Why It's Good For The Game
^
## Changelog
🆑
fix: Mafia games can now start properly.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
* Mafia now starts without admin intervention
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
* Basic Wizards (#79476)
## About The Pull Request
Makes NPC wizard mobs into basic mobs. These aren't actually used
anywhere, since their away mission was removed, so I figured I'd have
some fun with them.

Noteworthy changes are as follows:
- Wizard mobs can now wear any of the four basic colors of wizard robe
and hat. Rarely, they will wear the witch ("Marisa") outfit instead.
There was going to be a rare Tape Wizard spawn too, but the outfit
doesn't work correctly for some reason (see comments below).
- Wizard mobs no longer have a set spell loadout. Instead, they always
receive a random **targeted, primary spell**, a random **untargeted,
secondary spell**, and the spell **Blink**.
- Wizard subtypes (or var-edited wizards) can have any of the above
specified rather than random.
- Wizard AI will try to avoid ever being in melee, and will fire off
spells whenever possible with the priority order of primary > secondary
> blink. There is a mandatory 1-second waiting period between casts.
- Wizard mobs use "lesser" versions of Fireball and Blink. Lesser
Fireball does a little less damage and has a smaller explosion, though
it is still extremely dangerous. Lesser Blink simply has a smaller blink
radius so that wizard mobs don't just decide to leave.
Depending on their spell loadout, wizards can be _incredibly_ dangerous
mobs - stunning you with tesla blasts, shooting you with fireballs, and
more. Even weakened, fireball is the nastiest of these by far, able to
set you on fire or remove your limbs if you aren't properly protected.
Watch out!
The random lists have been kept pretty small, since I only wanted to use
spells that I know for sure work. Spell cards is pretty weak in AI
hands, since they don't take advantage of the fact that a human player
can spam it, but I wanted there to be a little variety in primary
attacks.
I included an UpdatePaths script here in case a downstream is using
these, but I doubt it was necessary.
## Why It's Good For The Game
Removes another simplemob.
The actual impact of this change is negligible, since this is an unused
mob, but it's possible that this lays the groundwork for these actually
being used - particularly since mappers can make them as powerful or
weak as they want by specifying a spell loadout. Wizards may make for a
tough boss challenge for a ruin or away mission, or a very mean surprise
for an admin to drop on an unsuspecting station.
## Changelog
As this is an unused mob, there are no player-facing changes.
* Basic Wizards
---------
Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com>
* Basic Shades (#79469)
## About The Pull Request
Makes shades into basic mobs. As they are solely player-controller and
have no AI, this was a very simple conversion.
Things of note:
- I've made shades use the same "theme" system as constructs, to
determine their drops and coloration - as opposed to these things being
manually set by the type of soulstone they're held in.
- I've reorganized files slightly, putting both constructs and shades in
a new "cult" basic mob folder.
That's more or less it. As I said, shades are simple.
## Why It's Good For The Game
Basic-izes another mob and cleans up the code a little. Removes the last
cult-related simplemob, too.
## Changelog
🆑
refactor: Shades now use the basic mob framework. Please report any
bugs.
/🆑
* Basic Shades
---------
Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com>
* Removes virtual-specific megafauna, fixes boss map issues [NO GBP] (#79424)
## About The Pull Request
Another atomization of the content patch-
Let's not subtype everything into virtual variants
This also fixes some bugs that were present with vdom boss maps
- Made the bubblegum map larger so he wouldn't teleport out
- Legion is just far too annoying to have to fix code wise, given that
few if anyone tries it with the base virtual equipment
<details>
<summary>what do you mean too annoying?</summary>
Legion doesn't handle dying like the standard megafauna - each time it
"dies" it looks to see if there's another legion in the entire game
world. Given the real one very likely exists, this basically means it
won't drop anything. I'd have to modify legion's death proc specifically
for the virtual domain. No other megafauna has this level of weirdness
(nor splitting behavior) and coupled with the fact I think no one tries
the domain, I'm just removing it.
</details>
## Why It's Good For The Game
Cleans up megafauna subtypes that were specific for the virtual domain.
Now, we won't need to keep adding to the list if there's ever a new one
Fixes#79203Fixes#79200
## Changelog
🆑
fix: Bubblegum should no longer teleport out of the simulation when
threatened
del: Chamber of Echoes map removed as it conflicts with the actual
Legion
/🆑
* Removes virtual-specific megafauna, fixes boss map issues [NO GBP]
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
* Basic Constructs: Proteon (#79425)
## About The Pull Request
Last one! Makes proteons into a basic mob, and completely removes the
simple_animal construct supertype.
Proteons aren't really designed to be played by a player, instead being
a nuisance mapped into various ruins and traps. As such, they don't
really have any special abilities. Instead, the hostile variant has a
somewhat unique behavior. They'll viciously attack anyone who comes
close, but, being frail little cowards, if a proteon takes damage it
will immediately flee. After a random period between 2 and 4 seconds, it
will stop fleeing and come back for more.
In addition to this, a few other things have been done, some only
related because they're in files I touched.
- Moved proteons from the file for the Cleric's Den to their own file in
the basic constructs folder. Given that they're used in several
different ruins, they might as well not just be in the file for one.
- Simple constructs have been cut, and with them the procs for
healing/repairing on shades and cult structures, as those are no longer
needed.
- Because I was touching it anyway, I touched up the file for trap
structures. They no longer use any one-letter variable names, and time
is now universally listed in seconds rather than deciseconds in that
file.
- I removed a completely unused blackboard key from ice demons. This is
something I noticed due to a change I ended up not making while working
on proteon AI, but I figured I might as well leave it gone.
## Why It's Good For The Game
Kills the last three simple construct typepaths, bringing us to the
destined 19 removed. Huzzah!
The proteon AI routine should inject a little spice into fighting
proteons, especially for the unprepared - unlike many mobs, they won't
stand there and take it if you decide to fight back, but you can never
safely ignore them when they run away. They still aren't particularly
dangerous.
## Changelog
🆑
refactor: Proteon constructs now use the basic mob framework. The ones
encountered in ruins are a bit flightier now, and will briefly flee
combat if attacked - only so that they can return and menace you again
soon after. Please report any bugs.
/🆑
---------
Co-authored-by: san7890 <the@ san7890.com>
* Basic Constructs: Proteon
* Update defcon2.dmm
---------
Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com>
Co-authored-by: san7890 <the@ san7890.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Basic Constructs: Wraith (#79235)
## About The Pull Request
Converts wraith constructs to basic mobs. The last of the "mainline"
constructs, though there's still one to go after this.
Wraiths are pretty much the same as they've always been - speedy
constructs that pack a bit of a punch, built around doing hit-and-run
tactics with their ability to ethereal jaunt. Notably, I've converted
their ability to recharge their jaunts with attacks into a new
component, `recharging_attacks`. This can be placed on any basic mob to
let them recharge a cooldown action by landing hits, which could
possibly be useful in the future.
NPC wraiths are pretty straightforward, with a twist - they will always
chase down and beat to death the lowest-hp mob they can see. Happening
upon one of these while wounded will end very badly! While I originally
wanted them to be more flighty and use hit-and-run tactics, I couldn't
figure out a way to do this that didn't look kind of silly and make them
less effective overall.
In addition to the wraiths, I've done some much-needed cleanup to basic
constructs as a whole, improving some things and covering some things I
missed along the way.
- Ectoplasm drop types from constructs is now properly based on their
theme. I _believe_ I've done this in a way that will pass unit tests
this time, but we'll see if my local tests were being honest with me.
- Player-controlled constructs now attack faster. I didn't realize that
being basic mobs capped them to attacking once every 2 seconds, which is
a gigantic nerf over the simple animal version. I cut this to just 1
second, which should be much closer to how it originally was.
- Artificers actually seek out and heal the most damaged ally they can
find, instead of the least damaged. Turns out the sort was doing the
exact opposite order from what I thought, which became much more obvious
when using the same targeting behavior on wraiths.
- I put the PR number in the juggernaut update script, which I somehow
missed on that one.
- Removed the extraneous "noncult" construct subtypes that didn't do
anything. The Artificer one, which does something, is still around.
## Why It's Good For The Game
For the same reasons as the previous three. 5 more simple animals gone,
and only one construct to go until I can nuke simple constructs from the
codebase entirely. Other than that, the new component could possibly
come in handy in future designs, and the NPC behavior should hopefully
be a little scary - even if just a little.
## Changelog
🆑
refactor: Wraith constructs have been converted to the basic mob
framework. NPC wraiths are now extra cruel and will attack the
lowest-health mob they can see at any given time. Make sure this isn't
you! Please report any bugs.
fix: Artificers and juggernauts no longer attack significantly more
slowly than intended.
/🆑
* Basic Constructs: Wraith
* Update defcon2.dmm
---------
Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Basic Pirate NPCs (#79284)
## About The Pull Request
Converts hostile pirate NPCs to basic mobs - specifically, a subtype of
trooper. As their behavior is not meaningfully distinct from other
troopers, this conversion mostly just sticks them on the existing AI
behavior while keeping the rest the same.
Pirates do have one new thing going for them, though, to differentiate
them from other troopers. They use the new **plundering attacks**
component, which means that every time they land a melee attack, they
steal money from the bank account of whoever they hit. This requires the
target to be wearing an ID with a linked bank account, so it's not the
hardest thing in the world to hide your money from them - but it's still
something to be wary of! If killed, any mob with this component will
drop everything they've stolen in a convenient holochip.
## Why It's Good For The Game
Takes down 5 more simplemobs, and (I think) converts the last remaining
trooper-type enemy to be a basic trooper. (It's possible there's more
I've forgotten that could use the same AI, though.)
The money-stealing behavior is mostly good because I think it's funny,
but it also makes the pirates something a little distinct from "yet
another mob that runs at you and punches you until you die". They still
do that, but now there's a little twist! This can be placed on other
mobs too, if we want to make any other sorts of thieves or brigands.
## Changelog
🆑
refactor: Pirate NPCs now use the basic mob framework. They'll be a
little smarter in combat, and if you're wearing your ID they'll siphon
your bank account with every melee attack! Beware! Please report any
bugs.
/🆑
* Basic Pirate NPCs
* Modular paths
---------
Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Converts traders to basic mobs (#79187)
## About The Pull Request
This PR converts the two trader mobs into basic mobs, these being the
basic debug trader that buys ectoplasm and sells ghost burgers, and Mr
Bones, who buys empty milk cartons and bones, and sells bone relate
paraphernalia.
Traders now use dynamic appearance generation. The old sprites still
exist as hallucinations, and as shop signs.
Trader UI is now summoned via `COMSIG_ATOM_ATTACK_HAND`, which properly
cancels the attack chain, so there is no longer need to put it on
Interact.
I kept most of the original behaviour, but moved them off into a
component. I have also cached all the images generated for the radials,
I hope I have not overengineered it. I have also created a new datum,
which stores the trader's wares, needs, and speech patterns.
Admins can put the component along with the trader data on any living
mobs with an AI controller, turning them into traders. Keep in mind that
most AI has random idle movement, meaning they have a chance to walk
off, closing your trader radial.

The trader AI consists of the following, first, when a trader sees
someone, they will deploy their shop, if one does not already exists.
The shop consists of a chair, and a holographic sign. If you attack
them, they will chase you with their weapons, and then return to their
chair when victorious. If the chair is somehow destroyed, they will
create a new shop when they see a new potential customer.

Mr Bones uses a variant of the AI, where they will run at you, and
deploy their shop when they reach you. I call this the jumpscare
variant. Below you can see me getting actually jumpscared because Mr
Bones has stepped on a yelling frog when I opened the maintenance door.

I have also made an element that toggles an ai controlled combat mode
when it gains a target, and when it loses it. I am using it to make
Traders unable to trade while they are trying to kill a robber. To aid
this, I a have made
`/datum/ai_controller/proc/sig_remove_from_blackboard` send the
`COMSIG_AI_BLACKBOARD_KEY_CLEARED` signal, in case the trader kills a
mob that deletes itself on death. This means I could remove a signup
`/datum/component/appearance_on_aggro` was doing towards Qdeleting.
Below you can see Mr Bones shooting me with candy corn.


Traders actually only shoot you until you are conscious, so I survived
here in crit. Most mobs don't have crit state, so they just die, so I am
sticking by this voice line.
Thank you @ CoiledLamb for help with the sale sign!
## Why It's Good For The Game
Two more mobs off the list. The AI and Componentized behaviours allows
us to set up new kind of traders.
## Changelog
🆑
refactor: Traders are basic mobs now. Please alert us of any strange
behaviours!
code: If there is only one option, radial lists will autopick it. This
behaviour can be turned off via a new argument.
/🆑
* Converts traders to basic mobs
---------
Co-authored-by: Profakos <profakos@gmail.com>