Emaggable vendors + Familiars for Chaplain (#6961)
This commit is contained in:
@@ -18,6 +18,7 @@ namespace Content.Client.Entry
|
|||||||
"Explosive",
|
"Explosive",
|
||||||
"ExplosionResistance",
|
"ExplosionResistance",
|
||||||
"Vocal",
|
"Vocal",
|
||||||
|
"Summonable",
|
||||||
"OnUseTimerTrigger",
|
"OnUseTimerTrigger",
|
||||||
"WarpPoint",
|
"WarpPoint",
|
||||||
"EmitSoundOnUse",
|
"EmitSoundOnUse",
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ using Content.Shared.Interaction;
|
|||||||
using Content.Shared.Inventory;
|
using Content.Shared.Inventory;
|
||||||
using Content.Shared.MobState.Components;
|
using Content.Shared.MobState.Components;
|
||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
|
using Content.Shared.Verbs;
|
||||||
|
using Content.Shared.Tag;
|
||||||
|
using Content.Shared.ActionBlocker;
|
||||||
using Content.Server.Cooldown;
|
using Content.Server.Cooldown;
|
||||||
using Content.Server.Bible.Components;
|
using Content.Server.Bible.Components;
|
||||||
using Content.Server.Popups;
|
using Content.Server.Popups;
|
||||||
@@ -20,12 +23,15 @@ namespace Content.Server.Bible
|
|||||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||||
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
||||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||||
|
[Dependency] private readonly TagSystem _tagSystem = default!;
|
||||||
|
[Dependency] private readonly ActionBlockerSystem _blocker = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
SubscribeLocalEvent<BibleComponent, AfterInteractEvent>(OnAfterInteract);
|
SubscribeLocalEvent<BibleComponent, AfterInteractEvent>(OnAfterInteract);
|
||||||
|
SubscribeLocalEvent<SummonableComponent, GetVerbsEvent<AlternativeVerb>>(AddSummonVerb);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnAfterInteract(EntityUid uid, BibleComponent component, AfterInteractEvent args)
|
private void OnAfterInteract(EntityUid uid, BibleComponent component, AfterInteractEvent args)
|
||||||
@@ -52,20 +58,20 @@ namespace Content.Server.Bible
|
|||||||
{
|
{
|
||||||
_popupSystem.PopupEntity(Loc.GetString("bible-sizzle"), args.User, Filter.Entities(args.User));
|
_popupSystem.PopupEntity(Loc.GetString("bible-sizzle"), args.User, Filter.Entities(args.User));
|
||||||
|
|
||||||
SoundSystem.Play(Filter.Pvs(args.User), "/Audio/Effects/lightburn.ogg", args.User);
|
SoundSystem.Play(Filter.Pvs(args.User), component.SizzleSoundPath.GetSound(), args.User);
|
||||||
_damageableSystem.TryChangeDamage(args.User, component.DamageOnUntrainedUse, true);
|
_damageableSystem.TryChangeDamage(args.User, component.DamageOnUntrainedUse, true);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_invSystem.TryGetSlotEntity(args.Target.Value, "head", out var entityUid))
|
if (!_invSystem.TryGetSlotEntity(args.Target.Value, "head", out var entityUid) && !_tagSystem.HasTag(args.Target.Value, "Familiar"))
|
||||||
{
|
{
|
||||||
if (_random.Prob(component.FailChance))
|
if (_random.Prob(component.FailChance))
|
||||||
{
|
{
|
||||||
var othersFailMessage = Loc.GetString("bible-heal-fail-others", ("user", args.User),("target", args.Target),("bible", uid));
|
var othersFailMessage = Loc.GetString(component.LocPrefix + "-heal-fail-others", ("user", args.User),("target", args.Target),("bible", uid));
|
||||||
_popupSystem.PopupEntity(othersFailMessage, args.User, Filter.Pvs(args.User).RemoveWhereAttachedEntity(puid => puid == args.User));
|
_popupSystem.PopupEntity(othersFailMessage, args.User, Filter.Pvs(args.User).RemoveWhereAttachedEntity(puid => puid == args.User));
|
||||||
|
|
||||||
var selfFailMessage = Loc.GetString("bible-heal-fail-self", ("target", args.Target),("bible", uid));
|
var selfFailMessage = Loc.GetString(component.LocPrefix + "-heal-fail-self", ("target", args.Target),("bible", uid));
|
||||||
_popupSystem.PopupEntity(selfFailMessage, args.User, Filter.Entities(args.User));
|
_popupSystem.PopupEntity(selfFailMessage, args.User, Filter.Entities(args.User));
|
||||||
|
|
||||||
SoundSystem.Play(Filter.Pvs(args.Target.Value), "/Audio/Effects/hit_kick.ogg", args.User);
|
SoundSystem.Play(Filter.Pvs(args.Target.Value), "/Audio/Effects/hit_kick.ogg", args.User);
|
||||||
@@ -74,15 +80,52 @@ namespace Content.Server.Bible
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var othersMessage = Loc.GetString("bible-heal-success-others", ("user", args.User),("target", args.Target),("bible", uid));
|
var othersMessage = Loc.GetString(component.LocPrefix + "-heal-success-others", ("user", args.User),("target", args.Target),("bible", uid));
|
||||||
_popupSystem.PopupEntity(othersMessage, args.User, Filter.Pvs(args.User).RemoveWhereAttachedEntity(puid => puid == args.User));
|
_popupSystem.PopupEntity(othersMessage, args.User, Filter.Pvs(args.User).RemoveWhereAttachedEntity(puid => puid == args.User));
|
||||||
|
|
||||||
var selfMessage = Loc.GetString("bible-heal-success-self", ("target", args.Target),("bible", uid));
|
var selfMessage = Loc.GetString(component.LocPrefix + "-heal-success-self", ("target", args.Target),("bible", uid));
|
||||||
_popupSystem.PopupEntity(selfMessage, args.User, Filter.Entities(args.User));
|
_popupSystem.PopupEntity(selfMessage, args.User, Filter.Entities(args.User));
|
||||||
|
|
||||||
SoundSystem.Play(Filter.Pvs(args.Target.Value), "/Audio/Effects/holy.ogg", args.User);
|
SoundSystem.Play(Filter.Pvs(args.Target.Value), component.HealSoundPath.GetSound(), args.User);
|
||||||
_damageableSystem.TryChangeDamage(args.Target.Value, component.Damage, true);
|
_damageableSystem.TryChangeDamage(args.Target.Value, component.Damage, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddSummonVerb(EntityUid uid, SummonableComponent component, GetVerbsEvent<AlternativeVerb> args)
|
||||||
|
{
|
||||||
|
if (!args.CanInteract || !args.CanAccess || component.AlreadySummoned || component.SpecialItemPrototype == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (component.RequiresBibleUser && !HasComp<BibleUserComponent>(args.User))
|
||||||
|
return;
|
||||||
|
|
||||||
|
AlternativeVerb verb = new()
|
||||||
|
{
|
||||||
|
Act = () =>
|
||||||
|
{
|
||||||
|
TransformComponent? position = Comp<TransformComponent>(args.User);
|
||||||
|
AttemptSummon(component, args.User, position);
|
||||||
|
},
|
||||||
|
Text = Loc.GetString("bible-summon-verb"),
|
||||||
|
Priority = 2
|
||||||
|
};
|
||||||
|
args.Verbs.Add(verb);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AttemptSummon(SummonableComponent component, EntityUid user, TransformComponent? position)
|
||||||
|
{
|
||||||
|
if (component.AlreadySummoned || component.SpecialItemPrototype == null)
|
||||||
|
return;
|
||||||
|
if (component.RequiresBibleUser && !HasComp<BibleUserComponent>(user))
|
||||||
|
return;
|
||||||
|
if (!Resolve(user, ref position))
|
||||||
|
return;
|
||||||
|
if (component.Deleted || Deleted(component.Owner))
|
||||||
|
return;
|
||||||
|
if (!_blocker.CanInteract(user, component.Owner))
|
||||||
|
return;
|
||||||
|
|
||||||
|
EntityManager.SpawnEntity(component.SpecialItemPrototype, position.Coordinates);
|
||||||
|
component.AlreadySummoned = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,13 @@
|
|||||||
using System;
|
|
||||||
using Robust.Shared.Analyzers;
|
|
||||||
using Robust.Shared.GameObjects;
|
|
||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Damage.Prototypes;
|
using Content.Shared.Sound;
|
||||||
using Robust.Shared.Serialization.Manager.Attributes;
|
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||||
using Robust.Shared.ViewVariables;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Server.Bible.Components
|
namespace Content.Server.Bible.Components
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
public sealed class BibleComponent : Component
|
public sealed class BibleComponent : Component
|
||||||
{
|
{
|
||||||
|
|
||||||
// Damage that will be healed on a success
|
// Damage that will be healed on a success
|
||||||
[DataField("damage", required: true)]
|
[DataField("damage", required: true)]
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
@@ -33,6 +28,15 @@ namespace Content.Server.Bible.Components
|
|||||||
|
|
||||||
public TimeSpan LastAttackTime;
|
public TimeSpan LastAttackTime;
|
||||||
public TimeSpan CooldownEnd;
|
public TimeSpan CooldownEnd;
|
||||||
|
[DataField("cooldownTime")]
|
||||||
public float CooldownTime { get; } = 5f;
|
public float CooldownTime { get; } = 5f;
|
||||||
|
|
||||||
|
[DataField("sizzleSound")]
|
||||||
|
public SoundSpecifier SizzleSoundPath = new SoundPathSpecifier("/Audio/Effects/lightburn.ogg");
|
||||||
|
[DataField("healSound")]
|
||||||
|
public SoundSpecifier HealSoundPath = new SoundPathSpecifier("/Audio/Effects/holy.ogg");
|
||||||
|
|
||||||
|
[DataField("locPrefix")]
|
||||||
|
public string LocPrefix = "bible";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
23
Content.Server/Bible/Components/SummonableComponent.cs
Normal file
23
Content.Server/Bible/Components/SummonableComponent.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Server.Bible.Components
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This lets you summon a mob or item with an alternative verb on the item
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed class SummonableComponent : Component
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Used for a special item only the Chaplain can summon. Usually a mob, but supports regular items too.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("specialItem", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||||
|
public string? SpecialItemPrototype = null;
|
||||||
|
public bool AlreadySummoned = false;
|
||||||
|
|
||||||
|
[DataField("requriesBibleUser")]
|
||||||
|
public bool RequiresBibleUser = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ using Robust.Shared.Serialization.Manager.Attributes;
|
|||||||
using Robust.Shared.ViewVariables;
|
using Robust.Shared.ViewVariables;
|
||||||
using Content.Server.VendingMachines.systems;
|
using Content.Server.VendingMachines.systems;
|
||||||
using static Content.Shared.Wires.SharedWiresComponent;
|
using static Content.Shared.Wires.SharedWiresComponent;
|
||||||
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||||
|
|
||||||
namespace Content.Server.VendingMachines
|
namespace Content.Server.VendingMachines
|
||||||
{
|
{
|
||||||
@@ -16,9 +17,10 @@ namespace Content.Server.VendingMachines
|
|||||||
public sealed class VendingMachineComponent : SharedVendingMachineComponent, IWires
|
public sealed class VendingMachineComponent : SharedVendingMachineComponent, IWires
|
||||||
{
|
{
|
||||||
public bool Ejecting;
|
public bool Ejecting;
|
||||||
|
public bool Emagged = false;
|
||||||
public TimeSpan AnimationDuration = TimeSpan.Zero;
|
public TimeSpan AnimationDuration = TimeSpan.Zero;
|
||||||
[DataField("pack")]
|
[ViewVariables] [DataField("pack", customTypeSerializer:typeof(PrototypeIdSerializer<VendingMachineInventoryPrototype>))] public string PackPrototypeId = string.Empty;
|
||||||
public string PackPrototypeId = string.Empty;
|
[ViewVariables] [DataField("emagPack", customTypeSerializer:typeof(PrototypeIdSerializer<VendingMachineInventoryPrototype>))] public string EmagPackPrototypeId = string.Empty;
|
||||||
public string SpriteName = "";
|
public string SpriteName = "";
|
||||||
public bool Broken;
|
public bool Broken;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using Robust.Server.GameObjects;
|
|||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
using Content.Shared.Acts;
|
using Content.Shared.Acts;
|
||||||
|
using Content.Shared.Emag.Systems;
|
||||||
using static Content.Shared.VendingMachines.SharedVendingMachineComponent;
|
using static Content.Shared.VendingMachines.SharedVendingMachineComponent;
|
||||||
using Content.Shared.Throwing;
|
using Content.Shared.Throwing;
|
||||||
|
|
||||||
@@ -31,6 +32,7 @@ namespace Content.Server.VendingMachines.systems
|
|||||||
SubscribeLocalEvent<VendingMachineComponent, InventorySyncRequestMessage>(OnInventoryRequestMessage);
|
SubscribeLocalEvent<VendingMachineComponent, InventorySyncRequestMessage>(OnInventoryRequestMessage);
|
||||||
SubscribeLocalEvent<VendingMachineComponent, VendingMachineEjectMessage>(OnInventoryEjectMessage);
|
SubscribeLocalEvent<VendingMachineComponent, VendingMachineEjectMessage>(OnInventoryEjectMessage);
|
||||||
SubscribeLocalEvent<VendingMachineComponent, BreakageEventArgs>(OnBreak);
|
SubscribeLocalEvent<VendingMachineComponent, BreakageEventArgs>(OnBreak);
|
||||||
|
SubscribeLocalEvent<VendingMachineComponent, GotEmaggedEvent>(OnEmagged);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args)
|
private void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args)
|
||||||
@@ -75,6 +77,16 @@ namespace Content.Server.VendingMachines.systems
|
|||||||
TryUpdateVisualState(uid, VendingMachineVisualState.Broken, vendComponent);
|
TryUpdateVisualState(uid, VendingMachineVisualState.Broken, vendComponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnEmagged(EntityUid uid, VendingMachineComponent component, GotEmaggedEvent args)
|
||||||
|
{
|
||||||
|
if (component.Emagged || component.EmagPackPrototypeId == string.Empty)
|
||||||
|
return;
|
||||||
|
|
||||||
|
AddVendEntries(component, component.EmagPackPrototypeId);
|
||||||
|
component.Emagged = true;
|
||||||
|
args.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsPowered(EntityUid uid, VendingMachineComponent? vendComponent = null)
|
public bool IsPowered(EntityUid uid, VendingMachineComponent? vendComponent = null)
|
||||||
{
|
{
|
||||||
if (!Resolve(uid, ref vendComponent))
|
if (!Resolve(uid, ref vendComponent))
|
||||||
@@ -121,6 +133,27 @@ namespace Content.Server.VendingMachines.systems
|
|||||||
vendComponent.Inventory = inventory;
|
vendComponent.Inventory = inventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add more entries for any reason AFTER initialization (emag, machine upgrades, etc)
|
||||||
|
/// </summary>
|
||||||
|
public void AddVendEntries(VendingMachineComponent component, string pack)
|
||||||
|
{
|
||||||
|
if (!_prototypeManager.TryIndex(pack, out VendingMachineInventoryPrototype? packPrototype))
|
||||||
|
{
|
||||||
|
Logger.Error($"Pack has no valid inventory prototype: {pack}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var (id, amount) in packPrototype.StartingInventory)
|
||||||
|
{
|
||||||
|
if (!_prototypeManager.TryIndex(id, out EntityPrototype? prototype))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
component.Inventory.Add(new VendingMachineInventoryEntry(id, amount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Deny(EntityUid uid, VendingMachineComponent? vendComponent = null)
|
public void Deny(EntityUid uid, VendingMachineComponent? vendComponent = null)
|
||||||
{
|
{
|
||||||
if (!Resolve(uid, ref vendComponent))
|
if (!Resolve(uid, ref vendComponent))
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
bible-heal-success-self = You hit {THE($target)} with {THE($bible)}, and their wounds close in a flash of holy light!
|
bible-heal-success-self = You hit {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} wounds close in a flash of holy light!
|
||||||
bible-heal-success-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and their wounds close in a flash of holy light!
|
bible-heal-success-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} wounds close in a flash of holy light!
|
||||||
bible-heal-fail-self = You hit {THE($target)} with {THE($bible)}, and it lands with a sad thwack, dazing them!
|
bible-heal-fail-self = You hit {THE($target)} with {THE($bible)}, and it lands with a sad thwack, dazing {OBJECT($target)}!
|
||||||
bible-heal-fail-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and it lands with a sad thack, dazing them!
|
bible-heal-fail-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and it lands with a sad thack, dazing {OBJECT($target)}!
|
||||||
bible-sizzle = The book sizzles in your hands!
|
bible-sizzle = The book sizzles in your hands!
|
||||||
|
bible-summon-verb = Summon familiar
|
||||||
|
necro-heal-success-self = You hit {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} flesh warps as it melts!
|
||||||
|
necro-heal-success-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} flesh warps as it melts!
|
||||||
|
necro-heal-fail-self = You hit {THE($target)} with {THE($bible)}, and it lands with a sad thwack, failing to smite {OBJECT($target)}.
|
||||||
|
necro-heal-fail-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and it lands with a sad thack, failing to smite {OBJECT($target)}.
|
||||||
|
|||||||
@@ -7,16 +7,25 @@
|
|||||||
ClothingUniformJumpskirtChaplain: 2
|
ClothingUniformJumpskirtChaplain: 2
|
||||||
ClothingOuterHoodieChaplain: 1
|
ClothingOuterHoodieChaplain: 1
|
||||||
ClothingOuterHoodieBlack: 1
|
ClothingOuterHoodieBlack: 1
|
||||||
ClothingOuterRobesCult: 1
|
|
||||||
ClothingOuterArmorCult: 1
|
|
||||||
ClothingHeadHatHoodChaplainHood: 1
|
ClothingHeadHatHoodChaplainHood: 1
|
||||||
ClothingHeadHatHoodCulthood: 1
|
|
||||||
ClothingHeadHatHoodNunHood: 1
|
ClothingHeadHatHoodNunHood: 1
|
||||||
ClothingHeadHatFez: 1
|
ClothingHeadHatFez: 1
|
||||||
ClothingHeadHatPlaguedoctor: 1
|
ClothingHeadHatPlaguedoctor: 1
|
||||||
ClothingHeadHatWitch: 1
|
ClothingHeadHatWitch: 1
|
||||||
ClothingHeadHatWitch1: 1
|
ClothingHeadHatWitch1: 1
|
||||||
ClothingHeadHelmetCult: 1
|
|
||||||
ClothingHeadsetService: 2
|
|
||||||
ClothingOuterPlagueSuit: 1
|
ClothingOuterPlagueSuit: 1
|
||||||
ClothingMaskPlague: 1
|
ClothingMaskPlague: 1
|
||||||
|
ClothingHeadsetService: 2
|
||||||
|
|
||||||
|
- type: vendingMachineInventory
|
||||||
|
id: PietyVendEmagInventory
|
||||||
|
spriteName: chapel
|
||||||
|
startingInventory:
|
||||||
|
ClothingOuterArmorCult: 1
|
||||||
|
ClothingHeadHelmetCult: 1
|
||||||
|
ClothingOuterRobesCult: 3
|
||||||
|
ClothingHeadHatHoodCulthood: 3
|
||||||
|
ClothingShoesCult: 4
|
||||||
|
BedsheetCult: 4
|
||||||
|
BibleNecronomicon: 1
|
||||||
|
|
||||||
|
|||||||
@@ -83,6 +83,18 @@
|
|||||||
Cold: 1.5
|
Cold: 1.5
|
||||||
Poison: 0.8
|
Poison: 0.8
|
||||||
|
|
||||||
|
- type: damageModifierSet
|
||||||
|
id: Infernal
|
||||||
|
coefficients:
|
||||||
|
Blunt: 0.8
|
||||||
|
Slash: 0.8
|
||||||
|
Piercing: 0.8
|
||||||
|
Cold: 0.8
|
||||||
|
Heat: 0.2
|
||||||
|
# Holy: 3 If we ever get some holy or magic sort of damage type they should be vulnerable
|
||||||
|
flatReductions:
|
||||||
|
Heat: 3
|
||||||
|
|
||||||
- type: damageModifierSet
|
- type: damageModifierSet
|
||||||
id: Scale # Skin tougher, bones weaker, strong stomachs, cold-blooded (kindof)
|
id: Scale # Skin tougher, bones weaker, strong stomachs, cold-blooded (kindof)
|
||||||
coefficients:
|
coefficients:
|
||||||
|
|||||||
@@ -41,6 +41,13 @@
|
|||||||
- type: Clothing
|
- type: Clothing
|
||||||
sprite: Clothing/Head/Helmets/cult.rsi
|
sprite: Clothing/Head/Helmets/cult.rsi
|
||||||
- type: IngestionBlocker
|
- type: IngestionBlocker
|
||||||
|
- type: Armor
|
||||||
|
modifiers:
|
||||||
|
coefficients:
|
||||||
|
Blunt: 0.8
|
||||||
|
Slash: 0.8
|
||||||
|
Piercing: 0.9
|
||||||
|
Heat: 0.8
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: ClothingHeadEVAHelmetBase
|
parent: ClothingHeadEVAHelmetBase
|
||||||
@@ -248,4 +255,3 @@
|
|||||||
Slash: 0.5
|
Slash: 0.5
|
||||||
Piercing: 0.5
|
Piercing: 0.5
|
||||||
Heat: 0.9
|
Heat: 0.9
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,8 @@
|
|||||||
flavorKind: organic
|
flavorKind: organic
|
||||||
- type: Bloodstream
|
- type: Bloodstream
|
||||||
bloodMaxVolume: 50
|
bloodMaxVolume: 50
|
||||||
|
- type: ReplacementAccent
|
||||||
|
accent: mouse
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: bee
|
name: bee
|
||||||
|
|||||||
@@ -88,6 +88,72 @@
|
|||||||
- type: Grammar
|
- type: Grammar
|
||||||
attributes:
|
attributes:
|
||||||
gender: epicene
|
gender: epicene
|
||||||
|
- type: Bloodstream
|
||||||
|
bloodReagent: DemonsBlood
|
||||||
|
bloodlossDamage:
|
||||||
|
types:
|
||||||
|
Bloodloss:
|
||||||
|
1
|
||||||
|
bloodlossHealDamage:
|
||||||
|
types:
|
||||||
|
Bloodloss:
|
||||||
|
-0.25
|
||||||
|
- type: Damageable
|
||||||
|
damageContainer: Biological
|
||||||
|
damageModifierSet: Infernal
|
||||||
|
- type: Temperature
|
||||||
|
heatDamageThreshold: 4000 #They come from hell, so...
|
||||||
|
coldDamageThreshold: 260
|
||||||
|
currentTemperature: 310.15
|
||||||
|
coldDamage:
|
||||||
|
types:
|
||||||
|
Cold : 1 #per second, scales with temperature & other constants
|
||||||
|
specificHeat: 42
|
||||||
|
heatDamage:
|
||||||
|
types:
|
||||||
|
Heat : 1 #per second, scales with temperature & other constants
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
name: Cerberus
|
||||||
|
parent: MobCorgiNarsi
|
||||||
|
id: MobCorgiCerberus
|
||||||
|
description: This pupper is not wholesome.
|
||||||
|
components:
|
||||||
|
- type: GhostTakeoverAvailable
|
||||||
|
makeSentient: true
|
||||||
|
name: Cerberus, Evil Familiar
|
||||||
|
description: Obey your master. Spread chaos.
|
||||||
|
rules: You are an intelligent, demonic dog. Try to help the chaplain and any of his flock. As an antagonist, you're otherwise unrestrained.
|
||||||
|
- type: UnarmedCombat
|
||||||
|
range: 1.5
|
||||||
|
arcwidth: 0
|
||||||
|
arc: bite
|
||||||
|
damage:
|
||||||
|
types:
|
||||||
|
Piercing: 8
|
||||||
|
Slash: 7
|
||||||
|
- type: UtilityAI
|
||||||
|
behaviorSets:
|
||||||
|
- Idle
|
||||||
|
- type: AiFactionTag
|
||||||
|
factions:
|
||||||
|
- SimpleNeutral
|
||||||
|
- type: InteractionPopup
|
||||||
|
successChance: 0.5
|
||||||
|
interactSuccessString: petting-success-corrupted-corgi
|
||||||
|
interactFailureString: petting-failure-corrupted-corgi
|
||||||
|
- type: MobState
|
||||||
|
thresholds:
|
||||||
|
0: !type:NormalMobState {}
|
||||||
|
80: !type:CriticalMobState {}
|
||||||
|
160: !type:DeadMobState {}
|
||||||
|
- type: Grammar
|
||||||
|
attributes:
|
||||||
|
gender: male
|
||||||
|
proper: true
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- Familiar
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: Ian
|
name: Ian
|
||||||
@@ -135,6 +201,25 @@
|
|||||||
proper: true
|
proper: true
|
||||||
gender: male
|
gender: male
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
name: Remilia
|
||||||
|
parent: MobBat
|
||||||
|
id: MobBatRemilia
|
||||||
|
description: The chaplain's familiar. Likes fruit.
|
||||||
|
components:
|
||||||
|
- type: GhostTakeoverAvailable
|
||||||
|
makeSentient: true
|
||||||
|
name: Remilia, the chaplain's familiar
|
||||||
|
description: Obey your master. Eat fruit.
|
||||||
|
rules: Follow the chaplain around. Don't cause any trouble unless the chaplain tells you to.
|
||||||
|
- type: Grammar
|
||||||
|
attributes:
|
||||||
|
gender: female
|
||||||
|
proper: true
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- Familiar
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: Lisa
|
name: Lisa
|
||||||
parent: MobCorgi
|
parent: MobCorgi
|
||||||
|
|||||||
@@ -68,6 +68,8 @@
|
|||||||
types:
|
types:
|
||||||
Bloodloss:
|
Bloodloss:
|
||||||
-0.25
|
-0.25
|
||||||
|
- type: DrawableSolution
|
||||||
|
solution: bloodstream
|
||||||
- type: Damageable
|
- type: Damageable
|
||||||
damageContainer: Biological
|
damageContainer: Biological
|
||||||
- type: AtmosExposed
|
- type: AtmosExposed
|
||||||
@@ -182,6 +184,5 @@
|
|||||||
heatDamage:
|
heatDamage:
|
||||||
types:
|
types:
|
||||||
Heat : 1 #per second, scales with temperature & other constants
|
Heat : 1 #per second, scales with temperature & other constants
|
||||||
|
|
||||||
- type: Bloodstream
|
- type: Bloodstream
|
||||||
bloodMaxVolume: 150
|
bloodMaxVolume: 150
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
damageOnUntrainedUse: ## What a non-chaplain takes when attempting to heal someone
|
damageOnUntrainedUse: ## What a non-chaplain takes when attempting to heal someone
|
||||||
groups:
|
groups:
|
||||||
Burn: 30
|
Burn: 30
|
||||||
|
- type: Summonable
|
||||||
|
specialItem: MobBatRemilia
|
||||||
- type: ItemCooldown
|
- type: ItemCooldown
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
netsync: false
|
netsync: false
|
||||||
@@ -30,3 +32,34 @@
|
|||||||
storageSoundCollection:
|
storageSoundCollection:
|
||||||
collection: storageRustle
|
collection: storageRustle
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: Bible
|
||||||
|
name: necronomicon
|
||||||
|
description: "There's a note: Klatuu, Verata, Nikto -- Don't forget it again!"
|
||||||
|
id: BibleNecronomicon
|
||||||
|
components:
|
||||||
|
- type: Bible
|
||||||
|
damage:
|
||||||
|
groups:
|
||||||
|
Caustic: 20 ## ~15 dps
|
||||||
|
damageOnFail:
|
||||||
|
groups:
|
||||||
|
Brute: 15
|
||||||
|
Airloss: 25
|
||||||
|
damageOnUntrainedUse:
|
||||||
|
groups:
|
||||||
|
Caustic: 50
|
||||||
|
failChance: 0
|
||||||
|
locPrefix: "necro"
|
||||||
|
healSound: "/Audio/Effects/lightburn.ogg"
|
||||||
|
cooldownTime: 1.3
|
||||||
|
- type: Summonable
|
||||||
|
specialItem: MobCorgiCerberus
|
||||||
|
- type: Sprite
|
||||||
|
netsync: false
|
||||||
|
sprite: Objects/Specific/Chapel/necronomicon.rsi
|
||||||
|
state: icon
|
||||||
|
- type: Item
|
||||||
|
size: 15
|
||||||
|
sprite: Objects/Specific/Chapel/necronomicon.rsi
|
||||||
|
prefix: inhand
|
||||||
|
|||||||
@@ -924,6 +924,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: VendingMachine
|
- type: VendingMachine
|
||||||
pack: PietyVendInventory
|
pack: PietyVendInventory
|
||||||
|
emagPack: PietyVendEmagInventory
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Structures/Machines/VendingMachines/chapdrobe.rsi
|
sprite: Structures/Machines/VendingMachines/chapdrobe.rsi
|
||||||
layers:
|
layers:
|
||||||
|
|||||||
@@ -135,6 +135,9 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: ExplosivePassable
|
id: ExplosivePassable
|
||||||
|
|
||||||
|
- type: Tag
|
||||||
|
id: Familiar
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: FireAlarmElectronics
|
id: FireAlarmElectronics
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 976 B |
Binary file not shown.
|
After Width: | Height: | Size: 474 B |
Binary file not shown.
|
After Width: | Height: | Size: 496 B |
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"license": "CC-BY-SA-3.0",
|
||||||
|
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a",
|
||||||
|
"size": {
|
||||||
|
"x": 32,
|
||||||
|
"y": 32
|
||||||
|
},
|
||||||
|
"states": [
|
||||||
|
{
|
||||||
|
"name": "icon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-left",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inhand-right",
|
||||||
|
"directions": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user