Fishy swarmers: Carp content and Space Dragon! (#7395)

Co-authored-by: mirrorcult <lunarautomaton6@gmail.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
CrudeWax
2022-06-16 07:14:06 +03:00
committed by GitHub
parent 5e00d83569
commit c210239f45
46 changed files with 1206 additions and 432 deletions

View File

@@ -1,109 +0,0 @@
using System.Collections.Generic;
using Content.Shared.MobState;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.Manager.Attributes;
using DrawDepth = Content.Shared.DrawDepth.DrawDepth;
namespace Content.Client.MobState
{
[UsedImplicitly]
public sealed class DamageStateVisualizer : AppearanceVisualizer, ISerializationHooks
{
private DamageState _data = DamageState.Alive;
private Dictionary<DamageState, string> _stateMap = new();
private int? _originalDrawDepth;
[DataField("normal")]
private string? _normal;
[DataField("crit")]
private string? _crit;
[DataField("dead")]
private string? _dead;
/// <summary>
/// Should noRot be turned off when crit / dead.
/// </summary>
[DataField("rotate")]
private bool _rotate;
void ISerializationHooks.BeforeSerialization()
{
_stateMap.TryGetValue(DamageState.Alive, out _normal);
_stateMap.TryGetValue(DamageState.Critical, out _crit);
_stateMap.TryGetValue(DamageState.Dead, out _dead);
}
void ISerializationHooks.AfterDeserialization()
{
if (_normal != null)
{
_stateMap.Add(DamageState.Alive, _normal);
}
if (_crit != null)
{
_stateMap.Add(DamageState.Critical, _crit);
}
if (_dead != null)
{
_stateMap.Add(DamageState.Dead, _dead);
}
}
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<ISpriteComponent>(component.Owner);
if (!component.TryGetData(DamageStateVisuals.State, out DamageState data))
{
return;
}
if (_data == data)
{
return;
}
_data = data;
if (_rotate)
{
sprite.NoRotation = data switch
{
DamageState.Critical => false,
DamageState.Dead => false,
_ => true
};
}
if (_stateMap.TryGetValue(_data, out var state))
{
sprite.LayerSetState(DamageStateVisualLayers.Base, state);
}
// So they don't draw over mobs anymore
if (_data == DamageState.Dead && sprite.DrawDepth > (int) DrawDepth.Items)
{
_originalDrawDepth = sprite.DrawDepth;
sprite.DrawDepth = (int) DrawDepth.Items;
}
else if (_originalDrawDepth != null)
{
sprite.DrawDepth = _originalDrawDepth.Value;
_originalDrawDepth = null;
}
}
}
public enum DamageStateVisualLayers : byte
{
Base
}
}

View File

@@ -0,0 +1,57 @@
using Content.Shared.MobState;
using Robust.Client.GameObjects;
using DrawDepth = Content.Shared.DrawDepth.DrawDepth;
namespace Content.Client.MobState;
public sealed class DamageStateVisualizerSystem : VisualizerSystem<DamageStateVisualsComponent>
{
protected override void OnAppearanceChange(EntityUid uid, DamageStateVisualsComponent component, ref AppearanceChangeEvent args)
{
var sprite = args.Sprite;
if (sprite == null || !args.Component.TryGetData(DamageStateVisuals.State, out DamageState data))
{
return;
}
if (!component.States.TryGetValue(data, out var layers))
{
return;
}
if (component.Rotate)
{
sprite.NoRotation = data switch
{
DamageState.Critical => false,
DamageState.Dead => false,
_ => true
};
}
// Brain no worky rn so this was just easier.
foreach (var layer in sprite.AllLayers)
{
layer.Visible = false;
}
foreach (var (key, state) in layers)
{
sprite.LayerSetVisible(key, true);
sprite.LayerSetState(key, state);
}
// So they don't draw over mobs anymore
if (data == DamageState.Dead && sprite.DrawDepth > (int) DrawDepth.Items)
{
component.OriginalDrawDepth = sprite.DrawDepth;
sprite.DrawDepth = (int) DrawDepth.Items;
}
else if (component.OriginalDrawDepth != null)
{
sprite.DrawDepth = component.OriginalDrawDepth.Value;
component. OriginalDrawDepth = null;
}
}
}

View File

@@ -0,0 +1,22 @@
using Content.Shared.MobState;
namespace Content.Client.MobState;
[RegisterComponent]
public sealed class DamageStateVisualsComponent : Component
{
public int? OriginalDrawDepth;
[DataField("states")] public Dictionary<DamageState, Dictionary<string, string>> States = new();
/// <summary>
/// Should noRot be turned off when crit / dead.
/// </summary>
[DataField("rotate")] public bool Rotate;
}
public enum DamageStateVisualLayers : byte
{
Base,
BaseUnshaded,
}

View File

@@ -0,0 +1,80 @@
using Content.Shared.Actions.ActionTypes;
using Robust.Shared.Containers;
using System.Threading;
using Content.Shared.Actions;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Sound;
using Content.Shared.Storage;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Dragon
{
[RegisterComponent]
public sealed class DragonComponent : Component
{
/// <summary>
/// The chemical ID injected upon devouring
/// </summary>
[DataField("devourChemical", customTypeSerializer: typeof(PrototypeIdSerializer<ReagentPrototype>))]
public string DevourChem = "Ichor";
/// <summary>
/// The amount of ichor injected per devour
/// </summary>
[DataField("devourHealRate")]
public float DevourHealRate = 15f;
[DataField("devourActionId", customTypeSerializer: typeof(PrototypeIdSerializer<EntityTargetActionPrototype>))]
public string DevourActionId = "DragonDevour";
[DataField("devourAction")]
public EntityTargetAction? DevourAction;
[DataField("spawnActionId", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
public string SpawnActionId = "DragonSpawn";
[DataField("spawnAction")]
public InstantAction? SpawnAction;
/// <summary>
/// The amount of time it takes to devour something
/// <remarks>
/// NOTE: original intended design was to increase this proportionally with damage thresholds, but those proved quite difficult to get consistently. right now it devours the structure at a fixed timer.
/// </remarks>
/// </summary>
[DataField("devourTime")]
public float DevourTime = 15f;
[DataField("spawnCount")] public int SpawnsLeft = 2;
[DataField("maxSpawnCount")] public int MaxSpawns = 2;
[DataField("spawnProto", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string? SpawnPrototype = "MobCarpDragon";
[ViewVariables(VVAccess.ReadWrite), DataField("soundDeath")]
public SoundSpecifier? SoundDeath = new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg");
[ViewVariables(VVAccess.ReadWrite), DataField("soundDevour")]
public SoundSpecifier? SoundDevour = new SoundPathSpecifier("/Audio/Effects/demon_consume.ogg");
[ViewVariables(VVAccess.ReadWrite), DataField("soundStructureDevour")]
public SoundSpecifier? SoundStructureDevour = new SoundPathSpecifier("/Audio/Machines/airlock_creaking.ogg");
[ViewVariables(VVAccess.ReadWrite), DataField("soundRoar")]
public SoundSpecifier? SoundRoar =
new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg");
public CancellationTokenSource? CancelToken;
/// <summary>
/// Where the entities go when dragon devours them, empties when the dragon is butchered.
/// </summary>
public Container DragonStomach = default!;
}
public sealed class DragonDevourActionEvent : EntityTargetActionEvent {}
public sealed class DragonSpawnActionEvent : InstantActionEvent {}
}

View File

@@ -0,0 +1,188 @@
using Content.Server.Body.Systems;
using Content.Server.DoAfter;
using Content.Server.Popups;
using Content.Shared.Actions;
using Content.Shared.CharacterAppearance.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.Damage;
using Content.Shared.MobState;
using Content.Shared.MobState.Components;
using Content.Shared.Tag;
using Robust.Shared.Audio;
using Robust.Shared.Containers;
using Robust.Shared.Player;
using System.Threading;
using Content.Shared.MobState.State;
using Content.Shared.Doors.Components;
namespace Content.Server.Dragon
{
public sealed class DragonSystem : EntitySystem
{
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!;
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DragonComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<DragonComponent, DragonDevourActionEvent>(OnDevourAction);
SubscribeLocalEvent<DragonComponent, DragonSpawnActionEvent>(OnDragonSpawnAction);
SubscribeLocalEvent<DragonComponent, DragonDevourComplete>(OnDragonDevourComplete);
SubscribeLocalEvent<DragonComponent, DragonDevourCancelledEvent>(OnDragonDevourCancelled);
SubscribeLocalEvent<DragonComponent, MobStateChangedEvent>(OnMobStateChanged);
}
private void OnMobStateChanged(EntityUid uid, DragonComponent component, MobStateChangedEvent args)
{
//Empties the stomach upon death
//TODO: Do this when the dragon gets butchered instead
if (args.CurrentMobState.IsDead())
{
if (component.SoundDeath != null)
SoundSystem.Play(component.SoundDeath.GetSound(), Filter.Pvs(uid, entityManager: EntityManager));
component.DragonStomach.EmptyContainer();
}
}
private void OnDragonDevourCancelled(EntityUid uid, DragonComponent component, DragonDevourCancelledEvent args)
{
component.CancelToken = null;
}
private void OnDragonDevourComplete(EntityUid uid, DragonComponent component, DragonDevourComplete args)
{
component.CancelToken = null;
//TODO: Figure out a better way of removing structures via devour that still entails standing still and waiting for a DoAfter. Somehow.
EntityManager.QueueDeleteEntity(args.Target);
if (component.SoundDevour != null)
SoundSystem.Play(component.SoundDevour.GetSound(), Filter.Pvs(args.User, entityManager: EntityManager));
}
private void OnStartup(EntityUid uid, DragonComponent component, ComponentStartup args)
{
component.SpawnsLeft = Math.Min(component.SpawnsLeft, component.MaxSpawns);
//Dragon doesn't actually chew, since he sends targets right into his stomach.
//I did it mom, I added ERP content into upstream. Legally!
component.DragonStomach = _containerSystem.EnsureContainer<Container>(uid, "dragon_stomach");
if (component.DevourAction != null)
_actionsSystem.AddAction(uid, component.DevourAction, null);
if (component.SpawnAction != null)
_actionsSystem.AddAction(uid, component.SpawnAction, null);
if (component.SoundRoar != null)
SoundSystem.Play(component.SoundRoar.GetSound(), Filter.Pvs(uid, 4f, EntityManager));
}
/// <summary>
/// The devour action
/// </summary>
private void OnDevourAction(EntityUid dragonuid, DragonComponent component, DragonDevourActionEvent args)
{
if (component.CancelToken != null || args.Handled) return;
args.Handled = true;
var target = args.Target;
var ichorInjection = new Solution(component.DevourChem, component.DevourHealRate);
//Check if the target is valid. The effects should be possible to accomplish on either a wall or a body.
//Eating bodies is instant, the wall requires a doAfter.
if (EntityManager.TryGetComponent(target, out MobStateComponent? targetState))
{
switch (targetState.CurrentState)
{
case SharedCriticalMobState:
case SharedDeadMobState:
if (!EntityManager.HasComponent<DamageableComponent>(dragonuid)) return;
//Humanoid devours allow dragon to get eggs, corpses included
if (EntityManager.HasComponent<HumanoidAppearanceComponent>(target))
{
// Add a spawn for a consumed humanoid
component.SpawnsLeft = Math.Min(component.SpawnsLeft + 1, component.MaxSpawns);
}
//Non-humanoid mobs can only heal dragon for half the normal amount, with no additional spawn tickets
else
{
ichorInjection.ScaleSolution(0.5f);
}
_bloodstreamSystem.TryAddToChemicals(dragonuid, ichorInjection);
component.DragonStomach.Insert(target);
if (component.SoundDevour != null)
SoundSystem.Play(component.SoundDevour.GetSound(), Filter.Pvs(dragonuid, entityManager: EntityManager));
return;
default:
_popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-fail-target-alive"), dragonuid, Filter.Entities(dragonuid));
break;
}
return;
}
// Absolutely ass solution but requires less yaml fuckery
// If it's a door (firelock, airlock, windoor), Wall or Window, dragon can eat it.
if (_tagSystem.HasTag(target, "Wall") || (_tagSystem.HasTag(target, "Window") || EntityManager.HasComponent<DoorComponent>(target)))
{
_popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-structure"), dragonuid, Filter.Entities(dragonuid));
if (component.SoundStructureDevour != null)
SoundSystem.Play(component.SoundStructureDevour.GetSound(), Filter.Pvs(dragonuid, entityManager: EntityManager));
component.CancelToken = new CancellationTokenSource();
_doAfterSystem.DoAfter(new DoAfterEventArgs(dragonuid, component.DevourTime, component.CancelToken.Token, target)
{
UserFinishedEvent = new DragonDevourComplete(dragonuid, target),
UserCancelledEvent = new DragonDevourCancelledEvent(),
BreakOnTargetMove = true,
BreakOnUserMove = true,
BreakOnStun = true,
});
}
}
private void OnDragonSpawnAction(EntityUid dragonuid, DragonComponent component, DragonSpawnActionEvent args)
{
if (component.SpawnPrototype == null) return;
// If dragon has spawns then add one.
if (component.SpawnsLeft > 0)
{
Spawn(component.SpawnPrototype, Transform(dragonuid).Coordinates);
component.SpawnsLeft--;
return;
}
_popupSystem.PopupEntity(Loc.GetString("dragon-spawn-action-popup-message-fail-no-eggs"), dragonuid, Filter.Entities(dragonuid));
}
private sealed class DragonDevourComplete : EntityEventArgs
{
public EntityUid User { get; }
public EntityUid Target { get; }
public DragonDevourComplete(EntityUid user, EntityUid target)
{
User = user;
Target = target;
}
}
private sealed class DragonDevourCancelledEvent : EntityEventArgs {}
}
}

View File

@@ -10,6 +10,7 @@ namespace Content.Server.Entry
"InteractionOutline",
"MeleeWeaponArcAnimation",
"EffectVisuals",
"DamageStateVisuals",
"AnimationsTest",
"ItemStatus",
"VehicleVisuals",

View File

@@ -4,39 +4,42 @@ licensed under CC BY-NC-SA 3.0
The following sounds were used from freesound:
cat_meow.ogg: modified from "Meow 4.wav" by freesound user "TRNGLE" (https://freesound.org/people/TRNGLE/sounds/368006/) licensed under CCBY 3.0. The original audio was trimmed, split to mono, and converted from WAV to OGG format.
cat_meow.ogg: modified from "Meow 4.wav" by freesound user "TRNGLE" (https://freesound.org/people/TRNGLE/sounds/368006/) licensed under CCBY 3.0. The original audio was trimmed, split to mono, and converted from WAV to OGG format.
cat_hiss.ogg: modified from "catHisses1.wav" by freesound user "Zabuhailo" (https://freesound.org/people/Zabuhailo/sounds/146963/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format.
cat_hiss.ogg: modified from "catHisses1.wav" by freesound user "Zabuhailo" (https://freesound.org/people/Zabuhailo/sounds/146963/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format.
small_dog_bark_happy.ogg: modified from "Dog bark2.wav" by freesound user "MisterTood" (https://freesound.org/people/MisterTood/sounds/9032/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format.
small_dog_bark_happy.ogg: modified from "Dog bark2.wav" by freesound user "MisterTood" (https://freesound.org/people/MisterTood/sounds/9032/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format.
duck_quack_happy.ogg: modified from "Duck Quack - Sound Effect (HD).mp3" by freesound user "Tabby+Gus." (https://freesound.org/people/Tabby+Gus./sounds/515408/) licensed under CC0 1.0 (public domain). The original audio was trimmed, looped, split to mono, and converted from MP3 to OGG format.
duck_quack_happy.ogg: modified from "Duck Quack - Sound Effect (HD).mp3" by freesound user "Tabby+Gus." (https://freesound.org/people/Tabby+Gus./sounds/515408/) licensed under CC0 1.0 (public domain). The original audio was trimmed, looped, split to mono, and converted from MP3 to OGG format.
chicken_cluck_happy.ogg: modified from "Chicken Single Alarm Call" by freesound user "Rudmer_Rotteveel" (https://freesound.org/people/Rudmer_Rotteveel/sounds/316920/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format.
chicken_cluck_happy.ogg: modified from "Chicken Single Alarm Call" by freesound user "Rudmer_Rotteveel" (https://freesound.org/people/Rudmer_Rotteveel/sounds/316920/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format.
ferret_happy.ogg: modified from "Ferret" by freesound user "J.Zazvurek" (https://freesound.org/people/J.Zazvurek/sounds/155115/) licensed under CC BY 3.0. The original audio was trimmed and converted from WAV to OGG format.
ferret_happy.ogg: modified from "Ferret" by freesound user "J.Zazvurek" (https://freesound.org/people/J.Zazvurek/sounds/155115/) licensed under CC BY 3.0. The original audio was trimmed and converted from WAV to OGG format.
mouse_squeak.ogg: modified from "Cartoon - Bat / Mouse Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/445958/) licensed under CC0 1.0 (public domain). The original audio was converted from WAV to OGG format.
mouse_squeak.ogg: modified from "Cartoon - Bat / Mouse Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/445958/) licensed under CC0 1.0 (public domain). The original audio was converted from WAV to OGG format.
sloth_squeak.ogg: modified from "squeakfinal.wav" by freesound user "Higgs01" (https://freesound.org/people/Higgs01/sounds/428114/) licensed under CC0 1.0 (Public domain dedication). The original audio was converted from WAV to OFF format AND converted from stereo to mono.
sloth_squeak.ogg: modified from "squeakfinal.wav" by freesound user "Higgs01" (https://freesound.org/people/Higgs01/sounds/428114/) licensed under CC0 1.0 (Public domain dedication). The original audio was converted from WAV to OFF format AND converted from stereo to mono.
parrot_raught.ogg: modified and used from "Parrot 1 raught 2.wav" by freesound user "Coral_Island_Studios" (https://freesound.org/people/Coral_Island_Studios/sounds/432588/) licensed under CC BY 3.0. The original audio was converted from WAV to OGG format.
parrot_raught.ogg: modified and used from "Parrot 1 raught 2.wav" by freesound user "Coral_Island_Studios" (https://freesound.org/people/Coral_Island_Studios/sounds/432588/) licensed under CC BY 3.0. The original audio was converted from WAV to OGG format.
fox_squeak.ogg: modified from "Video Game Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/468442/) licensed under CC0 1.0. The original audio was converted from WAV to OGG format
fox_squeak.ogg: modified from "Video Game Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/468442/) licensed under CC0 1.0. The original audio was converted from WAV to OGG format
frog_ribbit.ogg: original audio created by freesound user "egomassive" (https://freesound.org/people/egomassive/sounds/536759/). licensed under licensed under CC0 1.0
frog_ribbit.ogg: original audio created by freesound user "egomassive" (https://freesound.org/people/egomassive/sounds/536759/). licensed under licensed under CC0 1.0
goose_honk.ogg: modified from " Bird Honk - 1" by freesound user "SpaceJoe" (https://freesound.org/people/SpaceJoe/sounds/510940/) licensed under CC0 1.0. The originial audio was converted from WAV to OGG format.
goose_honk.ogg: modified from " Bird Honk - 1" by freesound user "SpaceJoe" (https://freesound.org/people/SpaceJoe/sounds/510940/) licensed under CC0 1.0. The originial audio was converted from WAV to OGG format.
snake_hiss.ogg: modified from "hissing snake sound effect" by freesound user "Garuda1982" (https://freesound.org/people/Garuda1982/sounds/541656/) licensed under CC BY 4.0. The original audio was convertred from WAV to OGG format.
snake_hiss.ogg: modified from "hissing snake sound effect" by freesound user "Garuda1982" (https://freesound.org/people/Garuda1982/sounds/541656/) licensed under CC BY 4.0. The original audio was convertred from WAV to OGG format.
The following sounds are taken from TGstation github (licensed under CC by 3.0):
space_dragon_roar.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0
The following sounds were used from youtube:
penguin_squawk.ogg: audio is recorded/created by youtube user "ProSounds" (https://youtu.be/Anr35RbBL3Y) licensed under CC BY 3.0. The original audio was trimmed and converted from MP3 to OGG format.
penguin_squawk.ogg: audio is recorded/created by youtube user "ProSounds" (https://youtu.be/Anr35RbBL3Y) licensed under CC BY 3.0. The original audio was trimmed and converted from MP3 to OGG format.
raccoon_squeak.ogg: audio is recorded by youtube user "jnargus" (https://youtu.be/BGjFP1CP7E0) licensed under CC by 3.0
raccoon_squeak.ogg: audio is recorded by youtube user "jnargus" (https://youtu.be/BGjFP1CP7E0) licensed under CC by 3.0
goat_bah.ogg: audio is created by youtube user "Winry Marini" (https://youtu.be/QIhwzsk5bww) licensed under CC BY 3.0
lizard_happy.ogg: audio created by youtube user "Nagaty Studio" (https://youtu.be/I7CX0AS8RNI) licensed under CC by 3.0.
goat_bah.ogg: audio is created by youtube user "Winry Marini" (https://youtu.be/QIhwzsk5bww) licensed under CC BY 3.0
lizard_happy.ogg: audio created by youtube user "Nagaty Studio" (https://youtu.be/I7CX0AS8RNI) licensed under CC by 3.0.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -31,3 +31,11 @@ minibombcountdown.ogg taken from Thomas Evdokimoff at https://freesound.org/peop
bite.ogg take from https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0
bone_rattle.ogg licensed under CC0 1.0 and taken from spookymodem at https://freesound.org/people/spookymodem/sounds/202102/
The following sounds are taken from TGstation github (licensed under CC by 3.0):
demon_attack1.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0
demon_consume.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0
demon_dies.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0

View File

@@ -0,0 +1,12 @@
devour-action-popup-message-structure = Your jaws dig into thick material..
devour-action-popup-message-fail-target-not-valid = That doesn't look particularly edible.
devour-action-popup-message-fail-target-alive = You can't consume creatures that are alive!
dragon-spawn-action-popup-message-fail-no-eggs = You don't have the stamina to create a carp!
action-name-devour = [color=red]Devour[/color]
action-description-devour = Attempt to break a structure with your jaws or swallow a creature.
action-name-carp-birth = Summon carp
action-description-carp-birth = Summon a carp to aid you at seizing the station!

View File

@@ -2,14 +2,16 @@
# you'll likely have to tag its metabolizers with something other than Human.
- type: metabolizerType
id: Human
id: Animal
- type: metabolizerType
id: Animal
id: Dragon
- type: metabolizerType
id: Human
- type: metabolizerType
id: Slime
- type: metabolizerType
id: Vox

View File

@@ -29,12 +29,14 @@
- FlyingMobMask
layer:
- FlyingMobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: bat
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: bat
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -97,11 +99,15 @@
5: !type:CriticalMobState {}
10: !type:DeadMobState {}
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: 0
crit: dead
dead: dead
- type: DamageStateVisuals
rotate: true
states:
Alive:
enum.DamageStateVisualLayers.Base: 0
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Tag
tags:
- Bee
@@ -153,11 +159,14 @@
state: chicken-0
sprite: Mobs/Animals/chicken.rsi
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: chicken-0
crit: dead-0
dead: dead-0
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: chicken-0
Critical:
enum.DamageStateVisualLayers.Base: dead-0
Dead:
enum.DamageStateVisualLayers.Base: dead-0
- type: Butcherable
spawned:
- id: FoodMeatChicken
@@ -184,11 +193,14 @@
state: duck-0
sprite: Mobs/Animals/duck.rsi
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: duck-0
crit: dead-0
dead: dead-0
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: duck-0
Critical:
enum.DamageStateVisualLayers.Base: dead-0
Dead:
enum.DamageStateVisualLayers.Base: dead-0
- type: Butcherable
spawned:
- id: FoodMeatDuck
@@ -215,11 +227,14 @@
state: duck-1
sprite: Mobs/Animals/duck.rsi
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: duck-1
crit: dead-1
dead: dead-1
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: duck-1
Critical:
enum.DamageStateVisualLayers.Base: dead-1
Dead:
enum.DamageStateVisualLayers.Base: dead-1
- type: Butcherable
spawned:
- id: FoodMeatDuck
@@ -246,11 +261,14 @@
state: duck-2
sprite: Mobs/Animals/duck.rsi
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: duck-2
crit: dead-2
dead: dead-2
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: duck-2
Critical:
enum.DamageStateVisualLayers.Base: dead-2
Dead:
enum.DamageStateVisualLayers.Base: dead-2
- type: Butcherable
spawned:
- id: FoodMeatDuck
@@ -306,11 +324,14 @@
cyan: "#18a2d5"
yellow: "#d58c18"
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: butterfly
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: butterfly
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Bloodstream
bloodMaxVolume: 0.1
- type: NoSlip
@@ -339,11 +360,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: cow
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: cow
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: SolutionContainerManager
solutions:
udder:
@@ -396,11 +420,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: crab
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: crab
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeatCrab
@@ -425,11 +452,14 @@
state: goat
sprite: Mobs/Animals/goat.rsi
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: goat
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: goat
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: SolutionContainerManager
solutions:
udder:
@@ -470,11 +500,14 @@
state: goose
sprite: Mobs/Animals/goose.rsi
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: goose
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: goose
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeatChicken
@@ -513,11 +546,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: crawling
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: crawling
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -553,12 +589,15 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: kangaroo
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: kangaroo
# SKIPPY NO!
crit: kangaroo-dead
dead: kangaroo-dead
Critical:
enum.DamageStateVisualLayers.Base: kangaroo-dead
Dead:
enum.DamageStateVisualLayers.Base: kangaroo-dead
- type: Puller
- type: entity
@@ -576,11 +615,14 @@
state: kangaroo-boxing
sprite: Mobs/Animals/kangaroo.rsi
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: kangaroo-boxing
crit: kangaroo-boxing-dead
dead: kangaroo-boxing-dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: kangaroo-boxing
Critical:
enum.DamageStateVisualLayers.Base: kangaroo-boxing-dead
Dead:
enum.DamageStateVisualLayers.Base: kangaroo-boxing-dead
- type: MeleeWeapon
range: 1.5
arcwidth: 0
@@ -626,12 +668,16 @@
- type: Body
template: PrimateTemplate
preset: PrimatePreset
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: monkey
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: monkey
crit: dead
dead: dead
- type: FireVisualizer
sprite: Mobs/Effects/onfire.rsi
normalState: Monkey_burning
@@ -688,11 +734,14 @@
baseWalkSpeed : 5
baseSprintSpeed : 5
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: mouse-0
crit: dead-0
dead: splat-0
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: mouse-0
Critical:
enum.DamageStateVisualLayers.Base: dead-0
Dead:
enum.DamageStateVisualLayers.Base: splat-0
- type: Food
- type: Hunger
baseDecayRate: 0.5 # I'm very hungry! Give me. The cheese.
@@ -762,11 +811,14 @@
- type: Clothing
HeldPrefix: 1
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: mouse-1
crit: dead-1
dead: splat-1
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: mouse-1
Critical:
enum.DamageStateVisualLayers.Base: dead-1
Dead:
enum.DamageStateVisualLayers.Base: splat-1
- type: Bloodstream
bloodMaxVolume: 50
- type: DiseaseCarrier #Why doesn't this save if it's only on the parent wtf
@@ -785,11 +837,14 @@
- type: Clothing
HeldPrefix: 1
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: mouse-2
crit: dead-2
dead: splat-2
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: mouse-1
Critical:
enum.DamageStateVisualLayers.Base: dead-1
Dead:
enum.DamageStateVisualLayers.Base: splat-1
- type: Bloodstream
bloodMaxVolume: 50
- type: DiseaseCarrier
@@ -822,11 +877,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: lizard
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: lizard
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -870,11 +928,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: slug
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: slug
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -913,11 +974,14 @@
layer:
- SmallMobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: frog
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: frog
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -959,11 +1023,14 @@
layer:
- FlyingMobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: parrot
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: parrot
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -1002,11 +1069,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: penguin
crit: penguin_dead
dead: penguin_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: penguin
Critical:
enum.DamageStateVisualLayers.Base: penguin_dead
Dead:
enum.DamageStateVisualLayers.Base: penguin_dead
- type: Butcherable
spawned:
- id: FoodMeatPenguin
@@ -1051,11 +1121,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: penguin
crit: dead
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: penguin
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeatPenguin
@@ -1105,11 +1178,13 @@
- SmallMobMask
layer:
- SmallMobLayer
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: snake
- type: Appearance
visuals:
- type: RotationVisualizer
- type: DamageStateVisualizer
normal: snake
# It's death animation is animated so hopefully this should push for separation between "dying" and "death" states.
# looks stupid, Rotation visualizer for now
# dead: dead
@@ -1154,11 +1229,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: tarantula
crit: tarantula_dead
dead: tarantula_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: tarantula
Critical:
enum.DamageStateVisualLayers.Base: tarantula_dead
Dead:
enum.DamageStateVisualLayers.Base: tarantula_dead
- type: Butcherable
spawned:
- id: FoodMeatSpider
@@ -1218,11 +1296,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: possum
crit: possum_dead # TODO: Make it so possums can "play dead." Probably need AI changes
dead: possum_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: possum
Critical:
enum.DamageStateVisualLayers.Base: possum_dead
Dead:
enum.DamageStateVisualLayers.Base: possum_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -1274,11 +1355,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: raccoon
crit: raccoon_dead
dead: raccoon_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: raccoon
Critical:
enum.DamageStateVisualLayers.Base: raccoon_dead
Dead:
enum.DamageStateVisualLayers.Base: raccoon_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -1330,11 +1414,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: fox
crit: fox_dead
dead: fox_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: fox
Critical:
enum.DamageStateVisualLayers.Base: fox_dead
Dead:
enum.DamageStateVisualLayers.Base: fox_dead
- type: Butcherable
spawned:
- id: FoodMeat

View File

@@ -33,11 +33,14 @@
0: !type:NormalMobState {}
150: !type:DeadMobState {}
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: bear
crit: bear_dead
dead: bear_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: bear
Critical:
enum.DamageStateVisualLayers.Base: bear_dead
Dead:
enum.DamageStateVisualLayers.Base: bear_dead
- type: Butcherable
spawned:
- id: FoodMeatBear

View File

@@ -17,6 +17,11 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: alive
sprite: Mobs/Aliens/Carps/space.rsi
- type: CombatMode
disarmAction:
enabled: false
autoPopulate: false
name: action-name-disarm
- type: Physics
- type: Fixtures
fixtures:
@@ -35,15 +40,17 @@
100: !type:DeadMobState {}
- type: MovementIgnoreGravity
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: alive
crit: crit
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: alive
Critical:
enum.DamageStateVisualLayers.Base: crit
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
# TODO: CrapMeat or FishMeat # - 2022-02-17 LMAO crap meat
spawned:
- id: FoodMeat
- id: FoodMeatFish
amount: 2
- type: MeleeWeapon
range: 1.5
@@ -55,17 +62,6 @@
types:
Piercing: 5
Slash: 10
- type: CombatMode
disarmAction:
enabled: false
autoPopulate: false
name: action-name-disarm
- type: GhostTakeoverAvailable
makeSentient: true
name: space carp
description: |
If you're a salvage spawn, defend the loot inside!
Otherwise, wreak havoc on the station!
- type: ReplacementAccent
accent: genericAggressive
- type: TypingIndicator
@@ -84,8 +80,6 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: alive
sprite: Mobs/Aliens/Carps/magic.rsi
- type: GhostTakeoverAvailable
name: magicarp
- type: TypingIndicator
proto: guardian
@@ -93,7 +87,7 @@
name: holocarp
parent: MobCarp
id: MobCarpHolo
description: Carp made out of holographic energies.
description: Carp made out of holographic energies. Sadly for you, it is very much real.
components:
- type: Sprite
drawdepth: Mobs
@@ -112,8 +106,6 @@
- MobMask
layer:
- Opaque
- type: GhostTakeoverAvailable
name: holocarp
- type: TypingIndicator
proto: robot
@@ -128,3 +120,14 @@
Defend the loot inside the salvage wreck!
- type: SalvageMobRestrictions
- type: entity
name: space carp
id: MobCarpDragon
suffix: DragonBrood
parent: MobCarp
components:
- type: GhostTakeoverAvailable
makeSentient: true
name: Sentient Carp
description: Help the dragon flood the station with carps!

View File

@@ -24,12 +24,15 @@
- MobMask
layer:
- MobLayer
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: corgi
Critical:
enum.DamageStateVisualLayers.Base: corgi_dead
Dead:
enum.DamageStateVisualLayers.Base: corgi_dead
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: corgi
crit: corgi_dead
dead: corgi_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -61,11 +64,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: narsian
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: narsian
crit: narsian_dead
dead: narsian_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: narsian
Critical:
enum.DamageStateVisualLayers.Base: narsian_dead
Dead:
enum.DamageStateVisualLayers.Base: narsian_dead
- type: MeleeWeapon
range: 1.5
arcwidth: 0
@@ -125,11 +131,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: ian
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: ian
crit: ian_dead
dead: ian_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: ian
Critical:
enum.DamageStateVisualLayers.Base: ian_dead
Dead:
enum.DamageStateVisualLayers.Base: ian_dead
- type: Grammar
attributes:
proper: true
@@ -152,11 +161,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: old_ian
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: old_ian
crit: old_ian_dead
dead: old_ian_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: old_ian
Critical:
enum.DamageStateVisualLayers.Base: old_ian_dead
Dead:
enum.DamageStateVisualLayers.Base: old_ian_dead
- type: Grammar
attributes:
proper: true
@@ -175,11 +187,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: lisa
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: lisa
crit: lisa_dead
dead: lisa_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: lisa
Critical:
enum.DamageStateVisualLayers.Base: lisa_dead
Dead:
enum.DamageStateVisualLayers.Base: lisa_dead
- type: Grammar
attributes:
proper: true
@@ -198,11 +213,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: puppy
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: puppy
crit: puppy_dead
dead: puppy_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: puppy
Critical:
enum.DamageStateVisualLayers.Base: puppy_dead
Dead:
enum.DamageStateVisualLayers.Base: puppy_dead
- type: Grammar
attributes:
gender: epicene
@@ -231,11 +249,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: cat
crit: cat_dead
dead: cat_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: cat
Critical:
enum.DamageStateVisualLayers.Base: cat_dead
Dead:
enum.DamageStateVisualLayers.Base: cat_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -275,11 +296,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: cat2
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: cat2
crit: cat2_dead
dead: cat2_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: cat2
Critical:
enum.DamageStateVisualLayers.Base: cat2_dead
Dead:
enum.DamageStateVisualLayers.Base: cat2_dead
- type: Grammar
attributes:
gender: epicene
@@ -307,11 +331,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: spacecat
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: spacecat
crit: spacecat_dead
dead: spacecat_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: spacecat
Critical:
enum.DamageStateVisualLayers.Base: spacecat_dead
Dead:
enum.DamageStateVisualLayers.Base: spacecat_dead
- type: InteractionPopup
successChance: 0.7
interactSuccessString: petting-success-space-cat
@@ -335,11 +362,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: caracal_flop
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: caracal_flop
crit: caracal_dead
dead: caracal_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: caracal_flop
Critical:
enum.DamageStateVisualLayers.Base: caracal_dead
Dead:
enum.DamageStateVisualLayers.Base: caracal_dead
- type: Grammar
attributes:
gender: epicene
@@ -381,11 +411,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: sloth
crit: sloth_dead
dead: sloth_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: sloth
Critical:
enum.DamageStateVisualLayers.Base: sloth_dead
Dead:
enum.DamageStateVisualLayers.Base: sloth_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -424,11 +457,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: ferret
crit: ferret_dead
dead: ferret_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: ferret
Critical:
enum.DamageStateVisualLayers.Base: ferret_dead
Dead:
enum.DamageStateVisualLayers.Base: ferret_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -478,11 +514,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: bingus
crit: bingus_dead
dead: bingus_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: bingus
Critical:
enum.DamageStateVisualLayers.Base: bingus_dead
Dead:
enum.DamageStateVisualLayers.Base: bingus_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -521,11 +560,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: mcgriff
crit: mcgriff_dead
dead: mcgriff_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: mcgriff
Critical:
enum.DamageStateVisualLayers.Base: mcgriff_dead
Dead:
enum.DamageStateVisualLayers.Base: mcgriff_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -556,11 +598,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: paperwork
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: paperwork
crit: paperwork_dead
dead: paperwork_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: paperwork
Critical:
enum.DamageStateVisualLayers.Base: paperwork_dead
Dead:
enum.DamageStateVisualLayers.Base: paperwork_dead
- type: Butcherable
spawned:
- id: FoodMeat
@@ -598,11 +643,14 @@
layer:
- MobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: walter
crit: walter_dead
dead: walter_dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: walter
Critical:
enum.DamageStateVisualLayers.Base: walter_dead
Dead:
enum.DamageStateVisualLayers.Base: walter_dead
- type: Butcherable
spawned:
- id: FoodMeat

View File

@@ -51,12 +51,15 @@
Slash: 12
Piercing: 8
- type: Appearance
visuals:
- type: DamageStateVisualizer
- type: DamageStateVisuals
rotate: true
normal: regalrat
crit: dead
dead: dead
states:
Alive:
enum.DamageStateVisualLayers.Base: regalrat
Critical:
enum.DamageStateVisualLayers.Base: dead
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Puller
- type: GhostTakeoverAvailable
makeSentient: true
@@ -158,12 +161,15 @@
Slash: 5
Piercing: 2
- type: Appearance
visuals:
- type: DamageStateVisualizer
- type: DamageStateVisuals
rotate: true
normal: mouse-3
crit: dead-3
dead: splat-3
states:
Alive:
enum.DamageStateVisualLayers.Base: mouse-3
Critical:
enum.DamageStateVisualLayers.Base: dead-3
Dead:
enum.DamageStateVisualLayers.Base: splat-3
- type: Puller
- type: DiseaseCarrier
carrierDiseases:

View File

@@ -38,10 +38,12 @@
15: !type:DeadMobState {}
- type: MovementIgnoreGravity
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: alive
dead: dead
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: alive
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Butcherable
spawned:
- id: FoodMeatXeno

View File

@@ -60,12 +60,15 @@
groups:
Brute: 20
- type: Appearance
visuals:
- type: DamageStateVisualizer
- type: DamageStateVisuals
rotate: true
normal: running
crit: crit
dead: dead
states:
Alive:
enum.DamageStateVisualLayers.Base: running
Critical:
enum.DamageStateVisualLayers.Base: crit
Dead:
enum.DamageStateVisualLayers.Base: dead
- type: Puller
- type: Butcherable
butcheringType: Spike
@@ -105,11 +108,14 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: purple_snake
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: purple_snake
crit: dead_purple_snake
dead: dead_purple_snake
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: purple_snake
Critical:
enum.DamageStateVisualLayers.Base: dead_purple_snake
Dead:
enum.DamageStateVisualLayers.Base: dead_purple_snake
- type: Grammar
attributes:
proper: true
@@ -156,10 +162,13 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: small_purple_snake
- type: Appearance
visuals:
- type: DamageStateVisualizer
normal: purple_snake
crit: dead_small_purple_snake
dead: dead_small_purple_snake
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: small_purple_snake
Critical:
enum.DamageStateVisualLayers.Base: dead_small_purple_snake
Dead:
enum.DamageStateVisualLayers.Base: dead_small_purple_snake
- type: SolutionTransfer
maxTransferAmount: 1

View File

@@ -0,0 +1,103 @@
- type: entity
name: space dragon
parent: SimpleSpaceMobBase
id: MobDragon
suffix:
description: A flying leviathan, loosely related to space carps.
components:
- type: GhostTakeoverAvailable
makeSentient: true
name: Space dragon!
description: Crash, roast, flood the station with carps!
- type: Speech
- type: CombatMode
disarmAction:
enabled: false
autoPopulate: false
name: action-name-disarm
- type: PlayerMobMover
- type: PlayerInputMover
- type: MovementSpeedModifier
baseWalkSpeed : 5
baseSprintSpeed : 5
- type: Sprite
sprite: Mobs/Aliens/Carps/dragon.rsi
noRot: true
# TODO: Randomise colors when RandomSpriteColor isn't poopoo
layers:
- map: [ "enum.DamageStateVisualLayers.Base" ]
state: alive
- map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ]
state: alive-unshaded
shader: unshaded
- type: Appearance
- type: DamageStateVisuals
states:
Alive:
enum.DamageStateVisualLayers.Base: alive
enum.DamageStateVisualLayers.BaseUnshaded: alive-unshaded
Critical:
enum.DamageStateVisualLayers.Base: crit
Dead:
enum.DamageStateVisualLayers.Base: dead
enum.DamageStateVisualLayers.BaseUnshaded: dead-unshaded
- type: Physics
bodyType: KinematicController
- type: Fixtures
fixtures:
- shape:
!type:PhysShapeCircle
radius: 0.40
mass: 50
mask:
- FlyingMobMask
layer:
- FlyingMobLayer
- type: MobState
thresholds:
0: !type:NormalMobState {}
450: !type:CriticalMobState {}
500: !type:DeadMobState {}
- type: Metabolizer
solutionOnBody: false
updateFrequency: 0.25
metabolizerTypes: [Dragon]
groups:
- id: Medicine
- id: Poison
- type: MovementIgnoreGravity
- type: NoSlip
- type: Butcherable
spawned:
- id: FoodMeatDragon
amount: 2
- type: MeleeWeapon
hitSound:
path: /Audio/Effects/bite.ogg
damage:
types:
Piercing: 15
Slash: 15
- type: Dragon
spawnsLeft: 2
spawnsProto: MobCarpDragon
devourAction:
event: !type:DragonDevourActionEvent
icon: Interface/Actions/devour.png
name: action-name-devour
description: action-description-devour
devourChemical: Ichor
devourHealRate: 15.0
whitelist:
components:
- MobState
- Door
tags:
- Wall
spawnAction:
event: !type:DragonSpawnActionEvent
icon: Interface/Actions/carpbirth.png
name: action-name-carp-birth
description: action-description-carp-birth
useDelay: 5

View File

@@ -215,9 +215,10 @@
layer:
- LargeMobLayer
- type: Appearance
visuals:
- type: DamageStateVisualizer
rotate: true
normal: onestar_boss
dead: onestar_boss_wrecked
states:
Alive:
enum.DamageStateVisualLayers.Base: onestar_boss
Dead:
enum.DamageStateVisualLayers.Base: onestar_boss_wrecked
- type: CombatMode

View File

@@ -177,7 +177,7 @@
reagents:
- ReagentId: Nutriment
Quantity: 6
- ReagentId: CapsaicinOil
- ReagentId: CarpoToxin
Quantity: 3
# Tastes like fish, batter, hot peppers.
@@ -367,6 +367,25 @@
state: queso
# Its queso! Everyone loves queso... Right?.
- type: entity
name: Sashimi
parent: FoodMealBase
id: FoodMealSashimi
description: It's taste can only be described as "Exotic". The poisoning though? That's pretty common.
components:
- type: Sprite
state: sashimi
- type: SolutionContainerManager
solutions:
food:
maxVol: 18
reagents:
- ReagentId: Nutriment
Quantity: 6
- ReagentId: CarpoToxin
Quantity: 15
# tastes exotic
- type: entity
name: enchiladas
parent: FoodMealBase

View File

@@ -48,11 +48,35 @@
food:
reagents:
- ReagentId: Toxin
Quantity: 1
Quantity: 5
- type: SliceableFood
count: 3
slice: FoodMeatCutlet
- type: entity
name: raw carp fillet
parent: FoodMeatBase
# MeatFish?...
id: FoodMeatFish
description: Your last words being "Wow, exotic!" are not worth it. The taste itself though? Maybe.
components:
- type: Tag
tags:
- Raw
- type: Sprite
state: fish
- type: SolutionContainerManager
solutions:
food:
reagents:
- ReagentId: CarpoToxin
Quantity: 5
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CarpoToxin
Quantity: 5
- type: entity
name: raw bacon
parent: FoodMeatBase
@@ -216,6 +240,32 @@
- ReagentId: Toxin
Quantity: 5
- type: entity
name: dragon flesh
parent: FoodMeatBase
id: FoodMeatDragon
description: The dense meat of the space-era apex predator is oozing with it's mythical ichor. Ironically, best eaten raw.
components:
- type: Tag
tags:
- Raw
- type: Sprite
layers:
- state: dragon
- state: dragon_veins
shader: unshaded
- type: SolutionContainerManager
solutions:
food:
reagents:
- ReagentId: Ichor
Quantity: 2
- type: Extractable
juiceSolution:
reagents:
- ReagentId: Ichor
Quantity: 2
- type: entity
name: raw lizard meat
parent: FoodMeatBase

View File

@@ -2,6 +2,7 @@
name: trash bag
id: TrashBag
parent: BaseStorageItem
description: The solution to space pollution. Rubbish removal revolution.
components:
- type: Sprite
netSync: false

View File

@@ -8,6 +8,9 @@
alarmedBy:
- FireAlarm
- AirAlarm
- type: Tag
tags:
- RCDDeconstructWhitelist
- type: ApcPowerReceiver
- type: ExtensionCableReceiver
- type: DeviceNetwork

View File

@@ -97,7 +97,6 @@
- type: Tag
tags:
- Wall
- RCDDeconstructWhitelist
- type: Sprite
sprite: Structures/Walls/cult.rsi
- type: Icon
@@ -336,6 +335,9 @@
id: WallReinforced
name: reinforced wall
components:
- type: Tag
tags:
- Wall
- type: Sprite
sprite: Structures/Walls/solid.rsi
- type: Icon

View File

@@ -28,3 +28,31 @@
effects:
- !type:SatiateHunger
factor: 1.5
- type: reagent
id: Ichor
name: Ichor
group: Biological
desc: An extremely potent regenerative chemical, perfected by space fauna evolution. Produced in the dragon's digestive system, it is seen as an exotic commodity due to the gargantuan effort of hunting for it.
physicalDesc: roaring
color: "#f4692e"
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1.5
# Dragon doesn't require airloss healing, so omnizine is still best for humans.
Medicine:
effects:
- !type:HealthChange
damage:
groups:
Burn: -5
Brute: -5
Toxin: -2
types:
Bloodloss: -5
# Just in case you REALLY want to water your plants
plantMetabolism:
- !type:PlantAdjustWater
amount: 0.5

View File

@@ -17,6 +17,14 @@
type: Local
messages: [ "carpetium-effect-blood-fibrous", "carpetium-effect-jumpsuit-insides" ]
probability: 0.1
# Hail the madman logic, if it has CARP, means it helps against CARPs
- !type:AdjustReagent
conditions:
- !type:ReagentThreshold
reagent: CarpoToxin
min: 1
reagent: CarpoToxin
amount: -3
- type: reagent
id: Fiber

View File

@@ -539,6 +539,7 @@
- !type:SatiateHunger
factor: -1
# Should heal quite literally everything, use in very small amounts
- type: reagent
id: Omnizine
name: reagent-name-omnizine
@@ -598,3 +599,4 @@
min: 1
reagent: Ultravasculine
amount: 0.5

View File

@@ -18,6 +18,30 @@
types:
Poison: 2
- type: reagent
id: CarpoToxin
name: Carpotoxin
group: Toxins
desc: Toxic secretions of a space carp. Causes a painful burning sensation.
color: "#e2a38c"
physicalDesc: exotic-smelling
plantMetabolism:
- !type:PlantAdjustToxins
amount: 10
- !type:PlantAdjustHealth
amount: -5
metabolisms:
Poison:
effects:
- !type:HealthChange
damage:
types:
Poison: 4
- !type:PopupMessage
type: Local
messages: [ "generic-reagent-effect-burning-insides" ]
probability: 0.33
- type: reagent
id: PolytrinicAcid
name: reagent-name-polytrinic-acid
@@ -164,7 +188,7 @@
- !type:HealthChange
damage:
types:
Asphyxiation: 4
Asphyxiation: 2
plantMetabolism:
- !type:PlantAdjustToxins
amount: 10
@@ -215,7 +239,7 @@
- !type:HealthChange
conditions:
- !type:ReagentThreshold
min: 30
min: 45
damage:
groups:
Brute: 2
@@ -228,7 +252,7 @@
- !type:PopupMessage
conditions:
- !type:ReagentThreshold
min: 30
min: 45
type: Local
messages: [ "histamine-effect-heavy-itchiness" ]
probability: 0.2

View File

@@ -392,6 +392,28 @@
# solids:
# FoodMeat: 1
- type: microwaveMealRecipe
id: RecipeCubanCarp
name: cuban carp recipe
result: FoodMealCubancarp
time: 15
solids:
FoodDough: 1
FoodCheeseSlice: 2
FoodChili: 1
FoodMeatFish: 2
- type: microwaveMealRecipe
id: RecipeSashimi
name: sashimi recipe
result: FoodMealCubancarp
time: 15
reagents:
TableSalt: 1
solids:
FoodMeatFish: 2
- type: microwaveMealRecipe
id: RecipeMisoColaSoup
name: salty sweet milocola soup recipe

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

View File

@@ -25,6 +25,9 @@
{
"name": "manifest"
},
{
"name": "devour"
}
{
"name": "ratKingArmy"
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,80 @@
{
"version": 1,
"size": {
"x": 64,
"y": 64
},
"license": "CC-BY-SA-3.0",
"copyright": "Taken from /tg/station at https://github.com/Toastgoats/tgstation/commit/024a840eed2a1be3f72435c2bb39faac8025f822",
"states": [
{
"name": "alive",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2
]
]
},
{
"name": "alive-unshaded",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2
]
]
},
{
"name": "crit"
},
{
"name": "dead"
},
{
"name": "dead-unshaded"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

View File

@@ -170,6 +170,12 @@
},
{
"name": "xeno"
},
{
"name": "dragon"
},
{
"name": "dragon_veins"
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 173 B