Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86e1455
[DEN Port] Ovinia! (Species) (#21)
juniwoofs Jul 28, 2026
73688cf
Restored original InteractionPopupSystem.cs
Jul 28, 2026
961c934
Ported ovinia from Macrocosm
Jul 29, 2026
8cf6fa0
Emote changes, displacement fix
Jul 30, 2026
371393f
Added hoofstep sounds
Jul 30, 2026
1e683fd
Made several changes
Aug 9, 2026
beb9ca5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 9, 2026
8acc47c
Added hoofstep sound effect for later use, removed footstep sound mod…
Aug 9, 2026
d271ad3
Merge branch 'feat-new-race-ovinia' of https://github.com/Psymbiote/s…
Aug 9, 2026
38a6eee
deleted extra hardsuit png
KoboldCatgirl Aug 9, 2026
d2314f2
remove defaultSoundsBySex
KoboldCatgirl Aug 9, 2026
119e12e
remove sloth squeak
KoboldCatgirl Aug 9, 2026
2aac901
Removed AnimalFriend, added snort.
Aug 9, 2026
3c72cd4
Fixed a very, very stupid mistake.
Aug 9, 2026
92ecf0e
Removed unused guidebook entry.
Aug 9, 2026
645bb6e
Merge branch 'main' into feat-new-race-ovinia
KoboldCatgirl Aug 15, 2026
7394b74
updates ovinia's temperatureprotection and voice sounds, gives ovinia…
KoboldCatgirl Aug 15, 2026
84ea0e9
sheepgirls can scream again, as nature intended
KoboldCatgirl Aug 15, 2026
3739a6e
gives ovinia an expanded height slider
KoboldCatgirl Aug 15, 2026
bf9bdcc
restored attributions, fixed pettingchance
KoboldCatgirl Aug 16, 2026
d396fae
Update Content.Shared/Interaction/InteractionPopupSystem.cs
Psymbiote Aug 19, 2026
1dd1215
Update Resources/ServerInfo/Guidebook/_starcup/Mobs/OviniaStarcup.xml
Psymbiote Aug 19, 2026
942505d
Restored moo to ovinia.
Aug 20, 2026
7aff6cb
Re-added the moo emote.
Aug 20, 2026
994fb3d
Merge branch 'main' of https://github.com/teamstarcup/starcup into fe…
Aug 20, 2026
0a0f7eb
Added a new icon for the tail wagging action.
Aug 20, 2026
3df9b42
Update Resources/Prototypes/_MACRO/Voice/ovinia.yml
Psymbiote Aug 21, 2026
6a943e5
removed ovinia's option for a wagging emote, use the Wag action!
KoboldCatgirl Aug 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Content.Server/Atmos/EntitySystems/FlammableSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Content.Server.Stunnable;
using Content.Server.Temperature.Systems;
using Content.Server.Damage.Components;
using Content.Shared._MACRO.Atmos.Components;
using Content.Shared.ActionBlocker;
using Content.Shared.Alert;
using Content.Shared.Atmos;
Expand Down Expand Up @@ -294,6 +295,11 @@ public void SetFireStacks(EntityUid uid, float stacks, FlammableComponent? flamm
if (!Resolve(uid, ref flammable))
return;

// MACRO start: firestack modifier
if (TryComp<FireStackModifierComponent>(uid, out var fireStackModifier))
stacks *= fireStackModifier.Modifier;
// MACRO end

flammable.FireStacks = MathF.Min(MathF.Max(flammable.MinimumFireStacks, stacks), flammable.MaximumFireStacks);

if (flammable.FireStacks <= 0)
Expand Down
14 changes: 14 additions & 0 deletions Content.Shared/Bed/Sleep/SleepingSystem.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using Content.Shared._MACRO.Bed.Sleep;
using Content.Shared.Actions;
using Content.Shared.Actions.Components;
using Content.Shared.Buckle.Components;
Expand Down Expand Up @@ -287,6 +288,19 @@ private void OnStatusMobStateChanged(Entity<ForcedSleepingStatusEffectComponent>

private void OnStatusEffectApplied(Entity<ForcedSleepingStatusEffectComponent> ent, ref StatusEffectAppliedEvent args)
{
// MACRO START: SleepTimeModifier to modify force sleep duration
// IF YOU ARE HERE TO ADD MORE TRYCOMPS: dont. make a new event instead.
if (TryComp<SleepTimeModifierComponent>(args.Target, out var sleepTimeModifier) &&
_statusEffect.TryGetTime(args.Target, StatusEffectForcedSleeping, out var initTime))
{
var time = initTime.EndEffectTime - initTime.StartEffectTime;
_statusEffect.TryUpdateStatusEffectDuration(
args.Target,
StatusEffectForcedSleeping,
time * sleepTimeModifier.Modifier);
}
// MACRO END

// Applying state check needed so we don't add SleepingComp during
// entity reset due to the status effect getting inserted
if (!_gameTiming.ApplyingState)
Expand Down
15 changes: 14 additions & 1 deletion Content.Shared/Interaction/InteractionPopupSystem.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
using Content.Shared._MACRO.Interaction;
using Content.Shared.Bed.Sleep;
using Content.Shared.IdentityManagement;
using Content.Shared.Interaction.Components;
using Content.Shared.Interaction.Events;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Popups;
using Content.Shared.Whitelist;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Network;
Expand All @@ -16,6 +18,7 @@ namespace Content.Shared.Interaction;

public sealed partial class InteractionPopupSystem : EntitySystem
{
[Dependency] private EntityWhitelistSystem _entityWhitelist = null!; // starcup ovinia port from Macrocosm
[Dependency] private IGameTiming _gameTiming = default!;
[Dependency] private IRobustRandom _random = default!;
[Dependency] private MobStateSystem _mobStateSystem = default!;
Expand Down Expand Up @@ -91,7 +94,17 @@ private void SharedInteract(
if (_netMan.IsClient && !predict)
return;

if (_random.Prob(component.SuccessChance))
// MACRO ADD: PettingModifier
// TODO: this is a very generic system. we probably need a whitelist of some kind
var successChance = component.SuccessChance;

if (TryComp<PettingChanceModifierComponent>(user, out var pettingChance) // starcup - uid -> user, needs to look at the holder of the component
&& _entityWhitelist.IsWhitelistPassOrNull(pettingChance.TargetWhitelist, target)
&& _entityWhitelist.IsWhitelistFailOrNull(pettingChance.TargetBlacklist, target))
successChance = Math.Clamp(successChance * pettingChance.Modifier, 0, 1);
// MACRO END

if (_random.Prob(successChance)) // MACRO: component.SuccessChance -> successChance
{
if (component.InteractSuccessString != null)
msg = Loc.GetString(component.InteractSuccessString, ("target", Identity.Entity(uid, EntityManager))); // Success message (localized).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ public bool CanAccessSolution(EntityUid ingested,

// TODO: Relay this event to solutions using solution relay
var ev = new EdibleEvent(user);
RaiseLocalEvent(ingested, ref ev);
RaiseLocalEvent(ingested, ref ev, true); // MACRO - Set broadcast to true for EatTimeModifier subscription

solution = ev.Solution;
time = ev.Time;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Content.Shared._MACRO.Atmos.Components;

/// <summary>
/// This is used for modifying fire stacks.
/// </summary>
[RegisterComponent]
public sealed partial class FireStackModifierComponent : Component
{
/// <summary>
/// The modifier to multiply the fire stacks by.
/// </summary>
[DataField]
public float Modifier { get; set; } = 1f;
}
20 changes: 20 additions & 0 deletions Content.Shared/_MACRO/Bed/Sleep/SleepTimeModifierComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Robust.Shared.GameStates;

namespace Content.Shared._MACRO.Bed.Sleep;

/// <summary>
/// Component that modifies an entity's sleep wakeup cooldown
/// by a multiplier.
/// </summary>
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState]
public sealed partial class SleepTimeModifierComponent : Component
{
/// <summary>
/// When this entity is put to sleep, the cooldown before
/// an attached player can wake the entity up will be
/// multiplied by this value.
/// </summary>
[DataField, AutoNetworkedField]
public float Modifier = 1;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Content.Shared.Interaction.Components;
using Content.Shared.Whitelist;

namespace Content.Shared._MACRO.Interaction;

/// <summary>
/// Allows any entity with this component to have a different success rate when petting mobs with <see cref="InteractionPopupComponent"/>.
/// </summary>
[RegisterComponent]
public sealed partial class PettingChanceModifierComponent : Component
{
/// <summary>
/// Modifier of the chance to successfully pet a mob.
/// </summary>
[DataField]
public float Modifier = 1;

/// <summary>
/// If not null, the target must succeed the whitelist.
/// </summary>
[DataField]
public EntityWhitelist? TargetWhitelist { get; set; }

/// <summary>
/// If not null, the target must not pass the blacklist.
/// </summary>
[DataField]
public EntityWhitelist? TargetBlacklist { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Content.Shared.Whitelist;
using Robust.Shared.GameStates;

namespace Content.Shared._MACRO.Nutrition.Components;

/// <summary>
/// This component is used to modify the time to eat food by a specific modifier.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class EatTimeModifierComponent : Component
{
/// <summary>
/// The amount you would like to multiply the delay on the eating doAfter
/// </summary>
[DataField]
public float Modifier = 1f;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Content.Shared._MACRO.Nutrition.Components;
using Content.Shared.Item;
using Content.Shared.Nutrition;
using Content.Shared.Nutrition.EntitySystems;
using Content.Shared.Whitelist;

namespace Content.Shared._MACRO.Nutrition.EntitySystems;

/// <summary>
/// Handles the time modification of the eaten food
/// </summary>
public sealed class EatTimeModifierSystem : EntitySystem
{
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<EdibleEvent>(OnEdible, after: [typeof(IngestionSystem)]);
}

private void OnEdible(ref EdibleEvent args)
{
var user = args.User;

if (args.Cancelled)
return;

if (!TryComp<EatTimeModifierComponent>(user, out var eatTimeModifier))
return;

args.Time *= eatTimeModifier.Modifier;
}
}
36 changes: 36 additions & 0 deletions Resources/Audio/_MACRO/Voice/Ovinia/attributions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#Attributions for Ovinia Baa's and Moo's

- files: ["ovinia_baa1.ogg"]
copyright: "created by saha213131, Modified by 'sheepmera', The original audio was shortened and converted from stereo to mono"
license: "CC0-1.0"
source: "https://freesound.org/people/saha213131/sounds/683259/"

- files: ["ovinia_baa2.ogg"]
copyright: "created by saha213131, Modified by 'sheepmera', The original audio was converted from stereo to mono"
license: "CC0-1.0"
source: "https://freesound.org/people/saha213131/sounds/691476/"

- files: ["ovinia_baa3.ogg"]
copyright: "created by michaelperfect, Modified by 'sheepmera', The original audio was shortened and converted from stereo to mono "
license: "CC0-1.0"
source: "https://freesound.org/people/michaelperfect/sounds/710299/"

- files: ["ovinia_scream.ogg"]
copyright: "created by saha213131, Modified by 'sheepmera', The original audio was pitch shifted and converted from stereo to mono "
license: "CC0-1.0"
source: "https://freesound.org/people/michaelperfect/sounds/710300/"

- files: ["ovinia_moo1.ogg"]
copyright: "created by Zozzy, Modified by 'Darklyac', The original audio was converted from WAV to OGG format"
license: "CC0-1.0"
source: "https://freesound.org/people/Zozzy/sounds/59245/"

- files: ["ovinia_moo2.ogg, ovinia_moo3.ogg"]
copyright: "created by JarredGibb, Modified by 'Darklyac', the original audio was converted from WAV to OGG format"
license: "CC0-1.0"
source: "https://freesound.org/people/JarredGibb/sounds/233145/"

- files: ["ovinia_moo4.ogg"]
copyright: "created by JarredGibb, Modified by 'Darklyac', the original audio was converted from WAV to OGG format. Volume lowered for starcup"
license: "CC0-1.0"
source: "https://freesound.org/people/JarredGibb/sounds/233130/"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
11 changes: 11 additions & 0 deletions Resources/Audio/_starcup/Effects/Footsteps/attributions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,14 @@
copyright: "Modified by Psymbiote from files by Bricklover and JustInvoke on freesound.org."
license: "CC0-1.0"
source: "https://freesound.org/s/532881/"

- files:
- hoofstep1.ogg
- hoofstep2.ogg
- hoofstep3.ogg
- hoofstep4.ogg
- hoofstep5.ogg
- hoofstep6.ogg
copyright: "Cropped from HORSES - Walking on stone 03.wav by G4F SFX on the GDC 2017 Game Audio Bundle."
license: "CC0-1.0"
source: "https://sonniss.com/gameaudiogdc/"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
5 changes: 5 additions & 0 deletions Resources/Locale/en-US/_MACRO/chat/chat-managers.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
chat-speech-verb-name-ovinia = Ovinia
chat-speech-verb-ovinia-1 = baas
chat-speech-verb-ovinia-2 = bleats
chat-speech-verb-ovinia-3 = maas
chat-speech-verb-ovinia-4 = mehs
85 changes: 85 additions & 0 deletions Resources/Locale/en-US/_MACRO/datasets/names/ovinia.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
names-ovinia-first-1 = Myrail
names-ovinia-first-2 = Vaeluun
names-ovinia-first-3 = Thallinn
names-ovinia-first-4 = Meavallei
names-ovinia-first-5 = Vaalev
names-ovinia-first-6 = Ruth
names-ovinia-first-7 = Baareivelaa
names-ovinia-first-8 = Maalun
names-ovinia-first-9 = Lethaavul
names-ovinia-first-10 = Keephai
names-ovinia-first-11 = Ehhmchole
names-ovinia-first-12 = Ailuuth
names-ovinia-first-13 = Ruuna
names-ovinia-first-14 = Lua
names-ovinia-first-15 = Luura
names-ovinia-first-16 = Lumia
names-ovinia-first-17 = Maeria
names-ovinia-first-18 = Luumara
names-ovinia-first-19 = Baalu
names-ovinia-first-20 = Maamea
names-ovinia-first-21 = Ruulune
names-ovinia-first-22 = Thaeluu
names-ovinia-first-23 = Rhumelaah
names-ovinia-first-24 = Thairulune
names-ovinia-first-25 = Lylymea
names-ovinia-first-26 = Myvaine
names-ovinia-first-27 = Lymehlune
names-ovinia-first-28 = Jayluvai
names-ovinia-first-29 = Tyean
names-ovinia-first-30 = Meva
names-ovinia-first-31 = Vyre
names-ovinia-first-32 = Mera
# begin starcup
names-ovinia-first-33 = Maali
names-ovinia-first-34 = Sadhi
names-ovinia-first-35 = Leah
names-ovinia-first-36 = Laaira
names-ovinia-first-37 = Maedh
names-ovinia-first-38 = Veena
names-ovinia-first-39 = Pena
names-ovinia-first-40 = Bionn
names-ovinia-first-41 = Muuno
names-ovinia-first-42 = Tohono
names-ovinia-first-43 = Leanna
names-ovinia-first-44 = Noella
names-ovinia-first-45 = Amaia
names-ovinia-first-46 = Yanne
names-ovinia-first-47 = Lylanni
names-ovinia-first-48 = Cuinne
names-ovinia-first-49 = Lavon
names-ovinia-first-50 = Olenna
names-ovinia-first-51 = Aenor
names-ovinia-first-52 = Annael
# end starcup

names-ovinia-last-1 = Juvayelean
names-ovinia-last-2 = Lunae
names-ovinia-last-3 = Vuulae
names-ovinia-last-4 = Rohmaae
names-ovinia-last-5 = Phaelarune
names-ovinia-last-6 = Invae
names-ovinia-last-7 = Meathall
names-ovinia-last-8 = Mehhvaa
names-ovinia-last-9 = Laalaene
names-ovinia-last-10 = Baahlathruu
names-ovinia-last-11 = Thyrunia
names-ovinia-last-12 = Vylune
names-ovinia-last-13 = Rhymehelai
names-ovinia-last-14 = Veythavai
names-ovinia-last-15 = Yvalueth
names-ovinia-last-16 = Lyvahlia
names-ovinia-last-17 = Anngoloo
names-ovinia-last-18 = Alathune
names-ovinia-last-19 = Curulean
names-ovinia-last-20 = Celerunia
names-ovinia-last-21 = Diolathruu
names-ovinia-last-22 = Edenaae
names-ovinia-last-23 = Ellathavai
names-ovinia-last-24 = Eluvhaa
names-ovinia-last-25 = Emelune
names-ovinia-last-26 = Felavhai
names-ovinia-last-27 = Finlathruu
names-ovinia-last-28 = Faelueth
names-ovinia-last-29 = Finwae
names-ovinia-last-30 = Gladaene
Loading
Loading