diff --git a/Content.Client/Floofstation/VoredSystem.cs b/Content.Client/Floofstation/VoredSystem.cs index c39a4c9fe25..ad1f6add230 100644 --- a/Content.Client/Floofstation/VoredSystem.cs +++ b/Content.Client/Floofstation/VoredSystem.cs @@ -1,5 +1,7 @@ +using Content.Shared.CCVar; using Content.Shared.FloofStation; using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; using Robust.Shared.Player; namespace Content.Client.Floofstation; @@ -8,6 +10,7 @@ public sealed partial class VoredSystem : EntitySystem { [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly ISharedPlayerManager _playerMan = default!; + [Dependency] private readonly IConfigurationManager _configManager = default!; public override void Initialize() { @@ -17,11 +20,14 @@ public override void Initialize() SubscribeLocalEvent(Onhutdown); SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); + + Subs.CVar(_configManager, FloofCCVars.VoreSoundEnabled, VoreSoundCVarChanged); } private void OnInit(EntityUid uid, VoredComponent component, ComponentInit args) { - if (uid != _playerMan.LocalEntity) + if (uid != _playerMan.LocalEntity + || !_configManager.GetCVar(FloofCCVars.VoreSoundEnabled)) return; component.Stream = _audio.PlayGlobal(component.SoundBelly, Filter.Local(), false)?.Entity; @@ -35,8 +41,22 @@ private void Onhutdown(EntityUid uid, VoredComponent component, ComponentShutdow QueueDel(component.Stream); } + private void VoreSoundCVarChanged(bool voreEnabled) + { + if (!TryComp(_playerMan.LocalEntity, out var component)) + return; + + if (voreEnabled) + component.Stream = _audio.PlayGlobal(component.SoundBelly, Filter.Local(), false)?.Entity; + else + QueueDel(component.Stream); + } + private void OnPlayerAttached(EntityUid uid, VoredComponent component, LocalPlayerAttachedEvent args) { + if (!_configManager.GetCVar(FloofCCVars.VoreSoundEnabled)) + return; + component.Stream = _audio.PlayGlobal(component.SoundBelly, Filter.Local(), false)?.Entity; } diff --git a/Content.Client/Options/UI/Tabs/AudioTab.xaml b/Content.Client/Options/UI/Tabs/AudioTab.xaml index 78b0e82629e..b012e874c17 100644 --- a/Content.Client/Options/UI/Tabs/AudioTab.xaml +++ b/Content.Client/Options/UI/Tabs/AudioTab.xaml @@ -121,6 +121,7 @@ Text="{Loc 'ui-options-announcer-disable-multiple-sounds'}" ToolTip="{Loc 'ui-options-announcer-disable-multiple-sounds-tooltip'}" /> + diff --git a/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs b/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs index 7da80d774bd..368ee1363a7 100644 --- a/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/AudioTab.xaml.cs @@ -1,5 +1,6 @@ using Content.Client.Audio; using Content.Shared.CCVar; +using Content.Shared.FloofStation; using Robust.Client.Audio; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; @@ -24,6 +25,7 @@ public AudioTab() _audio = IoCManager.Resolve(); LobbyMusicCheckBox.Pressed = _cfg.GetCVar(CCVars.LobbyMusicEnabled); + VoreSoundCheckBox.Pressed = _cfg.GetCVar(FloofCCVars.VoreSoundEnabled); RestartSoundsCheckBox.Pressed = _cfg.GetCVar(CCVars.RestartSoundsEnabled); EventMusicCheckBox.Pressed = _cfg.GetCVar(CCVars.EventMusicEnabled); AdminSoundsCheckBox.Pressed = _cfg.GetCVar(CCVars.AdminSoundsEnabled); @@ -42,6 +44,7 @@ public AudioTab() AnnouncerVolumeSlider, LobbyMusicCheckBox, + VoreSoundCheckBox, RestartSoundsCheckBox, EventMusicCheckBox, AnnouncerDisableMultipleSoundsCheckBox, @@ -87,6 +90,7 @@ protected override void Dispose(bool disposing) AnnouncerVolumeSlider, LobbyMusicCheckBox, + VoreSoundCheckBox, RestartSoundsCheckBox, EventMusicCheckBox, AnnouncerDisableMultipleSoundsCheckBox, @@ -129,6 +133,7 @@ private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args) _cfg.SetCVar(CCVars.MaxAmbientSources, (int)AmbienceSoundsSlider.Value); _cfg.SetCVar(CCVars.LobbyMusicEnabled, LobbyMusicCheckBox.Pressed); + _cfg.SetCVar(FloofCCVars.VoreSoundEnabled, VoreSoundCheckBox.Pressed); _cfg.SetCVar(CCVars.RestartSoundsEnabled, RestartSoundsCheckBox.Pressed); _cfg.SetCVar(CCVars.EventMusicEnabled, EventMusicCheckBox.Pressed); _cfg.SetCVar(CCVars.AnnouncerDisableMultipleSounds, AnnouncerDisableMultipleSoundsCheckBox.Pressed); @@ -155,6 +160,7 @@ private void Reset() AmbienceSoundsSlider.Value = _cfg.GetCVar(CCVars.MaxAmbientSources); LobbyMusicCheckBox.Pressed = _cfg.GetCVar(CCVars.LobbyMusicEnabled); + VoreSoundCheckBox.Pressed = _cfg.GetCVar(FloofCCVars.VoreSoundEnabled); RestartSoundsCheckBox.Pressed = _cfg.GetCVar(CCVars.RestartSoundsEnabled); EventMusicCheckBox.Pressed = _cfg.GetCVar(CCVars.EventMusicEnabled); AnnouncerDisableMultipleSoundsCheckBox.Pressed = _cfg.GetCVar(CCVars.AnnouncerDisableMultipleSounds); @@ -182,12 +188,13 @@ private void UpdateChanges() var isAmbientSoundsSame = (int)AmbienceSoundsSlider.Value == _cfg.GetCVar(CCVars.MaxAmbientSources); var isLobbySame = LobbyMusicCheckBox.Pressed == _cfg.GetCVar(CCVars.LobbyMusicEnabled); + var isVoreSoundSame = VoreSoundCheckBox.Pressed == _cfg.GetCVar(FloofCCVars.VoreSoundEnabled); var isRestartSoundsSame = RestartSoundsCheckBox.Pressed == _cfg.GetCVar(CCVars.RestartSoundsEnabled); var isEventSame = EventMusicCheckBox.Pressed == _cfg.GetCVar(CCVars.EventMusicEnabled); var isAnnouncerDisableMultipleSoundsSame = AnnouncerDisableMultipleSoundsCheckBox.Pressed == _cfg.GetCVar(CCVars.AnnouncerDisableMultipleSounds); var isAdminSoundsSame = AdminSoundsCheckBox.Pressed == _cfg.GetCVar(CCVars.AdminSoundsEnabled); var isEverythingSame = isMasterVolumeSame && isMidiVolumeSame && isAmbientVolumeSame - && isAmbientMusicVolumeSame && isAmbientSoundsSame && isLobbySame && isRestartSoundsSame && isEventSame + && isAmbientMusicVolumeSame && isAmbientSoundsSame && isLobbySame && isVoreSoundSame && isRestartSoundsSame && isEventSame && isAnnouncerDisableMultipleSoundsSame && isAdminSoundsSame && isLobbyVolumeSame && isInterfaceVolumeSame && isAnnouncerVolumeSame; ApplyButton.Disabled = isEverythingSame; diff --git a/Content.Server/FloofStation/Abilities/Psionics/Abilities/PsionicHypnoSystem.cs b/Content.Server/FloofStation/Abilities/Psionics/Abilities/PsionicHypnoSystem.cs index 57a91e8a868..cb2a01fa792 100644 --- a/Content.Server/FloofStation/Abilities/Psionics/Abilities/PsionicHypnoSystem.cs +++ b/Content.Server/FloofStation/Abilities/Psionics/Abilities/PsionicHypnoSystem.cs @@ -62,7 +62,7 @@ private void OnPowerUsed(EntityUid uid, PsionicHypnoComponent component, HypnoPo if (HasComp(args.Target)) { - _popups.PopupEntity(Loc.GetString("hypno-already-under", ("target", uid)), uid, uid, PopupType.Large); + _popups.PopupEntity(Loc.GetString("hypno-already-under", ("target", args.Target)), uid, uid, PopupType.Large); return; } diff --git a/Content.Server/FloofStation/VoreSystem.cs b/Content.Server/FloofStation/VoreSystem.cs index 88f41787cf3..86fc7cf2417 100644 --- a/Content.Server/FloofStation/VoreSystem.cs +++ b/Content.Server/FloofStation/VoreSystem.cs @@ -26,7 +26,6 @@ using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; using Content.Server.Power.EntitySystems; -using Content.Server.Silicon.Charge; using Content.Shared.PowerCell.Components; using System.Linq; using Content.Shared.Forensics; @@ -34,8 +33,10 @@ using Content.Shared.Contests; using Content.Shared.Standing; using Content.Server.Power.Components; -using Content.Shared.PowerCell; using Content.Server.Nutrition.EntitySystems; +using Content.Shared.Interaction.Events; +using Content.Shared.Hands.EntitySystems; +using Robust.Shared.Player; namespace Content.Server.FloofStation; @@ -60,6 +61,7 @@ public sealed class VoreSystem : EntitySystem [Dependency] private readonly StandingStateSystem _standingState = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly FoodSystem _food = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; public override void Initialize() { @@ -73,6 +75,7 @@ public override void Initialize() SubscribeLocalEvent(OnRelease); SubscribeLocalEvent(OnSeeAttempt); + SubscribeLocalEvent(CheckInteraction); } private void OnInit(EntityUid uid, VoreComponent component, MapInitEvent args) @@ -83,6 +86,7 @@ private void OnInit(EntityUid uid, VoreComponent component, MapInitEvent args) private void AddVerbs(EntityUid uid, VoreComponent component, GetVerbsEvent args) { DevourVerb(uid, component, args); + InsertSelfVerb(uid, args); VoreVerb(uid, component, args); } @@ -91,22 +95,43 @@ private void DevourVerb(EntityUid uid, VoreComponent component, GetVerbsEvent(args.Target) - || !_consent.HasConsent(args.Target, "Vore") - || HasComp(args.User)) + || !HasComp(args.Target) + || !_consent.HasConsent(args.User, "VorePred") + || !_consent.HasConsent(args.Target, "Vore")) return; InnateVerb verbDevour = new() { - Act = () => TryDevour(uid, args.Target, component), + Act = () => TryDevour(args.User, args.Target, component), Text = Loc.GetString("vore-devour"), - Category = VerbCategory.Vore, + Category = VerbCategory.Interaction, Icon = new SpriteSpecifier.Rsi(new ResPath("Interface/Actions/devour.rsi"), "icon-on"), Priority = -1 }; args.Verbs.Add(verbDevour); } + private void InsertSelfVerb(EntityUid uid, GetVerbsEvent args) + { + if (!args.CanInteract + || !args.CanAccess + || args.User == args.Target + || !TryComp(args.Target, out var component) + || !_consent.HasConsent(args.Target, "VorePred") + || !_consent.HasConsent(args.User, "Vore")) + return; + + InnateVerb verbInsert = new() + { + Act = () => TryDevour(args.Target, args.User, component), + Text = Loc.GetString("action-name-insert-self"), + Category = VerbCategory.Interaction, + Icon = new SpriteSpecifier.Rsi(new ResPath("Interface/Actions/devour.rsi"), "icon"), + Priority = -1 + }; + args.Verbs.Add(verbInsert); + } + private void VoreVerb(EntityUid uid, VoreComponent component, GetVerbsEvent args) { if (args.User != args.Target) @@ -164,7 +189,8 @@ public void TryDevour(EntityUid uid, EntityUid target, VoreComponent? component if (_food.IsMouthBlocked(uid, uid)) return; - _popups.PopupEntity(Loc.GetString("vore-attempt-devour", ("entity", uid), ("prey", target)), uid, PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("vore-attempt-devour", ("entity", uid), ("prey", target)), uid, target, PopupType.MediumCaution); + _popups.PopupEntity(Loc.GetString("vore-attempt-devour", ("entity", uid), ("prey", target)), target, uid, PopupType.MediumCaution); if (!TryComp(uid, out var predPhysics) || !TryComp(target, out var preyPhysics)) @@ -210,9 +236,27 @@ public void Devour(EntityUid uid, EntityUid target, VoreComponent? component = n temp.AtmosTemperatureTransferEfficiency = 0; _containerSystem.Insert(target, component.Stomach); - _audioSystem.PlayPvs(component.SoundDevour, uid); - _popups.PopupEntity(Loc.GetString("vore-devoured", ("entity", uid), ("prey", target)), uid, PopupType.LargeCaution); + if (_playerManager.TryGetSessionByEntity(target, out var sessionprey) + || sessionprey is not null) + _audioSystem.PlayEntity(component.SoundDevour, sessionprey, uid); + + if (_playerManager.TryGetSessionByEntity(uid, out var sessionpred) + || sessionpred is not null) + { + _audioSystem.PlayEntity(component.SoundDevour, sessionpred, uid); + // var message = Loc.GetString("", ("entity", uid)); + // _chatManager.ChatMessageToOne( + // ChatChannel.Emotes, + // message, + // message, + // EntityUid.Invalid, + // false, + // sessionprey.Channel); + } + + _popups.PopupEntity(Loc.GetString("vore-devoured", ("entity", uid), ("prey", target)), target, target, PopupType.SmallCaution); + _popups.PopupEntity(Loc.GetString("vore-devoured", ("entity", uid), ("prey", target)), target, uid, PopupType.SmallCaution); _adminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(uid)} vored {ToPrettyString(target)}"); } @@ -232,9 +276,16 @@ private void OnRelease(EntityUid uid, VoredComponent component, EntGotRemovedFro if (TryComp(uid, out var temp)) temp.AtmosTemperatureTransferEfficiency = 0.1f; - _audioSystem.PlayPvs(component.SoundRelease, args.Container.Owner); + if (_playerManager.TryGetSessionByEntity(args.Container.Owner, out var sessionpred) + || sessionpred is not null) + _audioSystem.PlayEntity(component.SoundRelease, sessionpred, uid); - _popups.PopupEntity(Loc.GetString("vore-released", ("entity", uid), ("pred", args.Container.Owner)), uid, PopupType.Large); + if (_playerManager.TryGetSessionByEntity(uid, out var sessionprey) + || sessionprey is not null) + _audioSystem.PlayEntity(component.SoundRelease, sessionprey, uid); + + _popups.PopupEntity(Loc.GetString("vore-released", ("entity", uid), ("pred", args.Container.Owner)), uid, args.Container.Owner, PopupType.Medium); + _popups.PopupEntity(Loc.GetString("vore-released", ("entity", uid), ("pred", args.Container.Owner)), uid, uid, PopupType.Medium); _adminLog.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(uid)} got released from {ToPrettyString(args.Container.Owner)} belly"); } @@ -388,6 +439,14 @@ private void OnGibContents(EntityUid uid, VoreComponent component, ref BeingGibb _containerSystem.EmptyContainer(component.Stomach); } + private void CheckInteraction(EntityUid uid, VoredComponent component, InteractionAttemptEvent args) + { + if (component.Pred != args.Target) + return; + + args.Cancel(); + } + public override void Update(float frameTime) { base.Update(frameTime); @@ -400,7 +459,7 @@ public override void Update(float frameTime) vored.Accumulator += frameTime; - if (vored.Accumulator <= 1) + if (vored.Accumulator <= 5) continue; vored.Accumulator -= 1; diff --git a/Content.Server/Resist/EscapeInventorySystem.cs b/Content.Server/Resist/EscapeInventorySystem.cs index 610a7a7774c..7cab3d463be 100644 --- a/Content.Server/Resist/EscapeInventorySystem.cs +++ b/Content.Server/Resist/EscapeInventorySystem.cs @@ -59,8 +59,17 @@ private void OnRelayMovement(EntityUid uid, CanEscapeInventoryComponent componen if (!args.HasDirectionalMovement) return; - if (!_containerSystem.TryGetContainingContainer(uid, out var container) - || !_actionBlockerSystem.CanInteract(uid, container.Owner)) + if (!_containerSystem.TryGetContainingContainer(uid, out var container)) + return; + + // Vore - Floofstation + if (HasComp(uid)) + { + AttemptEscape(uid, container.Owner, component, 5f); + return; + } + + if (!_actionBlockerSystem.CanInteract(uid, container.Owner)) return; // Make sure there's nothing stopped the removal (like being glued) @@ -78,13 +87,6 @@ private void OnRelayMovement(EntityUid uid, CanEscapeInventoryComponent componen return; } - // Vore - Floofstation - if (HasComp(uid)) - { - AttemptEscape(uid, container.Owner, component, 5f); - return; - } - // Uncontested if (HasComp(container.Owner) || HasComp(container.Owner) || HasComp(container.Owner)) AttemptEscape(uid, container.Owner, component); @@ -100,7 +102,8 @@ private void OnRelayMovement(EntityUid uid, CanEscapeInventoryComponent componen BreakOnTargetMove = false, BreakOnUserMove = true, BreakOnDamage = true, - NeedHand = false + NeedHand = false, + RequireCanInteract = false }; if (!_doAfterSystem.TryStartDoAfter(doAfterEventArgs, out component.DoAfter)) diff --git a/Content.Shared/Floofstation/FloofCCvars.cs b/Content.Shared/Floofstation/FloofCCvars.cs new file mode 100644 index 00000000000..7c842395982 --- /dev/null +++ b/Content.Shared/Floofstation/FloofCCvars.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.FloofStation; + +/// +/// Floofstation specific cvars. +/// +[CVarDefs] +// ReSharper disable once InconsistentNaming - Shush you +public sealed class FloofCCVars +{ + public static readonly CVarDef VoreSoundEnabled = + CVarDef.Create("ambience.vore_sound_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY); +} diff --git a/Content.Shared/Floofstation/VoreComponent.cs b/Content.Shared/Floofstation/VoreComponent.cs index e551f482851..160f489ebd6 100644 --- a/Content.Shared/Floofstation/VoreComponent.cs +++ b/Content.Shared/Floofstation/VoreComponent.cs @@ -14,7 +14,7 @@ public sealed partial class VoreComponent : Component [DataField] public SoundSpecifier? SoundDevour = new SoundPathSpecifier("/Audio/Floof/Vore/gulp.ogg") { - Params = AudioParams.Default.WithVolume(-3f), + Params = AudioParams.Default.WithVolume(-4f).WithMaxDistance(1f), }; public Container Stomach = default!; } diff --git a/Content.Shared/Floofstation/VoredComponent.cs b/Content.Shared/Floofstation/VoredComponent.cs index 92a7b251d13..b37b06946c1 100644 --- a/Content.Shared/Floofstation/VoredComponent.cs +++ b/Content.Shared/Floofstation/VoredComponent.cs @@ -18,12 +18,12 @@ public sealed partial class VoredComponent : Component [DataField, AutoNetworkedField] public SoundSpecifier? SoundBelly = new SoundPathSpecifier("/Audio/Floof/Vore/stomach_loop.ogg") { - Params = AudioParams.Default.WithLoop(true).WithVolume(-3f), + Params = AudioParams.Default.WithLoop(true).WithVolume(-4f), }; [DataField] public SoundSpecifier? SoundRelease = new SoundPathSpecifier("/Audio/Effects/Fluids/splat.ogg") { - Params = AudioParams.Default.WithVolume(-3f), + Params = AudioParams.Default.WithVolume(-4f), }; } diff --git a/Resources/Changelog/Floof.yml b/Resources/Changelog/Floof.yml index 6431ac16e9a..b25d336e028 100644 --- a/Resources/Changelog/Floof.yml +++ b/Resources/Changelog/Floof.yml @@ -1747,3 +1747,25 @@ Entries: id: 228 time: '2024-12-07T15:06:13.0000000+00:00' url: https://github.com/Fansana/floofstation1/pull/385 +- author: FoxxoTrystan + changes: + - type: Add + message: Add Vore Sound toggle in options. + - type: Add + message: Added Vore Pred and allow to insert yourself. + - type: Tweak + message: Vore Consent was changed to Vore Prey. + - type: Tweak + message: You can only vore others with the ability to vore. + - type: Fix + message: Fix Resomi Displacement Maps + id: 229 + time: '2024-12-08T23:56:42.0000000+00:00' + url: https://github.com/Fansana/floofstation1/pull/398 +- author: Memeji + changes: + - type: Add + message: .20 Rifle Rubber Ammo Box to Bartender loadout. + id: 230 + time: '2024-12-08T23:57:51.0000000+00:00' + url: https://github.com/Fansana/floofstation1/pull/397 diff --git a/Resources/Locale/en-US/Blep/consent.ftl b/Resources/Locale/en-US/Blep/consent.ftl index 80bc6b08cd6..a3f032c475a 100644 --- a/Resources/Locale/en-US/Blep/consent.ftl +++ b/Resources/Locale/en-US/Blep/consent.ftl @@ -18,9 +18,12 @@ consent-examine-verb = Consent Info consent-examine-not-set = This player has no consent preferences set. Ask for consent first before engaging in any erotic roleplay. # Consent toggles -consent-Vore-name = Vore +consent-Vore-name = Vore Prey consent-Vore-desc = Allow yourself to be devoured by anyone... or anything. +consent-VorePred-name = Vore Pred +consent-VorePred-desc = Allow to devoured critters... or anyone that has the consent option 'vore' enabled. + consent-Digestion-name = Digestion consent-Digestion-desc = Allow yourself to be digested. WARNING: BEING DIGESTED WILL ROUND-REMOVE YOU. diff --git a/Resources/Locale/en-US/Floof/hypno.ftl b/Resources/Locale/en-US/Floof/hypno.ftl index fff095e5644..905b8d7e78e 100644 --- a/Resources/Locale/en-US/Floof/hypno.ftl +++ b/Resources/Locale/en-US/Floof/hypno.ftl @@ -1,24 +1,24 @@ action-name-hypno = Psionic Hypnosis -action-description-hypno = You are capable to hypnotize people and make them do your bidding. +action-description-hypno = You are capable to mentally interfere with people's thoughts, and make them do your bidding. -hypnosis-power-initialization-feedback = I am able to hypnotize and make people do my bidding, reaching them in the deepest parts of their mind. -hypnosis-power-feedback = {CAPITALIZE($entity)} wields the power to control minds. +hypnosis-power-initialization-feedback = I am able to place other in a trance and have them do my bidding, cementing my will in the deepest parts of their mind. +hypnosis-power-feedback = The air around {CAPITALIZE($entity)} shimmers hypnotically from the force of their personality" -hypno-already-under = {CAPITALIZE($target)} is already hypnotized. -examined-hypno = Looks mindless, happy... -lost-subject = I lost control of one of my subjects. -hypno-free = I feel able to make my own toughts again. +hypno-already-under = {CAPITALIZE($target)} is already under hypnosis. +examined-hypno = Seems completely content with everything +lost-subject = I feel my powers dissipate. My subject is once again free... +hypno-free = I have awoken from my trance... hypno-release = Release Subject hypno-break = Break Hypnosis hypno-start = You stare into {POSS-ADJ($target)} eyes... -hypno-phase-1 = {CAPITALIZE($target)} eyes glows in such pretty colors... it's hard to look away... -hypno-phase-2 = The more you stare at {POSS-ADJ($target)} eyes... the more its i's hard to think... to have a thought... -hypno-phase-3 = What was I doing... again? It's so hard to think... maybe I don't need to anymore, just stare... its just... so pretty... +hypno-phase-1 = {CAPITALIZE($target)} eyes are shining with a powerful but calming aura... +hypno-phase-2 = The deeper you look into {POSS-ADJ($target)} eyes... the more difficult it is to think... easier to listen... +hypno-phase-3 = It's so hard to think. Maybe... I don't need to anymore? Just sink... only {POSS-ADJ($target)}. hypno-success = {CAPITALIZE($target)} stares into your eyes, lost in them, lost in you. -mood-effect-BeingHypnotized = It's nice to not think, to be mindless... I love to obey. -mood-effect-LostHypnosis = It was nice to not think, I miss that. +mood-effect-BeingHypnotized = It's so wonderful to not have to think... to be mindless... Obedience is pleasure... +mood-effect-LostHypnosis = I miss being under trance like that... it was so much easier... hypnotized = [bold][color=red]You have been HYPNOTISED by {CAPITALIZE($entity)}! Warning: You are not an antag, and still cannot help antags. THIS IS NOT AN ANTAGONIST ROLE. @@ -30,11 +30,11 @@ hypnotist = [bold][color=red]You have enthralled {CAPITALIZE($entity)}! "in accordinace to server rules, of course."[/color][/bold] stophypno = [bold][color=red]You are no longer hypnotized! - You are no longer hypnotized by {CAPITALIZE($entity)}, you are now thinking properly again.[/color][/bold] + You are no longer under the mental control of {CAPITALIZE($entity)}.[/color][/bold] has-no-consent = I cannot enter his mind. trait-name-HypnoticGaze = Hypnotic Gaze trait-description-HypnoticGaze = - Your eyes pretty colors to enters peoples minds, you are capable of hypnotizing peoples, regardless of - whether or not you possess any notable psychic powers. + Within your eyes lies the ability to place others under your control. You are capable of placing others in a trance, regardless of + whether or not you possess any other notable psychic powers. diff --git a/Resources/Locale/en-US/Floof/vore.ftl b/Resources/Locale/en-US/Floof/vore.ftl index 3a46118c0ee..be3d0722a04 100644 --- a/Resources/Locale/en-US/Floof/vore.ftl +++ b/Resources/Locale/en-US/Floof/vore.ftl @@ -31,3 +31,5 @@ vore-digested-prey-7 = [color=red]{CAPITALIZE($entity)} belly kneads on every fi vore-digested-prey-8 = [color=red]{CAPITALIZE($entity)} belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.[/color] vore-examine = Their belly is larger, you can see {$count} shapes. + +ui-options-vore-sounds = Vore Sounds diff --git a/Resources/Prototypes/Floof/Entities/Mobs/Species/resomi.yml b/Resources/Prototypes/Floof/Entities/Mobs/Species/resomi.yml index ddbe45fd288..d4b00193300 100644 --- a/Resources/Prototypes/Floof/Entities/Mobs/Species/resomi.yml +++ b/Resources/Prototypes/Floof/Entities/Mobs/Species/resomi.yml @@ -13,14 +13,15 @@ - type: Fixtures fixtures: fix1: - shape: !type:PhysShapeCircle + shape: + !type:PhysShapeCircle radius: 0.35 density: 185 restitution: 0.0 mask: - - MobMask + - MobMask layer: - - MobLayer + - MobLayer - type: DamageVisuals thresholds: [ 10, 30, 50, 70 ] damageOverlayGroups: @@ -122,11 +123,67 @@ components: - type: HumanoidAppearance species: Resomi + - type: Hands + handDisplacement: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: inHand - type: Inventory - speciesId: Resomi + speciesId: resomi displacements: jumpsuit: sizeMaps: 32: sprite: Floof/Mobs/Species/Resomi/displacement.rsi state: jumpsuit + eyes: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: eyes + gloves: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: hands + head: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: head + back: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: back + ears: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: ears + shoes: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: feet + neck: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: neck + mask: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: mask + suitstorage: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: suitStorage + belt: + sizeMaps: + 32: + sprite: Floof/Mobs/Species/Resomi/displacement.rsi + state: belt diff --git a/Resources/Prototypes/Floof/Species/resomi.yml b/Resources/Prototypes/Floof/Species/resomi.yml index 1e8487952ae..85f94595b7e 100644 --- a/Resources/Prototypes/Floof/Species/resomi.yml +++ b/Resources/Prototypes/Floof/Species/resomi.yml @@ -12,6 +12,8 @@ femaleFirstNames: names_resomi_female naming: First customName: true + sexes: + - Unsexed - type: speciesBaseSprites id: MobResomiSprites @@ -42,7 +44,7 @@ points: 1 required: false Tail: - points: 1 + points: 2 required: true defaultMarkings: [ ResomiTail, ResomiTailFeathers ] Head: @@ -54,15 +56,19 @@ RightFoot: points: 1 required: false + defaultMarkings: [ ResomiRLegFeathers ] LeftFoot: points: 1 required: false + defaultMarkings: [ ResomiLLegFeathers ] RightHand: points: 1 required: false + defaultMarkings: [ ResomiRArmFeathers ] LeftHand: points: 1 required: false + defaultMarkings: [ ResomiLArmFeathers ] - type: humanoidBaseSprite id: MobResomiEyes diff --git a/Resources/Prototypes/Floof/Traits/mental.yml b/Resources/Prototypes/Floof/Traits/mental.yml index 237bb819ea2..ac16c8e4559 100644 --- a/Resources/Prototypes/Floof/Traits/mental.yml +++ b/Resources/Prototypes/Floof/Traits/mental.yml @@ -14,6 +14,8 @@ jobs: - Chaplain - Librarian + - ForensicMantis + - ResearchDirector - !type:CharacterLogicOrRequirement requirements: - !type:CharacterSpeciesRequirement diff --git a/Resources/Prototypes/consent.yml b/Resources/Prototypes/consent.yml index f1c355e61dc..4096f7ab3b8 100644 --- a/Resources/Prototypes/consent.yml +++ b/Resources/Prototypes/consent.yml @@ -1,6 +1,9 @@ - type: consentToggle id: Vore +- type: consentToggle + id: VorePred + - type: consentToggle id: Digestion diff --git a/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail.png b/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail.png index 59939326f95..5535c2d525e 100644 Binary files a/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail.png and b/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail.png differ diff --git a/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail_feathers.png b/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail_feathers.png index 9d26d682491..ac22a353b4f 100644 Binary files a/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail_feathers.png and b/Resources/Textures/Floof/Mobs/Customization/resomi_parts.rsi/tail_feathers.png differ diff --git a/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/belt.png b/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/belt.png index 3bfc191dbae..46abece46b7 100644 Binary files a/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/belt.png and b/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/belt.png differ diff --git a/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/head.png b/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/head.png index 6a451a2af87..cd79c62e5e4 100644 Binary files a/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/head.png and b/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/head.png differ diff --git a/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/neck.png b/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/neck.png index 81037000cf4..4702d3da3da 100644 Binary files a/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/neck.png and b/Resources/Textures/Floof/Mobs/Species/Resomi/displacement.rsi/neck.png differ