# Description
Implements the softcrit functionality.
Similiar to critical state but spessmen will be able to communicate and
crawl around, but not pick up items.
Also supports configuring what is and isn't allowed in different
MobStates (per mob prototype): you can enable picking up items while in
softcrit so people can pick up their lasgun and continue shooting after
taking a 40x46mm to their ass cheeks from the guest nukies while being
dragged to safety.

<details> <summary><h1>Technical details</h1></summary>
New prototype type: "mobStateParams" (`MobStateParametersPrototype`)
Used to specify what can and can't be done when in a certain mobstate.
Of note that they are not actually bound to any `MobState` by
themselves. To assign a params prototype to a mobstate, use
`InitMobStateParams` in `MobStateComponent`.
It has to be a prototype because if I just did something akin to
`Dictionary<MobState, Dictionary<string, bool>>`, you'd have to check
the parent and copy every flag besides the one you wish to modify. That
is, if I understand how the prototype system works correctly, which I
frankly doubt. <!-- Working on softcrit made me hate prototypes. -->
MobStateComponent now has:
- `Dictionary<string, string> InitMobStateParams`, for storing "mobstate
- parameter prototype" pairs. `<string, string>` because it has to be
editable via mob prototypes. Named "mobStateParams" for mob prototypes.
- `public Dictionary<MobState, MobStateParametersPrototype>
MobStateParams` for actually storing the params for each state
- `public Dictionary<MobState, MobStateParametersOverride>
MobStateParamsOverrides` for storing overrides.
`MobStateParametersOverride` is a struct which mirrors all
`MobStateParametersPrototype`'s fields, except they're all nullable.
This is meant for code which wants to temporarily override some setting,
like a spell which allows dead people to talk. This is not the best
solution, but it should do at first. A better option would be tracking
each change separately, instead of hoping different systems overriding
the same flag will play nicely with eachother.
- a shitton of getter methods
TraitModifyMobState now has:
- `public Dictionary<string, string> Params` to specify a new prototype
to use.
- Important note: All values of `MobStateParametersPrototype` are
nullable, which is a hack to support `TraitModifyMobState`. This trait
takes one `MobStateParametersPrototype` per mobstate and applies all of
its non-null values. This way, a params prototype can be created which
will only have `pointing: true` and the trait can apply it (e.g. to
critstate, so we can spam pointing while dying like it's a game of turbo
dota)
- The above is why that wall of getters exists: They check the relevant
override struct, then the relevant prototype. If both are null, they
default to false (0f for floats.) The only exception is
OxyDamageOverlay, because it's used both for oxy damage overlay (if
null) and as a vision-limiting black void in crit..
MobStateSystem now has:
- a bunch of new "IsSomething"/"CanDoSomething" methods to check the
various flags, alongside rewritten old ones.
-

lookin ahh predicate factory
</details>
---
# TODO
done:
- [x] Make proper use of `MobStateSystem.IsIncapacitated()`.
done: some checks were changed, some left as they did what was (more or
less) intended.
<details>Previous `IsIncapacitated()` implementation simply checked if
person was in crit or dead. Now there is a `IsIncapacitated` flag in the
parameters, but it's heavily underutilized. I may need some help on this
one, since I don't know where would be a good place to check for it and
I absolutely will not just scour the entire build in search for them.
</details>
- [x] Separate force-dropping items from being downed
done: dropItemsOnEntering bool field. If true, will drop items upon
entering linked mobstate.
- [x] Don't drop items if `ForceDown` is true but `PickingUp` is also
true.
done: dropItemsOnEntering bool field. If true, will drop items upon
entering linked mobstate.
- [x] Actually check what are "conscious attempts" are used for
done: whether or not mob is conscious. Renamed the bool field
accordingly.
- [x] Look into adding a way to make people choke "slowly" in softcrit
as opposed to choking at "regular speed" in crit. Make that into a param
option? Make that into a float so the speed can be finetuned?
done: `BreathingMultiplier` float field added.
<details>
1f is regular breathing, 0.25 is "quarter-breathing". Air taken is
multiplied by `BreathingMultiplier` and suffocation damage taken (that
is dealt by RespiratorSystem, not all oxy damage) is multiplied by
`1-BreathingMultiplier`.
</details>
- [x] make sure the serializer actually does its job
done: it doesn't. Removed.
- [x] Make an option to prohibit using radio headsets while in softcrit
done: Requires Incapacitated parameter to be false to be able to use
headset radio.
- [x] Make sure it at least compiles
not done:
- [ ] probably move some other stuff to Params if it makes sense. Same
thing as with `IsIncapacitated` though: I kinda don't want to, at least
for now.
---
<details><summary><h1>No media</h1></summary>
<p>
:p
</p>
</details>
---
# Changelog
🆑
- add: Soft critical state. Crawl to safety, or to your doom - whatever
is closer.
---------
Signed-off-by: RedFoxIV <38788538+RedFoxIV@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
(cherry picked from commit 9a357c1774f1a783844a07b5414f504ca574d84c)
# Description
Honestly... much needed until they can get a proper rework from the
original creators. This PR nerfs them a shit ton (no more teleporting
away when you're in danger, smh) to make them more in line with the
other species so they aren't powergamer central. Additionally, brings
them more in-line with the traditional SS13 shadowkin. Shadowkins should
no longer get darkswap and such, in fact I've commented out the entire
ability until it too can get a rework.
---
# TODO
- [x] Removed DarkSwap from Shadowkin
- [x] Made shadowkins take more damage from heat, slash, and piercing
- [x] Brought shadowkin much more in line with their SS13 counterparts
- [x] Fixed shadowkin lore, making the guidebook entry more interesting
- [x] Fixed shadowkin lore file, adding in their species lore instead of
relying on a google doc
- [x] Shadowkin can be chosen as a player species roundstart
- [x] Rework Marish to have a more fleshed out language protoype
- [ ] Make DarkSwap unable to interact with the world as a whole
- [ ] Give DarkSwap a longer cooldown
- [ ] Make DarkSwap unable to be used if stunned
- [ ] Adjust DarkSwap glimmer production
- [x] Shadowkin do not have black eyes by default
- [x] Shadowkin have the black eyes trait listed (Waveform Misalignment
equivalent)
- [x] Shadowkin can now be mystagogue, mantis, chaplain, cataloguer, and
prisoner.
- [x] Shadowkin cannot have blackeye trait for mystagogue, mantis,
chaplain, or cataloguer.
- [x] Shadowkin must have blackeye trait for prisoner.
---
# Changelog
🆑 ShirouAjisai
- add: Shadowkins can now be roundstart species again
- add: Shadowkins now have a lungs, yippee!
- add: Shadowkins now have organs with funny little descriptions
- add: Shadowkins now have a brand new and expanded list of names
- add: Shadowkins now have roundstart innate telepathy ability rather
than a whole new language for it.
- tweak: Shadowkins take more damage from heat, slash, and piercing
- tweak: Shadowkins are much more like their SS13 counterparters
- tweak: Shadowkins now have much better lore in their guidebook entry
- tweak: Shadowkins now have a more fleshed out language (to outside
observers)
- tweak: Shadowkins now can be mystagogue, mantis, chaplain, and
cataloguer
- tweak: Shadowkins must now have blackeye trait to play prisoner
- tweak: Shadowkins no longer have blackeye trait by default
- tweak: Shadowkins now take asphyxiation damage, albeit at half the
rate of others.
- tweak: Shadowkins now have a more pronounced snout.
- remove: Removed DarkSwap from Shadowkin roundstart
---------
Signed-off-by: SixplyDev <einlichen@gmail.com>
Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com>
Co-authored-by: ShirouAjisai <zaneromeave319@gmail.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
(cherry picked from commit 031a102e2fe8ca1533375168b3ae64f65f5e99ea)
<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->
# Description
<!--
Explain this PR in as much detail as applicable
Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->
This PR compleatly rework shadowkins, slightly been forced this makes
shadowkins more "psionic creature" then anything else.
This is a WIP, but in general this PR make Shadowkin "Psionic" and fall
under the same rule.
RIP Shadowkin for me but ye.
CHANGES TO SHADOWKINS:
Shadowkins now follow the laws of psionic, they will always spawn with
DarkSwapPower but can generate others power, they do not spawn with
Shadeskip by default anymore, Mana has been lower from 250 to 200; they
can now pick normal psionic jobs.
Changes to DarkSwap:
DarkSwap cost 30 Mana and will raise glimmer on use, its will drain 1
Mana/Sec, will eject the user when mana is fully drained.
DarkSwap is now a random roll.
Changes to Psionics:
Added the Mana Alert for all psionics
---
# TODO
<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->
- [x] Psionic Mana Alert
- [x] DarkSwap Rework
- [x] Remove Unique Shadowkin Psionic Changes
- [x] Import bugs fixes/QOL changes.
---
<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->
<details><summary><h1>Media</h1></summary>
<p>
N/A
</p>
</details>
---
# Changelog
<!--
You can add an author after the `🆑` to change the name that appears
in the changelog (ex: `🆑 Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->
🆑
- tweak: Shadowkins has returned and has been reworked.
- add: DarkSwap is now in the Psionic Power Pool.
- tweak: Psionics can now see their mana pools.
---------
Signed-off-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com>
Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com>
(cherry picked from commit 93446f1004396c6d86a109690f0033f983d95d3e)