--- /dev/null
+using Content.Shared.Actions;
+using Content.Shared.Polymorph;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.Geras;
+
+/// <summary>
+/// This component assigns the entity with a polymorph action.
+/// </summary>
+[RegisterComponent]
+public sealed partial class GerasComponent : Component
+{
+ [DataField] public ProtoId<PolymorphPrototype> GerasPolymorphId = "SlimeMorphGeras";
+
+ [DataField] public ProtoId<EntityPrototype> GerasAction = "ActionMorphGeras";
+
+ [DataField] public EntityUid? GerasActionEntity;
+}
--- /dev/null
+using Content.Server.Actions;
+using Content.Server.Polymorph.Systems;
+using Content.Server.Popups;
+using Content.Shared.Actions;
+using Content.Shared.Geras;
+using Robust.Shared.Player;
+
+namespace Content.Server.Geras;
+
+/// <inheritdoc/>
+public sealed class GerasSystem : SharedGerasSystem
+{
+ [Dependency] private readonly ActionsSystem _actionsSystem = default!;
+ [Dependency] private readonly PolymorphSystem _polymorphSystem = default!;
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
+
+ /// <inheritdoc/>
+ public override void Initialize()
+ {
+ SubscribeLocalEvent<GerasComponent, MorphIntoGeras>(OnMorphIntoGeras);
+ SubscribeLocalEvent<GerasComponent, MapInitEvent>(OnMapInit);
+ }
+
+ private void OnMapInit(EntityUid uid, GerasComponent component, MapInitEvent args)
+ {
+ // try to add geras action
+ _actionsSystem.AddAction(uid, ref component.GerasActionEntity, component.GerasAction);
+ }
+
+ private void OnMorphIntoGeras(EntityUid uid, GerasComponent component, MorphIntoGeras args)
+ {
+ var ent = _polymorphSystem.PolymorphEntity(uid, component.GerasPolymorphId);
+
+ if (!ent.HasValue)
+ return;
+
+ _popupSystem.PopupEntity(Loc.GetString("geras-popup-morph-message-others", ("entity", ent.Value)), ent.Value, Filter.PvsExcept(ent.Value), true);
+ _popupSystem.PopupEntity(Loc.GetString("geras-popup-morph-message-user"), ent.Value, ent.Value);
+ }
+}
};
if (uiOpen)
{
- verb.Text = Loc.GetString("verb-common-close-ui");
+ verb.Text = Loc.GetString("comp-storage-verb-close-storage");
verb.Icon = new SpriteSpecifier.Texture(
new("/Textures/Interface/VerbIcons/close.svg.192dpi.png"));
}
else
{
- verb.Text = Loc.GetString("verb-common-open-ui");
+ verb.Text = Loc.GetString("comp-storage-verb-open-storage");
verb.Icon = new SpriteSpecifier.Texture(
new("/Textures/Interface/VerbIcons/open.svg.192dpi.png"));
}
--- /dev/null
+using Content.Shared.Actions;
+
+namespace Content.Shared.Geras;
+
+/// <summary>
+/// A Geras is the small morph of a slime. This system handles exactly that.
+/// </summary>
+public abstract class SharedGerasSystem : EntitySystem
+{
+
+}
+
+public sealed partial class MorphIntoGeras : InstantActionEvent
+{
+
+}
comp-storage-window-title = Storage Item
comp-storage-window-weight = { $weight }/{ $maxWeight }, Max Size: {$size}
comp-storage-window-slots = Slots: { $itemCount }/{ $maxCount }, Max Size: {$size}
+comp-storage-verb-open-storage = Open Storage
+comp-storage-verb-close-storage = Close Storage
--- /dev/null
+geras-popup-morph-message-user = You shift and morph into a small version of you!
+geras-popup-morph-message-others = {CAPITALIZE(THE($entity))} shifts and morphs into a blob of slime!
state: gib
event: !type:ActivateImplantEvent
-
- type: entity
id: ActionActivateFreedomImplant
name: Break Free
state: icon
event: !type:UseDnaScramblerImplantEvent
+- type: entity
+ id: ActionMorphGeras
+ name: Morph into Geras
+ description: Morphs you into a Geras - a miniature version of you which allows you to move fast, at the cost of your inventory.
+ noSpawn: true
+ components:
+ - type: InstantAction
+ charges: 1
+ itemIconStyle: BigAction
+ useDelay: 10 # prevent spam
+ priority: -20
+ icon:
+ sprite: Mobs/Aliens/slimes.rsi
+ state: blue_adult_slime
+ event: !type:MorphIntoGeras
+
- type: entity
id: ActionToggleSuitPiece
name: Toggle Suit Piece
- type: entity
name: basic slime
- id: MobAdultSlimes
+ id: BaseMobAdultSlimes
parent: [ SimpleMobBase, MobCombat ]
abstract: true
description: It looks so much like jelly. I wonder what it tastes like?
components:
- - type: NpcFactionMember
- factions:
- - SimpleNeutral
- - type: HTN
- rootTask:
- task: SimpleHostileCompound
- type: Sprite
drawdepth: Mobs
sprite: Mobs/Aliens/slimes.rsi
successChance: 0.5
interactSuccessString: petting-success-slimes
interactFailureString: petting-failure-generic
+ - type: Speech
+ speechVerb: Slime
+ speechSounds: Slime
+ - type: TypingIndicator
+ proto: slime
+
+- type: entity
+ name: basic slime
+ id: MobAdultSlimes
+ parent: BaseMobAdultSlimes
+ abstract: true
+ description: It looks so much like jelly. I wonder what it tastes like?
+ components:
- type: ReplacementAccent
accent: slimes
- type: GhostTakeoverAvailable
makeSentient: true
name: ghost-role-information-slimes-name
description: ghost-role-information-slimes-description
- - type: Speech
- speechVerb: Slime
- speechSounds: Slime
- - type: TypingIndicator
- proto: slime
+ - type: NpcFactionMember
+ factions:
+ - SimpleNeutral
+ - type: HTN
+ rootTask:
+ task: SimpleHostileCompound
+
+- type: entity
+ name: geras
+ description: A geras of a slime - the name is ironic, isn't it?
+ id: MobSlimesGeras
+ parent: BaseMobAdultSlimes
+ noSpawn: true
+ components:
+ # they portable...
+ - type: MultiHandedItem
+ - type: Item
+ size: Huge
+ - type: Sprite
+ color: "#FFFFFF55"
+ - type: MeleeWeapon
+ attackRate: 2
+ damage:
+ types:
+ Blunt: 4
+ - type: DamageStateVisuals
+ states:
+ Alive:
+ Base: blue_adult_slime
+ Dead:
+ Base: blue_adult_slime_dead
- type: entity
name: blue slime
- type: Body
prototype: Slime
requiredLegs: 2
+ # they like eat it idk lol
+ - type: Storage
+ grid:
+ - 0,0,1,2
+ maxItemSize: Large
+ storageInsertSound:
+ path: /Audio/Voice/Slime/slime_squish.ogg
+ - type: ContainerContainer
+ containers:
+ storagebase: !type:Container
+ ents: []
+ - type: UserInterface
+ interfaces:
+ - key: enum.StorageUiKey.Key
+ type: StorageBoundUserInterface
+ - key: enum.VoiceMaskUIKey.Key
+ type: VoiceMaskBoundUserInterface
+ - key: enum.HumanoidMarkingModifierKey.Key
+ type: HumanoidMarkingModifierBoundUserInterface
+ - key: enum.StrippingUiKey.Key
+ type: StrippableBoundUserInterface
+ # to prevent bag open/honk spam
+ - type: UseDelay
+ delay: 0.5
- type: HumanoidAppearance
species: SlimePerson
- type: Speech
- type: Damageable
damageContainer: Biological
damageModifierSet: Slime
+ - type: Geras
+ - type: PassiveDamage # Around 8 damage a minute healed
+ allowedStates:
+ - Alive
+ damageCap: 65
+ damage:
+ types:
+ Heat: -0.14
+ groups:
+ Brute: -0.14
- type: DamageVisuals
damageOverlayGroups:
Brute:
inventory: Transfer
revertOnDeath: true
+- type: polymorph
+ id: SlimeMorphGeras
+ configuration:
+ entity: MobSlimesGeras
+ transferName: false
+ transferHumanoidAppearance: false
+ inventory: Drop
+ transferDamage: true
+ revertOnDeath: true
+ revertOnCrit: true
+
# this is a test for transferring some visual appearance stuff
- type: polymorph
id: TestHumanMorph
They exhale nitrous oxide and are unaffected by it.
Their body can process 6 reagents at the same time instead of just 2.
- Their Slime "blood" can not be regenerated from Iron. Slime Blood is technically a source of
+ Slimepeople can morph into a [bold]"geras"[/bold] (an archaic slimefolk term), which is a smaller slime form that can [bold]pass through grilles[/bold],
+ but forces them to drop their inventory and held items. It's handy for a quick getaway. A geras is small enough to pick up (with two hands)
+ and fits in a duffelbag.
+
+ <Box>
+ <GuideEntityEmbed Entity="MobSlimesGeras" Caption="A typical geras."/>
+ </Box>
+
+ Slimepeople have an [bold]internal 2x2 storage inventory[/bold] inside of their slime membrane. Anyone can see what's inside and take it out of you without asking,
+ so be careful. They [bold]don't drop their internal storage when they morph into a geras, however![/bold]
+
+ Slimepeople have slight accelerated regeneration compared to other humanoids. They're also capable of hardening their fists, and as such have stronger punches,
+ although they punch a little slower.
+
+ Their slime "blood" can not be regenerated from Iron. Slime Blood is technically a source of
moderately filling food for other species, although drinking the blood of your coworkers is usually frowned upon.
They suffocate 80% slower, but take pressure damage 9% faster. This makes them by far the species most capable to survive in hard vacuum. For a while.