-using Content.Shared.Actions;
+using Content.Shared.Actions;
using Content.Shared.Mobs.Components;
namespace Content.Shared.Mobs.Systems;
public override void Initialize()
{
SubscribeLocalEvent<MobStateActionsComponent, MobStateChangedEvent>(OnMobStateChanged);
+ SubscribeLocalEvent<MobStateComponent, ComponentInit>(OnMobStateComponentInit);
}
private void OnMobStateChanged(EntityUid uid, MobStateActionsComponent component, MobStateChangedEvent args)
+ {
+ ComposeActions(uid, component, args.NewMobState);
+ }
+
+ private void OnMobStateComponentInit(EntityUid uid, MobStateComponent component, ComponentInit args)
+ {
+ if (!TryComp<MobStateActionsComponent>(uid, out var mobStateActionsComp))
+ return;
+
+ ComposeActions(uid, mobStateActionsComp, component.CurrentState);
+ }
+
+ /// <summary>
+ /// Adds or removes actions from a mob based on mobstate.
+ /// </summary>
+ private void ComposeActions(EntityUid uid, MobStateActionsComponent component, MobState newMobState)
{
if (!TryComp<ActionsComponent>(uid, out var action))
return;
}
component.GrantedActions.Clear();
- if (!component.Actions.TryGetValue(args.NewMobState, out var toGrant))
+ if (!component.Actions.TryGetValue(newMobState, out var toGrant))
return;
foreach (var id in toGrant)
ghost-role-information-mothroach-name = Mothroach
ghost-role-information-mothroach-description = A cute but mischievous mothroach.
+ghost-role-information-snail-name = Snail
+ghost-role-information-snail-description = A little snail who doesn't mind a bit of space. Just stay on grid!
+
+ghost-role-information-snailspeed-name = Snail
+ghost-role-information-snailspeed-description = A little snail with snailborn thrusters.
+
+ghost-role-information-snoth-name = Snoth
+ghost-role-information-snoth-description = A little snoth who doesn't mind a bit of space. Just stay on grid!
+
ghost-role-information-giant-spider-name = Giant spider
ghost-role-information-giant-spider-description = This station's inhabitants look mighty tasty, and your sticky web is perfect to catch them!
ghost-role-information-giant-spider-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other giant spiders.
food-sequence-content-berries = berries
food-sequence-content-spacemans-trumpet = spacemans trupmet
food-sequence-content-cherry = cherry
+food-sequence-content-snail = snail
# BURGERS
species-name-moth = Moth Person
species-name-skeleton = Skeleton
species-name-vox = Vox
+
+## Misc species things
+
+snail-hurt-by-salt-popup = The salty solution burns like acid!
\ No newline at end of file
suffix: "Salvage Ruleset"
components:
- type: SalvageMobRestrictions
+
+- type: entity
+ parent: SimpleSpaceMobBase
+ id: MobSnail
+ name: snail
+ description: Revolting unless you're french.
+ components:
+ - type: Body
+ prototype: Mouse
+ - type: GhostRole
+ makeSentient: true
+ allowSpeech: false
+ allowMovement: true
+ name: ghost-role-information-snail-name
+ description: ghost-role-information-snail-description
+ rules: ghost-role-information-freeagent-rules
+ - type: GhostTakeoverAvailable
+ - type: Sprite
+ drawdepth: SmallMobs
+ sprite: Mobs/Animals/snail.rsi
+ layers:
+ - map: ["enum.DamageStateVisualLayers.Base"]
+ state: snail
+ - type: Item
+ size: Tiny
+ - type: NpcFactionMember
+ factions:
+ - Mouse
+ - type: HTN
+ rootTask:
+ task: MouseCompound
+ - type: Physics
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 0.2
+ density: 100
+ mask:
+ - SmallMobMask
+ layer:
+ - SmallMobLayer
+ - type: MobState
+ - type: Deathgasp
+ - type: MobStateActions
+ actions:
+ Critical:
+ - ActionCritSuccumb
+ - ActionCritFakeDeath
+ - ActionCritLastWords
+ - type: MobThresholds
+ thresholds:
+ 0: Alive
+ 10: Critical
+ 20: Dead
+ - type: MovementSpeedModifier
+ baseWalkSpeed : 2
+ baseSprintSpeed : 3
+ - type: DamageStateVisuals
+ states:
+ Alive:
+ Base: snail
+ Critical:
+ Base: dead
+ Dead:
+ Base: dead
+ - type: Food
+ - type: Thirst
+ startingThirst: 25 # spawn with Okay thirst state
+ thresholds:
+ OverHydrated: 35
+ Okay: 25
+ Thirsty: 15
+ Parched: 10
+ Dead: 0
+ baseDecayRate: 0.04
+ - type: Hunger
+ currentHunger: 25 # spawn with Okay hunger state
+ thresholds:
+ Overfed: 35
+ Okay: 25
+ Peckish: 15
+ Starving: 10
+ Dead: 0
+ baseDecayRate: 0.1
+ - type: Extractable
+ grindableSolutionName: food
+ - type: SolutionContainerManager
+ solutions:
+ food:
+ reagents:
+ - ReagentId: UncookedAnimalProteins
+ Quantity: 3
+ - type: Butcherable
+ spawned:
+ - id: FoodMeatSnail
+ amount: 1
+ - type: Tag
+ tags:
+ - Trash
+ - VimPilot
+ - ChefPilot
+ - Meat
+ - type: CombatMode
+ combatToggleAction: ActionCombatModeToggleOff
+ - type: Bloodstream
+ bloodMaxVolume: 30
+ bloodReagent: Cryoxadone
+ - type: CanEscapeInventory
+ - type: MobPrice
+ price: 50
+ - type: BadFood
+ - type: NonSpreaderZombie
+ - type: PreventSpiller
+ - type: FireVisuals
+ sprite: Mobs/Effects/onfire.rsi
+ normalState: Mouse_burning
+ - type: Temperature
+ heatDamageThreshold: 500
+ coldDamageThreshold: 0
+ - type: Reactive
+ reactions:
+ - reagents: [TableSalt, Saline]
+ methods: [Touch, Ingestion, Injection]
+ effects:
+ - !type:HealthChange
+ scaleByQuantity: true
+ damage:
+ types:
+ Caustic: 1
+ - !type:PopupMessage
+ type: Local
+ visualType: Large
+ messages: [ "snail-hurt-by-salt-popup" ]
+ probability: 0.66
+
+- type: entity
+ parent: MobSnail
+ id: MobSnailInstantDeath
+ suffix: Smite
+ components:
+ - type: MobStateActions
+ actions:
+ Alive:
+ - ActionSmite
+ Critical:
+ - ActionCritSuccumb
+ - ActionCritFakeDeath
+ - ActionCritLastWords
+ - type: Godmode
+ - type: MovementAlwaysTouching
+
+- type: entity
+ parent: MobSnail
+ id: MobSnailSpeed
+ suffix: Speed
+ components:
+ - type: GhostRole
+ name: ghost-role-information-snailspeed-name
+ description: ghost-role-information-snailspeed-description
+ rules: ghost-role-information-freeagent-rules
+ - type: Sprite
+ layers:
+ - map: ["enum.DamageStateVisualLayers.Base"]
+ state: spacesnail
+ - type: DamageStateVisuals
+ states:
+ Alive:
+ Base: spacesnail
+ Critical:
+ Base: spacesnaildead
+ Dead:
+ Base: spacesnaildead
+ - type: MovementSpeedModifier
+ baseWalkSpeed : 5 #he go fast, also they cant slip so its probably fine.
+ baseSprintSpeed : 7
+# - type: ActiveJetpack # I think this will need a custom component to not make tests angry.
+ - type: MovementAlwaysTouching
+
+- type: entity
+ parent: MobSnail
+ id: MobSnailMoth
+ name: Snoth
+ components:
+ - type: Body
+ prototype: Mothroach
+ - type: GhostRole
+ name: ghost-role-information-snoth-name
+ description: ghost-role-information-snoth-description
+ rules: ghost-role-information-freeagent-rules
+ - type: Sprite
+ layers:
+ - map: ["enum.DamageStateVisualLayers.Base"]
+ state: snoth
+ - type: DamageStateVisuals
+ states:
+ Alive:
+ Base: snoth
+ Critical:
+ Base: snothdead
+ Dead:
+ Base: snothdead
taco:
name: food-sequence-content-slime
+- type: entity
+ name: raw snail meat
+ parent: FoodMeatRawBase
+ id: FoodMeatSnail
+ description: Improved with salt.
+ components:
+ - type: Sprite
+ state: snail
+ - type: FoodSequenceElement
+ sprite:
+ sprite: Objects/Consumable/Food/meat.rsi
+ state: snail
+ entries:
+ burger:
+ name: food-sequence-content-snail
+ taco:
+ name: food-sequence-content-snail
+ - type: SolutionContainerManager
+ solutions:
+ food:
+ maxVol: 15
+ reagents:
+ - ReagentId: UncookedAnimalProteins
+ Quantity: 3
+ - ReagentId: Fat
+ Quantity: 3
+ - ReagentId: Water
+ Quantity: 4 #It makes saline if you add salt!
+
# Cooked
- type: entity
sprite: Objects/Consumable/Food/skewer.rsi
state: skewer-meat
+- type: entity
+ name: boiled snail
+ parent: FoodMeatBase
+ id: FoodMeatSnailCooked
+ description: Improved with salt.
+ components:
+ - type: Tag
+ tags:
+ - Cooked
+ - Meat
+ - type: Sprite
+ layers:
+ - state: snail-cooked
+ - type: FoodSequenceElement
+ sprite:
+ sprite: Objects/Consumable/Food/meat.rsi
+ state: snail-cooked
+ entries:
+ burger:
+ name: food-sequence-content-snail
+ taco:
+ name: food-sequence-content-snail
+ - type: SolutionContainerManager
+ solutions:
+ food:
+ maxVol: 15
+ reagents:
+ - ReagentId: Nutriment
+ Quantity: 3
+ - ReagentId: Protein
+ Quantity: 3
+ - ReagentId: Water
+ Quantity: 4 # makes saline if you add salt!
+
# Cutlets
# Raw
- Fruit
- Soup
# Tastes like bungo, hot curry.
+
+- type: entity
+ name: escargot
+ parent: FoodBowlBase
+ id: FoodSoupEscargot
+ description: A creamy and rich bowl of snails, bon appetit!
+ components:
+ - type: FlavorProfile
+ flavors:
+ - creamy
+ - slimy
+ - type: Sprite
+ layers:
+ - state: bowl
+ - state: escargot
+ - type: SolutionContainerManager
+ solutions:
+ food:
+ maxVol: 20
+ reagents:
+ - ReagentId: Nutriment
+ Quantity: 6
+ - ReagentId: Vitamin
+ Quantity: 6
+ - ReagentId: Allicin
+ Quantity: 3
+ - type: Tag
+ tags:
+ - Meat
+ - Soup
- id: MobMothroach
prob: 0.008
+- type: entity
+ id: SnailMigrationLowPop
+ parent: BaseStationEventShortDelay
+ components:
+ - type: StationEvent
+ startAnnouncement: station-event-vent-creatures-start-announcement
+ startAudio:
+ path: /Audio/Announcements/attention.ogg
+ weight: 6
+ duration: 50
+ - type: VentCrittersRule
+ entries:
+ - id: MobSnail
+ prob: 0.02
+ - id: MobSnailSpeed
+ prob: 0.002
+ - id: MobSnailMoth
+ prob: 0.002
+
+- type: entity
+ id: SnailMigration
+ parent: BaseStationEventShortDelay
+ components:
+ - type: StationEvent
+ startAnnouncement: station-event-vent-creatures-start-announcement
+ startAudio:
+ path: /Audio/Announcements/attention.ogg
+ earliestStart: 15
+ weight: 6
+ duration: 50
+ minimumPlayers: 30
+ - type: VentCrittersRule
+ entries:
+ - id: MobSnail
+ prob: 0.02
+ - id: MobSnailSpeed
+ prob: 0.002
+ - id: MobSnailMoth
+ prob: 0.002
+ - id: MobSnailInstantDeath
+ prob: 0.00001 # ~ 1:2000 snails
+
- type: entity
id: PowerGridCheck
parent: BaseStationEventShortDelay
FoodBungo: 2
FoodChiliPepper: 1
+- type: microwaveMealRecipe
+ id: RecipeBoiledSnail
+ name: boiled snail recipe
+ result: FoodMeatSnailCooked
+ time: 5
+ reagents:
+ Water: 10
+ solids:
+ FoodMeatSnail: 1
+
+- type: microwaveMealRecipe
+ id: RecipeEscargotSoup
+ name: escargot recipe
+ result: FoodSoupEscargot
+ time: 10
+ reagents:
+ Water: 5
+ solids:
+ FoodBowlBig: 1
+ FoodOnionSlice: 1
+ FoodButter: 1
+ FoodMeatSnailCooked: 1
+
#Pies
- type: microwaveMealRecipe
--- /dev/null
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by Kezu (discord) & IProduceWidgets (github)",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "snail",
+ "directions": 4
+ },
+ {
+ "name": "dead"
+ },
+ {
+ "name": "spacesnail",
+ "directions": 4
+ },
+ {
+ "name": "spacedead"
+ },
+ {
+ "name": "snoth",
+ "directions": 4
+ },
+ {
+ "name": "snothdead"
+ }
+ ]
+}
\ No newline at end of file
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa. Fills created by potato1234_x",
+ "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa. escargot from tgstation at https://github.com/tgstation/tgstation/commit/7ffd61b6fa6a6183daa8900f9a490f46f7a81955. Fills created by potato1234_x",
"size": {
"x": 32,
"y": 32
0.1
]
]
+ },
+ {
+ "name": "escargot"
},
{
"name": "eyeball"
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation and modified by Swept, potato1234x and deltanedas at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa",
+ "copyright": "Taken from tgstation and modified by Swept, potato1234x and deltanedas at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa, snail by IproduceWidgets (github) and Kezu (discord)",
"size": {
"x": 32,
"y": 32
},
{
"name": "slime"
+ },
+ {
+ "name": "snail"
+ },
+ {
+ "name": "snail-cooked"
},
{
"name": "snake"