Mood Rework Part 1 (#2425)

This PR significantly reworks some parts of the mood system, namely by
completely restoring and reworking the saturation scale shader so that
its not completely terrible. Additionally, I've added numerous new
instances and locations where Moodlets can be found in the game,
particularly when it comes to food and drugs, as well as a new Mood
interaction with the Deep Fryer. Chef gameplay is significantly expanded
via the introduction of flavor related moodlets, as well as the almighty
deep fryer giving a unique, moderately strong, and long lasting moodlet
to anyone who eats whatever you deep fry.

Go ahead, give someone a deep fried stick of salted butter coated in
chocolate. You'll make their day.

The big differences with the Saturation Scale are that its now variable,
with smooth transitions, with the scale scaling with your character's
mood. The more depressed you are, the more desaturated the world
becomes. Whereas if you have entirely too many positive mood bonuses,
the world becomes incredibly vibrant.

<details><summary><h1>Media</h1></summary>
<p>

Shoukou's Bar as seen by someone with the Sanguine trait(and no other
moodlets)

![image](https://github.com/user-attachments/assets/bf8e7b25-5243-41ee-a6ad-3170444faae6)

Max mood

![image](https://github.com/user-attachments/assets/fc03ee20-37a5-4163-ac35-8f2735f8b531)

Saturnine trait:

![image](https://github.com/user-attachments/assets/fc21fc20-81e5-4364-807f-fcef40837ade)

Minimum mood(dead)

![image](https://github.com/user-attachments/assets/b38e8ce8-0ea2-436d-b298-b1a715b0a6c2)

Smooth transitions for shader tone.

https://github.com/user-attachments/assets/3ab55da1-eca6-4cc5-9489-f4ad13ed0f27

</p>
</details>

🆑
- add: Re-enabled the "Mood shader" after significantly reworking it.
Mood visual effects now scale with your character's mood, instead of
only ever being near-greyscale. Being high life now makes the world more
colorful and saturated.
- add: A huge variety of medicines, drugs, and even food items(based on
flavor!) now have mood effects. Reaching for the packet of salt now
actually makes food provide a better mood buff.
- add: Being Tear-gassed causes a massive mood penalty.
- add: Deep frying food provides a strong mood bonus.
- add: Added new Manic, Mercurial, and Dead Emotions traits.

Signed-off-by: VMSolidus <evilexecutive@gmail.com>
This commit is contained in:
VMSolidus
2025-05-17 17:10:11 -04:00
committed by Spatison
parent 38348df975
commit dc52f8bf2b
29 changed files with 677 additions and 69 deletions

View File

@@ -3,7 +3,7 @@ using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Content.Shared.Mood;
using Robust.Shared.Timing;
using Content.Shared.Overlays;
namespace Content.Client.Overlays;
@@ -17,8 +17,7 @@ public sealed class SaturationScaleOverlay : Overlay
public override bool RequestScreenTexture => true;
public override OverlaySpace Space => OverlaySpace.WorldSpace;
private readonly ShaderInstance _shader;
private const float Saturation = 0.5f;
private float _currentSaturation = 1f;
public SaturationScaleOverlay()
{
@@ -36,14 +35,14 @@ public sealed class SaturationScaleOverlay : Overlay
return base.BeforeDraw(in args);
}
protected override void Draw(in OverlayDrawArgs args)
{
if (ScreenTexture is null)
if (ScreenTexture is null || _playerManager.LocalEntity is not { Valid: true } player
|| !_entityManager.HasComponent<SaturationScaleOverlayComponent>(player))
return;
_shader.SetParameter("SCREEN_TEXTURE", ScreenTexture);
_shader.SetParameter("saturation", Saturation);
_shader.SetParameter("saturation", _currentSaturation);
var handle = args.WorldHandle;
handle.SetTransform(Matrix3x2.Identity);
@@ -51,4 +50,19 @@ public sealed class SaturationScaleOverlay : Overlay
handle.DrawRect(args.WorldBounds, Color.White);
handle.UseShader(null);
}
protected override void FrameUpdate(FrameEventArgs args)
{
if (ScreenTexture is null || _playerManager.LocalEntity is not { Valid: true } player
|| !_entityManager.TryGetComponent(player, out SaturationScaleOverlayComponent? saturationComp)
|| _currentSaturation == saturationComp.SaturationScale)
return;
var deltaTSlower = args.DeltaSeconds * saturationComp.FadeInMultiplier;
var saturationFadeIn = saturationComp.SaturationScale > _currentSaturation
? deltaTSlower : -deltaTSlower;
_currentSaturation += saturationFadeIn;
_shader.SetParameter("saturation", _currentSaturation);
}
}

View File

@@ -0,0 +1,45 @@
using Content.Server.Mood;
using Content.Shared.EntityEffects;
using Content.Shared.Mood;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
namespace Content.Server.EntityEffects.Effects;
/// <summary>
/// Removes all non-categorized moodlets from an entity(anything not "Static" like hunger & thirst).
/// </summary>
[UsedImplicitly]
public sealed partial class ChemPurgeMoodlets : EntityEffect
{
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) =>
Loc.GetString("reagent-effect-guidebook-purge-moodlets");
[DataField]
public bool RemovePermanentMoodlets;
public override void Effect(EntityEffectBaseArgs args)
{
if (args is not EntityEffectReagentArgs _)
return;
var entityManager = IoCManager.Resolve<EntityManager>();
var protoMan = IoCManager.Resolve<IPrototypeManager>();
if (!entityManager.TryGetComponent(args.TargetEntity, out MoodComponent? moodComponent))
return;
var moodletList = new List<string>();
foreach (var moodlet in moodComponent.UncategorisedEffects)
{
if (!protoMan.TryIndex(moodlet.Key, out MoodEffectPrototype? moodProto)
|| moodProto.Timeout == 0 && !RemovePermanentMoodlets)
continue;
moodletList.Add(moodlet.Key);
}
foreach (var moodId in moodletList)
entityManager.EventBus.RaiseLocalEvent(args.TargetEntity, new MoodRemoveEffectEvent(moodId));
}
}

View File

@@ -0,0 +1,36 @@
using Content.Shared.EntityEffects;
using Content.Shared.Mood;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
namespace Content.Server.EntityEffects.Effects;
/// <summary>
/// Removes a moodlet from an entity if present.
/// </summary>
[UsedImplicitly]
public sealed partial class ChemRemoveMoodlet : EntityEffect
{
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
{
var protoMan = IoCManager.Resolve<IPrototypeManager>();
return Loc.GetString("reagent-effect-guidebook-remove-moodlet",
("name", protoMan.Index<MoodEffectPrototype>(MoodPrototype.Id)));
}
/// <summary>
/// The mood prototype to be removed from the entity.
/// </summary>
[DataField(required: true)]
public ProtoId<MoodEffectPrototype> MoodPrototype = default!;
public override void Effect(EntityEffectBaseArgs args)
{
if (args is not EntityEffectReagentArgs _)
return;
var entityManager = IoCManager.Resolve<EntityManager>();
var ev = new MoodRemoveEffectEvent(MoodPrototype);
entityManager.EventBus.RaiseLocalEvent(args.TargetEntity, ev);
}
}

View File

@@ -12,7 +12,6 @@ using Content.Shared.Movement.Systems;
using Content.Shared.Mood;
using Content.Shared.Overlays;
using Content.Shared.Popups;
using Content.Shared.Traits.Assorted.Components;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
using Timer = Robust.Shared.Timing.Timer;
@@ -33,7 +32,6 @@ public sealed class MoodSystem : EntitySystem
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly IConfigurationManager _config = default!;
public override void Initialize()
{
base.Initialize();
@@ -47,8 +45,11 @@ public sealed class MoodSystem : EntitySystem
SubscribeLocalEvent<MoodComponent, MoodRemoveEffectEvent>(OnRemoveEffect);
}
private void OnShutdown(EntityUid uid, MoodComponent component, ComponentShutdown args) =>
private void OnShutdown(EntityUid uid, MoodComponent component, ComponentShutdown args)
{
_alerts.ClearAlertCategory(uid, component.MoodCategory);
RemComp<SaturationScaleOverlayComponent>(uid);
}
private void OnRemoveEffect(EntityUid uid, MoodComponent component, MoodRemoveEffectEvent args)
{
@@ -92,7 +93,6 @@ public sealed class MoodSystem : EntitySystem
private void OnMoodEffect(EntityUid uid, MoodComponent component, MoodEffectEvent args)
{
if (!_config.GetCVar(CCVars.MoodEnabled)
|| !_config.GetCVar(CCVars.MoodEnabled)
|| !_prototypeManager.TryIndex<MoodEffectPrototype>(args.EffectId, out var prototype) )
return;
@@ -268,7 +268,7 @@ public sealed class MoodSystem : EntitySystem
uid = ev.Receiver;
amount = ev.MoodChangedAmount;
var newMoodLevel = amount + neutral;
var newMoodLevel = amount + neutral + ev.MoodOffset;
if (!force)
newMoodLevel = Math.Clamp(
amount + neutral,
@@ -283,6 +283,7 @@ public sealed class MoodSystem : EntitySystem
mood.NeutralMoodThreshold = component.MoodThresholds.GetValueOrDefault(MoodThreshold.Neutral);
}
RefreshShaders(uid, component.CurrentMoodLevel);
UpdateCurrentThreshold(uid, component);
}
@@ -313,7 +314,6 @@ public sealed class MoodSystem : EntitySystem
{
_movementSpeedModifier.RefreshMovementSpeedModifiers(uid);
SetCritThreshold(uid, component, modifier);
RefreshShaders(uid, modifier);
}
// Modify interface
@@ -325,12 +325,11 @@ public sealed class MoodSystem : EntitySystem
component.LastThreshold = component.CurrentMoodThreshold;
}
private void RefreshShaders(EntityUid uid, int modifier)
private void RefreshShaders(EntityUid uid, float mood)
{
if (modifier == -1)
EnsureComp<SaturationScaleOverlayComponent>(uid);
else
RemComp<SaturationScaleOverlayComponent>(uid);
EnsureComp<SaturationScaleOverlayComponent>(uid, out var comp);
comp.SaturationScale = mood / 50;
Dirty(uid, comp);
}
private void SetCritThreshold(EntityUid uid, MoodComponent component, int modifier)
@@ -417,7 +416,6 @@ public sealed partial class ShowMoodEffects : IAlertClick
var playerManager = IoCManager.Resolve<IPlayerManager>();
if (!entityManager.TryGetComponent<MoodComponent>(uid, out var comp)
|| comp.CurrentMoodThreshold == MoodThreshold.Dead
|| !playerManager.TryGetSessionByEntity(uid, out var session))
return;

View File

@@ -1,13 +1,12 @@
using Content.Server.Body.Components;
using Content.Shared.Nutrition.Components;
using Content.Server.Nutrition.EntitySystems;
using Content.Shared.FixedPoint;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
namespace Content.Server.Nutrition.Components;
[RegisterComponent, Access(typeof(FoodSystem), typeof(FoodSequenceSystem))]
[RegisterComponent]
public sealed partial class FoodComponent : Component
{
[DataField]
@@ -80,4 +79,7 @@ public sealed partial class FoodComponent : Component
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public bool RequireDead = true;
[DataField]
public HashSet<string> MoodletsOnEat = new();
}

View File

@@ -10,7 +10,6 @@ using Content.Shared.Administration.Logs;
using Content.Shared.Body.Components;
using Content.Shared.Body.Organ;
using Content.Shared.Chemistry;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Database;
using Content.Shared.DoAfter;
using Content.Shared.FixedPoint;
@@ -37,6 +36,7 @@ using Content.Shared.CCVar;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Whitelist;
using Robust.Shared.Configuration;
using Content.Shared.Mood;
namespace Content.Server.Nutrition.EntitySystems;
@@ -323,6 +323,9 @@ public sealed class FoodSystem : EntitySystem
_popup.PopupPredicted(Loc.GetString("food-system-eat-broadcasted-success", ("user", Identity.Entity(args.User, EntityManager)), ("food", Identity.Entity(entity.Owner, EntityManager))),
args.User, args.User, PopupType.MediumCaution);
foreach (var mood in entity.Comp.MoodletsOnEat)
RaiseLocalEvent(args.User, new MoodEffectEvent(mood));
// log successful voluntary eating
_adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.User):target} ate {ToPrettyString(entity.Owner):food}");
}

View File

@@ -236,5 +236,8 @@ namespace Content.Server.Nyanotrasen.Kitchen.Components
[ViewVariables(VVAccess.ReadWrite)]
[DataField("soundRemoveItem")]
public SoundSpecifier SoundRemoveItem = new SoundPathSpecifier("/Audio/Nyanotrasen/Machines/deepfryer_basket_remove_item.ogg");
[DataField]
public string DeepFriedMoodletPrototype = "DeepFriedEffect";
}
}

View File

@@ -347,6 +347,9 @@ public sealed partial class DeepFryerSystem : SharedDeepfryerSystem
MakeCrispy(item);
if (TryComp(item, out FoodComponent? foodComp))
foodComp.MoodletsOnEat.Add(component.DeepFriedMoodletPrototype);
var oilToUse = 0;
if (HasComp<ItemComponent>(item)) {

View File

@@ -25,5 +25,5 @@ public sealed partial class CCVars
CVarDef.Create("mood.modify_thresholds", false, CVar.SERVER);
public static readonly CVarDef<bool> MoodVisualEffects =
CVarDef.Create("mood.visual_effects", false, CVar.CLIENTONLY | CVar.ARCHIVE);
CVarDef.Create("mood.visual_effects", true, CVar.CLIENTONLY | CVar.ARCHIVE);
}

View File

@@ -48,7 +48,7 @@ public sealed class MoodRemoveEffectEvent : EntityEventArgs
/// EG: The end result after tallying up all Moodlets comes out to 70, but a trait multiplies it by 0.8 to make it 56.
/// </summary>
[ByRefEvent]
public record struct OnSetMoodEvent(EntityUid Receiver, float MoodChangedAmount, bool Cancelled);
public record struct OnSetMoodEvent(EntityUid Receiver, float MoodChangedAmount, bool Cancelled, float MoodOffset = 0f);
/// <summary>
/// This event is raised on an entity when it receives a mood effect, but before the effects are calculated.

View File

@@ -2,5 +2,15 @@
namespace Content.Shared.Overlays;
[RegisterComponent, NetworkedComponent]
public sealed partial class SaturationScaleOverlayComponent : Component { }
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class SaturationScaleOverlayComponent : Component
{
[DataField, AutoNetworkedField]
public float SaturationScale = 1f;
/// <summary>
/// Modifies how quickly the saturation "fades in", normally at a rate of 1% per second times this multiplier.
/// </summary>
[DataField, AutoNetworkedField]
public float FadeInMultiplier = 0.1f;
}

View File

@@ -0,0 +1,22 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Traits.Assorted.Components;
/// <summary>
/// A component that intensifies moodlets by a random amount.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class ManicComponent : Component
{
/// <summary>
/// The lower bound for multiplying moodlet effects. This also deadens negative moods.
/// </summary>
[DataField]
public float LowerMultiplier = 0.7f;
/// <summary>
/// The amount to multiply moodlets by. This will also intensify negative moods too.
/// </summary>
[DataField]
public float UpperMultiplier = 1.3f;
}

View File

@@ -0,0 +1,22 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Traits.Assorted.Components;
/// <summary>
/// A component that randomly varies user's mood. Triggers each time mood is changed.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class MercurialComponent : Component
{
/// <summary>
/// The lower bounds for random mood offsets.
/// </summary>
[DataField]
public float LowerMood = -10f;
/// <summary>
/// The upper bounds for random mood offsets.
/// </summary>
[DataField]
public float UpperMood = 10f;
}

View File

@@ -5,6 +5,8 @@ using Content.Shared.Traits.Assorted.Components;
using Content.Shared.Damage.Events;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Damage.Components;
using Content.Shared.Mood;
using Robust.Shared.Random;
namespace Content.Shared.Traits.Assorted.Systems;
@@ -12,6 +14,7 @@ public sealed partial class TraitStatModifierSystem : EntitySystem
{
[Dependency] private readonly ContestsSystem _contests = default!;
[Dependency] private readonly MobThresholdSystem _threshold = default!;
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
@@ -22,6 +25,8 @@ public sealed partial class TraitStatModifierSystem : EntitySystem
SubscribeLocalEvent<AdrenalineComponent, GetThrowingDamageEvent>(OnAdrenalineGetThrowingDamage);
SubscribeLocalEvent<PainToleranceComponent, GetMeleeDamageEvent>(OnPainToleranceGetMeleeDamage);
SubscribeLocalEvent<PainToleranceComponent, GetThrowingDamageEvent>(OnPainToleranceGetThrowingDamage);
SubscribeLocalEvent<ManicComponent, OnSetMoodEvent>(OnManicMood);
SubscribeLocalEvent<MercurialComponent, OnSetMoodEvent>(OnMercurialMood);
}
private void OnCritStartup(EntityUid uid, CritModifierComponent component, ComponentStartup args)
@@ -83,4 +88,10 @@ public sealed partial class TraitStatModifierSystem : EntitySystem
var modifier = _contests.StaminaContest(uid, component.BypassClamp, component.RangeModifier);
return component.Inverse ? 1 / modifier : modifier;
}
private void OnManicMood(EntityUid uid, ManicComponent component, ref OnSetMoodEvent args) =>
args.MoodChangedAmount *= _random.NextFloat(component.LowerMultiplier, component.UpperMultiplier);
private void OnMercurialMood(EntityUid uid, MercurialComponent component, ref OnSetMoodEvent args) =>
args.MoodOffset += _random.NextFloat(component.LowerMood, component.UpperMood);
}

View File

@@ -379,6 +379,12 @@ reagent-effect-guidebook-add-moodlet =
*[other] for {$timeout} seconds
}
reagent-effect-guidebook-remove-moodlet =
Removes the {$name} moodlet.
reagent-effect-guidebook-purge-moodlets =
Removes all active non-permanent moodlets.
reagent-effect-guidebook-purify-evil = Purifies evil powers
reagent-effect-guidebook-plant-diethylamine =
{ $chance ->

View File

@@ -90,3 +90,69 @@ mood-effect-PlasmamanIngestPlasma =
mood-effect-PlasmamanIngestMilk =
I can feel the milk's calcium repairing my bones. This is dairy-lightful!
# Floor Juice
mood-effect-DrankBlood =
I've just drank salty, lukewarm blood. That's disgusting!
mood-effect-DrankBloodVampiric =
Oh what sweet nectar is this, like a fine vintage.
mood-effect-DrankInsectBlood =
I've just drank slimy insect goop. That's disgusting!
mood-effect-DrankVomit =
Why did I just drink that vomit? It tastes like vomit!
mood-effect-DrankZombieBlood =
THAT TASTED VILE, LIKE DEATH IN LIQUID FORM!
# Medicines
mood-effect-EpinephrineEffect =
My blood feels like it has been set on fire!
mood-effect-PsicodineEffect =
I feel completely at peace.
mood-effect-StrongStimulant =
LET'S FUCKING GO!!!
mood-effect-MildPaincauser =
My body feels sore.
mood-effect-StrongPaincauser =
Agony gnaws at my soul.
mood-effect-MildPainkiller =
My aches and pains are just a little better.
mood-effect-StrongPainkiller =
I can barely feel anything, all of my pains are washed out and faded.
# Poisons
mood-effect-LacerinolEffect =
BILLIONS OF TINY KNIVES ARE INSIDE ME, GET THEM OUT!
mood-effect-PuncturaseEffect =
MY BODY IS FULL OF NEEDLES, GET THEM OUT!
mood-effect-BruizineEffect =
I FEEL LIKE I'M BEING CRUSHED BY A THOUSAND TON SPACE SHIP!
mood-effect-TearGasEffect =
MY EYES ARE BURNING, IT HURTS SO MUCH!
mood-effect-BuzzochloricBeesEffect =
OH NO NOT THE BEES! NOT THE BEES! NOT THE BEES AGHHHHHHHHHHHH! THEY'RE IN MY EYES!
mood-effect-RomerolEffect =
I THINK I AM GOING TO DIE. I AM BUT A CORPSE AWAITING ITS GRAVE.
mood-effect-PaxEffect =
Woah...
# Food
mood-effect-SweetenerEffect =
That tasted really sweet.
mood-effect-SpicyEffect =
That tasted spicy, hot in a good way.
mood-effect-OilyEffect =
I ate something cooked with sweet oil.
mood-effect-SaltyEffect =
I ate something salty, it tasted great!
mood-effect-MintyEffect =
I ate something minty, it was cool and refreshing.
mood-effect-PepperEffect =
I ate something peppery, it tasted great!
mood-effect-ChocolateEffect =
I ate something with chocolate, it was so good!
mood-effect-ButterEffect =
I ate a buttery treat, I could eat this all day.
mood-effect-DeepFriedEffect =
I ate something deep fried! It was the tastiest thing I've ever had in my life!
mood-effect-TastyEffect =
That was really tasty!

View File

@@ -654,6 +654,15 @@ trait-description-IPCBrittleBoneDisease =
This trait reduces your threshold for death by 60 points.
(Just as the normal version, it halves the threshold. IPCs cannot be crit, so it instead makes you die 60 points sooner.)
trait-name-Manic = Manic
trait-description-Manic = Your perception of the world is subject to varying intensities. Anything that affects your mood will have its effects multiplied by between 0.7 and 1.3.
trait-name-Mercurial = Mercurial
trait-description-Mercurial = Your mood fluctuates regularly, causing you to have a random modifier to your mood that is always somewhere between -10 and +10.
trait-name-DeadEmotions = Dead Emotions
trait-description-DeadEmotions = You feel nothing, and are completely unaffected by all positive or negative mood modifiers.
trait-name-IPCFaultyWaterproofing = Faulty Waterproofing
trait-description-IPCFaultyWaterproofing =
Either due to damage or cheap construction, your chassis is not waterproof.
@@ -665,3 +674,4 @@ trait-description-IPCFragileCircuits =
Your chassis is particularly bad at handling electric discharges.
You immediately shut down any time you take [color=orange]Shock[/color] damage and must be rebooted.
fragileCircuits-kill-popup = {$name}'s circuits shut down from short-circuiting!

View File

@@ -30,10 +30,159 @@
# Non-Addictive Drugs
- type: moodEffect
id: EthanolBenefit
moodChange: 7
moodChange: 3
timeout: 300 #5 minutes
- type: moodEffect
id: SpaceDrugsBenefit
moodChange: 7
timeout: 300 #5 minutes
- type: moodEffect
id: StrongStimulant
moodChange: 10
timeout: 300 #5 minutes
# Floor Juice
- type: moodEffect
id: DrankBlood
moodChange: -10
timeout: 60 #1 minute
- type: moodEffect
id: DrankBloodVampiric
moodChange: 10
timeout: 300 #5 minutes
- type: moodEffect
id: DrankInsectBlood
moodChange: -10
timeout: 60 #1 minute
- type: moodEffect
id: DrankVomit
moodChange: -10
timeout: 60 #1 minute
- type: moodEffect
id: DrankZombieBlood
moodChange: -30
timeout: 600 #10 minute
# Medicines
- type: moodEffect
id: EpinephrineEffect
moodChange: -3
timeout: 300 #5 minutes
- type: moodEffect
id: PsicodineEffect
moodChange: 8
timeout: 300 #5 minutes
- type: moodEffect
id: MildPaincauser
moodChange: -1
timeout: 300 #5 minutes
- type: moodEffect
id: StrongPaincauser
moodChange: -5
timeout: 300 #5 minutes
- type: moodEffect
id: MildPainkiller
moodChange: 1
timeout: 300 #5 minutes
- type: moodEffect
id: StrongPainkiller
moodChange: 5
timeout: 300 #5 minutes
# Poisons
- type: moodEffect
id: LacerinolEffect
moodChange: -20
timeout: 60 #1 minute
- type: moodEffect
id: PuncturaseEffect
moodChange: -20
timeout: 60 #1 minute
- type: moodEffect
id: BruizineEffect
moodChange: -20
timeout: 60 #1 minute
- type: moodEffect
id: TearGasEffect
moodChange: -20
timeout: 60 #1 minute
- type: moodEffect
id: BuzzochloricBeesEffect
moodChange: -20
timeout: 60 #1 minute
- type: moodEffect
id: RomerolEffect
moodChange: -200
timeout: 1800 #30 minutes
- type: moodEffect
id: PaxEffect
moodChange: 100
timeout: 60 #1 minute
# Food
- type: moodEffect
id: SweetenerEffect
moodChange: 0.5
timeout: 1800 #30 minutes
- type: moodEffect
id: SpicyEffect
moodChange: 0.5
timeout: 1800 #30 minutes
- type: moodEffect
id: OilyEffect
moodChange: 0.5
timeout: 1800 #30 minutes
- type: moodEffect
id: SaltyEffect
moodChange: 0.5
timeout: 1800 #30 minutes
- type: moodEffect
id: MintyEffect
moodChange: 0.5
timeout: 1800 #30 minutes
- type: moodEffect
id: PepperEffect
moodChange: 0.5
timeout: 1800 #30 minutes
- type: moodEffect
id: ChocolateEffect
moodChange: 3
timeout: 1800 #30 minutes
- type: moodEffect
id: ButterEffect
moodChange: 4
timeout: 1800 #30 minutes
- type: moodEffect
id: DeepFriedEffect
moodChange: 5
timeout: 1800 #30 minutes
- type: moodEffect
id: TastyEffect
moodChange: 3
timeout: 1800 #30 minutes

View File

@@ -262,7 +262,7 @@
conditions:
- !type:ReagentThreshold
reagent: Ethanol
min: 5
min: 1
- type: reagent
id: Gin

View File

@@ -7,6 +7,11 @@
flavor: sweet
color: aquamarine
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: BbqSauce
@@ -17,6 +22,11 @@
flavor: sweet
color: darkred
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: Cornoil
@@ -27,6 +37,11 @@
flavor: oily
color: yellow
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: OilyEffect
- type: reagent
id: Frostoil
@@ -36,6 +51,11 @@
physicalDesc: reagent-physical-desc-cold
flavor: cold
color: skyblue
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: MintyEffect
- type: reagent
id: HorseradishSauce
@@ -46,6 +66,11 @@
flavor: spicy
color: gray
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SpicyEffect
- type: reagent
id: Hotsauce
@@ -56,6 +81,11 @@
flavor: spicy
color: red
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SpicyEffect
- type: reagent
id: Ketchup
@@ -66,6 +96,11 @@
flavor: tomato
color: red
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: Ketchunaise
@@ -76,6 +111,11 @@
flavor: ketchunaise
color: "#fba399"
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: LaughinSyrup
@@ -86,6 +126,11 @@
flavor: sweet
color: "#803280"
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: Mayo
@@ -96,6 +141,11 @@
flavor: mayonnaise
color: "#f9f5e5"
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: Mustard
@@ -106,6 +156,11 @@
flavor: mustard
color: "#ffdb58"
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: Vinaigrette
@@ -116,6 +171,11 @@
flavor: sour
color: "#efdaae"
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
- type: reagent
id: Soysauce
@@ -133,6 +193,8 @@
factor: 0.5
- !type:SatiateThirst
factor: -0.5 # high salt content
- !type:ChemAddMoodlet
moodPrototype: SaltyEffect
- type: reagent
id: TableSalt
@@ -164,6 +226,8 @@
# eating salt on its own kinda sucks, kids
- !type:SatiateThirst
factor: -0.5
- !type:ChemAddMoodlet
moodPrototype: SaltyEffect
- type: reagent
id: Syrup
@@ -184,6 +248,8 @@
effects:
- !type:SatiateHunger
factor: 6.0 #Stronger than cookedramen
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
footstepSound:
collection: FootstepBlood
params:

View File

@@ -86,6 +86,8 @@
reagent: Nutriment
min: 0.1
factor: 1
- !type:ChemAddMoodlet
moodPrototype: SweetenerEffect
plantMetabolism:
- !type:PlantAdjustNutrition
amount: 0.1

View File

@@ -104,6 +104,11 @@
flavor: peppery
color: black
recognizable: true
metabolisms:
Food:
effects:
- !type:ChemAddMoodlet
moodPrototype: PepperEffect
- type: reagent
id: Vinegar
@@ -157,8 +162,8 @@
flavor: oily
flavorMinimum: 0.05
color: olive
meltingPoint: -6.0 #Nyano - Summary: Add melting point for fryer.
boilingPoint: 299.0 #Nyano - Summary: Add boiling point for fryer.
meltingPoint: -6.0 #Nyano - Summary: Add melting point for fryer.
boilingPoint: 299.0 #Nyano - Summary: Add boiling point for fryer.
recognizable: true
metabolisms:
Food:
@@ -166,6 +171,8 @@
- !type:AdjustReagent
reagent: Nutriment
amount: 0.75
- !type:ChemAddMoodlet
moodPrototype: OilyEffect
- type: reagent
id: Oil
@@ -200,6 +207,8 @@
- !type:AdjustReagent
reagent: Nutriment #Oils enhance nutrition
amount: 0.75
- !type:ChemAddMoodlet
moodPrototype: SpicyEffect
Poison:
effects:
- !type:AdjustTemperature
@@ -234,6 +243,8 @@
reagent: Nutriment
min: 0.1
factor: 1
- !type:ChemAddMoodlet
moodPrototype: ChocolateEffect
plantMetabolism:
- !type:PlantAdjustNutrition
amount: 0.1
@@ -258,4 +269,6 @@
effects:
- !type:AdjustReagent
reagent: Nutriment
amount: 0.75
amount: 0.75
- !type:ChemAddMoodlet
moodPrototype: ButterEffect

View File

@@ -46,6 +46,16 @@
type: Vampiric
reagent: Omnizine
amount: 0.3
- !type:ChemAddMoodlet
moodPrototype: DrankBlood
conditions:
- !type:OrganType
type: Human
- !type:ChemAddMoodlet
moodPrototype: DrankBloodVampiric
conditions:
- !type:OrganType
type: Vampiric
Food:
effects:
- !type:AdjustReagent
@@ -84,6 +94,11 @@
recognizable: true
physicalDesc: reagent-physical-desc-slimy
slippery: false
metabolisms:
Drink:
effects:
- !type:ChemAddMoodlet
moodPrototype: DrankInsectBlood
- type: reagent
id: Slime
@@ -146,6 +161,14 @@
recognizable: true
physicalDesc: reagent-physical-desc-metallic
slippery: false
metabolisms:
Drink:
effects:
- !type:ChemAddMoodlet
moodPrototype: DrankBlood
conditions:
- !type:OrganType
type: Human
- type: reagent
parent: Blood
@@ -158,6 +181,14 @@
recognizable: true
physicalDesc: reagent-physical-desc-pungent
slippery: false
metabolisms:
Drink:
effects:
- !type:ChemAddMoodlet
moodPrototype: DrankBlood
conditions:
- !type:OrganType
type: Human
- type: reagent
id: ZombieBlood
@@ -182,6 +213,9 @@
Poison: 4
- !type:ChemVomit
probability: 0.25
- !type:CauseZombieInfection
- !type:ChemAddMoodlet
moodPrototype: DrankZombieBlood
- type: reagent
id: Ichor
@@ -250,6 +284,8 @@
- !type:AdjustReagent
reagent: Nutriment
amount: 0.1
- !type:ChemAddMoodlet
moodPrototype: DrankVomit
footstepSound:
collection: FootstepBlood
params:

View File

@@ -135,6 +135,8 @@
- !type:HasTag
invert: true
tag: Bee
- !type:ChemAddMoodlet
moodPrototype: BuzzochloricBeesEffect
- type: reagent
id: GroundBee
@@ -204,6 +206,8 @@
- !type:Emote
emote: Scream
probability: 0.3
- !type:ChemAddMoodlet
moodPrototype: LacerinolEffect
- type: reagent
id: Fresium

View File

@@ -138,6 +138,8 @@
Radiation: -3
groups:
Brute: 0.5
- !type:ChemAddMoodlet
moodPrototype: StrongPaincauser
- type: reagent
id: Bicaridine
@@ -172,6 +174,8 @@
- !type:ReagentThreshold
min: 15
- !type:Drunk
- !type:ChemAddMoodlet
moodPrototype: MildPaincauser
- type: reagent
id: Cryoxadone
@@ -383,6 +387,8 @@
- !type:MovespeedModifier # Goob edit
walkSpeedModifier: 1.1
sprintSpeedModifier: 1.1
- !type:ChemAddMoodlet
moodPrototype: EpinephrineEffect
- type: reagent
id: Hyronalin
@@ -451,6 +457,8 @@
Asphyxiation: -5
- !type:ModifyBleedAmount
amount: -0.25
- !type:ChemAddMoodlet
moodPrototype: MildPainkiller
- type: reagent
id: Kelotane
@@ -484,6 +492,8 @@
conditions:
- !type:ReagentThreshold
min: 25
- !type:ChemAddMoodlet
moodPrototype: MildPainkiller
- type: reagent
id: Leporazine
@@ -631,6 +641,11 @@
conditions:
- !type:ReagentThreshold
min: 10
- !type:ChemRemoveMoodlet
moodPrototype: RomerolEffect
conditions:
- !type:ReagentThreshold
min: 10
- type: reagent
id: AmbuzolPlus
@@ -648,6 +663,11 @@
conditions:
- !type:ReagentThreshold
min: 5
- !type:ChemRemoveMoodlet
moodPrototype: RomerolEffect
conditions:
- !type:ReagentThreshold
min: 5
- type: reagent
id: PulpedBananaPeel
@@ -745,6 +765,11 @@
key: SeeingRainbows
time: 15.0
type: Remove
- !type:ChemPurgeMoodlets
conditions:
- !type:ReagentThreshold
reagent: Synaptizine
min: 10
- type: reagent
id: TranexamicAcid
@@ -793,6 +818,8 @@
Heat: -0.5
Shock: -0.5
Cold: -0.5 # Was .33, Buffed due to limb damage changes
- !type:ChemAddMoodlet
moodPrototype: MildPainkiller
- type: reagent
id: Lipozine
@@ -1017,6 +1044,8 @@
damage:
types:
Cold: 3
- !type:ChemAddMoodlet
moodPrototype: LacerinolEffect
- type: reagent
id: Puncturase
@@ -1041,6 +1070,8 @@
damage:
types:
Blunt: 5
- !type:ChemAddMoodlet
moodPrototype: PuncturaseEffect
- type: reagent
id: Bruizine
@@ -1064,6 +1095,8 @@
damage:
types:
Poison: 4
- !type:ChemAddMoodlet
moodPrototype: BruizineEffect
- type: reagent
id: Pyrazine
@@ -1273,14 +1306,8 @@
key: Drunk
time: 6.0
type: Remove
- !type:PopupMessage # we dont have sanity/mood so this will have to do
type: Local
visualType: Medium
messages:
- "psicodine-effect-fearless"
- "psicodine-effect-anxieties-wash-away"
- "psicodine-effect-at-peace"
probability: 0.2
- !type:ChemAddMoodlet
moodPrototype: PsicodineEffect
- type: reagent
id: PotassiumIodide

View File

@@ -52,6 +52,8 @@
key: Adrenaline
component: IgnoreSlowOnDamage
time: 5
- !type:ChemAddMoodlet
moodPrototype: StrongStimulant
Medicine:
effects:
- !type:ResetNarcolepsy
@@ -109,6 +111,9 @@
key: Adrenaline
component: IgnoreSlowOnDamage
time: 5
- !type:ChemAddMoodlet
moodPrototype: StrongStimulant
# WD EDIT START
- !type:GenericStatusEffect # WWDP
key: NoScream
component: NoScream
@@ -123,6 +128,7 @@
reagent: Ephedrine
max: 1.1
min: 1
# WD EDIT END
Medicine:
effects:
- !type:ResetNarcolepsy
@@ -149,8 +155,8 @@
sprintSpeedModifier: 1.3
- !type:HealthChange
conditions:
- !type:ReagentThreshold
min: 80 #please wait 3 minutes before using another stimpack
- !type:ReagentThreshold
min: 80 #please wait 3 minutes before using another stimpack
damage:
types:
Poison: 1
@@ -190,23 +196,25 @@
key: Adrenaline
component: IgnoreSlowOnDamage
time: 5
- !type:ChemAddMoodlet
moodPrototype: StrongStimulant
Medicine:
metabolismRate: 1.0
effects:
- !type:ResetNarcolepsy
- !type:SatiateHunger
factor: 1
- !type:SatiateThirst
factor: 1
- !type:HealthChange
conditions:
- !type:TotalDamage
min: 70
max: 120 # you've got a chance to get out of crit
damage: # heals at the same rate as tricordrazine, doesn't heal poison because if you OD'd I'm not giving you a safety net
groups:
Burn: -1
Brute: -1
- !type:ResetNarcolepsy
- !type:SatiateHunger
factor: 1
- !type:SatiateThirst
factor: 1
- !type:HealthChange
conditions:
- !type:TotalDamage
min: 70
max: 120 # you've got a chance to get out of crit
damage: # heals at the same rate as tricordrazine, doesn't heal poison because if you OD'd I'm not giving you a safety net
groups:
Burn: -1
Brute: -1
- type: reagent
id: THC
@@ -303,10 +311,6 @@
min: 15
- !type:ChemAddMoodlet
moodPrototype: SpaceDrugsBenefit
conditions:
- !type:ReagentThreshold
reagent: SpaceDrugs
min: 5
- type: reagent
id: Bananadine
@@ -454,6 +458,8 @@
conditions:
- !type:ReagentThreshold
min: 5
- !type:ChemAddMoodlet
moodPrototype: TearGasEffect
- type: reagent
id: Happiness
@@ -487,17 +493,8 @@
conditions:
- !type:ReagentThreshold
min: 20
- !type:PopupMessage # we dont have sanity/mood so this will have to do
type: Local
visualType: Medium
messages:
- "psicodine-effect-fearless"
- "psicodine-effect-anxieties-wash-away"
- "psicodine-effect-at-peace"
probability: 0.2
conditions:
- !type:ReagentThreshold
max: 20
- !type:ChemAddMoodlet
moodPrototype: PsicodineEffect
- !type:GenericStatusEffect
key: SeeingRainbows
component: SeeingRainbows

View File

@@ -470,6 +470,11 @@
conditions:
- !type:ReagentThreshold
min: 5
- !type:ChemAddMoodlet
moodPrototype: RomerolEffect
conditions:
- !type:ReagentThreshold
min: 5
- type: reagent
id: UncookedAnimalProteins
@@ -556,6 +561,8 @@
component: Pacified
refresh: false
type: Add
- !type:ChemAddMoodlet
moodPrototype: PaxEffect
- type: reagent
id: Honk

View File

@@ -208,3 +208,55 @@
- type: ReplacementAccent
replacementChance: 0.15
accent: liar
- type: trait
id: Manic
category: Mental
points: 0
requirements:
- !type:CharacterJobRequirement
inverted: true
jobs:
- Borg
- StationAi
functions:
- !type:TraitAddComponent
components:
- type: Manic
- type: trait
id: Mercurial
category: Mental
points: 0
requirements:
- !type:CharacterJobRequirement
inverted: true
jobs:
- Borg
- StationAi
functions:
- !type:TraitAddComponent
components:
- type: Mercurial
- type: trait
id: DeadEmotions
category: Mental
points: -5
requirements:
- !type:CharacterJobRequirement
inverted: true
jobs:
- Borg
- StationAi
- !type:CharacterTraitRequirement
inverted: true
traits:
- Sanguine
- Saturnine
- Manic
- Mercurial
functions:
- !type:TraitRemoveComponent
components:
- type: Mood

View File

@@ -132,6 +132,8 @@
- !type:AdjustReagent
reagent: Mitogen
amount: 0.125 # 1.25 per 5u
- !type:ChemAddMoodlet
moodPrototype: StrongPainkiller
- type: reagent
id: Mitogen
@@ -722,6 +724,8 @@
conditions:
- !type:ReagentThreshold
min: 20
- !type:ChemAddMoodlet
moodPrototype: MildPainkiller
# Externally applied meds