diff --git a/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs b/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs index 5e63171986..9419daf348 100644 --- a/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs +++ b/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Actions; +using Content.Shared.Actions; using Content.Shared.Mobs.Components; namespace Content.Shared.Mobs.Systems; @@ -14,9 +14,26 @@ public sealed class MobStateActionsSystem : EntitySystem public override void Initialize() { SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(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(uid, out var mobStateActionsComp)) + return; + + ComposeActions(uid, mobStateActionsComp, component.CurrentState); + } + + /// + /// Adds or removes actions from a mob based on mobstate. + /// + private void ComposeActions(EntityUid uid, MobStateActionsComponent component, MobState newMobState) { if (!TryComp(uid, out var action)) return; @@ -27,7 +44,7 @@ public sealed class MobStateActionsSystem : EntitySystem } 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) diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 79b98691b8..bb816ba297 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -30,6 +30,15 @@ ghost-role-information-mouse-description = A hungry and mischievous mouse. 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. diff --git a/Resources/Locale/en-US/nutrition/components/food-sequence.ftl b/Resources/Locale/en-US/nutrition/components/food-sequence.ftl index 672b0a0e7a..36ce47d5cf 100644 --- a/Resources/Locale/en-US/nutrition/components/food-sequence.ftl +++ b/Resources/Locale/en-US/nutrition/components/food-sequence.ftl @@ -73,6 +73,7 @@ food-sequence-content-capfruit = capfruit food-sequence-content-berries = berries food-sequence-content-spacemans-trumpet = spacemans trupmet food-sequence-content-cherry = cherry +food-sequence-content-snail = snail # BURGERS diff --git a/Resources/Locale/en-US/species/species.ftl b/Resources/Locale/en-US/species/species.ftl index f31b1fa0f0..bb5c3a67ac 100644 --- a/Resources/Locale/en-US/species/species.ftl +++ b/Resources/Locale/en-US/species/species.ftl @@ -9,3 +9,7 @@ species-name-arachnid = Arachnid 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 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 91f5e952e9..493449e3f3 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -369,3 +369,206 @@ 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 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index 22ebbda7c9..53fbf62399 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -930,6 +930,35 @@ 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 @@ -1473,6 +1502,40 @@ 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 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml index 5c2a87c2b1..d5cb4311c4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml @@ -1227,3 +1227,33 @@ - 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 diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 56ffeda7f0..901fd299e8 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -337,6 +337,48 @@ - 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 diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index bf39e1487b..fb1280daff 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -957,6 +957,29 @@ 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 diff --git a/Resources/Textures/Mobs/Animals/snail.rsi/dead.png b/Resources/Textures/Mobs/Animals/snail.rsi/dead.png new file mode 100644 index 0000000000..bdaecdab58 Binary files /dev/null and b/Resources/Textures/Mobs/Animals/snail.rsi/dead.png differ diff --git a/Resources/Textures/Mobs/Animals/snail.rsi/meta.json b/Resources/Textures/Mobs/Animals/snail.rsi/meta.json new file mode 100644 index 0000000000..ca42ca9eed --- /dev/null +++ b/Resources/Textures/Mobs/Animals/snail.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "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 diff --git a/Resources/Textures/Mobs/Animals/snail.rsi/snail.png b/Resources/Textures/Mobs/Animals/snail.rsi/snail.png new file mode 100644 index 0000000000..26d112c57f Binary files /dev/null and b/Resources/Textures/Mobs/Animals/snail.rsi/snail.png differ diff --git a/Resources/Textures/Mobs/Animals/snail.rsi/snoth.png b/Resources/Textures/Mobs/Animals/snail.rsi/snoth.png new file mode 100644 index 0000000000..5e634d1265 Binary files /dev/null and b/Resources/Textures/Mobs/Animals/snail.rsi/snoth.png differ diff --git a/Resources/Textures/Mobs/Animals/snail.rsi/snothdead.png b/Resources/Textures/Mobs/Animals/snail.rsi/snothdead.png new file mode 100644 index 0000000000..7296239608 Binary files /dev/null and b/Resources/Textures/Mobs/Animals/snail.rsi/snothdead.png differ diff --git a/Resources/Textures/Mobs/Animals/snail.rsi/spacedead.png b/Resources/Textures/Mobs/Animals/snail.rsi/spacedead.png new file mode 100644 index 0000000000..37cbde99fb Binary files /dev/null and b/Resources/Textures/Mobs/Animals/snail.rsi/spacedead.png differ diff --git a/Resources/Textures/Mobs/Animals/snail.rsi/spacesnail.png b/Resources/Textures/Mobs/Animals/snail.rsi/spacesnail.png new file mode 100644 index 0000000000..3a2d97c622 Binary files /dev/null and b/Resources/Textures/Mobs/Animals/snail.rsi/spacesnail.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bowl.rsi/escargot.png b/Resources/Textures/Objects/Consumable/Food/bowl.rsi/escargot.png new file mode 100644 index 0000000000..2ae8f5af72 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/bowl.rsi/escargot.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/bowl.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/bowl.rsi/meta.json index 8e2c4444fc..d6c3ed7676 100644 --- a/Resources/Textures/Objects/Consumable/Food/bowl.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/bowl.rsi/meta.json @@ -1,7 +1,7 @@ { "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 @@ -66,6 +66,9 @@ 0.1 ] ] + }, + { + "name": "escargot" }, { "name": "eyeball" diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json index 824d3b9681..4ad75849d1 100644 --- a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json @@ -1,7 +1,7 @@ { "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 @@ -152,6 +152,12 @@ }, { "name": "slime" + }, + { + "name": "snail" + }, + { + "name": "snail-cooked" }, { "name": "snake" diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/snail-cooked.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/snail-cooked.png new file mode 100644 index 0000000000..81d8f43bbf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/meat.rsi/snail-cooked.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/snail.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/snail.png new file mode 100644 index 0000000000..c3c7ffcef5 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/meat.rsi/snail.png differ