Commit Graph

762 Commits

Author SHA1 Message Date
MrMelbert 8c1e35e1c0 Refactors mind language holders into non-existent, fixes new languages being deleted on species swap + tests (#76612)
## 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
/🆑
2023-07-10 18:34:57 +00:00
ChungusGamer666 4f2227baf3 Implements a macro for checking mind traits (#76548)
## About The Pull Request


![image](https://github.com/tgstation/tgstation/assets/82850673/f85d0556-1806-40bf-92b8-597e46ccb4af)
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>
2023-07-06 11:45:46 -06:00
Sealed101 1825ea0d78 Storm weather related fixes (#76367)
## 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
/🆑
2023-07-01 19:23:19 +01:00
MrMelbert 6b3e8f4564 Buffs Wizarditis (#76156)
## 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.
/🆑
2023-06-24 21:03:53 +02:00
LemonInTheDark ae5a4f955d Pulls apart the vestiges of components still hanging onto signals (#75914)
## 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](https://github.com/tgstation/tgstation/commit/102b79694fa8eb57ecf7b36032616a9e368ccced)

[Moves signal procs over to their own
file](https://github.com/tgstation/tgstation/commit/33d07d01fd336726b4f6f6f1b61bb0b3f11a00dc)

[Renames the PREQDELETING and QDELETING comsigs to drop the parent bit
since they can hook to more then just comps
now](https://github.com/tgstation/tgstation/commit/335ea4ad081ec63c42cfa05856e582cca833af6e)

[Does something similar to the attackby comsigs (PARENT ->
ATOM)](https://github.com/tgstation/tgstation/commit/210e57051df63f88dac3dd83321236da825aae5e)

[And finally passes over the examine
signals](https://github.com/tgstation/tgstation/commit/65917658fb8a1e7d28ae23c9437a583d646f0302)

## 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
/🆑
2023-06-09 06:14:31 +00:00
Singul0 877a1942b2 Abductors can now use batons in general. (not just their specialized baton) (#75561)
## 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>
2023-05-31 14:37:18 -04:00
John Willard e38882179f Fixes mind traits (Curator, Miner, Clown) (#75593)
## 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:

![image](https://github.com/tgstation/tgstation/assets/53777086/30e92026-5d1d-44a5-9969-206df99c5e8f)

Tower of Babel:

![image](https://github.com/tgstation/tgstation/assets/53777086/b1d41f9d-e020-495c-89de-0d4e2c953442)

## 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.
/🆑
2023-05-23 16:53:51 -06:00
Sylvette b58a2c6848 Sign language Fixes & Spellcasting, just for fun (#74768)
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.
2023-05-13 19:41:06 +00:00
tralezab 9b75c331a3 Fixes magic eyepatch spell casting (#75270) 2023-05-10 13:27:50 -05:00
Rhials 40873e0a98 Non-random events now provide a cause in their deadchat broadcast (#74904)
## 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:


![image](https://user-images.githubusercontent.com/28870487/233735108-aea2996b-aff4-45e2-ae0c-3e07f86de9b7.png)
Traitors using uplink viruses to turn off the power/comms.


![image](https://user-images.githubusercontent.com/28870487/233734371-18a31dff-198e-4a4a-a43f-15be6cbb545e.png)
Beer nuke!


![image](https://user-images.githubusercontent.com/28870487/233731635-7c93c1ef-641d-40df-975e-a916af4d1129.png)
For when a traitor takes an Space Dragon final objective, which summons
a carp migration event.


![image](https://user-images.githubusercontent.com/28870487/233727323-e2cfc46f-909f-4754-a0f9-a2763360a376.png)
Wizard ritual events!


![image](https://user-images.githubusercontent.com/28870487/233733025-5c8284bc-02e1-41c8-aae4-76a5c2124d97.png)
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!!!!!!!
/🆑
2023-04-24 18:45:41 -06:00
oranges 4c48966ff8 Renames delta time to be a more obvious name (#74654)
This tracks the seconds per tick of a subsystem, however note that it is
not completely accurate, as subsystems can be delayed, however it's
useful to have this number as a multiplier or ratio, so that if in
future someone changes the subsystem wait time code correctly adjusts
how fast it applies effects

regexes used

git grep --files-with-matches --name-only 'DT_PROB' | xargs -l sed -i
's/DT_PROB/SPT_PROB/g'
git grep --files-with-matches --name-only 'delta_time' | xargs -l sed -i
's/delta_time/seconds_per_tick/g'
2023-04-11 21:31:07 -07:00
Bloop bd4392ab74 New inhand icons for light tubes, makes latex balloons craftable, and various other fixes/improvements (#74576)
## 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.


![dreamseeker_6WC8vJMiBW](https://user-images.githubusercontent.com/13398309/230615134-31c51e94-cee5-4eef-ba63-c348a3b2debc.gif)

### 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.


![image](https://user-images.githubusercontent.com/13398309/230617764-3a304fd2-05d0-4b2f-b420-056a93c0dce3.png)

### 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
/🆑
2023-04-09 19:51:35 -04:00
Tim 4397d63a55 Split weapons_and_items.dmi icons into their own categories (#74363)
## 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
/🆑
2023-04-06 08:30:57 +12:00
tralezab dc2f52e386 Blink is no longer a forbidden school spell?? (#74487)
## 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
/🆑
2023-04-04 20:59:50 +02:00
tralezab c3b78761d2 Adds Chuunibyou Spell + Granter (#74404)
## 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
/🆑
2023-04-03 17:11:00 +02:00
necromanceranne c27f9a6d9b Minor Nukie Thing: Bolt-action Sniper Rifle, balance coding, and some ammo changes (#73781)
## 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.
/🆑
2023-03-28 19:16:33 +02:00
Zephyr ecbcef778d Refactors Regenerate Organs, and a few organ helpers (#74219)
## 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>
2023-03-26 17:54:36 +01:00
san7890 a6f49ed542 Refactors Suiciding Variable Into Trait (#74150)
## 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.


![image](https://user-images.githubusercontent.com/34697715/226506321-550c37e7-5de8-4f9f-9ceb-4bf9b1052597.png)

## 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
2023-03-21 20:06:45 -04:00
san7890 bf6f81a9b5 Implements AddTraits and RemoveTraits procs for adding/removing multiple traits + swag unit test (#74037)
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
2023-03-18 01:57:06 +00:00
Jacquerel 44c0099536 Restores Spell Card targetting behaviour (#73706)
## 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.
/🆑
2023-03-10 21:49:23 -07:00
OrionTheFox 709017f772 Fixes Telepathy range checks not applying when sending messages (#73865)
## 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.
/🆑
2023-03-10 15:51:34 -05:00
BlueMemesauce c77e70056e Fixes mime finger gun icon and adds logging to vow of silence (#73825)
## 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>
2023-03-07 16:30:10 -08:00
Jacquerel 35dfe2862c [no gbp] Removes AB_CHECK_INCAPACITATED from spells (#73744)
## 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.
/🆑
2023-03-03 19:41:16 -08:00
Profakos 50b37c8c7f Faction defines (#73681)
## 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
2023-02-28 16:44:08 -07:00
Jacquerel 705f7a419c Refactor Statue & Creature unobserved behaviour (#73630)
## 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.
/🆑
2023-02-26 17:58:51 -07:00
Jacquerel ebcd1d600b Teleport scroll charges cannot be bypassed via clicking the action button (#73653)
## 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.
/🆑
2023-02-26 19:37:14 -05:00
Jacquerel 296ca23aa1 Most actions cannot be used while incapacitated (#73513)
## 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.
/🆑
2023-02-20 15:47:31 -07:00
LemonInTheDark ab307032ed Nightvision Rework (In the name of color) (#73094)
## About The Pull Request

Relies on #72886 for some render relay expansion I use for light_mask
stuff.

Hello bestie! Night vision pissed me off, so I've come to burn this
place to the ground.
Two sections to discuss here. First we'll talk about see_in_dark and why
I hate it, second we'll discuss the lighting plane and how we brighten
it, plus introducing color to the party.

### `see_in_dark` and why it kinda sucks

https://www.byond.com/docs/ref/#/mob/var/see_in_dark

See in dark lets us control how far away from us a turf can be before we
hide it/its contents if it's dark (not got luminosity set)
We currently set it semi inconsistently to provide nightvision to mobs.

The trouble is stuff that produces light != stuff that sets luminosity.
The worst case of this can be seen by walking out of escape on icebox,
where you'll see this


![image](https://user-images.githubusercontent.com/58055496/215683654-587fb00f-ebb8-4c83-962d-a1b2bf429c4a.png)

Snow draws above the lighting plane, so the snow will intermittently
draw, depending on see_in_dark and the luminosity from tracking lights.
This would in theory be solvable by modifying the area, but the same
problem applies across many things in the codebase.
As things currently stand, to be emissive you NEED to have a light on
your tile. People are bad at this, and honestly it's a bit much to
expect of them. An emissive overlay on a canister shouldn't need an
element or something and a list on turfs to manage it.
This gets worse when you factor in the patterns I'm using to avoid
drawing lights above nothing, which leads to lights that should show,
but are misoffset because their parent pixel offsets.

It's silly. We do it so we can have things like mesons without just
handing out night vision, but even there the effect of just hiding
objects and mobs looks baddddddd when moving. It's always bothered me.
I'll complain about mesons more later, but really just like, they're too
bright as it is.

I'm proposing here that rather then manually hiding stuff based off
distance from the player, we can instead show/hide using just the
lighting plane. This means things like mesons are gonna get dimmer, but
that's fine because they suck.

It does have some side effects, things like view() on mobs won't hide
stuff in darkness, but that's fine because none actually thinks about
view like that, I think.

Oh and I added a case to prevent examining stuff that's in darkness, and
not right next to you when you don't have enough nightvision, to match
the old behavior `see_in_dark` gave us.

Now I'd like to go on a mild tangent about color, please bare with me

### Color and why `lighting_alpha` REALLY sucks

You ever walk around with mesons on when there's a fire going, or an
ethereal or firelocks down.
You notice how there isn't really much color to our lights? Doesn't that
suck?

It's because the way we go about brighting lighting is by making
everything on the lighting plane transparent.
This is fine for brightening things, but it ends up looking kinda crummy
in the end and leads to really washed out colors that should be bright.
Playing engineer or miner gets fucking depressing.

The central idea of this pr, that everything else falls out of, is
instead of making the plane more transparent, we can use color matrixes
to make things AT LEAST x bright.

https://www.byond.com/docs/ref/#/{notes}/color-matrix

Brief recap for color matrixes, fully expanded they're a set of 20
different values in a list
Units generally scale 0-1 as multipliers, though since it's
multiplication in order to make an rgb(1,1,1) pixel fullbright you would
need to use 255s.

A "unit matrix" for color looks like this:
```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     0, 0, 0, 0
)
```

The first four rows are how much each r, g, b and a impact r, g, b and
well a.
So a first row of `(1, 0, 0, 0)` means 1 unit of r results in 1 unit of
r. and 0 units of green, blue and alpha, and so on.
A first row of `(0, 1, 0, 0)` would make 1 red component into 1 green
component, and leave red, blue and alpha alone, shifting any red of
whatever it's applied to a green.

Using these we can essentially color transform our world. It's a fun
tool. But there's more.

That last row there doesn't take a variable input like the others.
Instead, it ADDS some fraction of 255 to red, green, blue and alpha.

So a fifth row of `(1, 0, 0, 0)` would make every pixel as red as it
could possibly be.

This is what we're going to exploit here. You see all these values
accept negative multipliers, so we can lower colors down instead of
raising them up!
The key idea is using color matrix filters
https://www.byond.com/docs/ref/#/{notes}/filters/color to chain these
operations together.

Pulling alllll the way back, we want to brighten darkness without
affecting brighter colors.
Lower rgb values are darker, higher ones are brighter. This relationship
isn't really linear because of suffering reasons, but it's good enough
for this.
Let's try chaining some matrixes on the lighting plane, which is bright
where fullbright, and dark where dark.

Take a list like this

```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     -0.2, -0.2, -0.2, 0
)
```
That would darken the lighting a bit, but negative values will get
rounded to 0
A subsequent raising by the same amount
```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     0.2, 0.2, 0.2, 0
)
```
Will essentially threshold our brightness at that value.
This ensures we aren't washing out colors when we make things brighter,
while leaving higher values unaffected since they basically just had a
constant subtracted and then readded.

### But wait, there's more

You may have noticed, we gain access to individual color components
here.
This means not only can we darken and lighten by thresholds, we can
COLOR those thresholds.
```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     0.1, 0.2, 0.1, 0
)
```
Something like the above, if applied with its inverse, would tint the
darkness green.
The delta between the different scalars will determine how vivid the
color is, and the actual value will impact the brightness.

Something that's always bothered me about nightvision is it's just
greyscale for the most part, there isn't any color to it.
There was an old idea of coloring the game plane to match their lenses,
but if you've ever played with the colorblind quirk you know that gets
headachey really fast.
So instead of that, lets color just the darkness that these glasses
produce.
It provides some reminder that you're wearing them, instead of just
being something you forget about while playing, and provides a reason to
use flashlights and such since they can give you a clearer, less tinted
view of things while retaining the ability to look around things.

I've so far applied this pattern to JUST headwear for humans (also those
mining wisps)
I'm planning on furthering it to mobs that use nightvision, but I wanted
to get this up cause I don't wanna pr it the day before the freeze.

Mesons are green, sec night vision is red, thermals orange, etc.

I think the effect this gives is really really nice. 
I've tuned most things to work for the station, though mesons works for
lavaland for obvious reasons.

I've tuned things significantly darker then we have them set currently,
since I really hate flat lighting and this system suffers when
interacting with it.

My goal with these is to give you a rough idea of what's around you,
without a good eye for detail.
That's the difference between say, mesons, and night vision. One helps
you see outlines, the other gives you detail and prevents missing
someone in the darkness.

It's hard to balance this precisely because of different colored
backgrounds (looking at you icebox)
More can be done on this front in future but I'm quite happy with things
as of now

### **EDIT**

I have since expanded to all uses of nightvision, coloring most all of
them.

Along the way I turned some toggleable nightvision into just one level. 
Fullbright sucks, and I'd rather just have one "good" value.

I've kept it for a few cases, mostly eyes you rip out of mobs.
Impacted mobs are nightmares, aliens, zombies, revenants, states and
sort of stands.

I've done a pass on all mobs and items that impact nightvision and added
what I thought was the right level of color to them. This includes stuff
like blobs and shuttle control consoles
As with glasses much of this was around reducing vision, though I kept
it stronger here, since many of these mobs rely on it for engaging with
the game

<details>
<summary>
Technical Changes
</summary>

#### Adds filter proc (the ones that act like templates) support to
filter transitions.
Found this when testing this pr, seemed silly.

#### Makes our emissive mask mask all light instead
This avoids dumbass overlay lighting lighting up wallmounts.
We switch modes if some turfflags are set, to accomplish the same thing
with more overhead, and support showing things through the darkness.

Also fixes a bug where you'd only get one fullscreen object per mob, so
opening and closing a submap would take it away

Also also fixes the lighting backdrop not actually spanning the screen. 
It doesn't actually do anything anymore because of the fullscreen light
we have, but just in case that's unsued.
Needs cleanup in future.

#### Moves openspace to its own plane that doesn't draw, maxing its
color with a sprite

This is to support the above
We relay this plane to lighting mask so openspace can like, have
lighting

#### Changes our definition of nightvision to the light cutoff of night
vision goggles and such
Side affect of removing see_in_dark. This logic is a bit weak atm, needs
some work.

#### Removes the nightvision spell
It's a dupe of the nightvision action button, and newly redundant since
I've removed all uses of it

#### Cleans up existing plane master critical defines, ensures
trasnparent won't render

These sucked
Also transparent stuff should never render, if it does you'll get white
blobs which suck

</details>

## Why It's Good For The Game

Videos! (Github doesn't like using a summary here I'm sorry)
<details>

Demonstration of ghost lighting, and color


https://user-images.githubusercontent.com/58055496/215693983-99e00f9e-7214-4cf4-a76a-6e669a8a1103.mp4

Engi-glass mesons and walking in maint (Potentially overtuned, yellow is
hard)


https://user-images.githubusercontent.com/58055496/215695978-26e7dc45-28aa-4285-ae95-62ea3d79860f.mp4

Diagnostic nightvision goggles and see_in_dark not hiding emissives


https://user-images.githubusercontent.com/58055496/215692233-115b4094-1099-4393-9e94-db2088d834f3.mp4

Sec nightvision (I just think it looks neat)


https://user-images.githubusercontent.com/58055496/215692269-bc08335e-0223-49c3-9faf-d2d7b22fe2d2.mp4

Medical nightvision goggles and other colors


https://user-images.githubusercontent.com/58055496/215692286-0ba3de6a-b1d5-4aed-a6eb-c32794ea45da.mp4

Miner mesons and mobs hiding in lavaland (This is basically the darkest
possible environment)


https://user-images.githubusercontent.com/58055496/215696327-26958b69-0e1c-4412-9298-4e9e68b3df68.mp4

Thermal goggles and coloring displayed mobs


https://user-images.githubusercontent.com/58055496/215692710-d2b101f3-7922-498c-918c-9b528d181430.mp4

</details>

I think it's pretty, and see_in_dark sucks butt.

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and 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: The darkness that glasses and hud goggles that impact your
nightvision (think mesons, nightvision goggles, etc) lighten is now
tinted to match the glasses. S pretty IMO, and hopefully it helps with
forgetting you're wearing X.
balance: Nightvision is darker. I think bright looks bad, and things
like mesons do way too much
balance: Mesons (and mobs in general) no longer have a static distance
you can see stuff in the dark. If a tile is lit, you can now see it.
fix: Nightvision no longer dims colored lights, instead simply
thresholding off bits of darkness that are dimmer then some level.
/🆑
2023-02-17 18:10:39 -07:00
Jacquerel cbbf7b3613 Basic Mob Spiders III: Sgt. Araneus is no longer a bat (#73350)
## About The Pull Request

This PR converts giant spiders into basic mobs and resultingly fixes
#37793
They _should_ have the same behaviour as their simple mob versions
although I can't verify that their movement speeds are _exactly_ the
same. It should at least be pretty close.
A quirk of spiders is that they had a pretty large `move_to_delay` which
made them slow in the hands of AI (because it would just pause for ages
between taking steps) and faster in the hands of players, and they often
appear in both forms so I had to implement this as a speed modifier
based on player control.

Additionally this is the first basic mob which can be set on fire.
This is currently implemented as a var on `mob/living/basic` but I know
there was some annoyance at adding the environment tolerances as vars on
there so if desired I can try and extract it out, I'm just not sure how
easy it will be.

Something else I noticed is that spiders seem to take stamina damage
from bug spray... but stamina damage does nothing to either simple _or_
basic mobs. I have left it in for now in case I am missing something,
and rebalancing it to do something else would be more like a balance
change.

Oh also I killed the `mob/basic/retaliate` folder because that isn't a
classification that needs to exist or makes sense.

## Why It's Good For The Game

We don't want to use simple mobs any more.
Sergeant Araneus can finally actually be a spider, instead of being a
bat.

## Changelog

🆑
refactor: Spider code has been refactored and AI-controlled spiders may
have slightly different movement or reaction times.
fix: Basic mobs can now be slowed when they take stamina damage, however
currently only spiders actually _can_ take stamina damage.
fix: Spiders should now more reliably disable their AI when controlled
by a player.
fix: Araneus is no longer considered to be a bat and so cannot fly.
fix: Araneus is no longer considered to be a bat and so is no longer
frightening to people who are scared of the supernatural.
/🆑
2023-02-13 05:22:26 +00:00
Zephyr 5122fb07cb Refactor SPELL_REQUIRES_OFF_CENTCOM to SPELL_REQUIRES_STATION (#73348)
When I refactored stuff to use lazy templates it broke a few needed checks, this is one of those checks.
Although there is no reason this shouldn't have been checking for station level over not CC
2023-02-12 20:49:22 +00:00
Jacquerel 728a0f1b91 Grand Ritual: Alternate Wizard objective (Wizard Events II) (#72918)
Adds an alternate greentext objective for Wizards known as the "Grand
Ritual". This was initially the gimmick of a different wizard-related
antagonist downstream. I didn't get permission to port it, so I'm
attaching it to regular Wizards instead.

Wizards will spawn in with a new Grand Ritual button next to their
antagonist info button. Pressing it will pinpoint them towards their
next Ritual Location (a randomly chosen region of the space station).
Once within that location, pressing it will summon a magic circle and
obliterate any dense objects which are in the way. This also puts the
ability on a two minute cooldown.
Clicking on the magic circle with an empty hand will begin a three-stage
invocation to gather magical power. You can interrupt this invocation at
any time and will resume from the last stage you completed (if you
finished two stages you only need to do one more).
Once you complete a ritual, a random event will be triggered based on
how many rituals you have performed so far. These tend to be ones which
annoy the crew in some manner, and Wizard Events are included in the
list. Additionally, something weird will usually happen to the room you
are in.
Then you are assigned a new location and can toddle off to do it again.

Once you have done this three times, you will be picked up by the
station's sensors every time you start a subsequent ritual and should
expect annoyed company to come investigate.
Once you have done this six times, you can finally spend all of that
accumulated power on the seventh Grand Finale ritual. Completing this
grants you victory at the end of the round and will have a larger,
flashier effect which you can pick from a list of options, think of it
like a wizard equivalent of a Traitor Final Objective or Heretic
Ascension.
After that you can still keep doing rituals if you want to pester the
crew further by summoning more random events, you've already "won" at
this point so now it's your job to make them want to go home.

I think it'd be more fun to just find out what the Finale ritual can do
by seeing it happen but maintainers will probably want a list of its
precise capabilities, so here it is:

Currently completing a ritual also has a chance to create Heretic
Reality Tears (of both varieties, available for Heretics to eat and
visible to crew) as a kind of cross-antagonist interaction which seemed
to make sense to me but if this seems thematically or mechanically
inappropriate it's easy to strip out.
2023-02-12 14:27:05 -06:00
tralezab 21ef5c8981 Adds two new Sanguine spells to expand the splattercasting set: Exsanguinating Strike and Scream For Me! (#73019)
Adds two new spells. These are "Sanguine" school spells, which means
they do not interact with splattercasting. This is good for
splattercasting wizards, because they can use these spells to gain back
blood without losing the blood casting them.

Sanguine Strike

Empowers your next melee attack to deal more damage (either double or
+20, whichever is less), lifesteal for that amount, and steal 50 blood
from your target.

Scream For Me

Touch attack that applies severe blood wounds on every limb of your
target. Yeah, they're going to be dead shortly after.

Splattercasting is a super unique way to play wizard and I think people
are pretty warm to it, but without enough support for getting more blood
back the most common way these people are dying is simply to blood loss.
This should help them replenish blood a bit easier than feasting on
someone, while still leaving feasting as a good option for a LOT of
blood back.
2023-02-11 18:22:57 +00:00
Jacquerel 3335b5e59f Basic Mob Spiders II: Elements (#73202)
## About The Pull Request

This PR elementises two kinds of spider behaviour in preparation for
making them into Basic Mobs, which in turn will solve a bug with
Araneus.
This will probably conflict with my other PR but I'll deal with it.

The Nurse Spider and Flesh Spider healing abilities which were similar
but not _quite_ the same now share the same component.
Also Lightgeists because they also did this.
I'll be honest I think Flesh Spider would be better off with the
"Regenerator" component instead but that would be a balance change so I
can't do that right now.

The Tarantula "slower when not on webs" passive is also now an element.
This will make my third PR (to be opened when these two are merged)
easier.

Also I noticed we were using the same colour for spawning a particle in
a few places so I moved that hash into the colours define file.

ALSO while making this the linter identified that a shitload of procs
were passing `required_bodytype` to `heal_overall_damage` as if it was
`stamina` which probably caused some bugs. Don't know which though!


https://user-images.githubusercontent.com/7483112/217679050-b728ee98-3ba1-4663-bb6b-75295d5f9a6a.mp4

## Why It's Good For The Game

Reduces amount of duplicated code, making it easier to maintain.
Elements can be reused for other things later, like the infuser?

## Changelog

🆑
refactor: Spider healing abilities have been refactored to reuse the
same code rather than reimplement it across two different mobs, it
should work the same as it used to. This is also used by Lightgeists.
fix: Mob biotype on `heal_overall_damage` should be applied more
consistently. This might mean that some things which were previously
healing prosthetic limbs have stopped doing that.
/🆑
2023-02-10 12:40:31 -07:00
Jacquerel 2ff892757f Correct instances of destroying baseturfs in ChangeTurf & Select dimensional anomaly theme (#73177)
## About The Pull Request

This is starting to hit an atomisation threshold but I promise all of
these fixes are related (they need the same new proc in their fix)

First of all, I needed to debug specific types of dimensional anomaly
because some of them replace the floor with floor tiles and some of them
replace the floor with underlay tiles (like glass plating), so I added
an event override to allow you to pick which to activate.
This actually could be easily removed into another PR if desired, or
even delayed until after the freeze if you don't think it's appropriate,
it just seemed like after I wrote it then I might as well include it and
I'll still need it to retest after addressing any reviews here.

Fixes #39222
Fixes #70161

In both of these instances we were using `ChangeTurf` to turn one kind
of floor into another kind of floor, but this is naive because in both
cases we are also using a mix of "under" floors and "over" floors (from
now on I will refer to these as "plating" and "floor tiles" because
those are easier to understand).

Transforming a plating into a plating, or a tile into a tile works fine
and preserves expected behaviour.
Transforming a tile into a plating is also fine, it just deletes the
"over" layer and leaves you with some floor you can't remove with a
crowbar.
Transforming a plating into a tile creates a floor that you can remove
with a crowbar _and which has no baseturf underneath_, instantly
breaching it to space (or making a hole to the lower z level). This
isn't expected behaviour for either of these effects.

In order to fix this I added a helper proc to `turf/open` called
`replace_floor`.
If you pass this proc a plating it will simply replace the existing
turf. If you pass it a tile then it will _always_ ensure that there is a
plating underneath, making it breach-safe for any future effect (or
other existing one I have forgotten about) which wants to transform
floors.

Also I generally refactored the "transform an area" version of the
colossus crystal because that code was old and smelled bad.

Fixes #55821

Finally I also fixed this for cult constructs, which was a similar but
different bug.
This was creating a _wall_ on top of a plating with changeturf which
would _also_ destroy the plating and leave a void underneath.
I haven't found any other instances of this so I fixed it in the Conjure
spell rather than with a helper proc, but I can make one instead if
desired.

## Why It's Good For The Game

All three of these cases result in unexpected hull breaches, which can
be quite annoying.
In the case of both anomalous items they can cover quite a wide area in
floor which can be trivially breached with a crowbar and then tedious to
replace after it has destroyed all of the air.
In the case of the artificer it could create breaches in cult bases
(very frequently built in maint, which is mostly plating) which would
immediately start suffocating your team. This is obviously not ideal.

Also being able to pick the theme of the anomaly is fun.

## Changelog

🆑
fix: Plating replaced by floor tiles from a dimensional anomaly or
colossus crystal will now still have plating underneath when crowbarred,
instead of space (or open space on z level maps).
fix: Summoning a cult wall on plating as an Artificer will leave the
plating intact underneath when it is removed, rather than replacing it
with a void.
admin: Admins can pick the initial flavour of a manually triggered
dimensional anomaly.
/🆑
2023-02-10 03:45:14 +00:00
Comxy 7e41cd3c0b Netherworld Mobs Refractor (#73086)
## About The Pull Request

This PR refactors netherworld mobs into basic mobs as best as possible.
Also makes some of them run faster when they are getting damaged or deal
more damage. Now the mobs might be able to keep up a little with the
players.
## Why It's Good For The Game

Makes the mobs have better movement and more dynamic movement. Makes the
quality of these mobs better.
## Changelog
🆑
add: Added new damage buffs for netherworld mobs
refactor: Refactors netherworld mobs into basic mobs
/🆑
2023-02-05 12:42:07 -07:00
ATH1909 96117e742d sending a message with telepathy (or an abductor gadget or prayer response) now gives your target a balloon alert (#73087)
## About The Pull Request

revenant telepathy, genetic telepathy, eldritch telepathy, and split
personality communing now give the person you're sending a message to a
balloon alert to get them to check their chat window

EDIT: also added prayer responses, abductor messaging, and abductor mind
control to this list

EDIT: also added additional feedback for antimagic blocking telepathy
and tinfoil blocking abductor mind control

EDIT: also changed the telepathy reception message to more closely
resemble the prayer response one (they're still not identical, though)


![image](https://user-images.githubusercontent.com/42606352/215655699-5c6156a3-02ec-43e8-8cce-55a217888a7b.png)

![image](https://user-images.githubusercontent.com/42606352/215940716-d62706a6-294e-4677-8278-21bc1a969d19.png)

![image](https://user-images.githubusercontent.com/42606352/215940801-d842c448-4924-45e8-822c-bd74c66ca87f.png)
I tested the prayer stuff too, you'll just have to trust me on that one.

## Why It's Good For The Game

fixes https://github.com/tgstation/tgstation/issues/73031

## Changelog

🆑 ATHATH
qol: Revenant telepathy, genetic telepathy, eldritch telepathy, split
personality communing, prayer responses, abductor-to-abductee messaging,
and abductor mind control now give the person you're sending a message
to a balloon alert to get them to check their chat window.
qol: Failing to send a telepathic message and failing to use abductor
mind control on someone now gives better feedback.
tweak: The telepath-ee notification message has been slightly altered.
/🆑
2023-02-02 17:43:35 +00:00
Helg2 0dd820f089 Fixes mime's vow of silence requiring wizard robes to be casted. (#73093)
## About The Pull Request
As it says in title. Also somewhat fixes this #73060 
## Why It's Good For The Game
Cringe mimes can speak again/Changeling mimes can pretend other people
again.
## Changelog
🆑
fix: Mime's Vow of silence will no longer requiere wizard robes to be
casted.
/🆑
2023-01-31 22:42:06 -07:00
Jacquerel 66cb9133c4 Dominate & Lazarus Inject basic mobs. Lazarus Injected mobs don't fight each other. (#72440)
## About The Pull Request

Fixes #72404 
The Lazarus Injector doesn't currently work on basic mobs, but should.

Problem:
The EMPed state of the Lazarus Injector is intended to make a revived
mob hostile to everyone except you, including other mobs you have
revived wtih an EMPed Lazarus Injector.
This is trivial to achieve for Simple Mobs which essentially all share
the same AI, but I could not think of a single workable solution for
Basic Mobs which don't, or at least any which didn't come with a tedious
requirement to closely consider this niche item when programming any
additional AI.

Solution:
Change the default behaviour of the Lazarus Injector so this is not a
problem.
If all it does it make the mob loyal to you _and_ friendly to other mobs
which are loyal to you, then it's pretty easy because we can just use
the existing faction flags.

This is unambiguously a buff to using the item for nefarious purposes as
now if you revive four ice drakes and fulton them onto the station they
won't kill each other until only one is left, but is the only workable
solution I could really think of.
A lot of the very dangerous mining fauna can't be dragged so
transporting your army to the station still poses a question.

The alternate solution was just to replace the AI controller of any
emp-revived basic mob with a "zombie" AI controller, but this has the
problem that
A- It would now make things like cows and dogs into hostile creatures
when they previously weren't.
B- It loses any interesting behaviour the mob previously had and for
cases like Bileworms doesn't even make any sense (they'd try to walk and
just get stuck in place).
This ultimately leads to needing to make bespoke versions for various
mobs, which doesn't seem desirable from a maintainability standpoint.

As a side note it's still not a great idea to revive Bileworms _anyway_
as, their ability to move is tied to their ability to attack so once
they don't have a target they will just kind of sit there and if they
_do_ get a target their attempts to help you fight are difficult to
distinguish from attempts to kill you... but at least being able to
revive them makes it easier to make one sapient if you really want to
trap a player's mind inside a body which is incapable of leaving
lavaland.

Additional edit:
At Fikou's suggestion I've also added a sentience comparison proc to
`mob/living` and removed some code duplication which dealt with this
problem in the sentience/mind transfer potions, as well as added it to
the Dominate spell.

## Why It's Good For The Game

This device is meant to revive mobs and it shouldn't be required for
players to memorise an arbitrary list of which mobs it does and doesn't
work on.
Especially as the goal is eventually that all simple mobs should be
basic mobs.
This way of working is more intuitive, even if it is also stronger. I
was surprised when I used EMPed injectors and my "new minions" just
killed each other.

## Changelog

🆑
fix: You can now revive 'basic mobs' with a Lazarus Injector, such as
dogs, cows, axolotls, or carp.
fix: The same category of mobs can also now be effected by the Runic
Golem Dominate spell.
fix: Basic Mobs will switch target if they can no longer attack their
current target; meaning that if you become a Bileworm's friend it will
stop attacking you.
balance: Mobs injected with the Lazarus Injector while it is EMPed will
no longer attack other mobs revived by EMPed Lazarus Injectors.
/🆑
2023-01-30 16:14:23 -08:00
ChungusGamer666 5991542d4a Turns miming into a trait instead of an unsightly mind boolean (#72290)
## About The Pull Request

https://github.com/tgstation/tgstation/pull/72254 turned to be wildly
unpopular so i'm simplifying it and keeping only the important, code
backend stuff

## Why It's Good For The Game

makes the code gooder, makes mobs without a mind capable of miming (if
that becomes necessary for whatever reason)

## Changelog

Not player facing

Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
2023-01-21 16:00:43 -08:00
Jeremiah 872e64fb05 Adds spaces around logical operators (#72603)
## About The Pull Request
Part of a prior PR that was closed (#72562). This version does not add
the check in CI.
## Why It's Good For The Game
The work is already done, so I figured why not.
## Changelog
N/A Nothing player facing

Co-authored-by: Jeremiah Snow <jlsnow301@pm.me>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-01-16 16:56:35 -08:00
Rhials 66b7310039 STAY IN THE LIGHT: Adds terrify Nightmare spell, terrified status effect, and a reason to mind the shadows (#72282)
Adds the Terrify spell, and its associated status effect, Terrified.
This new spell is given to antagonist nightmares, as a part of their
brain. The spell only works in those surrounded by darkness, and will
apply the Terrified status effect if successful. Upon being Terrified,
victims will passively gain **Terror Buildup** if they remain in the
dark. As buildup increases, so do the negative effects, including tunnel
vision, panic attacks, dizziness, and more.

There are two primary methods for mitigating terror buildup. The first
is moving into the light, which will reverse the passive terror buildup
and eventually make it go away. The other method is by getting a hug
from a friendly hand, which will reduce buildup significantly.

Getting a hug from an UNfriendly hand (a nightmare, for instance) will
cause the victim to freak out and be briefly knocked down. This can be
spammed on targets who are caught alone in the dark, keeping them in an
unfavorable position (sideways) and adding to the victim's terror
buildup considerably. Escape into the light as soon as possible, or
you'll be pushed to MAXIMUM TERROR BUILDUP.

To what end? Heart failure. Past the soft terror cap (which limits how
much passively generated terror you can make) exists the hard terror
cap. Bypassing that threshold will cause a stress induced heart attack
and knock you unconscious (embarrassing!)
2023-01-17 00:07:54 +00:00
MrMelbert c3a1f21c1a Converts blindness and nearsightedness to status effects, scratches some VERY dumb blindness handling that resulted in mobs becoming "incurably" blind (#72267)
## About The Pull Request

- Nearsighted is now a grouped status effect.
- Blindness is now a grouped status effect.
   - Eye handling of blindness has improved. 
- When eyes are removed, they now cause you to become blind, rather than
handling it in `update_tint`.
- Being ahealed no longer blinds you for one tick, meaning that black
overlay on aheal is gone.
- Temporary Blindness is now a status effect.
- Both Nearsightedness and Blindness have been exorcised from mob vars
and life chains. This means that we've finally cut 2 procs from life,
`handle_status_effect` and `handle_traits`, and moved both to event
based processing. Wooo optimizations.
- Swapped pacifism status effect to use apply and set helpers. 
- Removed an unused admin toggle that disabled welding helmet tint but
also tint from every clothing item and also blindness from losing your
eyes.
- Clothes now generally all blind their mob more consistently.
- Oculine, eye surgery, and sensory restoration are now no longer the
only way to fix blindness from eye damage. If your eyes are healed
through any other means, it will also heal your blindness.
- Some things that made you blind, such as ling blind sting, no longer
just flat made you blind from eye damage forever. They now cause eye
damage directly, which in turn makes you blind from eye damage, as
expected.
- Pacifists can't eyestab anymore. Eyestabs now have a limit on the
amount of blur applied.
- Refactored some `is_x_covered` procs to accept flags rather than have
a lot of arguments for some silly reason.
- Unit tests for blindness. 

## Why It's Good For The Game

Blindness was exceptionally poorly handled prior, primarily due to the
fact that it was tied to the mob instead of separated out

On top of that the system put a LOT of faith in proper handling of
blindness on the coder's end which was misplaced evidently. Many places
didn't update or handle blindness correctly, or just let people
perma-blind.

Deferring it to a status effect improves this a lot

## Changelog

🆑 Melbert
refactor: Refactored blindness and nearsightedness. Important to note is
that all mobs are naturally blind until their eyes are actually created.
refactor: Refactored "is covered" procs
fix: Less sources of blindness now cause permanent blindness. Includes
the "Blind" Spell and "Blind Sting" from changelings.
admin: Ahealing someone no longer flashes the blind overlay for 1 tick.
admin: I removed an unused (sort of) inaccessible admin verb that
allowed you to toggle the tint from all welding helmets (and clothing)
(and lack of eyes) in existence, let me know if you want similar back
balance: Changeling "Blind Sting" now causes eye damage (enough to
blind) rather than arbitrarily forcing blindness.
balance: Visionloss virus symptom now causes eye damage (enough to
blind) rather than arbitrarily forcing blindness.
balance: Oculine has been reworked slightly. Prior, Oculine arbitrarily
healed blindness and nearsightedness from eye damage reagrdless of how
damaged the eyes were, and applied blur on success. Now, Oculine just
heals eye damage, and blindness / nearsightedness is restored in the
process. There is now a probability every tick that eye blur is applied
based on how pure the oculine is while healing very damaged eyes.
balance: Pacifists can no longer eyestab.
balance: Any clothing item that covers your eyes contributes to getting
the bonus while sleeping, and to removing temporary blindness faster
/🆑
2023-01-15 23:01:40 -08:00
Helg2 d345ef9536 Fixes smoke spell being not-robeless (#72222)
Makes smoke spell work while robeless as intended,
this fixes cases like the Traitor Ninja kit now allowing you
to actually use the spell that comes with it.
2023-01-01 13:35:13 +00:00
Rhials 4596b9de9b Instant Summons will now brutally rip out embedded objects, and drag the embedee to you if nearby. (#71848)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

The instant summons spell will cause embedded weapons to be violently
torn out from victims upon being recalled away. This comes with bonus
removal damage and a piercing wound. If you are near the victim as this
happens, they will be violently launched towards you. Make sure not to
let them fly into you!

Feel free to try it with the High-Frequency Blade (100% embed chance)
next time you're wizard.

Also, if the numbers on this seem a bit extreme, give me a heads up.
Combat balance isn't exactly my forte.


https://user-images.githubusercontent.com/28870487/206542566-0cf72e21-332e-48a5-801b-0f8478ef24ff.mp4

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

## Why It's Good For The Game

Adds an interesting synergy to one of the more commonly accessible
spells. Get creative, get violent.

Encourages people to use summons for more interesting things than
shove/steal insurance.

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

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and 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. -->

🆑
balance: Instant Summons will now violently tear out embedded objects as
they are summoned, and will drag embedee to you if nearby.
/🆑

<!-- 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. -->

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2022-12-30 18:54:08 -08:00
MrMelbert 7eeb14858e Touch spells can now be used for high fiving, which casts it on the high-five-ee. (#71978)
## About The Pull Request


![image](https://user-images.githubusercontent.com/51863163/207437877-cecbad86-9af4-44ea-a1d9-75d16087e2c5.png)


https://user-images.githubusercontent.com/51863163/207440026-bbb77b71-1b9a-4330-9192-61b50e079df2.mp4

Offering a touch spell to someone will offer them a high five like with
the slapper.

If someone accepts your offer to high five, you will cast the spell on
them.

### **Important distinction: Cult spells are not touch spells they
aren't even spells**

## Why It's Good For The Game

A funny interaction with the offer system. High five people with smite
for fantastic results.

## Changelog

🆑 Melbert
add: You can now high five people with (non-cult) touch spells! Maybe be
careful high-fiving a wizard who knows Smite.
/🆑
2022-12-26 19:26:14 -08:00
MrMelbert 0d4b56435b Converts drowsy and eye blur to status effects, striking yet another two carbon level status vars (#71950)
## About The Pull Request

You know the deal by now.

- Drowsiness is now tracked via status effect.
- Eye blue is now tracked via status effect.

In converting these over, cleaned up a bit of code relating to some
other effects. Attempts to unify behavior between some of them, namely
certain biotypes or mob types shouldn't be experiencing certain effects.

## Why It's Good For The Game

More stuff moved to status effects, slightly more cleaner and better to
work with code. Allows for all mobs that can sleep to be able to get
drowsy, too.

## Changelog

🆑 Melbert
refactor: Drowsiness and Blurred Eyes are now tracked via status effect.
/🆑
2022-12-26 19:58:21 +01:00
Jacquerel b174af7661 Basic Mob Carp Part VIII: Basic Mob Carp (#72073)
## About The Pull Request

Wow we're finally here. This turns carp into Basic Mobs instead of
Simple Animals.
They use a variety of behaviours added in previous PRs to act in a
marginally more interesting way than they used to.
But don't worry there's still 2 or 3 PRs to follow this one until I'm
done with space fish.

Changes in this PR:
Carp will try to run away if they get below 50% health, to make use of
their "regenerate if not attacked" component.
Magicarp have different targetting behaviour for spells depending on
their spell;
- Ressurecting Carp will try to ressurect allied mobs.
- Animating Carp will try to animate nearby objects.
- Door-creating Carp will try to turn nearby walls into doors.

You can order Magicarp to cast their spell on something if you happen to
manage to tame one.
The eating element now has support for "getting hurt" when you eat
something. Carp eating can rings and hating it was too soulful not to
continue supporting.

## Why It's Good For The Game

Carp are iconic beasts and I think they should be more interesting.
Also we just want to turn mobs into basic mobs anyway.

## Changelog

🆑
add: Carp will now run away if their health gets low, meaning they may
have a chance to regenerate.
add: Lia will now fight back if attacked instead of letting herself get
killed, watch out!
balance: Magicarp will now aim their spells more intelligently.
add: Tame Magicarp can be ordered to use their spells on things.
refactor: Carp are now "Basic Mobs" instead of "Simple Mobs"
fix: Dehydrated carp no longer give you a bad feeling when they're your
friend and a good feeling when they're going to attack you.
balance: Tamed carp are now friendly only to their tamer rather than
their whole faction, which should make dehydrated carp more active.
Order them to stay or follow you if you want them to behave around your
friends.
/🆑
2022-12-25 18:24:18 -08:00
Rhials f0effc5d93 Gives shadow jaunt users a warning before moving into a lit area (#72154)
## About The Pull Request

When using Shadow Jaunt, if you are about to walk onto a tile that will
force you out of your jaunt, you will receive a warning and be held back
for a moment. After the delay, you will have a window to continue moving
into the light and leave your jaunt. If you need to get out of your
jaunt sooner, you can manually exit the shadow jaunt with the action
button.


https://user-images.githubusercontent.com/28870487/209010307-f8973e2d-b92d-4d2b-b0a1-3211a6eb034d.mp4

(It's a bit faster than shown in the video, just trust me)

It's not perfect, and with bad timing you might slip out of it anyways,
but it's better than nothing. If you are intentionally trying to bypass
a wall, you'll have to wait out the delay if you want to come out on the
other side of it.

There's a few minor code changes to help facilitate this.
check_light_level no longer ejects the jaunter on its own, instead
returning true or false based on if the light level is above the
acceptable amount. It also now receives a location to check the light
level of, rather than strictly checking the location of the jaunt
effect.

If this ends up being too clunky or restrictive, I'd be fine with
changing the warning to a toggleable option on the Nightmare's HUD.
## Why It's Good For The Game

Shadow jaunt moves you very fast, and is difficult to move precisely in
(especially when under the pressure of a tactical retreat). It's not
uncommon for Nightmares to accidentally fling themselves past a wall in
maintenance and be exposed in an unfavorable location.

There are already so many ways for a Nightmare to be screwed over.
Accidentally walking through a wall and dying is probably one of the
lamest.
## Changelog
🆑 Rhials
qol: Shadow Jaunter users now receive a brief warning before walking
into light and being forcibly un-jaunted.
/🆑
2022-12-24 12:54:09 +01:00
Sol N 7687a28e7c refreshes syndi-kits and syndicate surplus crates, introduces shared limited stock (#71869)
## About The Pull Request

After all, the Syndicate loves a good throwback.


![C6O47fPhAB](https://user-images.githubusercontent.com/116288367/207737104-3d24574f-02e0-433d-8ea7-6825ca4cb970.png)

This PR does a few things with the goal of reimplementing and
revitalizing syndicate traitor kits and the syndicate surplus crate.
Of note is that I have added in a way for limited stock items to share
their limited stock.

Following maintainer guidance the syndicate traitor kits have increased
in price and as a result some of the lower value ones have been
adjusted. I've given all active bundles current TC costs per item
knowing full well they will be inaccurate eventually.

<details>
  <summary>Changes as a result of my audit of syndikits</summary>
    
### UNCHANGED
Recon, Spai, Stealthy, Screwed, Sniper, Nukie Meta, Implants
Mad Scientist, Bees

Lord Singuloth is also unchanged and disabled, I think that it should
turn into a new supermatter themed kit maybe. outside of current scope.

### Gun Kit
Replaced emag with doorjack and gave it a chameleon holster, literally
moved 1 tc elsewhere

### Murderer
replaced emag again, no additions its a lot of tc and Just Good

### Hacker
added doorjack, otherwise unchanged

### Sabotage
no changes other than adding in extra bombs it didnt have

### James Bond
gave him some gadgets with the freedom implant, emp flashlight, and one
x4. also a cyanide pill and deck of cards for fun

### Ninja
Added in miner Jump Boots, smoke spell, and doorjack. dont just want it
to be space ninja

### Dark Lord
Added in new lightning bolt spell granter and made the desword default
to red. probably overbudget.

### White Whale
dehydrated carp added so you can ride it alongside the ones you grenade
out. hard to imagine changing this

### Mr Freeze
changed temperature gun to be cryo only so that i could give him the
cryo thermal pistol. cold attacks only.

### 2006 Traitor
doorjack.

</details> 

tl;dr theyre all about 30 tc worth of shit more or less some are more
but thats what rarity should be for
you can only buy from one type of syndicrate per round


![QOF1WO7CC6](https://user-images.githubusercontent.com/116288367/207739417-00ae6b81-b6aa-4774-a4bb-f2d880988ff4.gif)

Next up is the return of the surplus crate. 
Crate is generated, gives you gear **based on your progression at the
time of buying the crate**, you can use it all at the start and get some
chameleon kits and not a lot of dangerous weapons or wait till later.
I've changed the weight on some items here and there and given weight to
role and species locked items, though I will admit that latter is
unimportant because I set moth lanterns to be unable to appear in these
two crates.


![dreamseeker_t8abXysKqK](https://user-images.githubusercontent.com/116288367/206761978-96e2a51e-f9a5-48e4-a863-a9198fa15ea2.gif)

But who cares about that your eyes instantly went to the United Surplus
Crate and the United Surplus Key lets be honest.

The united surplus crate is 80 TC worth of uplink items relative to your
current progression when you purchase it and gives you a locked box. It
**will explode if you try to break it** so be careful with it. It gives
you 80 TC and costs 20 TC because it is impossible to open without key.
The rub of course is that the Syndicate forbids agents from buying more
than one surplus item of any kind, you need to find another traitor and
make them buy you a key to open your box. Or I guess you can share the
box?


![dreamseeker_ts0AZeiyfy](https://user-images.githubusercontent.com/116288367/207740388-3f688bba-5d71-48d2-8079-671bbed7e54e.gif)

Regardless, if the crate is opened with any other means it doesn't spawn
its contents, you need 2 traitor uplinks.
Both of these items have a 30 minute timer because you don't want a
crate that has 5 emp flashlights in it. You at least want one energy
sword.

I did a lot of code shit and changed various things to be proc based to
allow for more editing and interjection of things, as I wrote in code
comments making a crate thats locked to a specific set of progression
just means changing the proc that generates a list of valid uplink items
to check items' progression values to a specified value instead of your
characters progression.

Ok I think that goes over everything more or less????

## Why It's Good For The Game

I've heard that people liked these and I think they are quite fun, being
able to go from "i dunno what to do as a traitor" to "ah, of course, I
will become the Bombler" is a fun thing to be able to have, and people
like to get a bunch of random shit in the mail. Some of it even feels
free!!!!!!!!!!!!!!!!!!! Brain points go up!!!

The division of procs allows for more creativity with this system than
existed before as well as other possibilities for interacting with the
uplink handler in funny ways.

## Changelog

🆑
add: the syndicate is once again distributing syndi-kits, some now with
new technology
add: a fresh batch of syndicate surplus crates have been sent out,
though they seem a bit lighter than before
add: in an effort to encourage cooperation, a traitor can now purchase
either the new United Surplus Syndicate Crate or its key, but not both
add: lightning bolt book granter for wizard event and one syndie-kit
bundle
add: temperature gun that only makes things colder for one syndie-kit
bundle
code: it is now possible to have uplink items share limited stock
bal: role-restricted items no longer can be delivered by the stray
syndicate drop pod event
/🆑
2022-12-18 12:23:32 +00:00
Imaginos16 0ccd96e910 Revolver Resprites: Imaginos Edition (#72008)
## About The Pull Request
Self Explanatory! This PR resprites every revolver in the game and adds
a new variety: The Syndicate Revolver!

![image](https://user-images.githubusercontent.com/77556824/207713437-c4908250-be0b-47bc-9991-20dd106ebdd3.png)

This also takes into account detective revolvers and their reskins!

![image](https://user-images.githubusercontent.com/77556824/207713493-bcc384c6-fc9a-4a98-9199-acfe937d6d9b.png)

The Syndicate Revolver itself is a cosmetic change of the regular .357
revolver, which can still be found via gatfruit, or Garbage Day. The
Syndicate Revolver can be obtained via the battlecruiser, or any uplink.

Special thanks to @axietheaxolotl for making the Syndicate Revolver
sprite.
## Why It's Good For The Game
The previous sprites were either too old, or looked like plastic toys,
and desperately needed a visual overhaul. This PR addresses that issue
in a very direct manner!
## Changelog
🆑 PositiveEntropy, AxieTheAxolotl
imageadd: Resprites every revolver!
imageadd: Adds the Syndicate Revolver, a visually new, but mechanically
identical .357 revolver to uplinks!
/🆑

Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
2022-12-16 01:00:33 +00:00