## About The Pull Request
Some changes to Cosmic and Knock heretic ascensions, in response to
feedback.
- Cosmic Heretics can no longer control their summon while jaunted.
- Additionally the death link element the Star Gazer used... wouldn't
work if there was more than one cosmic heretic. I refactored it into a
component, so that it would.
Frankly there are probably a lot of _other_ abilities which shouldn't be
usable while jaunted but are, but I have been burned in the past by
adding defaults which were applied too widely so we'll leave it
case-by-case for now.
- The Knock rift can no longer summon Flesh Worms of any kind.
- But it _can_ summon fire sharks (we really need to reflavour these...)
and any future "basic mob" heretic mobs (or ones which are converted).
- Additionally the rift can't be clicked by ghosts while it's polling
ghosts automatically because that would create funky empty-minded mobs.
- Finally it goes away when the heretic dies.
## Why It's Good For The Game
For Cosmic Heretics, controlling the Star Gazer in conjunction with
Space Jaunt essentially meant that the heretic was playing an RTS as an
invincible observer with an invulnerable unit, now they have to actually
be present and killable in order to sic The Beast on you.
For Knock Heretics, Minor Flesh Worms are a proof of concept which was
never meant to be used except by admins. They're _barely_ weaker than a
normal flesh worm, extraordinarily tanky, delete walls, and generally
devalue the Flesh path ascension.
Vanishing upon heretic death is because every _other_ ascension is at
least theoretically stoppable except this one. Now this one is too.
It's still _very hard_ to kill the heretic because every _10 seconds_
they can transform into a heretic mob which acts as an extra health
pool.
## Changelog
🆑
fix: If two cosmic heretics ascend in the same round, their star gazer
survival will be linked to each individual heretic and not shared by
just one of them.
fix: You can't click the Knock heretic portal to join as a mob while
already signed up to become a mob.
balance: Cosmic heretics can't order the Star Gazer around while
jaunting.
balance: The Knock Heretic portal cannot summon Flesh Worms, but can
summon Fire Sharks.
balance: The Knock Heretic portal will disperse if its creator is
killed.
/🆑
## About The Pull Request
What is says on the tin.
## Why It's Good For The Game
Prevents an exploit able to give you an exceptionally large blood head
start due to a series of magic mirror race choices and raceswapping,
allowing for almost unlimited casting due to how some species handle
blood volume and generation.
## Changelog
🆑
fix: Splattercasting resets your blood to normal values when you
transsform into a vampire.
fix: Gaining a new species will set your blood volume down to the normal
volume levels if higher than normal.
/🆑
## About The Pull Request
Fixes#71330
The brimdemon was basically already perfect (well, it has a novel means
of attacking) so I didn't get too fancy with this one, it's _largely_
just a straightforward conversion.
Following this change it's a little slower to back off, but better at
lining up with people in order to blast them. Additionally, its beam is
now a mob ability so you can give it to other mobs if you so desire.
Because I can't help doing a _little_ tinkering, Brimdemons now explode
2.5 seconds after they die, after a brief warning animation.
## Why It's Good For The Game
Simple mobs must die
## Changelog
🆑
add: Brimdemon corpses release an explosion shortly after death, just to
keep you on your toes.
refactor: Brimdemons now use the basic mob framework which (should)
improve their pathfinding somewhat. Please bug report any unusual
behaviour.
admin: The brimdemon's beam ability can be given to any mob, for your
Binding of Isaac event
/🆑
## About The Pull Request
Heavily refactors wounds AGAIN.
The primary thing this PR does is completely change how wounds are
generated and added - while the normal "hit a guy til they bleed" stuff
works about the same, asking for a specific type of wound, say, like how
vending machines try to apply a compound fracture sometimes, isnt going
to work if we ever get any non-organic wounds, which the previous
refactor allowed.
With this PR, however...
* You can now ask for a specific type of wound via
get_corresponding_wound_type(), which takes wound types, a limb, wound
series, etc. and will try to give you a wound fitting those
specifications - but also, a wound that can be applied to a limb.
* This will allow for a vending machine to apply a compound fracture to
a human, but a collapsed superstructure (assuming my synth wounds go in)
to a robot
There are now new "series types" and "wound specific types" that allow
us to designate what series are "mainline" and randomly generatable, and
what are "alternate types" and must be generated manually - you can see
the documentation in wounds.dm.
The behavior of limping and interaction delays has been abstracted to
datum/wound from bone wounds to allow just, general ease of development
Pregen data now allows for series-specific wound penalties. Example: You
could set a burn wound's series wound penalty to 40, which would make
wound progression in the burn category easier - but it would not make it
any easier to get a slashing wound. As it stands wound penalties are for
wounds globally
Scar files are now picked in a "priority" list, where the wound checks
to see if the limb has a biostate before moving down in said list.
Example: Wounds will check for flesh first, if it finds it - it will use
the flesh scar list. Failing that, they then check bone - if it uses
that, it will use the bone scar list. This allows for significantly more
modular scars that dont even need much proc editing when a new wound
type is added
Misc changes: most initial() usage has been replaced by singleton
datums, wound_type is now wound_types and thus wounds can accept
multiple wound types, wounds can now accept multiple tool behaviors for
treatment, wounds now have a picking weight so we can make certain
wounds rarer flatly,
This PR also allows for wounds to override lower severity wounds on
generation, allowing eswords to jump to avulsions - but in spirit of
refactoring, this has been disabled by default (see pregen data's
competition_mode var).
## Why It's Good For The Game
Code quality is good!
Also, all the changes above allow wounds to be a MUCH more modular
system, which is one of its biggest problems right now - everything is
kinda hardcoded and static, making creative work within wounds harder to
do.
## Changelog
🆑
refactor: Refactored wounds yet again
fix: Wounds are now picked from the most severe down again, meaning
eswords can jump to avulsions
fix: Scar descs are now properly applied
/🆑
## About The Pull Request
Hey there,
There were more than a few times (like in cinematic code) where we might
need to accurately know the source of what's adding this trait (or have
multiple sources for the whole 'we don't want this mob to do shit while
we transform this mob'), so in order to rectify this potential issue,
let's refactor it into a trait.
## Why It's Good For The Game
Some code already declared that there might be issues with this being a
boolean var (with no way of knowing _why_ we don't want this mob to not
transform (or not do anything idk). Let's remove those comments and any
future doubt in those instances with the trait macros. Also, stuff like
`TRAIT_IMMOBILIZED` which does a similar thing in many contexts was
already a trait that was regularly added in conjunction with flipping
the variable, so we're able to flatten all that stuff into
`add_traits()` and `remove_traits()` now. nice
I also cleaned up quite a bit of code as I saw it, let me know if it
should be split out but I guarantee that if I didn't do it- no one will
for the next two years.
## Changelog
🆑
refactor: If you transform into another mob and notice bugs with
interacting with the game world, please create a bug report as this
framework was recently refactored.
/🆑
Probably fucked up somewhere, lmk
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
oh apparently this is my 100th PR on tg, which is weird because github
reports 99 total, and i made at least one to the old voidcrew repo, and
filtering tg prs by my name still shows 99. weird. here's to 100 more i
guess?
<sub>could have been better if it was a get, jhonflupwliiard watch ur
back 🔫 </sub>
## About The Pull Request
Adds a new spell granter book to the Wizard's Den - Summon Cheese, which
grants the spell by the same name, which summons 9 heads of cheese.
That's about it, I think.
## Why It's Good For The Game
Wizards are a hungry bunch, so why can't they just summon food? They can
even share, if they'd like, since the notion of a friendly wizard still
exists
<details>
<summary>... </summary>
alright fine
i'm slightly malding over not getting the 77777 get so no more
roleplaying in the pr body
Wizard Grand Ritual now has a hidden goal of sacrificing 50 cheese
wheels. Sacrificing a cheese wheel is done with invoking the grand rune,
and each invocation/pulse of the rune will whisk away more cheese until
all cheese on the rune is taken by whichever entity lurks in the other
realm. The sacrifice will be hinted at in an _ancient parchment_ which
will be on the bookshelf (when i add it lmao) alongside the spell book.
Meeting this cheese goal will lock the wizard's grand finale rune and
grand finale effect to special ones. The cheese rune is mostly identical
to the normal grand rune, barring the custom sprites/animations.
The cheese finale consists of the wizard getting permanent Levitation
(nogravity + free space movement), a 0.5 modifier(reducing incoming
damage in half) to every damage type, a comically strong mood buff and
**The Wabbajack**(separate sprite pending) - a juiced up chaos staff
which can fire a lot more projectiles than a normal one can (it will get
more, I may even make a few just for it).
Everybody else (including any invader antags) gets hallucinations, 175
brain damage and a comically strong mood debuff, as well as a vendetta
against the wizard. If the victim was already suffering from
hallucinations from a trauma (including the quirk), they are instead
healed.
if you didn't catch the obvious reference, this entire shtick is a
tribute to Sheogorath. the rune makes use of daedric script, and most of
the catchphrases are a direct quotation of the Daedric Prince of
Madness, so if any of those things can get us in trouble somehow, let me
know. i will be sad but i will comply.
This shtick is intended as an easter egg, really, so I wasn't really
planning on expanding the wizard grand finale into heretic paths thing
or whatever.
Oh, and finale grand runes now allow the wizard to select the effect
even if it's time-gated. If it is, you just won't be able to invoke it
until the time comes. The rune will tell you how much time is left until
you can invoke it. And grand finale runes with a finale effect selected
also glow in the color of their effect. I also think I fixed some step
of the grand rune animation not triggering but I'm not sure.
<details><summary>Some rune animations (some are subject to
change)</summary>


</details>
## Why It's Great For The Game
it's funny
</details>
## Changelog
🆑 Sealed101, EBAT_BASUHA for spritework
add: Wizard's Den now has a book of Summon Cheese in the Studies Room
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
**_THIS PR UPDATES THE SCAR VERSION - ALL EXISTING SCARS WILL BE
WIPED_**
Expands the wound system functionality to support any type of limb at
all.
To do this, wounds have been significantly refactored. For starters,
wounds now use limb biotype instead of wound type for determining what
they can be applied to. They also use singleton instances for most "can
we apply this" checks instead if copy pasted initial().
Wounds now use a "wound series" instead of wound_type for determining
the, well, series. Previously, all WOUND_BLUNT wounds were considered
bone wounds, making it impossible to have multiple WOUND_BLUNT wounds at
once. Now, its based on wound series - bone wounds are of the blunt bone
wound series, and use the typical logic.
One change that results from this is the ability for everything with a
jointed limb to get a dislocation. Yes, this includes things like
prosthetics.
On the note of external and internal biotypes: Exterior are bones,
Interior is flesh. Interior protects exterior from slash until its
mangled, at which point it either exposes exterior to slash or allows
dismemberment if theres no exterior.
Basically - it acts the exact same way, except its not hardcoded, and
its more modular.
A lot, lot more changes were made - I cant name them all, but if youre
interested, you can read up. Wounds have more procs, more
modularization, and less hardcoding.
Sadly, scars have been updated in such a way so that the wound version
must be updated. Scars will be deleted.
## Why It's Good For The Game
As it stands, half the limbs in the game can't be dismembered. This
changes that, allowing every single limb to be dismembered.
The two dismemberment critera are now:
1. If able to get mangled flesh or bone, it can be dismembered once it
gets mangled flesh and bone (or JUST flesh if it only has a internal
biostate, vice vers afor bone if external only)
2. If it cant be dismembered by the above, it will have a chance to
dismember when at or above 80% of its total max damage
Finally, code being better is usually a good thing.
## Changelog
🆑
balance: Prosthetics and slimepeople can now have limbs dismembered
balance: Slimepeople can now receive slash wounds, but cannot bleed
balance: Most limbs can now be dislocated
refactor: Scar backend reworked, scars will be wiped as they update to
the new format
/🆑
## About The Pull Request
Phased mobs are not turfs so the new check failed.
Fixes this and adds a unit test for it.
Also makes shadow walk VV-able to any level of lightness.
## Changelog
🆑 Melbert
fix: Fixes Shadow Walk
/🆑
## About The Pull Request
Fixes#77501
Spider egg ghost role spawners grant the spider antag datum, rather than
the act of being a spider.
This means that gold core, mapstart, polymorph belt, and other spiders
will not have an antagonist datum.
While doing this I also made a new abstract `mob/living/basic/spider`
type which all three kinds of spider life stage (`spiderling`, `young`,
`giant`) extend from, because there was a gross amount of copied code.
Now there isn't.
Also the Flesh Spider and Event Midwife eggs now simply hatch adult
spiders instead of child ones.
This is because there is no reason for either of these to have a two
minute wait time before they get going. Midwife spiders spawned by the
event should just start spidering immediately, and Flesh Spiders are
made by changelings and shouldn't be effected by measures introduced to
balance the spider gamemode.
Eggs which are laid during a round and _can_ hatch into midwife spiders
still hatch baby spiders.
Also I swapped some white pixels on the animation of the ambush
spiderling for a different colour because they looked bad.
## Why It's Good For The Game
While the policy is always "if you turn yourself into something, you're
not an antagonist" the presence of the antag datum still confuses
people. Plus that code was gross and I didn't like it.
## Changelog
🆑
fix: Giant Spiders only have an antag datum if created by the round
event.
balance: Flesh spider eggs hatch into adult spiders instead of baby
spiders.
balance: The eggs spawned by the start of the spider infestation event
hatch into adult Midwife spiders instead of baby ones.
/🆑
## About The Pull Request
Adds Summon Simians, a spell that summons four monkeys or lesser
gorillas, with the amount increasing per upgrade. The monkeys have
various fun gear depending on how lucky you get and how leveled the
spell is. If the spell is maximum level, it only summons normal
gorillas.
Added further support for nonhuman robed casting: Monkeys, cyborgs, and
drones can all now cast robed spells as long as they're wearing a
wizardly hat as well.
Made monkeys able to wield things again.
Wizard Mutate spell works on non-human races. It also gives you
Gigantism now (funny). If the Race can't support tinted bodyparts, your
whole sprite is temporarily turned green.
Made Laser eyes projectiles a subtype of actual lasers, which has
various properties such as on-hit effects and upping the damage to 30.
Improved some monkey AI code.
## Why It's Good For The Game
> Adds Summon Simians, a spell that summons four monkeys or lesser
gorillas, with the amount increasing per upgrade. The monkeys have
various fun gear depending on how lucky you get and how leveled the
spell is. If the spell is maximum level, it only summons normal
gorillas.
It's criminal we don't have a monky spell, and this is a really fun spin
on it. Total chaos, but total monky chaos. It's surprisingly strong,
but! it can very well backfire if you stay near the angry monkeys too
long and your protection fades away. Unless you become a monkey
yourself!!
> Wizard Mutate spell works on non-human races.
This spell is great but it's hampered by the mutation's human
requirement, which is reasonable in normal gameplay. Wizards don't need
to care about that, and the human restriction hinders a lot of possible
gimmicks, so off it goes. Also, wizard hulk does't cause chunky fingers
for similar reasons
> Made Laser eyes projectiles a subtype of actual lasers, which has
various properties such as on-hit effects and upping the damage to 30.
Don't really caer about the damage so much, this is more so that it has
effects such as on-hit visuals. Can lower the damage if required, but
honestly anything that competes against troll mjolnir is good.
> Added further support for nonhuman robed casting: Monkeys, cyborgs,
and drones can all now cast robed spells as long as they're wearing a
wizardly hat as well.
SS13 is known for 'The Dev Team Thinks of Everything' and I believe this
is a sorely lacking part of this or something. It's funny.
I want to see a monkey wizard.
> Made monkeys able to wield things again.
I really don't know why this was a thing and it was breaking my axe and
spear wielding primal monkeys. Like, why?
## Changelog
🆑
add: Adds Summon Simians, a spell that summons four monkeys or lesser
gorillas, with the amount increasing per upgrade. The monkeys have
various fun gear depending on how lucky you get and how leveled the
spell is. If the spell is maximum level, it only summons normal
gorillas.
balance: Wizard Mutate spell works on non-human races. It also gives you
Gigantism now (funny). If the Race can't support tinted bodyparts, your
whole sprite is temporarily turned green.
balance: Made Laser eyes projectiles a subtype of actual lasers, which
has various properties such as on-hit effects and upping the damage to
30.
add: Added further support for nonhuman robed casting: Monkeys, cyborgs,
and drones can all now cast robed spells as long as they're wearing a
wizardly hat as well.
balance: Made monkeys able to wield two-handed things again.
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
Adds a new device you can research called the "Polymorphic Field Inverter".
It requires Advanced Biotechnology and Anomalous Research to unlock.
Completing that research lets you print out a fancy belt. Using it for 5
seconds on a mob (dead or alive) which is organic in nature and isn't
some kind of human or megafauna (monkeys are fine) will store a copy of
its DNA. Scanning another creature will replace the original stored DNA.
Storing DNA does absolutely nothing unless you have also inserted an
active Bioscrambler core.
If the item is activated with a Bioscrambler core then equipping it
grants you the ability to transform into the same kind of creature as
the one you scanned (and back). As in spells such as Wildshape you share
health with your transformed form and if you die while transformed then
you die, so be careful when turning into something like a cockroach
which has one hit point.
It has an associated experiment which makes the research free, which is
to scan two humans with (non-prosthetic) organs that they didn't have
when the round started. You can accomplish this through surgery, DNA
infusion, or a bioscrambler anomaly. You can do it on some monkeys if
nobody is cooperating with you.
I copied a teeny bit of this code from #73969 although I didn't actually
end up needing most of it.
These are absolutely codersprites so if anyone wanted to make cooler
ones, let me know.
## About The Pull Request
- Abductor Baton Recall now starts linked to the Abductor's Baton
- Did some misc. spell changed to the abductor baton recall to make it
less spell-like
- Fixes Instant Summon's name not changing to "Recall whatever item"
when an item is marked
- Instant Summons now displays the item marked on the button
## Why It's Good For The Game
Having to mark the abductor baton is bad UX, when making it start marked
is pretty trivial.
Also this just helps it be a lot more obvious what is linked to what if
you end up having more than one instant summons known.
## Changelog
🆑 Melbert
qol: Abductor Baton Recall now starts linked to their baton, and you can
no longer unlink your baton
qol: Instant Summons now shows what item is marked over the icon
fix: Fixes Instant Summon's name not updating when marking an item
/🆑
## About The Pull Request
Spiritual successor to #76716
- Some spells can now be cast while the mob is within the contents of
certain atoms.
- PAIs can now cast if within a PAI card
- AIs can now cast if within an AI card
- People within vehicles (mechas and cars) can now cast their spells
- Repulse and Knock now have unique interactions for being cast within a
locker
## Why It's Good For The Game
Carlac's PR gave me an idea for how to tackle this in a relatively clean
way so I went ahead and adapted the suggestion to something that works
for the cast chain.
This isn't perfect, some spells will need to be updated, but they can be
done piecemeal.
This is something that, IN THEORY, should have already been wholesale
supported by the spell refactor - any atom you pass into the cast chain
should "just work ™️ ", either rejecting if it fails the valid target
check or doing the spell effects as if the atom passed was the caster.
## Changelog
🆑 Melbert
add: PAIs can now cast wizard spells should they have any.
add: AIs located in intellicards can now cast wizard spells should they
have any.
add: Some spells, such as AoE or conjure spells, are now castable from
within Mechas or Clown Cars. To varying degrees of success.
add: Knock will now unlock and open closets you are hiding within.
add: Repulse will now throw open closets you are hiding within.
/🆑
## About The Pull Request
On the tin, the former "imp" is now refactored into basic mob code. Very
simple since these are only meant to be controlled by players, and all
of their stuff was on Signal Handlers and Cooldown Actions anyways. Just
lessens the amount of stupidity.
Did you know that we were trying to make demons spawn in a `pop`'d cat
named "Laughter"? Embedded in the list? I've literally never seen this
cat, so I'm under heavy suspicion that the code we were using was broken
for the longest time (or may have never worked), and we now instead just
do it a much more sane way of having a cat spawn on our demise.
## Why It's Good For The Game
Cleaner code! Less simple mob jank to deal with. Trims down the list of
simple animals to refactor. No more duplicated code that we were already
doing on parent! It's so good man literally everything was seamless with
a bit of retooling and tinkering. The typepath is also no longer `imp`,
it's actually `demon`, which I'm happy with because there's no other
demons to have it be confused with anymore.
We were also doing copypasta on both the demon spawner bottle and the
demon spawning event so I also just unified that into the mob. I also
reorganized the sprites to be a bit clearer and match their new
nomenclature
## Changelog
🆑
refactor: Slaughter and Laughter Demons have been refactored, please
place an issue report for any unexpected things/hitches.
fix: Laughter Demons should now actually drop a kitten.
/🆑
## About The Pull Request
Adds an achievement for completing the Grand Ritual
Also, adds blackbox logging for the Grand Ritual feature so we can see
how much people are actually doing it
Also, while testing I noticed that Summon Guns/Magic were fucked, so I
fixed them.
## Why It's Good For The Game
Nice to have some stats.
Nice to get a juice reward for doing your wizard chores.
## About The Pull Request
the bee now a baisc insect he will now go to find his home and he will
go and pollinated the plants and helped the queen make children by
polliniting the plants and he will. the queen will leve the hive more
rarely than the normal bees so she can stay in the hive to make kids
## Why It's Good For The Game
the bee now is a basic insect so it means he have a better ai
## Changelog
🆑
balance: the bee now can fly over the machines so its easy for him to go
to the hydroponics machine
fix: player bees now will not be stuck inside the hive if he entered it,
they can now leave it
fix: fixed a har deleted when the hive is deleted all the bees still
have a refence to the hive now its fixed
fix: now when a player interacted with the bee hive the bees will now
leave the hive to defend the hive (it was glitched)
refactor: the bees now are a basic insect.
/🆑
## About The Pull Request
Mutate prev = 40 / 37.5 / 35 / 32.5 / 30
Mutate now = 40 / 35 / 30
Spell cards prev = 6 / 5 / 4 / 3 / 2
Spell cards now = 6 / 4 / 2
Teleport prev = 60 / 50 / 40 / 30 / 20
Teleport now = 60 / 40 / 20
Shape change prev = 20 / 16.75 / 12.5 / 8.75 / 5
Shape change now = 20 / 12 / 4
Swap prev = 30 / 24 / 18 / 12 / 6
Swap now = 25 / 15 / 5
I also deleted the invocation for swap to make it more usable. When I
added the spell I thought it would be used more but I have never seen it
been used.
## Why It's Good For The Game
For a lot of spells it seems like it is useless to upgrade them, since
it costs a lot but does little in a lot of cases. Maybe this goes for
more spells than my pr changes but I wanted how this comes over first. I
rather do not do balance changes since it ruins my gbp even though I am
trying to improve the game but I still thought this was worth it since
it might also make the swap spell more relevant.
## Changelog
🆑
balance: Changes some cooldowns and upgrades of spells.
/🆑
## About The Pull Request
This PR adds a new wizard ritual (the kind that require 100 threat on
dynamic)
This ritual allows the wizard to select one spellbook entry (item or
spell), to which everyone on the station will be given or taught said
spell or item. If the spell requires a robe, the spell becomes robeless,
and if the item requires wizard to use, it makes it usable. Mostly.
- Want an epic sword fight? Give everyone a high-frequency blade
- One mindswap not enough shenanigans for you? Give out mindswap
- Fourth of July? Fireball would be pretty hilarious...
The wizard ritual costs 3 points plus the cost of whatever entry you are
giving out. So giving everyone fireball is 5 points.
It can only be cast once by a wizard, because I didn't want to go
through the effort to allow multiple in existence
## Why It's Good For The Game
Someone gave me the idea and I thought it sounded pretty funny as an
alternative to Summon Magic
Maybe I make this a Grand Finale ritual instead / in tandem? That's also
an idea.
## Changelog
🆑 Melbert
add: Wizards have a new Right and Wrong: Mass Teaching, allowing them to
grant everyone on the station one spell or relic of their choice!
/🆑
## About The Pull Request
Refactors arcane barrage (the wizard spell) and blood barrage (the weird
version of the same spell that cultists get) into the magic subtype. No
longer are they rifles...for some reason. Also they have sprites once
again! Yay. Fixes https://github.com/tgstation/tgstation/issues/76561
So as to not replicate a really crappy system used to get the hand
swapping working, I've just opted to take this opportunity to make
arcane barrage an automatic fire weapon. Yes, this is kind of a feature,
but it's...it's appropriate, don't you think? And I don't think
meaningfully changes its fire rate?
Blood Barrage no longer harms cultists/constructs shot by it and now
properly just heals them/injects them with unholy water. Why all this
was shoved into the Bump() proc is beyond me, but it works now. Fixes
https://github.com/tgstation/tgstation/issues/76560
I've improved the variables for some of the cult spells, and I've also
fixed what I think is one the most pesky parts of how drawing blood
works. So, rather than using range(), it uses view(), which seems to
cause the spell to be a bit funky with lighting? So if you're in
darkness (gosh cultists in dim light, how unheard of), this spell
struggles to gather up blood. Not anymore it doesn't!
Lastly, it only worked on blood pools or droplets, not blood trails. So,
you could bleed a character out by dragging them around, but not sap up
the blood they're dropping from doing so. Only the intermittent blood
splatters or your own bloody footprints count.
Here is the funny thing with that. It still cleans up the blood trail.
You just couldn't activate the blood draw from the trail or treat it as
blood. Now you can. Blood trails now give you +5 charges, and you can
activate the blood draw using blood trails.
## Why It's Good For The Game
Arcane Barrage/Blood Barrage:
This was some really old code and I'm still not sure why they were made
as a separate spell to the madoka reference, which at this stage is
still better than this spell. But at least it is using a sensible
subtype with a reasonable, more modern component to facilitate the
'rapid firing barrage of magical bullet' image this spell is meant to
invoke. As a result of all this nonsense, this spell had its sprites
broken because it kept being attached to stuff in the rifles folder.
Let's put a stop to that here and now and break it independently
instead.
Oh also cultists getting shot by healing bullets that still killed them
is both funny and dumb and the way it worked was bonkers.
Blood Draw:
A cultist trying to determine, on the fly, what blood is a valid for the
blood draw is nearly impossible from visual alone. You'd be convinced
this part of the spell is broken just because having a splatter and a
trail on the same tile massively obfuscates whether you're looking at
valid sources of blood. I've struggled to understand as a player what
was going on and why it was so selective about what was acceptable. Now
I see that the problem was one of visual accuracy, bad type checking,
and really, really outdated code that should have been improved with
better procs.
Blood trails are also actually made from dragging out a creature's
bloody corpse. For humans, the most common source of blood trails, this
does actually mean they're losing blood to produce these trails. It
stands to reason this should be a valid source (bloody footprints are,
after all). I gave them a...somewhat minor amount of charge contribution
just to keep it moderately sane for how much blood it generates.
## Changelog
🆑
refactor: Arcane Barrage and Blood Barrage are magic gun subtypes and
not rifle subtypes. Also they have sprites again.
qol: The barrage spells now use the automatic component to do its thing.
fix: Blood Barrage once again heals cultists and constructs without
hurting them.
code: Cleans up how Blood Rites finds blood to draw in. You can now just
click turfs as well as blood, and it should now be much more accurate
about it.
qol: Blood trails contribute to charges gained using Blood Rites. You
can also activate Blood Rite's blood draw using blood trails.
/🆑
## About The Pull Request
Moves anti-magic effect off of the component and onto the mob. Fixes
some bugs while there.
Anti-magic effects will now only trigger on calls with a charge cost
associated.
If the user is under the effects of.. an antimagic effect, a new one
will not play. This cuts down on overlay and sound effect spam from
walking through forcewall or spacetime distortion, for example.
## Why It's Good For The Game
I just found it a little annoying to see a chaplain walk through a magic
effect and it just spams the fart sound over and over on repeat and
makes them completely impossible to see.
## Changelog
🆑 Melbert
fix: Anti-magic visual effects will no longer trigger overtop one
another
/🆑
## About The Pull Request
Further continous organizing and cleaning the Icons folder. There are
still some minior nitpicks left to do, but I reached my daily sanity
expenses limit again, and the faster these get in the less issues for
both me and others later. Also cleans some mess I caused by my blindness
last PR.
## Why It's Good For The Game
Saner spriters = better sprites
## About The Pull Request
This PR refactors mind language holders into non-existence
As a result, `update_atom_languages` is no longer necessary
Mind-bound languages are transferred via `/mind/proc/transfer_to`
Species changing no longer deletes and re-creates the mob's language
holder, allowing them to keep any languages they have.
Species languages are sourced from `LANGUAGE_SPECIES` now, meaning they
are removed when they change species. If the mob is not a human with a
species datum, these are effectively just atom level languages.
Makes a bunch of unit tests to ensure language transfer over certain
events works as intended
## Why It's Good For The Game
Mobs with minds having two independent language holders results in a
good few bugs, and simply doesn't make sense when we have sources
(`LANGUAGE_MIND`).
Instead of tracking two language holders, we can simply use sources
better and only track one.
This means that the language holder you start with is your language
holder, period. It doesn't get deleted or re-instantiated or whatever.
## Changelog
🆑 Melbert
refactor: Refactored language holders, making species changes not delete
all of your known languages
/🆑
## About The Pull Request

Seeing this pattern repeated over various sections of code was starting
to piss me off
## Why It's Good For The Game
Lessens chance to cause errors with mind traits, ensures consistent
behavior, makes it easier to change how mind traits work if necessary.
## Changelog
hopefully not player facing
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
A bundle of stormy weather-related fixes:
- ash storm visually replenishes dug basalt again; also updates refilled
basalt's light, if it rolled an eligible icon variant
- new proc refill_dug() for asteroid turfs, currently made use of in
weather but be my guest
- I THINK the lowest-light variants are so low they don't show up at all
but I didn't look into the lighting subsystem so /shrug
- `set_basalt_light()` is a global proc. the reason is because we have,
like, an unnecessary amount of basalt turfs that don't call back to each
other. `misc/basalt`, `floor/fakebasalt`, `holofloor/basalt`. bro come
on. should merge them where possible but that's for a separate PR; ALSO
MAKE IT USE THE `diggable` ELEMENT BRO COME ON!!!
- ash storm no longer loops `end()` sounds
- it was calling parent THEN removing the playlist's sounds, which
caused the playlist's ash storm weak sound to be picked again and play
with a hugelarge timer
- snow storm no longer affects mecha pilots
- I find it weird that ash storm immunity is just innate whether the
mech is "sealed" or not (Ripley mk I) but for now, I've made snow storm
immunity behave the same
- _jaunt spells provide weather immunity while the jaunt is active_
- _the caster is supposed to be untouchable by any practical means, it
don't make a lick'a sense to have weather affect them. I gave it a
general weather immunity however, and that also makes jaunts protect
from radiation. methinks it's fair, lmk if that's excessive_
## Why It's Good For The Game
- Fixes#76304
- Fixes#76400
- Refilled basalt tiles that should have light are consistent with
mapped in basalt tiles
- Consistency for mechs; the adjustment might be a balance thing, lmk
## Changelog
🆑
fix: fixed basalt turfs remaining visually dug up when refilled by an
ash storm
fix: fixed ash storm ending sounds looping after the storm is over
fix: mechs are now snow storm immune
fix: jaunt spells protect from weather when jaunting
/🆑
## About The Pull Request
Basically, reworks Wizarditis so you randomly cast real (weakened)
spells instead of just saying random invocations + doing a hardcoded
version of teleport.
Spells include Teleport, Disable Tech (small radius), Mutate, Knock,
Forcewall, Blink, Smoke, Spacetime Distortion (much smaller radius),
Timestop (radius of 1 (haha)), Repulse (small radius), Blind, Lightning
Bolt (weaker bolt), and Swap
Makes anti-magic counter wizarditis, but not cure it.
Adds some more minor tells that one may be infected. Removes some old
messages in favor of newer ones.
## Why It's Good For The Game
Wizarditis is very lackluster for how difficult it is to obtain.
Initially this started as de-hardcoding / optimizing the in built
teleport function to use the actual scyar nila, but I realized how easy
it would be to expand this, so I did it.
Because it's funny.
## Changelog
🆑 Melbert
add: Wizarditis Improved. Those infected will now randomly cast one of
the following (weakened) spells at max stage: Teleport, Disable Tech,
Mutate, Knock, Forcewall, Blink, Smoke, Spacetime Distortion, Timestop,
Repulse, Blind, Lightning Bolt, or Swap
add: A source of antimagic will prevent Wizarditis's ill effects, but
won't cure you.
/🆑
## About The Pull Request
Signals were initially only usable with component listeners, which while
no longer the case has lead to outdated documentation, names, and a
similar location in code.
This pr pulls the two apart. Partially because mso thinks we should, but
also because they really aren't directly linked anymore, and having them
in this midstate just confuses people.
[Renames comp_lookup to listen_lookup, since that's what it
does](102b79694f)
[Moves signal procs over to their own
file](33d07d01fd)
[Renames the PREQDELETING and QDELETING comsigs to drop the parent bit
since they can hook to more then just comps
now](335ea4ad08)
[Does something similar to the attackby comsigs (PARENT ->
ATOM)](210e57051d)
[And finally passes over the examine
signals](65917658fb)
## Why It's Good For The Game
Code makes more sense, things are better teased apart, s just good imo
## Changelog
🆑
refactor: Pulled apart the last vestiges of names/docs directly linking
signals to components
/🆑
## About The Pull Request
Abductors can now use any baton instead of just their special baton.
## Why It's Good For The Game
Abductors are a bit fucked if they lose their baton and are unable to
buy one from their shop. Sure they can just use flashes or maint-fu but
those methods are hard and or unreliable. (if they manage to lose their
baton, they probably aren't that robust anyways). This PR gives more
leeway if you fuck up as an abductor.
## Changelog
🆑
balance: The mothership which abductors came from has worked very hard
to train their field agents how to use batons from their specimen's
habitat
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Tower of Babel (Curator), Naive (Clown), and Storm detector (Shaft
Miner), are all traits that are given to your mind upon taking these
jobs.
However, we have been checking the body for these traits, not the mind.
This meant that Shaft miners werent alerted of ice storms, Clowns didnt
have their unique examine text, and Curators were affected by Tower of
Babel.
This fixes all those issues.
Naive and Tower of Babel realistically should only be on the mind, so I
changed all instances to check the mind. Storm detection is something
you can get through analyzers, so I left it as a check for both your
body and mind traits.
Clown's Naive:

Tower of Babel:

## Why It's Good For The Game
Fixes several bugs for 3 jobs all at once. I don't see any issue reports
on any of these, but they existed.
## Changelog
🆑
fix: Shaft Miners are now alerted of Icemoon storms, Clowns are naive,
and Curators are immune to the Tower of Babel again.
/🆑
Fixes#72165
First PR, first-time coder, this might be a doozy but _hopefully_
everything is fine.
## About The Pull Request
This fixes signers being able to speak with sign language while cuffed
or emotemute, bringing the feature back to how it was initially
intended.
This also fixes signers only being able to sign spells based on their
ability to speak. Before this PR, signers could cast spells with sign
language, but it was dependent on their ability to speak with their
mouth, allowing them to sign spells even if they would not be able to.
Instead, it has been changed to work so that one can sign spells only
when both of their hands are completely empty.
## Why It's Good For The Game
First of all, signers should probably not be able to speak when cuffed
or emotemute, I'm not sure when this broke but somewhere along the lines
it did and this is simply bringing it back to how it was supposed to be.
Second of all, spells were created long before sign langauge (I believe,
don't quote me on that), but sign language is just another language and
still can communicate the same. Furthermore, signing spells instead of
speaking them is overall more difficult to work with given the fact that
it won't work if you are holding items, restrained, have a limb disabled
or amputated, or are emotemuted. The one benefit that sign language
provides is being able to sign when otherwise mute, but this only really
applies in select cases. I feel the downsides definitely outweigh the
upsides in this case, and it will be more of a gimmick so that mute
players can still play antags like heretic.
## About The Pull Request
Most calls of runEvent() now provide a cause that is read out to
deadchat. announce_deadchat() has been slightly adjusted to accommodate
this.
Previously, everything that wasn't a truly random event would broadcast
with the same generic "XYZ has just been triggered!" message. Now, you
get a little bit more detail as to why/what triggered the event.
Some helpers in the __HELPERS/events.dm file have been made, for forcing
events normally/async/after a delay (using an addtimer). This also moves
a lot (but not all) instances of events being forced to these helpers.
Some samples:

Traitors using uplink viruses to turn off the power/comms.

Beer nuke!

For when a traitor takes an Space Dragon final objective, which summons
a carp migration event.

Wizard ritual events!

Even this one!
This also changes runEvent() to run_event(), because I figured I'd be
touching every single instance of the proc anyways.
## Why It's Good For The Game
Better feedback, less confusion amongst deadchat's constituents.
Some of them may be a bit self-explanatory, but in some cases
(especially the apocalypse rune) it's beneficial to know that an admin
isn't the one behind it.
<!-- 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
🆑 Rhials
qol: Deadchat now gets more juicy details on what has triggered a
non-randomly occurring random event.
code: There are now helpers for forcing events in a variety of ways.
More events! More events!!!!!!!
/🆑
This tracks the seconds per tick of a subsystem, however note that it is
not completely accurate, as subsystems can be delayed, however it's
useful to have this number as a multiplier or ratio, so that if in
future someone changes the subsystem wait time code correctly adjusts
how fast it applies effects
regexes used
git grep --files-with-matches --name-only 'DT_PROB' | xargs -l sed -i
's/DT_PROB/SPT_PROB/g'
git grep --files-with-matches --name-only 'delta_time' | xargs -l sed -i
's/delta_time/seconds_per_tick/g'
## About The Pull Request
This ended up turning into a bit of a junk drawer of a PR I'll admit,
but there's really not a whole lot to it.
There are three parts:
### Part I - Inhand sprites for light tubes.
Adds inhand sprites for light tubes. No more cardboard tube placeholder.
This is self explanatory-they have unique sprites for all 3 states
(normal, broken, and burnt out). The broken version has sharpness now.
Also refactored light_items.dm a bit, it was using a bespoke proc called
`update` to do icon updates. Now it has been _updated_ to use
`update_appearance` instead.

### Part II - Latex Balloons
Latex balloons, a very old piece of code that was full of typos, has had
some life breathed back into it. It is a fun little item, and I saw no
reason to let it rot. It can now be crafted using a latex glove and some
cable. Also, you can pop them using anything sharp... such as a broken
light tube! Aha!
We've come full circle.

### Part III - update_inhand_icon proc
A new atom helper function, `/atom/proc/update_inhand_icon(mob/target =
loc)`
I was struggling to find an existing proc that could update inhand icons
of a mob that was holding any given atom, without necessarily having a
ref to the mob yet.
So I ended up writing one that did that, and finding the spots in the
code which were using a similar way of doing it (that is in fact how I
stumbled upon the latex balloon item).
...........But then Iearned of the
`/datum/element/update_icon_updates_onmob` component and ended up using
that instead. There are still some very niche cases where you might not
be able to use the component where the proc would come in handy however
e.g. in transforming.dm--and if anything, I think it could serve as a
good spot to leave a comment informing would be users of
`update_icon_updates_on_mob` as an alternative.
For that reason especially I thought it worth keeping.
## Why It's Good For The Game
New inhand sprites, and a fun little craftable balloon. What's not to
like?
## Changelog
🆑
add: latex balloons can now be crafted using a latex glove and some
cable. You can fill them with air using a tank. They also have a new
sound effect.
imageadd: light tubes have a new inhand sprite
fix: broken light tubes now actually have sharpness to them as they are
basically spikes of glass.
refactor: refactored latex balloon code
/🆑
## About The Pull Request
This sprite file had been a dumping ground for miscellaneous sprites for
the past decade. It's bloated and full of random kinds of icons and even
has a few unused ones. It's time to reorganize them into their own
separate dmi's based on theme.
## Why It's Good For The Game
Better organization and easier access when looking for stuff.
## Changelog
🆑
imageadd: Split all icons in weapons_and_items.dmi to their own
categories
imagedel: Removed some unused icons
/🆑
## About The Pull Request
Turns blink's school from forbidden to translocation. This has some
incredibly minor changes nobody is going to notice:
- Changes the blink's invocations when mixed with a CERTAIN spell
- If you were very specifically a chaplain with the holy crusade sect
and you casted blink, before it would excommunicate you, now it will
just smite you, as translocation spells are seen as less bad than
forbidden magic
- probably some more niche interactions but that's all I can remember
## Why It's Good For The Game
Guys, I know blink is a very annoying spell but come on now it's not
forbidden magic, that's for heretics and super duper evil stuffs
## Changelog
🆑
fix: blink is now a translocation spell
/🆑
## About The Pull Request
My April fools this year, though not going to call it one because some
people think it should just be actually merged.
### Chuunibyou Powers 🌟
Wizard gets a new spell for 2 points that gives him the powers of
chuuni. This makes them have ridiculous shouted invocations for all
their spells, their spells are colored pink, and they heal slightly when
casting one.
While mostly a meme spell, I could see a tailored loadout like lichdom
and splattercasting that takes advantage of the unique spellcasting
changes, like a very low cooldown spammable loadout to heal quickly.
There is also a granter book in the library, which teaches a version of
chunni that doesn't heal.
#### Medical eyepatch
I added it, chuuni wizards get a NODROP version.
## Why It's Good For The Game
This PR bestows upon the game the glorious gift of chuuni powers, the
ultimate manifestation of my hidden potential and the secret truth of
this world, which only I and a few chosen ones can comprehend and
unleash! Why wouldn't you want it?!
In all seriousness, it is a unique wizard playstyle and it will make for
some funny memes. Beyond wizard, the chaplain, heretics, or mime can
read it in the library for a very silly round. I like it!
## Changelog
🆑
add: Chuunibyou wizards, and chunni granters in the library
add: Medical eyepatches
/🆑
## About The Pull Request
### The Rifle:
-The Sniper Rifle is now a bolt action. This replaces the 4 second fire
delay on the sniper rifle. This overall will improve the fire rate if
you're good at racking the bolt, but it will also feel less like you're
in a weird limbo of inaction while using the sniper rifle, since the
fire delay can be quite confusing to players not used to it. This can be
tweaked, like reducing the speed of the racking action, if it seems like
it is too much.
-The scope component now goes up to 50 tiles (or so), which allows you
to gain a significant sightline over an area. The reasoning for this is
simple. The component actually nerfed the overall range of the sniper
rifle's scope, so this should hopefully restore that somewhat. And
having such a huge sightline makes it much easier to utilize the
impressive range of the rifle. Currently, it's really only ideal for
extremely close range fighting.
-The normal sniper rifle, the one that syndicate base scientists get,
can be suppressed. I don't know why it was different.
### The Ammo:
Normal .50 BMG: Does much more object damage, and on top of that deals
additional damage to mechs, but not by much more. Now, when it
dismembers a limb, it also deals its damage to the chest. This ensures
that you didn't straight up lose out on dealing a killing blow because
you took their limb off, and makes the dismemberment property of .50 BMG
a significant upside rather than a immense detriment.
Marksman: Gains a lot of the above benefits, but has much lower range.
Why this nerf? It's actually because of some funny nonsense with how
ricochet works. Which can cause....accidents to happen. To you. Consider
that firing down a straight line and missing could be quite embarrassing
when the bullet has 400 tiles of range.
Soporific: Now called Disruptor ammo. Works as it did before, putting
humans to sleep for 40 seconds (seriously, 40 seconds). Also deals some
stamina damage, if...that's relevant. But now also causes an EMP effect
and a boatload of added damage to both mechs and borgs, allowing it to
be an excellent anti-mech and anti-borg ammo type, as well as scrambling
any pesky suit sensors, energy weapons and so on in an area around the
impact. Useful for support fire.
Incendiary (NEW!): Causes a massive firebomb to go off where it impacts
(no explosion, so this isn't a stun). Also sets the target on fire,
which is always fun. Good for shooting into groups of people with
impunity. Also deals burn damage instead, since I think nukies could use
more methods for direct fire damage.
Surplus (NEW!): It's .50 BMG but it lacks most if not all the upsides.
No armour penetration, no dismemberment, no paralysis. It still deals a
lot of damage to objects, so not a bad option for simply removing
structures from afar. So what's the point in this ammo? You can buy 7
magazines for the price of one. I want to introduce 'Surplus' as an idea
for nukies to invest in if they want to be able to keep shooting but
they're really on a budget, like most non-warop nukies tend to be. This
is definitely subject to change (like a damage decrease on top of
everything else).
Pricing and Capacity: Normal ammo and surplus costs 3 TC. Every special
ammo costs 4 TC. Every special ammo also has the same ammo capacity as
the normal magazine. It's kind of weird how most of the subtypes had 5
shots rather than 6, but then soporific had...3? I don't get it. This
would probably cause a good deal of confusion, especially if you are
swapping ammo types and weren't aware of this particular oddity.
Anyway, 6 shots.
### Minor Addition
Gets rid of the cheap suppressor. It lies to players, tricking them into
thinking this is a low quality suppressor. Newsflash, it isn't. There is
no distinct difference between that suppressor and the normal
suppressor.
## Why It's Good For The Game
The sniper rifle, unfortunately, sucks a lot except for very specific
use cases. It got a big nerf with the scope component in terms of range,
even if the functionality is way cooler. And, at a baseline, there was
some counterintuitive functions attached to it. Dismemberment was cool,
but it also caused a loss in overall damage due to how limbs contribute
to core health. On top of this, the cool ammo types were...not much
better? Penetrator was almost always the best option, even if it lost a
lot of damage as a consequence.
So, what was it good for? X-ray + Penetrator. Pretty much, that's it. It
has some other uses but if I had to be entirely honest, there wasn't
much that other weapon couldn't do as well.
Hopefully this helps things going forward, and I want to mess with this
as well down the line in case its a bit too much of a boost in power.
Absolutely please rip this PR apart.
## Changelog
🆑
balance: Makes the syndicate sniper rifle a bolt-action rifle.
balance: Sniper rifles have a scope range of roughly 50 tiles.
balance: Sniper rifle ammo, if it dismembers your limbs, does damage to
the chest.
balance: All the various syndicate sniper rifle magazines have
consistent casing quantities (6 shots). They also have more consistent
pricing. 3 for normal and a box of surplus, and 4 for every other type.
balance: Reduces the range of Marksman ammo to 50 tiles. Not because it
is strong, but because you might accidentally shoot yourself if you're
not watching where you're shooting. Ricochets are no joke.
add: Replaces Soporific with Disruptor ammo. Works like soporific, but
also EMPS things it hits.
add: Adds Incendiary .50 BMG. Causes a combustion to erupt from the
struck target, as well as setting targets on fire. Great for parties.
add: Adds Surplus .50 BMG. It sucks, but you get a lot of them! Quantity
over quality, baby.
remove: The suppressors in the bundle are of standard quality. The
apparent 'cheap suppressor' that came bundled with the C-20r and sniper
rifle were found to actually be 'fine'. Trust us.
/🆑
## About The Pull Request
Refactors regenerate organs to be slightly more intelligent in handling
organ changes and replacements.
Noteably:
- We don't remove organs that were modified by the owner; such as
changing out your heart for a cybernetic
- We early break out of the for loop if they aren't supposed to have an
organ there and remove it
- We check for the organ already being correct, and just healing it and
continuing if it is
Also changes the names of some of the organ helpers into snake_case
### Mapping March
Ckey to receive rewards: N/A
## Why It's Good For The Game
## Changelog
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
Firstly, this var was on `/mob`, even though only `/mob/living` and
`/mob/dead` could have ever used it, so who knows how much needless
memory it was consuming on stuff such as `oranges_ear` that would never
ever ever use something like this.
Edit: okay instead of memory it just polluted variable edit windows for
all /mob when it didn't need to. I like having a slim VV window
Secondly, it's a technical improvement over the previous system as we
are able to "track" where a suicide originates from, and how we can
track that from mob-to-mob-to-mob. Previously, the boolean `suiciding`
would only inform us if they had ever been connected to a mob that had
ever committed suicide, but now we are able to precisely determine which
mob gave them the trait that they must now apparently bear until the
round restarts.
## Why It's Good For The Game
Less memory usage, more indepth ability to track suicides in case you
really need that dexterity. Currently no implemented code could benefit
from using it, but it would be pretty neat if someone could figure out a
way to have someone be guilt-tripped whenever they look into a mirror
and seeing the reflection of their past life? This PR won't actually
help you code that and it'll probably require a bit more work, but it's
a possibility of some cool interactions you can do when you have this
information available to you.

## Changelog
🆑
refactor: Some aspects of how we track suicides from your living mob to
your observer have changed- please do let us know if anything has broken
via a GitHub Issue Report.
/🆑
There's probably some technical improvements that can be made in some
parts of the code I reworked to accommodate this change, do let me know
if you spot any easy ones (or fuckups). a lot of excess comes from the
fact that any step in the TRAIT framework trusts that you are passing in
a valid datum (or subtype) so that's a thing
On the tin, doing it like this means we can reduce our overall line
fingerprint whenever we have to add two or more traits from the same
source on the same target. Especially helps when we get to the 4+ range
of traits, a breath of fresh air even.
Doesn't mean we have to do for loops, as that's already handled within
the define as well. I replaced some of the checks with `length()`
checks, let me know if I should switch it over to something else (maybe
`islist()`)? We stack_trace whenever we're not passed a list reference
on purpose, and sometimes var/lists are null by default (or just empty,
making this redundant).
## Why It's Good For The Game
I commonly feel the urge to write "use `AddTraits()`" or something in
reviews, then am sad when I remember it doesn't exist. I will no longer
be sad.
Can ensure a lot more trait safety as well by using static lists- when
both ADD_TRAIT_LIST and REMOVE_TRAIT_LIST re-use the same list, you are
confident (from a static point of view) that everything that you want to
be adding/removing works.
I may have missed a few things where this could be used, but both macros
implemented in this PR still use the same framework that was being used
in the last four years- so stuff won't break if left untouched. Just a
nifty new tool for developers.
also fixed up some code in the area, numerous bugs were found and
exploded
## About The Pull Request
Fixes#52946
This has been broken ever since #44112 which apparently removed the proc
in this component which selected a target for performance reasons and
just... didn't replace it with anything else? So it's been bricked ever
since.
In order to restore the removed mouse tracking behaviour I implemented
the pattern used in scoped weapons and the kinesis module. As this was
the third thing I could find to use this code, I abstracted it out into
an object where most of the shared behaviour lives. I tested those
things too and they still seem to do what they used to.
Here it is in action:
https://user-images.githubusercontent.com/7483112/221954852-22244bb1-7c87-452d-a9b0-ebed81c4c1ef.mp4
Because this spell now applies a full screen overlay in order to
function, it's really begging for someone to make some touhou-style art
with cards and patterns around the edge of the screen while you are in
aiming mode, but I'm not going to be the one to make it.
I tidied this component up and refactored it as best I could while I was
reworking it to use a full screen overlay but I am... not totally
confident that it should be a component at all given that it keeps being
created and destroyed. But also it has worked that way for like four
years now, so who am I to say.
Oh yeah also the icon for this spell broke, so I fixed it.
## Why It's Good For The Game
Makes a reasonably terrible wizard spell marginally less bad.
Maybe now that this component works, some other things can use it?
If we make a fourth thing which follows your cursor it won't need to
copy/paste code around.
## Changelog
🆑
fix: Spell Cards from the Wizard spell will now home in somewhat on the
target nearest to your cursor.
fix: The Spell Cards spell now displays the correct icon instead of a
big red "error" text.
/🆑
## About The Pull Request
So, while there's a range check for selecting a target after moving out
of range, there isn't one for sending a message after moving out of
range.
This fixes that.
## Why It's Good For The Game
The voice behind you is now reasonably behind you rather than across the
station.
## Changelog
🆑
fix: fixed Telepathy messages not having a check for being in range.
/🆑
## About The Pull Request
Decided against the balance changes in #73817
## Why It's Good For The Game
Although it is obvious when a mime talked, knowing the exact details can
still be useful for administrators
## Changelog
🆑
fix: Mime finger gun icon is no longer an error
admin: Logs when mimes break or make a vow of silence
/🆑
---------
Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
## About The Pull Request
In #73513 I was a little overzealous and now most spells can't be cast
when you are batoned even though _silence_ is meant to be the counter to
wizards (and heretics).
I took this back off the root of `spell` and then using the principle of
"anything with an invocation should be able to be used while stunned"
checked which spells didn't have invocations.
It seems like literally the only one of _those_ which was problematic
was the one from the original bug, implying that just maybe perhaps I
should have used a targeted solution instead of applying my fix to like
80% of actions in the game.
Side effect: Any non-invocation spell can once again be cast while
time-stopped. So like, Blink, Smoke, Cult Wall Conversion, and Fire
Breath.
Personally I think this is a niche enough interaction that it doesn't
matter and I don't think it's worth adding a new trait and check just
for this one spell.
## Why It's Good For The Game
Numerous abilities like jaunting and notably Hasty Realignment, the
heretic spell which removes stuns from you, were being blocked by stuns.
This makes their owners much more vulnerable than they are supposed to
be.
## Changelog
🆑
fix: Most spells can once again be cast even after someone stuns you
with a baton.
/🆑
## About The Pull Request
Quite a lot of mobs had faction defines as a string, which always has a
chance for error. For example, the clown mob spawner had their faction
written as "clown", when the official faction name was "clowns", and a
define existed for it anyways! This PR moves every single string based
factions over here. No references or special role factions. Hopefully I
didn't miss anything.
I also moved a global define used for picking your uplink provider's
flavour to the only file that used it, datum_traitor.dm, and renamed
them a bit to avoid confusion.
I have also noticed that the mimic faction was assigned to the petrified
player with += instead of |=. |= would ensure no duplicate factions, so
I have changed it.
Future improvement:
I have noticed that there is a lot of bloat with factions that contain
only one or two entries (examples: gnomes, floating eyeballs, penguins,
the pet lizards), and some always appear in pairs (vines and plants, the
rare exceptions being killer tomatoes and strange reagent spawned pine
trees), but trimming consolidating them is a matter for a different
time.
## Why It's Good For The Game
Makes assigning factions a bit less error prone.
I can finally remove the ```/// Later all mob factions will be moved
here and their current factions replaced with faction defines.```
comment. Later is NOW.
## Changelog
Nothing player facing
## About The Pull Request
While I was touching the Creature file for another PR (#73629) I noticed
that an identical proc was implemented here and on Statue.
I moved it into a component and managed to hook it into signals which
have return flags.
This required a bit of a refactor of their abilities too, but that was
for the best because one of them had a reimplementation of Jaunt which
could have just been a subtype of Jaunt, and none of their abilities had
icons.
I also made `spell` send `COMSIG_MOB_ABILITY_STARTED` in `PreActivate`
because it completely overrides the parent and doesn't do that as a
result.
## Why It's Good For The Game
I'll be honest this is mostly because I was looking at the code and
didn't like it, I don't think there were any bugs related to this but it
does reduce chat spam a little bit?
It should make this behaviour more maintainable and useful in the
future, as we're not copying and pasting multiple procs between
different files (for both this behaviour and jaunting).
## Changelog
🆑
refactor: The actions of Statues and Creatures which can't be used while
seen now share logic, and will not spam chat with feedback.
/🆑
## About The Pull Request
Teleport scrolls would only deplete a charge if used in hand, however
their implementation actually granted you the spell as an item action
which you could use by hitting the action button, This would not deplete
a charge, and had no cooldown whatsoever.
The action button is convenient and should stay, but I modified the code
so that instead of depleting a charge when clicked it depletes a charge
when the spell contained by the item successfully casts.
I also changed the order of operations slightly in `spell/after_cast`
because using the signal to delete the scroll would also delete the
spell (sensibly, it should clean up after itself) before the last cast
could make smoke, which was sad.
## Why It's Good For The Game
On live the teleport scroll gives all wizards _and_ apprentices the
teleport spell with absolutely no cooldown and infinite usage, which is
probably not intended.
## Changelog
🆑
fix: Using a teleport scroll will deplete a charge regardless of whether
used in-hand or by pressing the action button.
/🆑
## About The Pull Request
Fixes#39775
The `TRAIT_INCAPACITATED` trait is intended to block you from acting but
does not inherently block actions. Actions only check for "conscious",
"has available hands", "immobile", or "lying down".
Most actions still _can't_ be used while incapacitated. This is because
most actions are spells, most spells have invocations, and you can't
talk while you are incapacitated. This is silly.
I have resolved this by adding a new flag which blocks actions while
incapacitated. This is somewhat redundant with "conscious" because most
sources of that also make you incapacitated but not _always_, you might
want the specificity.
I have tried to be discerning about where this flag is applied, it is
not in all cases (for instance you can still swallow implanted pills
while incapacitated and such), but it's not only possible but I can't
really avoid implementing this without it being a balance change in
_some_ cases,
Actions this effects are things such as:
Xenomorph Tail Sweep, Lesser Magic Missile (cult constucts), Heretic
Shadow Cloak, the Smoke spell in general, Conjuring (but not firing)
Infinite Guns, Mime spells
Times when these actions will no longer be available but were previously
are such times as when the mob is:
Stamina Crit, Stunned, Paralysis, and Time Stopped.
## Why It's Good For The Game
The incapacitated trait is applied by effects which should block acting
but still permits several actions which logically would be prevented.
This fortunately hasn't come up too often due to the high ratio of
actions with invocations, but it feels bad to stun someone and then have
them still able to perform an action they logically wouldn't be able to
take while stunned.
This is especially egregious in the case of Time Stop (the only way to
stun a lot of the mobs effected by this) but that's a rare pick on a
rare antagonist and would also rarely be used on these mobs, so a bit of
an edge case.
## Changelog
🆑
fix: Many spell-like abilities which could be stunned, paralysed, or
frozen in time now cannot be.
/🆑