diff --git a/Content.Client/_DV/Cocoon/CocoonSystem.cs b/Content.Client/_DV/Cocoon/CocoonSystem.cs new file mode 100644 index 00000000000..85a1fd223a7 --- /dev/null +++ b/Content.Client/_DV/Cocoon/CocoonSystem.cs @@ -0,0 +1,33 @@ +using System.Numerics; +using Content.Shared._DV.Cocoon; +using Content.Shared.Humanoid; +using Robust.Client.GameObjects; +using Robust.Shared.Containers; + +namespace Content.Client._DV.Cocoon +{ + public sealed class CocoonSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnCocEntInserted); + } + + private void OnCocEntInserted(EntityUid uid, CocoonComponent component, EntInsertedIntoContainerMessage args) + { + if (!TryComp(uid, out var cocoonSprite)) + return; + + if (TryComp(args.Entity, out var humanoidAppearance)) // If humanoid, use height and width + cocoonSprite.Scale = new Vector2(1,1); + else if (!TryComp(args.Entity, out var entSprite)) + return; + else if (entSprite.BaseRSI != null) // Set scale based on sprite scale + sprite dimensions. Ideally we would somehow get a bounding box from the sprite size not including transparent pixels, but FUCK figuring that out. + cocoonSprite.Scale = entSprite.Scale * (entSprite.BaseRSI.Size / 32); + else if (entSprite.Scale != cocoonSprite.Scale) // if basersi somehow not found (?) just use scale + cocoonSprite.Scale = entSprite.Scale; + } + } +} diff --git a/Content.Server/_DV/Cocoon/CocoonerSystem.cs b/Content.Server/_DV/Cocoon/CocoonerSystem.cs new file mode 100644 index 00000000000..f444e6bf479 --- /dev/null +++ b/Content.Server/_DV/Cocoon/CocoonerSystem.cs @@ -0,0 +1,62 @@ +using Content.Server.DoAfter; +using Content.Server.Popups; +using Content.Server.Speech.Components; +using Content.Shared._DV.Cocoon; +using Content.Shared.Administration.Logs; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.Destructible; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Stunnable; +using Robust.Shared.Containers; +using Robust.Shared.Random; + +namespace Content.Server._DV.Cocoon +{ + public sealed class CocooningSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedDestructibleSystem _destructibleSystem = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + + private const string BodySlot = "body_slot"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnCocEntInserted); + SubscribeLocalEvent(OnCocEntRemoved); + } + + private void OnCocEntInserted(EntityUid uid, CocoonComponent component, EntInsertedIntoContainerMessage args) + { + component.Victim = args.Entity; + + if (TryComp(args.Entity, out var currentAccent)) + component.OldAccent = currentAccent.Accent; + + EnsureComp(args.Entity).Accent = "mumble"; + EnsureComp(args.Entity); + + _blindableSystem.UpdateIsBlind(args.Entity); + } + + private void OnCocEntRemoved(EntityUid uid, CocoonComponent component, EntRemovedFromContainerMessage args) + { + if (TryComp(args.Entity, out var replacement)) + if (component.OldAccent is not null) + replacement.Accent = component.OldAccent; + else + RemComp(args.Entity, replacement); + + + RemComp(args.Entity); + _blindableSystem.UpdateIsBlind(args.Entity); + } + } +} diff --git a/Content.Server/_DV/Vampire/BloodSuckerSystem.cs b/Content.Server/_DV/Vampire/BloodSuckerSystem.cs new file mode 100644 index 00000000000..78f865a7418 --- /dev/null +++ b/Content.Server/_DV/Vampire/BloodSuckerSystem.cs @@ -0,0 +1,171 @@ +using System.Linq; +using Content.Shared.Verbs; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared._DV.Vampire; +using Content.Shared._DV.Cocoon; +using Content.Server.Atmos.Components; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared.Chemistry.EntitySystems; +using Content.Server.Popups; +using Content.Server.DoAfter; +using Content.Server.Nutrition.Components; +using Content.Shared.Vampire; +using Robust.Shared.Utility; + +namespace Content.Server.Vampire +{ + public sealed class BloodSuckerSystem : EntitySystem + { + [Dependency] private readonly BodySystem _bodySystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionSystem = default!; + [Dependency] private readonly PopupSystem _popups = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly StomachSystem _stomachSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddSuckVerb); + SubscribeLocalEvent(OnDoAfter); + } + + private void AddSuckVerb(EntityUid uid, BloodSuckerComponent component, GetVerbsEvent args) + { + + var victim = args.Target; + var ignoreClothes = false; + + if (TryComp(args.Target, out var cocoon)) + { + victim = cocoon.Victim ?? args.Target; + ignoreClothes = cocoon.Victim != null; + } + else if (component.WebRequired) + return; + + if (!TryComp(victim, out var bloodstream) || args.User == victim || !args.CanAccess) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartSuckDoAfter(uid, victim, component, bloodstream, !ignoreClothes); // start doafter + }, + Text = Loc.GetString("action-name-suck-blood"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2, + }; + args.Verbs.Add(verb); + } + + + private void OnDoAfter(EntityUid uid, BloodSuckerComponent component, BloodSuckDoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Target == null) + return; + + args.Handled = TrySuck(uid, args.Args.Target.Value); + } + + public void StartSuckDoAfter(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodSuckerComponent = null, BloodstreamComponent? stream = null, bool doChecks = true) + { + if (!Resolve(bloodsucker, ref bloodSuckerComponent) || !Resolve(victim, ref stream)) + return; + + if (doChecks) + { + if (!_interactionSystem.InRangeUnobstructed(bloodsucker, victim)) + return; + + if (_inventorySystem.TryGetSlotEntity(victim, "head", out var headUid) && HasComp(headUid)) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-helmet", ("helmet", headUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + + if (_inventorySystem.TryGetSlotEntity(bloodsucker, "mask", out var maskUid) && + EntityManager.TryGetComponent(maskUid, out var blocker) && + blocker.Enabled) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-mask", ("mask", maskUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + } + + if (stream.BloodReagent != "Blood") + _popups.PopupEntity(Loc.GetString("bloodsucker-not-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + else if (_solutionSystem.PercentFull(victim) != 0) + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-no-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + else + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); + + var args = new DoAfterArgs(EntityManager, bloodsucker, bloodSuckerComponent.Delay, new BloodSuckDoAfterEvent(), bloodsucker, target: victim) + { + BreakOnMove = false, + DistanceThreshold = 2f, + NeedHand = false + }; + + _doAfter.TryStartDoAfter(args); + } + + public bool TrySuck(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodsuckerComp = null) + + +{ + var sharedBloodSuckerSystem = EntitySystem.Get(); + + if (!Resolve(bloodsucker, ref bloodsuckerComp)) + return false; + if (!TryValidateVictim(victim)) + return false; + + if (!TryGetBloodsuckerStomach(bloodsucker, out var stomach)) + return false; + if (!sharedBloodSuckerSystem.TryValidateSolution(bloodsucker)) + return false; + + sharedBloodSuckerSystem.PlayBloodSuckEffects(bloodsucker, victim); + return CompleteBloodSuck(bloodsucker, victim, stomach, bloodsuckerComp); +} + +private bool TryValidateVictim(EntityUid victim) +{ + if (!TryComp(victim, out var bloodstream) || bloodstream.BloodSolution == null) + return false; + return _bloodstreamSystem.GetBloodLevelPercentage(victim, bloodstream) != 0.0f; +} + +private bool TryGetBloodsuckerStomach(EntityUid bloodsucker, out StomachComponent stomach) +{ + stomach = _bodySystem.GetBodyOrganEntityComps(bloodsucker).FirstOrDefault(); + return true; +} + + +private bool CompleteBloodSuck(EntityUid bloodsucker, EntityUid victim, StomachComponent stomach, BloodSuckerComponent bloodsuckerComp) +{ + if (!TryComp(victim, out var bloodstream) || bloodstream.BloodSolution == null) + return false; + + var extractedBlood = _solutionSystem.SplitSolution(bloodstream.BloodSolution.Value, bloodsuckerComp.UnitsToSuck); + _stomachSystem.TryTransferSolution(bloodsucker, extractedBlood, stomach); + + DamageSpecifier damage = new(); + damage.DamageDict.Add("Piercing", 1); + _damageableSystem.TryChangeDamage(victim, damage, true); + + return true; +} + } +} diff --git a/Content.Shared/_DV/Cocoon/CocoonComponent.cs b/Content.Shared/_DV/Cocoon/CocoonComponent.cs new file mode 100644 index 00000000000..c887a2e5633 --- /dev/null +++ b/Content.Shared/_DV/Cocoon/CocoonComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Shared._DV.Cocoon +{ + [RegisterComponent] + public sealed partial class CocoonComponent : Component + { + public string? OldAccent; + + public EntityUid? Victim; + + [DataField("damagePassthrough")] + public float DamagePassthrough = 0.5f; + + } +} diff --git a/Content.Shared/_DV/Cocoon/CocoonDoAfterEvent.cs b/Content.Shared/_DV/Cocoon/CocoonDoAfterEvent.cs new file mode 100644 index 00000000000..3bfde77a647 --- /dev/null +++ b/Content.Shared/_DV/Cocoon/CocoonDoAfterEvent.cs @@ -0,0 +1,15 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared._DV.Cocoon +{ + [Serializable, NetSerializable] + public sealed partial class CocoonDoAfterEvent : SimpleDoAfterEvent + { + } + + [Serializable, NetSerializable] + public sealed partial class UnCocoonDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Content.Shared/_DV/Cocoon/CocoonerComponent.cs b/Content.Shared/_DV/Cocoon/CocoonerComponent.cs new file mode 100644 index 00000000000..aba674fb80f --- /dev/null +++ b/Content.Shared/_DV/Cocoon/CocoonerComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._DV.Cocoon +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class CocoonerComponent : Component + { + [DataField("cocoonDelay")] + public float CocoonDelay = 12f; + + [DataField("cocoonKnockdownMultiplier")] + public float CocoonKnockdownMultiplier = 0.5f; + } +} diff --git a/Content.Shared/_DV/Cocoon/CocoonerSystem.cs b/Content.Shared/_DV/Cocoon/CocoonerSystem.cs new file mode 100644 index 00000000000..e4f485b5cb5 --- /dev/null +++ b/Content.Shared/_DV/Cocoon/CocoonerSystem.cs @@ -0,0 +1,169 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.Database; +using Content.Shared.Destructible; +using Content.Shared.DoAfter; +using Content.Shared.Humanoid; +using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Components; +using Content.Shared.Nutrition.Components; +using Content.Shared.Popups; +using Content.Shared.Storage; +using Content.Shared.Stunnable; +using Content.Shared.Verbs; +using Robust.Shared.Random; +using Robust.Shared.Utility; + +namespace Content.Shared._DV.Cocoon +{ + public sealed class CocooningSystem : EntitySystem + { + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedDestructibleSystem _destructibleSystem = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + + private const string BodySlot = "body_slot"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddVerbs); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnCocoonDoAfter); + SubscribeLocalEvent(OnUnCocoonDoAfter); + } + + private void AddVerbs(EntityUid uid, CocoonerComponent component, GetVerbsEvent args) + { + AddCocoonVerb(uid, component, args); + AddUnCocoonVerb(uid, component, args); + } + + private void AddCocoonVerb(EntityUid uid, CocoonerComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || !HasComp(args.Target) || args.Target == args.User) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCocooning(uid, component, args.Target); + }, + Text = Loc.GetString("cocoon"), + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Actions/web.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void AddUnCocoonVerb(EntityUid uid, CocoonerComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || !HasComp(args.Target)) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartUnCocooning(uid, component, args.Target); + }, + Text = Loc.GetString("uncocoon"), + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Actions/web.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + + private void OnDamageChanged(EntityUid uid, CocoonComponent component, DamageChangedEvent args) + { + if (!args.DamageIncreased || args.DamageDelta == null || component.Victim == null) + return; + + var damage = args.DamageDelta * component.DamagePassthrough; + _damageableSystem.TryChangeDamage(component.Victim, damage); + } + + private void StartCocooning(EntityUid uid, CocoonerComponent component, EntityUid target) + { + _popupSystem.PopupEntity(Loc.GetString("cocoon-start-third-person", ("target", Identity.Entity(target, EntityManager)), ("spider", Identity.Entity(uid, EntityManager))), uid, + Shared.Popups.PopupType.MediumCaution); + + var delay = component.CocoonDelay; + + if (HasComp(target)) + delay *= component.CocoonKnockdownMultiplier; + + var args = new DoAfterArgs(EntityManager, uid, delay, new CocoonDoAfterEvent(), uid, target: target) + { + BreakOnMove = true + }; + + _doAfter.TryStartDoAfter(args); + } + + private void StartUnCocooning(EntityUid uid, CocoonerComponent component, EntityUid target) + { + _popupSystem.PopupEntity(Loc.GetString("uncocoon-start-third-person", ("target", target), ("spider", Identity.Entity(uid, EntityManager))), uid, + Shared.Popups.PopupType.MediumCaution); + + var delay = component.CocoonDelay / 2; + + var args = new DoAfterArgs(EntityManager, uid, delay, new UnCocoonDoAfterEvent(), uid, target: target) + { + BreakOnMove = true + }; + + _doAfter.TryStartDoAfter(args); + } + + private void OnCocoonDoAfter(EntityUid uid, CocoonerComponent component, CocoonDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Target == null) + return; + + var spawnProto = HasComp(args.Args.Target) ? "CocoonedHumanoid" : "CocoonSmall"; + Transform(args.Args.Target.Value).AttachToGridOrMap(); + var cocoon = Spawn(spawnProto, Transform(args.Args.Target.Value).Coordinates); + + if (!TryComp(cocoon, out var slots)) + return; + + _itemSlots.SetLock(cocoon, BodySlot, false, slots); + _itemSlots.TryInsert(cocoon, BodySlot, args.Args.Target.Value, args.Args.User); + _itemSlots.SetLock(cocoon, BodySlot, true, slots); + + var impact = (spawnProto == "CocoonedHumanoid") ? LogImpact.High : LogImpact.Medium; + + _adminLogger.Add(LogType.Action, impact, $"{ToPrettyString(args.Args.User):player} cocooned {ToPrettyString(args.Args.Target.Value):target}"); + args.Handled = true; + } + + private void OnUnCocoonDoAfter(EntityUid uid, CocoonerComponent component, UnCocoonDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Target == null) + return; + + if (TryComp(args.Args.Target.Value, out var butcher)) + { + var spawnEntities = EntitySpawnCollection.GetSpawns(butcher.SpawnedEntities, _robustRandom); + var coords = Transform(args.Args.Target.Value).MapPosition; + EntityUid popupEnt = default!; + foreach (var proto in spawnEntities) + popupEnt = Spawn(proto, coords.Offset(_robustRandom.NextVector2(0.25f))); + } + + _destructibleSystem.DestroyEntity(args.Args.Target.Value); + + _adminLogger.Add(LogType.Action, LogImpact.Low + , $"{ToPrettyString(args.Args.User):player} uncocooned {ToPrettyString(args.Args.Target.Value):target}"); + args.Handled = true; + } + } +} diff --git a/Content.Shared/_DV/Roles/OneirophageRole.cs b/Content.Shared/_DV/Roles/OneirophageRole.cs new file mode 100644 index 00000000000..0d8f595b321 --- /dev/null +++ b/Content.Shared/_DV/Roles/OneirophageRole.cs @@ -0,0 +1,6 @@ +using Content.Shared.Roles; + +namespace Content.Shared._DV.Roles; + +[RegisterComponent] +public sealed partial class OneirophageRoleComponent : BaseMindRoleComponent; diff --git a/Content.Shared/_DV/Vampire/BloodSuckDoAfterEvent.cs b/Content.Shared/_DV/Vampire/BloodSuckDoAfterEvent.cs new file mode 100644 index 00000000000..5b88d2ddc99 --- /dev/null +++ b/Content.Shared/_DV/Vampire/BloodSuckDoAfterEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared._DV.Vampire +{ + [DataDefinition] + public partial class BloodSuckDoAfterEvent + { + } +} + diff --git a/Content.Shared/_DV/Vampire/BloodSuckedComponent.cs b/Content.Shared/_DV/Vampire/BloodSuckedComponent.cs new file mode 100644 index 00000000000..aa715a1a0c9 --- /dev/null +++ b/Content.Shared/_DV/Vampire/BloodSuckedComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared._DV.Vampire +{ + /// + /// For entities who have been sucked. + /// + [RegisterComponent] + public sealed partial class BloodSuckedComponent : Component + {} +} diff --git a/Content.Shared/_DV/Vampire/BloodSuckerComponent.cs b/Content.Shared/_DV/Vampire/BloodSuckerComponent.cs new file mode 100644 index 00000000000..d2a28318989 --- /dev/null +++ b/Content.Shared/_DV/Vampire/BloodSuckerComponent.cs @@ -0,0 +1,44 @@ +namespace Content.Shared._DV.Vampire +{ + [RegisterComponent] + public partial class BloodSuckerComponent + { + /// + /// How much to suck each time we suck. + /// + [DataField("unitsToSuck")] + public float UnitsToSuck = 20f; + + /// + /// The time (in seconds) that it takes to suck an entity. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan Delay = TimeSpan.FromSeconds(4); + + // ***INJECT WHEN SUCK*** + + /// + /// Whether to inject chems into a chemstream when we suck something. + /// + [DataField("injectWhenSuck")] + public bool InjectWhenSuck; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + + /// + /// Whether we need to web the thing up first... + /// + [DataField("webRequired")] + public bool WebRequired; + } +} diff --git a/Content.Shared/_DV/Vampire/BloodSuckerSystem.cs b/Content.Shared/_DV/Vampire/BloodSuckerSystem.cs new file mode 100644 index 00000000000..6e57c7b2b79 --- /dev/null +++ b/Content.Shared/_DV/Vampire/BloodSuckerSystem.cs @@ -0,0 +1,67 @@ +using Content.Shared._DV.Vampire; +using Content.Shared.Administration.Logs; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Database; +using Content.Shared.HealthExaminable; +using Content.Shared.Popups; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Vampire +{ + public sealed class SharedBloodSuckerSystem : EntitySystem + { + [Dependency] private readonly SharedSolutionContainerSystem _solutionSystem = default!; + [Dependency] private readonly SharedPopupSystem _popups = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnHealthExamined); + SubscribeLocalEvent(OnDamageChanged); + } + + + private void OnHealthExamined(EntityUid uid, BloodSuckedComponent component, HealthBeingExaminedEvent args) + { + args.Message.PushNewline(); + args.Message.AddMarkupOrThrow(Loc.GetString("bloodsucked-health-examine", ("target", uid))); + } + + private void OnDamageChanged(EntityUid uid, BloodSuckedComponent component, DamageChangedEvent args) + { + if (args.DamageIncreased) + return; + + if (!_prototypeManager.TryIndex("Brute", out var brute) || + !args.Damageable.Damage.TryGetDamageInGroup(brute, out var bruteTotal) + || !_prototypeManager.TryIndex("Airloss", out var airloss) || + !args.Damageable.Damage.TryGetDamageInGroup(airloss, out var airlossTotal)) + return; + if (bruteTotal == 0 && airlossTotal == 0) + RemComp(uid); + } + + public bool TryValidateSolution(EntityUid bloodsucker) + { + if (!(_solutionSystem.PercentFull(bloodsucker) >= 1)) + return true; + _popups.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough"), bloodsucker, bloodsucker, PopupType.MediumCaution); + return false; + } + + private void PlayBloodSuckEffects(EntityUid bloodsucker, EntityUid victim) + { + _adminLogger.Add(LogType.MeleeHit, LogImpact.Medium, $"{ToPrettyString(bloodsucker):player} sucked blood from {ToPrettyString(victim):target}"); + _audio.PlayPvs("/Audio/Items/drink.ogg", bloodsucker); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked-victim", ("sucker", bloodsucker)), victim, victim, PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked", ("target", victim)), bloodsucker, bloodsucker, PopupType.Medium); + EnsureComp(victim); + } + + } +} diff --git a/Content.Shared/_DV/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs b/Content.Shared/_DV/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs new file mode 100644 index 00000000000..ac94804639f --- /dev/null +++ b/Content.Shared/_DV/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs @@ -0,0 +1,23 @@ +namespace Content.Shared._DV.Vampire.Injector +{ + [RegisterComponent] + /// + /// Item that gives a bloodsucker injection glands (for poison, usually) + /// + public partial class BloodSuckerGlandInjectorComponent + { + public bool Used = false; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + } +} diff --git a/Content.Shared/_DV/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs b/Content.Shared/_DV/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs new file mode 100644 index 00000000000..fb20c004f94 --- /dev/null +++ b/Content.Shared/_DV/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs @@ -0,0 +1,39 @@ +using Content.Shared.Interaction; +using Content.Shared.Popups; + +namespace Content.Shared._DV.Vampire.Injector +{ + public sealed class BloodSuckerGlandInjectorSystem : EntitySystem + { + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAfterInteract); + } + + private void OnAfterInteract(EntityUid uid, BloodSuckerGlandInjectorComponent component, AfterInteractEvent args) + { + if (component.Used) + return; + + if (!args.CanReach) + return; + + if (!TryComp(args.Target, out var bloodSuckerComponent)) + return; + + // They already have one. + if (bloodSuckerComponent.InjectWhenSuck) + return; + + bloodSuckerComponent.InjectWhenSuck = true; + bloodSuckerComponent.InjectReagent = component.InjectReagent; + bloodSuckerComponent.UnitsToInject = component.UnitsToInject; + component.Used = true; + QueueDel(uid); + + _popupSystem.PopupEntity(Loc.GetString("bloodsucker-glands-throb"), args.Target.Value, args.Target.Value); + } + } +} diff --git a/Resources/Locale/en-US/_DV/abilities/arachne.ftl b/Resources/Locale/en-US/_DV/abilities/arachne.ftl new file mode 100644 index 00000000000..f088a4c444c --- /dev/null +++ b/Resources/Locale/en-US/_DV/abilities/arachne.ftl @@ -0,0 +1,16 @@ +action-name-spin-web = Spin Web +action-desc-spin-web = Use your spinnerets to make a spider web in the current tile. Makes you hungrier and thirstier. +action-name-spin-web-space = You can't spin a web in space! +action-name-spin-web-blocked = There's no room for a web here. +spin-web-action-hungry = You're too hungry to spin a web! +spin-web-action-thirsty = You're too thirsty to spin a web! +spin-web-start-second-person = You start spinning a web. +spin-web-start-third-person = {CAPITALIZE(THE($spider))} starts spinning a web! +cocoon-start-second-person = You start cocooning {THE($target)}. +cocoon-start-third-person = {CAPITALIZE(THE($spider))} starts cocooning {THE($target)}. +uncocoon-start-second-person = You start releasing {THE($target)}. +uncocoon-start-third-person = {CAPITALIZE(THE($spider))} starts releasing {THE($target)}. +spun-web-second-person = You spin up a web. +spun-web-third-person = {CAPITALIZE(THE($spider))} spins up a web! +cocoon = Cocoon +uncocoon = Uncocoon diff --git a/Resources/Locale/en-US/_DV/abilities/bloodsucker.ftl b/Resources/Locale/en-US/_DV/abilities/bloodsucker.ftl new file mode 100644 index 00000000000..c8aa0ed8542 --- /dev/null +++ b/Resources/Locale/en-US/_DV/abilities/bloodsucker.ftl @@ -0,0 +1,19 @@ +action-name-suck-blood = Suck Blood +action-description-suck-blood = Suck the blood of the victim in your hand. + +bloodsucker-fail-helmet = You'd need to remove {THE($helmet)}. +bloodsucker-fail-mask = You'd need to remove your mask! + +bloodsucker-not-blood = {$target} doesn't have delicious, nourishing blood. +bloodsucker-fail-no-blood = {$target} has no blood in { POSS-ADJ($target) } body. +bloodsucker-fail-no-blood-bloodsucked = {$target} has been sucked dry. + +bloodsucker-blood-sucked = You suck some blood from {$target}. +bloodsucker-doafter-start = You try to suck blood from {$target}. + +bloodsucker-doafter-start-victim = {CAPITALIZE(THE($sucker))} is trying to bite your neck! +bloodsucker-blood-sucked-victim = {CAPITALIZE(THE($sucker))} sucks some of your blood! + +bloodsucked-health-examine = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } bite marks on { POSS-ADJ($target) } neck.[/color] + +bloodsucker-glands-throb = The glands behind your fangs feel a bit sore. diff --git a/Resources/Locale/en-US/_DV/abilities/chitinid.ftl b/Resources/Locale/en-US/_DV/abilities/chitinid.ftl index 87759da4f7c..58c88203d8c 100644 --- a/Resources/Locale/en-US/_DV/abilities/chitinid.ftl +++ b/Resources/Locale/en-US/_DV/abilities/chitinid.ftl @@ -1 +1 @@ -chitzite-cough = {CAPITALIZE(THE($name))} starts coughing up a hunk of Chitzite! +chitzite-cough = {CAPITALIZE(THE($name))} starts coughing up a hunk of Chitzite! diff --git a/Resources/Locale/en-US/_DV/abilities/item-cougher.ftl b/Resources/Locale/en-US/_DV/abilities/item-cougher.ftl index 56d80b02f2f..6183a4cd135 100644 --- a/Resources/Locale/en-US/_DV/abilities/item-cougher.ftl +++ b/Resources/Locale/en-US/_DV/abilities/item-cougher.ftl @@ -1 +1 @@ -item-cougher-mask = Take off your {$mask} first. +item-cougher-mask = Take off your {$mask} first. diff --git a/Resources/Locale/en-US/_DV/abilities/lifedrainer.ftl b/Resources/Locale/en-US/_DV/abilities/lifedrainer.ftl index 4072129ab0f..d039253c581 100644 --- a/Resources/Locale/en-US/_DV/abilities/lifedrainer.ftl +++ b/Resources/Locale/en-US/_DV/abilities/lifedrainer.ftl @@ -1,5 +1,5 @@ -verb-life-drain = Life drain -life-drain-second-start = {CAPITALIZE(THE($drainer))} starts draining your life force! -life-drain-third-start = {CAPITALIZE(THE($drainer))} starts draining {THE($target)}'s life force! -life-drain-second-end = Your being is annihilated. -life-drain-third-end = {CAPITALIZE(THE($drainer))} drains {THE($target)}'s life force! +verb-life-drain = Life drain +life-drain-second-start = {CAPITALIZE(THE($drainer))} starts draining your life force! +life-drain-third-start = {CAPITALIZE(THE($drainer))} starts draining {THE($target)}'s life force! +life-drain-second-end = Your being is annihilated. +life-drain-third-end = {CAPITALIZE(THE($drainer))} drains {THE($target)}'s life force! diff --git a/Resources/Locale/en-US/_DV/abilities/psionic.ftl b/Resources/Locale/en-US/_DV/abilities/psionic.ftl index 8d6ab750383..403a7785595 100644 --- a/Resources/Locale/en-US/_DV/abilities/psionic.ftl +++ b/Resources/Locale/en-US/_DV/abilities/psionic.ftl @@ -44,3 +44,4 @@ psionic-power-precognition-random-sentience-result-message = Something bright an psionic-power-precognition-unknown-shuttle-cargo-lost-result-message = You see a vision of a simple ship of old Terra, adrift of the sea, far away from home. psionic-power-precognition-unknown-shuttle-traveling-cuisine-result-message = You see a vision of peace, a cozy meal sizzling on a warm stove. A delicious smells wafts through the air. psionic-power-precognition-unknown-shuttle-disaster-evac-pod-result-message = You see a vision of death and blood, of a destruction so complete only few survive, drifting through the coldness of space. +psionic-power-precognition-oneirophage-result-message = You see a vision of blood suspended in mid air, an invisible menace whispering dreams in your mind. diff --git a/Resources/Locale/en-US/_DV/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/_DV/ghost/roles/ghost-role-component.ftl index f301c7a4840..2fe9332afab 100644 --- a/Resources/Locale/en-US/_DV/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/_DV/ghost/roles/ghost-role-component.ftl @@ -60,3 +60,9 @@ deltav-ghost-role-information-salvageantag-rules = You are a salvage mob. You are allowed to attack salvagers without provocation. DO NOT GIB THEIR CORPSES! You are allowed to attack the salvage shuttle. You are NOT allowed to go to the station. If the salvagers go to the station, you can't follow them. + +ghost-role-information-oneirophage-name = Oneirophage +ghost-role-information-oneirophage-description = Nest. Lure. Ambush. Consume. +ghost-role-information-oneirophage-rules = You are a team antagonist with all Spiders. + The crew is allowed to kill you without warning. + You are allowed to attack the crew without provocation. diff --git a/Resources/Locale/en-US/_DV/metabolism/metabolizer-types.ftl b/Resources/Locale/en-US/_DV/metabolism/metabolizer-types.ftl new file mode 100644 index 00000000000..f06cdfbeb2b --- /dev/null +++ b/Resources/Locale/en-US/_DV/metabolism/metabolizer-types.ftl @@ -0,0 +1 @@ +metabolizer-type-vampiric = Vampiric diff --git a/Resources/Locale/en-US/_DV/oneirophage/oneirophage.ftl b/Resources/Locale/en-US/_DV/oneirophage/oneirophage.ftl new file mode 100644 index 00000000000..7fd4d50f0f5 --- /dev/null +++ b/Resources/Locale/en-US/_DV/oneirophage/oneirophage.ftl @@ -0,0 +1,3 @@ +oneirophage-round-end-name = Oneirophage + +oneirophage-role-briefing = You are the Dream Spider, spin webs of blood and fear throughout the tunnels of this fertile ground. diff --git a/Resources/Locale/en-US/_DV/prototypes/roles/antags.ftl b/Resources/Locale/en-US/_DV/prototypes/roles/antags.ftl index dd2cef59efa..aa67ca7657c 100644 --- a/Resources/Locale/en-US/_DV/prototypes/roles/antags.ftl +++ b/Resources/Locale/en-US/_DV/prototypes/roles/antags.ftl @@ -12,3 +12,6 @@ roles-antag-syndicate-synthesis-objective = Sell your finest chemicals. roles-antag-syndicate-recruiter-name = Syndicate Recruiter roles-antag-syndicate-recruiter-objective = Find and recruit the best agents for the Syndicate. + +roles-antag-oneirophage-name = Oneirophage +roles-antag-oneirophage-objective = Survive and thrive off their blood. diff --git a/Resources/Locale/en-US/_DV/species/species.ftl b/Resources/Locale/en-US/_DV/species/species.ftl index b8cebd93d58..30ef56ba786 100644 --- a/Resources/Locale/en-US/_DV/species/species.ftl +++ b/Resources/Locale/en-US/_DV/species/species.ftl @@ -4,3 +4,4 @@ species-name-vulpkanin = Vulpkanin species-name-harpy = Harpy species-name-rodentia = Rodentia species-name-chitinid = Chitinid +species-name-arachne = Arachne diff --git a/Resources/Locale/en-US/_EE/markings/tatoos.ftl b/Resources/Locale/en-US/_EE/markings/tatoos.ftl new file mode 100644 index 00000000000..6e96ffed129 --- /dev/null +++ b/Resources/Locale/en-US/_EE/markings/tatoos.ftl @@ -0,0 +1,5 @@ +marking-TattooEyeArachneRight-tattoo_eye_arachne_r = Right Arachne Eye +marking-TattooEyeArachneRight = Right Arachne Eye + +marking-TattooEyeArachneLeft-tattoo_eye_arachne_l = Left Arachne Eye +marking-TattooEyeArachneLeft = Left Arachne Eye diff --git a/Resources/Locale/en-US/nyanotrasen/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/nyanotrasen/ghost/roles/ghost-role-component.ftl index b999392b58d..fe933ef2ad0 100644 --- a/Resources/Locale/en-US/nyanotrasen/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/nyanotrasen/ghost/roles/ghost-role-component.ftl @@ -1,5 +1,2 @@ -ghost-role-information-giant-spider-vampire-name = Oneirophage -ghost-role-information-giant-spider-vampire-description = Nest. Lure. Ambush. Consume. - ghost-role-information-cancer-mouse-name = Cancer Mouse ghost-role-information-cancer-mouse-description = Make off color comments, but not so edgy that they break the rules of the server. diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index af7c0d07f8b..7b28a8daa03 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -168,6 +168,7 @@ - type: Tag tags: - HidesHarpyWings # DeltaV: Used by harpies to help render their hardsuit sprites + - SuitEVA # DeltaV used to prevent arachne - type: ProtectedFromStepTriggers slots: WITHOUT_POCKET - type: DamageOnInteractProtection diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/arachnid.yml index f4c446df5b7..0d64e334be5 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/arachnid.yml @@ -122,7 +122,7 @@ id: ArachnidTorsoStripes bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: stripes @@ -135,7 +135,7 @@ id: ArachnidTorsoSlashes bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: slashes @@ -148,7 +148,7 @@ id: ArachnidTorsoX bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: x @@ -161,7 +161,7 @@ id: ArachnidTorsoCross bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: cross @@ -174,7 +174,7 @@ id: ArachnidTorsoHeart bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: heart @@ -187,7 +187,7 @@ id: ArachnidTorsoHourglass bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: hourglass @@ -200,7 +200,7 @@ id: ArachnidTorsoNailAndHammer bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: nail-and-hammer @@ -213,7 +213,7 @@ id: ArachnidTorsoStar bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: star @@ -226,7 +226,7 @@ id: ArachnidTorsoArrows bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: arrows @@ -239,7 +239,7 @@ id: ArachnidTorsoCore bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: core @@ -252,7 +252,7 @@ id: ArachnidTorsoFiddleback bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: fiddleback @@ -265,7 +265,7 @@ id: ArachnidTorsoSkull bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: skull @@ -278,7 +278,7 @@ id: ArachnidTorsoTarget bodyPart: Chest markingCategory: Chest - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/chest.rsi state: target @@ -292,7 +292,7 @@ id: ArachnidRArmStripes bodyPart: RArm markingCategory: Arms - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/arms.rsi state: stripes_right @@ -305,7 +305,7 @@ id: ArachnidLArmStripes bodyPart: LArm markingCategory: Arms - speciesRestriction: [Arachnid] + speciesRestriction: [Arachnid, Arachne] # EE Arachne sprites: - sprite: Mobs/Customization/Arachnid/arms.rsi state: stripes_left diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/ears.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/ears.yml index 6e350880329..143e86a1be0 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/ears.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/ears.yml @@ -2,7 +2,7 @@ id: HumanLongEars bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [Human, Dwarf] + speciesRestriction: [Human, Dwarf, Arachne] # DeltaV Arachne forcedColoring: true followSkinColor: true sprites: diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml index 71fe6245101..26abfc57163 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml @@ -2,7 +2,7 @@ id: GauzeLefteyePatch bodyPart: Eyes markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -16,7 +16,7 @@ id: GauzeLefteyePad bodyPart: Eyes markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -30,7 +30,7 @@ id: GauzeRighteyePatch bodyPart: Eyes markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -44,7 +44,7 @@ id: GauzeRighteyePad bodyPart: Eyes markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -58,7 +58,7 @@ id: GauzeBlindfold bodyPart: Eyes markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Harpy, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -72,7 +72,7 @@ id: GauzeShoulder bodyPart: Chest markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -86,7 +86,7 @@ id: GauzeStomach bodyPart: Chest markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -100,7 +100,7 @@ id: GauzeUpperArmRight bodyPart: RArm markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -114,7 +114,7 @@ id: GauzeLowerArmRight bodyPart: RArm, RHand markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin, Rodentia, Arachne ] # Delta V - Felinid, Oni, Vulpkanin, Rodentia #EE - Arachne coloring: default: type: @@ -128,7 +128,7 @@ id: GauzeLeftArm bodyPart: LArm, LHand markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: @@ -142,7 +142,7 @@ id: GauzeLowerLegLeft bodyPart: LFoot markingCategory: Overlay - speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia] # Delta V - Felinid, Oni, Vulpkanin, Rodentia + speciesRestriction: [Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, Rodentia, Arachne] # Delta V - Felinid, Oni, Vulpkanin, Rodentia # EE - Arachne coloring: default: type: diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml index 19373e79d8d..12bdf9695fe 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_noses.yml @@ -4,7 +4,7 @@ markingCategory: Snout followSkinColor: true forcedColoring: true - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] #Einstein Engines - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne] # EE - Felinid, Oni, Harpy, Arachne sprites: - sprite: Mobs/Customization/human_noses.rsi state: schnozz @@ -15,7 +15,7 @@ markingCategory: Snout followSkinColor: true forcedColoring: true - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] #Einstein Engines - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne] # EE - Felinid, Oni, Harpy, Arachne sprites: - sprite: Mobs/Customization/human_noses.rsi state: nubby @@ -26,7 +26,7 @@ markingCategory: Snout followSkinColor: true forcedColoring: true - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] #Einstein Engines - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne] # EE - Felinid, Oni, Harpy, Arachne sprites: - sprite: Mobs/Customization/human_noses.rsi state: droop @@ -37,7 +37,7 @@ markingCategory: Snout followSkinColor: true forcedColoring: true - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] #Einstein Engines - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne] # EE - Felinid, Oni, Harpy, Arachne sprites: - sprite: Mobs/Customization/human_noses.rsi state: blob @@ -48,7 +48,7 @@ markingCategory: Snout followSkinColor: true forcedColoring: true - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] #Einstein Engines - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy, Arachne] # EE - Felinid, Oni, Harpy, Arachne sprites: - sprite: Mobs/Customization/human_noses.rsi state: uppie diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml index 822be2893c4..503c229671c 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml @@ -2,7 +2,7 @@ id: ScarEyeRight bodyPart: Head markingCategory: Head - speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Rodentia] # Delta V - Felinid, Oni, Harpy, Rodentia + speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Rodentia, Arachne] # Delta V - Felinid, Oni, Harpy, Rodentia # EE - Arachne followSkinColor: true sprites: - sprite: Mobs/Customization/scars.rsi @@ -12,7 +12,7 @@ id: ScarEyeLeft bodyPart: Head markingCategory: Head - speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Rodentia] # Delta V - Felinid, Oni, Harpy, Rodentia + speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni, Rodentia, Arachne] # Delta V - Felinid, Oni, Harpy, Rodentia # EE - Arachne followSkinColor: true sprites: - sprite: Mobs/Customization/scars.rsi @@ -22,7 +22,7 @@ id: ScarTopSurgeryShort bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Felinid, Oni] #Einstein Engines - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne] # EE - Felinid, Oni, Arachne sexRestriction: [Male] followSkinColor: true sprites: @@ -33,7 +33,7 @@ id: ScarTopSurgeryLong bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Felinid, Oni] #Einstein Engines - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne] # EE - Felinid, Oni, Arachne sexRestriction: [Male] followSkinColor: true sprites: @@ -44,7 +44,7 @@ id: ScarChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Felinid, Oni] #Einstein Engines - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne] # EE - Felinid, Oni, Arachne sexRestriction: [Male] # DeltaV: Splitting the scars and tattoos followSkinColor: true sprites: diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml index 6310f1b34f2..024bc7831aa 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml @@ -2,7 +2,7 @@ id: TattooHiveChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, SlimePerson, Felinid, Oni] # Delta V - SlimePerson, Felinid, Oni + speciesRestriction: [Human, Dwarf, SlimePerson, Felinid, Oni, Arachne] # Delta V - SlimePerson, Felinid, Oni # EE - Arachne sexRestriction: [Male] # DeltaV: Splitting the scars and tattoos coloring: default: @@ -17,7 +17,7 @@ id: TattooNightlingChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, SlimePerson, Felinid, Oni] # Delta V - SlimePerson, Felinid, Oni + speciesRestriction: [Human, Dwarf, SlimePerson, Felinid, Oni, Arachne] # Delta V - SlimePerson, Felinid, Oni # EE - Arachne sexRestriction: [Male] # DeltaV: Splitting the scars and tattoos coloring: default: @@ -32,7 +32,7 @@ id: TattooSilverburghLeftLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne] # Delta V - Felinid, Oni # EE - Arachne coloring: default: type: @@ -46,7 +46,7 @@ id: TattooSilverburghRightLeg bodyPart: RLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne] # Delta V - Felinid, Oni # EE - Arachne coloring: default: type: @@ -60,7 +60,7 @@ id: TattooCampbellLeftArm bodyPart: LArm markingCategory: Arms - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne] # Delta V - Felinid, Oni # EE - Arachne coloring: default: type: @@ -74,7 +74,7 @@ id: TattooCampbellRightArm bodyPart: RArm markingCategory: Arms - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Oni, Arachne] # Delta V - Felinid, Oni # EE - Arachne coloring: default: type: @@ -116,7 +116,7 @@ id: TattooEyeRight bodyPart: Eyes markingCategory: Head - speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Vulpkanin, Oni, Harpy, Rodentia] # Delta V - Felinid, Vulpkanin, Oni, Harpy, Rodentia + speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Vulpkanin, Oni, Harpy, Rodentia, Arachne] # Delta V - Felinid, Vulpkanin, Oni, Harpy, Rodentia # EE - Arachne coloring: default: type: @@ -130,7 +130,7 @@ id: TattooEyeLeft bodyPart: Eyes markingCategory: Head - speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Vulpkanin, Oni, Harpy, Rodentia] # Delta V - Felinid, Vulpkanin, Oni, Harpy, Rodentia + speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Vulpkanin, Oni, Harpy, Rodentia, Arachne] # Delta V - Felinid, Vulpkanin, Oni, Harpy, Rodentia # EE - Arachne coloring: default: type: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 5238612f452..6e68e7616cb 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -2424,6 +2424,9 @@ groups: Brute: -0.07 Burn: -0.07 + - type: BloodSucker # begin EE + webRequired: true + - type: Cocooner # end EE - type: entity parent: MobSpiderBase diff --git a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml index 02feda953f8..4c315257bd2 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml @@ -76,6 +76,9 @@ ignoreWhitelist: components: - IgnoreSpiderWeb + - type: Tag # DeltaV port Arachne from EE + tags: + - ArachneWeb - type: entity id: SpiderWebClown diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml index dfc55602df3..9a7fa02be89 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml @@ -34,24 +34,3 @@ - state: green - state: prisoner - type: MidRoundAntagSpawnLocation - -# - type: entity -# id: SpawnPointGhostVampSpider -# name: ghost role spawn point -# suffix: Vampire spider -# parent: MarkerBase -# noSpawn: true -# components: -# - type: GhostRoleMobSpawner -# prototype: MobGiantSpiderVampireAngry -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: Sprite -# sprite: Markers/jobs.rsi -# layers: -# - state: green -# - sprite: Mobs/Animals/bat.rsi -# state: bat diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml index 045af4d82fc..578f40ecd22 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml @@ -1,141 +1,3 @@ -# - type: entity -# name: oneirophage -# parent: SimpleMobBase -# id: MobGiantSpiderVampire -# description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. -# components: -# - type: Sprite -# drawdepth: Mobs -# layers: -# - map: ["enum.DamageStateVisualLayers.Base"] -# state: viper -# sprite: Mobs/Animals/spider.rsi -# - type: Physics -# - type: Fixtures -# fixtures: -# fix1: -# shape: -# !type:PhysShapeCircle -# radius: 0.35 -# density: 130 -# mask: -# - SmallMobMask -# layer: -# - SmallMobLayer -# - type: Appearance -# - type: DamageStateVisuals -# states: -# Alive: -# Base: viper -# Critical: -# Base: viper_dead -# Dead: -# Base: viper_dead -# - type: Butcherable -# spawned: -# - id: FoodMeatSpider -# amount: 2 -# - type: CombatMode -# - type: ReplacementAccent -# accent: xeno -# - type: InteractionPopup -# successChance: 0.5 -# interactSuccessString: petting-success-tarantula -# interactFailureString: petting-failure-generic -# - type: Puller -# needsHands: false -# - type: Arachne -# cocoonDelay: 8 -# - type: SolutionContainerManager -# solutions: -# melee: -# reagents: -# - ReagentId: Nocturine -# Quantity: 20 -# - type: MeleeChemicalInjector -# solution: melee -# transferAmount: 3.5 -# - type: SolutionRegeneration -# solution: melee -# generated: -# reagents: -# - ReagentId: Nocturine -# Quantity: 0.15 -# - type: BloodSucker -# unitsToSucc: 35 -# injectWhenSucc: true -# injectReagent: Cryptobiolin -# unitsToInject: 10 -# webRequired: true -# - type: Bloodstream -# bloodReagent: DemonsBlood -# - type: Body -# prototype: VampiricAnimalLarge -# - type: PotentialPsionic -# - type: Psionic -# removable: false -# - type: MetapsionicPower -# - type: MeleeWeapon -# hidden: true -# angle: 0 -# animation: WeaponArcBite -# damage: -# types: -# Piercing: 8 -# - type: AntiPsionicWeapon -# punish: false -# modifiers: -# coefficients: -# Piercing: 2.25 -# - type: Damageable -# damageContainer: HalfSpirit -# damageModifierSet: HalfSpirit -# - type: StatusEffects -# allowed: -# - Stun -# - KnockedDown -# - SlowedDown -# - Stutter -# - SeeingRainbows -# - Electrocution -# - Drunk -# - SlurredSpeech -# - PressureImmunity -# - Muted -# - ForcedSleep -# - TemporaryBlindness -# - Pacified -# - PsionicsDisabled -# - PsionicallyInsulated -# - type: Tag -# tags: -# - Oneirophage -# - type: MovementAlwaysTouching -# - type: PsionicInvisibleContacts -# whitelist: -# tags: -# - ArachneWeb - -# - type: entity -# name: oneirophage -# parent: MobGiantSpiderVampire -# id: MobGiantSpiderVampireAngry -# suffix: Angry -# components: -# - type: NpcFactionMember -# factions: -# - SimpleHostile -# - type: InputMover -# - type: MobMover -# - type: HTN -# rootTask: SimpleHostileCompound -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: GhostTakeoverAvailable - - type: entity parent: SimpleMobBase id: MobMouseCancer diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 6490e87ffb1..4e678a29cae 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -23,11 +23,38 @@ - !type:OrganType type: Human shouldHave: false + - !type:SatiateHunger # begin EE + factor: 0.5 + conditions: + - !type:OrganType + type: Vampiric + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Water + amount: 0.15 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Protein + amount: 0.125 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Omnizine + amount: 0.2 # end EE Food: effects: - !type:AdjustReagent reagent: UncookedAnimalProteins amount: 0.1 + conditions: # begin EE + - !type:OrganType + type: Vampiric + shouldHave: false # end EE Medicine: effects: - !type:HealthChange diff --git a/Resources/Prototypes/_DV/Chemistry/metabolizer_types.yml b/Resources/Prototypes/_DV/Chemistry/metabolizer_types.yml new file mode 100644 index 00000000000..4beba1f92f7 --- /dev/null +++ b/Resources/Prototypes/_DV/Chemistry/metabolizer_types.yml @@ -0,0 +1,3 @@ +- type: metabolizerType + id: Vampiric + name: metabolizer-type-vampiric diff --git a/Resources/Prototypes/_DV/Damage/modifier_sets.yml b/Resources/Prototypes/_DV/Damage/modifier_sets.yml index a9a5eff4900..32d5e55208f 100644 --- a/Resources/Prototypes/_DV/Damage/modifier_sets.yml +++ b/Resources/Prototypes/_DV/Damage/modifier_sets.yml @@ -39,3 +39,15 @@ Cold: 1.1 Shock: 1.15 Radiation: 0.2 + +- type: damageModifierSet + id: Arachne + coefficients: + Cold: 0.5 + Blunt: 0.9 + Slash: 0.8 + Piercing: 0.8 + Heat: 1.25 + Radiation: 1.25 + flatReductions: + Cold: 3 diff --git a/Resources/Prototypes/_DV/Entities/Body/Mechanisms/vampiric.yml b/Resources/Prototypes/_DV/Entities/Body/Mechanisms/vampiric.yml new file mode 100644 index 00000000000..e0b08c6d64d --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Body/Mechanisms/vampiric.yml @@ -0,0 +1,22 @@ +- type: entity + id: OrganVampiricHumanoidStomach + parent: OrganHumanStomach + components: + - type: Metabolizer + # mm yummy + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink + +- type: entity + id: OrganVampiricStomach + parent: OrganAnimalStomach + components: + - type: Metabolizer + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml b/Resources/Prototypes/_DV/Entities/Body/Parts/spider.yml similarity index 60% rename from Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml rename to Resources/Prototypes/_DV/Entities/Body/Parts/spider.yml index a900f7524e7..4970f843ad2 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml +++ b/Resources/Prototypes/_DV/Entities/Body/Parts/spider.yml @@ -5,7 +5,7 @@ abstract: true components: - type: Damageable - damageContainer: Biological + damageContainer: OrganicPart - type: BodyPart - type: ContainerContainer containers: @@ -15,7 +15,7 @@ price: 100 - type: Tag tags: - - Trash + - Trash - type: Extractable juiceSolution: reagents: @@ -24,13 +24,38 @@ - ReagentId: DemonsBlood Quantity: 10 +- type: entity + id: ThoraxSpider + name: "spider thorax" #for arachne, actual spiders should get a cephalothorax that combines with head. + parent: PartSpider + components: + - type: Sprite + sprite: Mobs/Species/Moth/parts.rsi # placeholder sprite + state: "torso_m" + - type: Icon + sprite: Mobs/Species/Moth/parts.rsi + state: "torso_m" + - type: BodyPart #"Other" type + slotId: thorax + - type: ContainerContainer + containers: + bodypart: !type:Container + ents: [ ] + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 10 + - ReagentId: DemonsBlood + Quantity: 20 + - type: entity id: RightLegSpider name: "right spider leg" parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi @@ -48,7 +73,7 @@ parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi diff --git a/Resources/Prototypes/_DV/Entities/Body/Prototypes/arachne.yml b/Resources/Prototypes/_DV/Entities/Body/Prototypes/arachne.yml new file mode 100644 index 00000000000..cbcd4e97856 --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Body/Prototypes/arachne.yml @@ -0,0 +1,65 @@ +- type: body + id: Arachne + name: "arachne" + root: torso + slots: + head: + part: HeadHuman + connections: + - torso + organs: + brain: OrganHumanBrain + eyes: OrganHumanEyes + torso: + part: TorsoHuman + connections: + - left arm + - right arm + - thorax + - head + organs: + heart: OrganHumanHeart + lungs: OrganHumanLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganHumanLiver + kidneys: OrganHumanKidneys + right arm: + part: RightArmHuman + connections: + - right hand + left arm: + part: LeftArmHuman + connections: + - left hand + right hand: + part: RightHandHuman + left hand: + part: LeftHandHuman + thorax: + part: ThoraxSpider + connections: + # The slots needs to start with (symmetry) (part) or they're not gonna be registered + - left leg (fore) + - left leg (second) + - left leg (third) + - left leg (hind) + - right leg (fore) + - right leg (second) + - right leg (third) + - right leg (hind) + left leg (fore): + part: LeftLegSpider + left leg (second): + part: LeftLegSpider + left leg (third): + part: LeftLegSpider + left leg (hind): + part: LeftLegSpider + right leg (fore): + part: RightLegSpider + right leg (second): + part: RightLegSpider + right leg (third): + part: RightLegSpider + right leg (hind): + part: RightLegSpider diff --git a/Resources/Prototypes/_DV/Entities/Body/Prototypes/vampiricanimal.yml b/Resources/Prototypes/_DV/Entities/Body/Prototypes/vampiricanimal.yml new file mode 100644 index 00000000000..c0065ec664e --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Body/Prototypes/vampiricanimal.yml @@ -0,0 +1,43 @@ +- type: body + id: VampiricAnimal + name: "vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal + +- type: body + id: VampiricAnimalLarge + name: "large vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/_DV/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/_DV/Entities/Clothing/OuterClothing/armor.yml index b75dd976ea9..fe1ef1dd4a0 100644 --- a/Resources/Prototypes/_DV/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/_DV/Entities/Clothing/OuterClothing/armor.yml @@ -82,3 +82,4 @@ tags: - BorgSecurityArmour - WhitelistChameleon # Inherited from Parent + - Hardsuit # this is not a hardsuit but we dont want arachne using it diff --git a/Resources/Prototypes/_DV/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/_DV/Entities/Markers/Spawners/ghost_roles.yml index 6bff35e65e5..c949a4e3883 100644 --- a/Resources/Prototypes/_DV/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/_DV/Entities/Markers/Spawners/ghost_roles.yml @@ -123,3 +123,20 @@ - !type:RoleTimeRequirement role: JobChemist time: 7200 # 2h chemist so you know how to make CH + +- type: entity + categories: [ HideSpawnMenu, Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostOneirophage + components: + - type: GhostRole + name: ghost-role-information-oneirophage-name + description: ghost-role-information-oneirophage-description + rules: ghost-role-information-oneirophage-rules + mindRoles: + - MindRoleOneirophage + requirements: # keep in sync with the antag prototype + - !type:OverallPlaytimeRequirement + time: 86400 # 24h so you probably know some general lore or something + - type: GhostRoleMobSpawner + prototype: MobOneirophage diff --git a/Resources/Prototypes/_DV/Entities/Mobs/Customization/Markings/makeup.yml b/Resources/Prototypes/_DV/Entities/Mobs/Customization/Markings/makeup.yml index f5f83ca4224..ef940ad5f69 100644 --- a/Resources/Prototypes/_DV/Entities/Mobs/Customization/Markings/makeup.yml +++ b/Resources/Prototypes/_DV/Entities/Mobs/Customization/Markings/makeup.yml @@ -2,7 +2,7 @@ id: MakeupLips bodyPart: Head markingCategory: Head - speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy, Arachne] # Delta V - Felinid, Oni, Harpy coloring: default: type: diff --git a/Resources/Prototypes/_DV/Entities/Mobs/NPCs/glimmer_creatures.yml b/Resources/Prototypes/_DV/Entities/Mobs/NPCs/glimmer_creatures.yml index b4ed2df261b..c3f7223a1b3 100644 --- a/Resources/Prototypes/_DV/Entities/Mobs/NPCs/glimmer_creatures.yml +++ b/Resources/Prototypes/_DV/Entities/Mobs/NPCs/glimmer_creatures.yml @@ -160,3 +160,125 @@ - GlimmerMonster - type: NPCRetaliation attackMemoryLength: 10 + +- type: entity + name: oneirophage + parent: MobGiantSpider + id: MobOneirophage + description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. + components: + - type: GhostRole + makeSentient: true + allowSpeech: true + allowMovement: true + name: ghost-role-information-oneirophage-name + description: ghost-role-information-oneirophage-description + rules: ghost-role-information-oneirophage-rules + - type: GhostTakeoverAvailable + - type: NpcFactionMember + factions: + - SimpleHostile + - type: Sprite + drawdepth: Mobs + layers: + - map: ["enum.DamageStateVisualLayers.Base", "movement"] + state: viper + sprite: Mobs/Animals/spider.rsi + - type: SpriteMovement + movementLayers: + movement: + state: viper-moving + noMovementLayers: + movement: + state: viper + - type: Appearance + - type: DamageStateVisuals + states: + Alive: + Base: viper + Critical: + Base: viper_dead + Dead: + Base: viper_dead + - type: ReplacementAccent + accent: xeno + - type: MobStateActions + actions: + Critical: + - ActionCritSuccumb + - ActionCritFakeDeath + - ActionCritLastWords + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-tarantula + interactFailureString: petting-failure-generic + interactSuccessSpawn: EffectHearts + interactSuccessSound: + path: /Audio/Animals/snake_hiss.ogg + - type: Puller + needsHands: false + - type: Cocooner + cocoonDelay: 8 + - type: SolutionContainerManager + solutions: + melee: + reagents: + - ReagentId: Nocturine + Quantity: 20 + - type: MeleeChemicalInjector + solution: melee + transferAmount: 3.5 + - type: SolutionRegeneration + solution: melee + generated: + reagents: + - ReagentId: Nocturine + Quantity: 0.15 + - type: BloodSucker + unitsToSuck: 35 + injectWhenSuck: true + injectReagent: Cryptobiolin + unitsToInject: 10 + webRequired: true + - type: Bloodstream + bloodReagent: DemonsBlood + - type: Body + prototype: VampiricAnimalLarge + - type: PotentialPsionic + - type: Psionic + removable: false + - type: GlimmerSource + - type: MetapsionicPower + - type: AntiPsionicWeapon + punish: false + modifiers: + coefficients: + Piercing: 2.25 + # - type: Damageable # DeltaV no + # damageContainer: HalfSpirit + # damageModifierSet: HalfSpirit + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - SeeingRainbows + - Electrocution + - Drunk + - SlurredSpeech + - PressureImmunity + - Muted + - ForcedSleep + - TemporaryBlindness + - Pacified + - PsionicsDisabled + - PsionicallyInsulated + - type: Tag + tags: + - Oneirophage + - type: MovementAlwaysTouching + - type: PsionicInvisibleContacts + whitelist: + tags: + - ArachneWeb diff --git a/Resources/Prototypes/_DV/Entities/Mobs/Player/arachne.yml b/Resources/Prototypes/_DV/Entities/Mobs/Player/arachne.yml new file mode 100644 index 00000000000..4391fa33fab --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Mobs/Player/arachne.yml @@ -0,0 +1,29 @@ +- type: entity + save: false + name: Urist McArachne + parent: MobArachneBase + id: MobArachne + components: + - type: CombatMode + - type: MindContainer + showExamineInfo: true + - type: Input + context: "human" + - type: MobMover + - type: InputMover + - type: Respirator + damage: + types: + Asphyxiation: 1.0 + damageRecovery: + types: + Asphyxiation: -1.0 + - type: Alerts + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: NpcFactionMember + factions: + - NanoTrasen diff --git a/Resources/Prototypes/_DV/Entities/Mobs/Species/arachne.yml b/Resources/Prototypes/_DV/Entities/Mobs/Species/arachne.yml new file mode 100644 index 00000000000..d02cb49d60a --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Mobs/Species/arachne.yml @@ -0,0 +1,243 @@ +- type: entity + save: false + name: Urist McArachne + parent: BaseMobHuman + id: MobArachneBase + abstract: true + components: + - type: Sprite + # Arachne are one of the species that needs a manual visual layers setup. + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: _DV/Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: _DV/Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: _DV/Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: _EE/Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair"] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: _EE/Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - map: [ "clownedon" ] # Dynamically generated + sprite: "Effects/creampie.rsi" + state: "creampie_human" + visible: false + - type: HumanoidAppearance + species: Arachne + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.40 + density: 140 + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Body + prototype: Arachne + requiredLegs: 8 + - type: Speech + speechSounds: Alto + - type: Damageable + damageContainer: Biological + damageModifierSet: Arachne + - type: MeleeWeapon + animation: WeaponArcBite + soundHit: + path: /Audio/Effects/bite.ogg + damage: + types: + Piercing: 5 + - type: Inventory + templateId: arachne + displacements: + jumpsuit: + sizeMaps: + 32: + sprite: _DV/Mobs/Species/Arachne/displacement.rsi + state: jumpsuit + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - type: Bloodstream + bloodReagent: DemonsBlood + - type: BloodSucker + webRequired: true + - type: Cocooner + - type: DamageVisuals + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.RArm" + - type: MovedByPressure + pressureResistance: 4 + - type: Barotrauma + damage: + types: + Blunt: 0.05 #per second, scales with pressure and other constants. Reduced Damage. This allows medicine to heal faster than damage. + - type: MovementAlwaysTouching + - type: FireVisuals + sprite: Mobs/Effects/onfire.rsi + normalState: Generic_mob_burning + alternateState: arachne_standing + fireStackAlternateState: 3 + - type: Spider + - type: IgnoreSpiderWeb + - type: FootPrints + leftBarePrint: "footprint-left-bare-spider" + rightBarePrint: "footprint-right-bare-spider" + +- type: entity + save: false + name: Urist McArachne + parent: MobHumanDummy + id: MobArachneDummy + categories: [ HideSpawnMenu ] + description: A dummy arachne meant to be used in character setup. + components: + - type: Sprite + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: _DV/Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: _DV/Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: _DV/Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: _EE/Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: _EE/Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - type: Inventory + templateId: arachne + displacements: + jumpsuit: + sizeMaps: + 32: + sprite: _DV/Mobs/Species/Arachne/displacement.rsi + state: jumpsuit + - type: HumanoidAppearance + species: Arachne diff --git a/Resources/Prototypes/_DV/Entities/Structures/Webbing/webs.yml b/Resources/Prototypes/_DV/Entities/Structures/Webbing/webs.yml new file mode 100644 index 00000000000..67b76ba1e73 --- /dev/null +++ b/Resources/Prototypes/_DV/Entities/Structures/Webbing/webs.yml @@ -0,0 +1,93 @@ +- type: entity + id: CocoonedHumanoid + name: cocooned humanoid + description: Unlucky. + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: _DV/Structures/cocoon.rsi + state: cocoon_large1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon_large1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon_large2: "" + - enum.DamageStateVisualLayers.Base: + cocoon_large3: "" + - type: Cocoon + - type: Clickable + - type: InteractionOutline + - type: Transform + noRot: true + - type: Damageable + damageModifierSet: Web + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 40 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.4,0.25,0.1" + density: 20 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: Physics + bodyType: Dynamic + - type: Pullable + - type: AntiRottingContainer + - type: ItemSlots + slots: + body_slot: + name: Body + locked: true + ejectOnBreak: true + - type: Butcherable + butcheringType: Knife + butcherDelay: 12 + spawned: + - id: MaterialWebSilk1 + amount: 1 + prob: 0.5 #This doesn't cost hunger so should at least make it not worth it time-wise + - type: Appearance + - type: ContainerContainer + containers: + body_slot: !type:ContainerSlot + +- type: entity + id: CocoonSmall + parent: CocoonedHumanoid + name: cocoon + description: What could be inside...? + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: _DV/Structures/cocoon.rsi + state: cocoon1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon2: "" + - enum.DamageStateVisualLayers.Base: + cocoon3: "" diff --git a/Resources/Prototypes/_DV/GameRules/events.yml b/Resources/Prototypes/_DV/GameRules/events.yml index 3ba78e31290..18700406564 100644 --- a/Resources/Prototypes/_DV/GameRules/events.yml +++ b/Resources/Prototypes/_DV/GameRules/events.yml @@ -12,6 +12,7 @@ - id: Fugitive - id: ListeningPost - id: ParadoxAnomaly + - id: Oneirophage #- id: RatKingSpawn # Replaces upstream meteor events until they're good @@ -210,3 +211,21 @@ sound: /Audio/Effects/clang.ogg mindRoles: - MindRoleFugitive + +- type: entity + parent: BaseMidRoundAntag + id: Oneirophage + components: + - type: StationEvent + duration: null + - type: PrecognitionResult + message: psionic-power-precognition-oneirophage-result-message + - type: AntagSelection + agentName: oneirophage-round-end-name + definitions: + - spawnerPrototype: SpawnPointGhostOneirophage + min: 1 + max: 1 + pickPlayer: false + mindRoles: + - MindRoleOneirophage diff --git a/Resources/Prototypes/_DV/InventoryTemplates/arachne_inventory_template.yml b/Resources/Prototypes/_DV/InventoryTemplates/arachne_inventory_template.yml new file mode 100644 index 00000000000..941a9d61309 --- /dev/null +++ b/Resources/Prototypes/_DV/InventoryTemplates/arachne_inventory_template.yml @@ -0,0 +1,121 @@ +#human but no shoes or full body +- type: inventoryTemplate + id: arachne + slots: + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 6 + uiWindowPos: 0,1 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + stripTime: 6 + uiWindowPos: 1,1 + strippingWindowPos: 1,2 + displayName: Suit + blacklist: + tags: + - Hardsuit + - SuitEVA + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,1 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,2 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,2 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 3 + uiWindowPos: 2,2 + strippingWindowPos: 2,0 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,3 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + fullTextureName: template_small + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,4 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + fullTextureName: template_small + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,3 + strippingWindowPos: 1,4 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,5 + dependsOn: outerClothing + dependsOnComponents: + - type: AllowSuitStorage + displayName: Suit Storage + - name: id + slotTexture: id + fullTextureName: template_small + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + fullTextureName: template_small + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 1,5 + displayName: Belt + - name: back + slotTexture: back + fullTextureName: template_small + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 0,5 + displayName: Back diff --git a/Resources/Prototypes/_DV/Roles/Antags/oneirophage.yml b/Resources/Prototypes/_DV/Roles/Antags/oneirophage.yml new file mode 100644 index 00000000000..8ca3870136b --- /dev/null +++ b/Resources/Prototypes/_DV/Roles/Antags/oneirophage.yml @@ -0,0 +1,9 @@ +- type: antag + id: Oneirophage + name: roles-antag-oneirophage-name + antagonist: true + objective: roles-antag-oneirophage-objective + # keep these in sync with the spawner + requirements: + - !type:OverallPlaytimeRequirement + time: 86400 # 24h so you probably know some general lore or something diff --git a/Resources/Prototypes/_DV/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/_DV/Roles/MindRoles/mind_roles.yml index 78a30855d08..20fc98f6ed4 100644 --- a/Resources/Prototypes/_DV/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/_DV/Roles/MindRoles/mind_roles.yml @@ -53,3 +53,15 @@ - type: SynthesisRole - type: RoleBriefing briefing: synthesis-role-briefing + +- type: entity + parent: BaseMindRoleAntag + id: MindRoleOneirophage + name: Oneirophage Role + components: + - type: MindRole + antagPrototype: Oneirophage + exclusiveAntag: true + - type: OneirophageRole + - type: RoleBriefing + briefing: oneirophage-role-briefing diff --git a/Resources/Prototypes/_DV/Species/arachne.yml b/Resources/Prototypes/_DV/Species/arachne.yml new file mode 100644 index 00000000000..41af08c9400 --- /dev/null +++ b/Resources/Prototypes/_DV/Species/arachne.yml @@ -0,0 +1,56 @@ +- type: species + id: Arachne + name: species-name-arachne + roundStart: true + prototype: MobArachne + sprites: MobArachneSprites + defaultSkinTone: "#c0967f" + markingLimits: MobArachneMarkingLimits + dollPrototype: MobArachneDummy + skinColoration: HumanToned + +- type: markingPoints + id: MobArachneMarkingLimits + points: + Hair: + points: 1 + required: false + FacialHair: + points: 1 + required: false + HeadSide: + points: 3 + required: false + Tail: + points: 1 + required: false + Chest: + points: 1 + required: false + Arms: + points: 2 + required: false + Undershirt: # DeltaV + points: 1 + required: false + +- type: speciesBaseSprites + id: MobArachneSprites + sprites: + Head: MobHumanHead + HeadSide: MobHumanoidAnyMarking + Hair: MobHumanoidAnyMarking + FacialHair: MobHumanoidAnyMarking + Snout: MobHumanoidAnyMarking + Chest: MobHumanTorso + Eyes: MobArachneEyes + LArm: MobHumanLArm + RArm: MobHumanRArm + LHand: MobHumanLHand + RHand: MobHumanRHand + +- type: humanoidBaseSprite + id: MobArachneEyes + baseSprite: + sprite: _DV/Mobs/Species/eyes.rsi + state: eyes diff --git a/Resources/Prototypes/_DV/tags.yml b/Resources/Prototypes/_DV/tags.yml index 76b96a7595e..2439bb8bd76 100644 --- a/Resources/Prototypes/_DV/tags.yml +++ b/Resources/Prototypes/_DV/tags.yml @@ -68,7 +68,7 @@ - type: Tag id: HidesHarpyWings - + - type: Tag id: HudMedicalSecurity #Craftable Corpsman Glasses @@ -107,3 +107,9 @@ - type: Tag id: PermissibleForSurgery # Can be worn on the body during surgery + +- type: Tag # Arachne port + id: ArachneWeb + +- type: Tag # Arachne port + id: Oneirophage diff --git a/Resources/Textures/_DV/Mobs/Species/Arachne/displacement.rsi/jumpsuit.png b/Resources/Textures/_DV/Mobs/Species/Arachne/displacement.rsi/jumpsuit.png new file mode 100644 index 00000000000..ebf250c5b82 Binary files /dev/null and b/Resources/Textures/_DV/Mobs/Species/Arachne/displacement.rsi/jumpsuit.png differ diff --git a/Resources/Textures/_DV/Mobs/Species/Arachne/displacement.rsi/meta.json b/Resources/Textures/_DV/Mobs/Species/Arachne/displacement.rsi/meta.json new file mode 100644 index 00000000000..1fdc62be956 --- /dev/null +++ b/Resources/Textures/_DV/Mobs/Species/Arachne/displacement.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Lyndomen", + "size": { + "x": 32, + "y": 32 + }, + "load": { + "srgb": false + }, + "states": [ + { + "name": "jumpsuit", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_DV/Mobs/Species/arachne.rsi/meta.json b/Resources/Textures/_DV/Mobs/Species/arachne.rsi/meta.json new file mode 100644 index 00000000000..a985b24cca3 --- /dev/null +++ b/Resources/Textures/_DV/Mobs/Species/arachne.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-4.0", + "copyright": "Created by @kes#0001, colored by Woods#1999", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "spider_body", + "directions": 4 + }, + { + "name": "spider_body_front", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_DV/Mobs/Species/arachne.rsi/spider_body.png b/Resources/Textures/_DV/Mobs/Species/arachne.rsi/spider_body.png new file mode 100644 index 00000000000..d1432cc3fd6 Binary files /dev/null and b/Resources/Textures/_DV/Mobs/Species/arachne.rsi/spider_body.png differ diff --git a/Resources/Textures/_DV/Mobs/Species/arachne.rsi/spider_body_front.png b/Resources/Textures/_DV/Mobs/Species/arachne.rsi/spider_body_front.png new file mode 100644 index 00000000000..0171f16fe38 Binary files /dev/null and b/Resources/Textures/_DV/Mobs/Species/arachne.rsi/spider_body_front.png differ diff --git a/Resources/Textures/_DV/Mobs/Species/eyes.rsi/eyes.png b/Resources/Textures/_DV/Mobs/Species/eyes.rsi/eyes.png new file mode 100644 index 00000000000..b6250e22b38 Binary files /dev/null and b/Resources/Textures/_DV/Mobs/Species/eyes.rsi/eyes.png differ diff --git a/Resources/Textures/_DV/Mobs/Species/eyes.rsi/meta.json b/Resources/Textures/_DV/Mobs/Species/eyes.rsi/meta.json new file mode 100644 index 00000000000..a98aba406f1 --- /dev/null +++ b/Resources/Textures/_DV/Mobs/Species/eyes.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by @Rane#7518", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "eyes", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon1.png b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon1.png new file mode 100644 index 00000000000..27741fdf314 Binary files /dev/null and b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon1.png differ diff --git a/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon2.png b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon2.png new file mode 100644 index 00000000000..252be2398af Binary files /dev/null and b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon2.png differ diff --git a/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon3.png b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon3.png new file mode 100644 index 00000000000..ca9cbb79bbe Binary files /dev/null and b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon3.png differ diff --git a/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large1.png b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large1.png new file mode 100644 index 00000000000..f9431f64285 Binary files /dev/null and b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large1.png differ diff --git a/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large2.png b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large2.png new file mode 100644 index 00000000000..885bb7b3c93 Binary files /dev/null and b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large2.png differ diff --git a/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large3.png b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large3.png new file mode 100644 index 00000000000..9a033961ffa Binary files /dev/null and b/Resources/Textures/_DV/Structures/cocoon.rsi/cocoon_large3.png differ diff --git a/Resources/Textures/_DV/Structures/cocoon.rsi/meta.json b/Resources/Textures/_DV/Structures/cocoon.rsi/meta.json new file mode 100644 index 00000000000..08cfb264df9 --- /dev/null +++ b/Resources/Textures/_DV/Structures/cocoon.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "copyright" : "Taken from https://github.com/tgstation/tgstation", + "license" : "CC-BY-SA-3.0", + "size" : { + "x" : 32, + "y" : 32 + }, + "states" : [ + { + "directions" : 1, + "name" : "cocoon1" + }, + { + "directions" : 1, + "name" : "cocoon2" + }, + { + "directions" : 1, + "name" : "cocoon3" + }, + { + "directions" : 1, + "name" : "cocoon_large1" + }, + { + "directions" : 1, + "name" : "cocoon_large2" + }, + { + "directions" : 1, + "name" : "cocoon_large3" + } + ], + "version" : 1 +} diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png new file mode 100644 index 00000000000..acb96562e73 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png new file mode 100644 index 00000000000..acb96562e73 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/full.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json new file mode 100644 index 00000000000..b44be570c4f --- /dev/null +++ b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "copyright": "Rane", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "female_none", + "directions": 4 + }, + { + "name": "female_full", + "directions": 4 + }, + { + "name": "female_top", + "directions": 4 + }, + { + "name": "male_none", + "directions": 4 + }, + { + "name": "male_full", + "directions": 4 + }, + { + "name": "male_top", + "directions": 4 + }, + { + "name": "full", + "directions": 4 + }, + { + "name": "none", + "directions": 4 + }, + { + "name": "top", + "directions": 4 + }, + { + "name": "unisex_full", + "directions": 4 + }, + { + "name": "unisex_none", + "directions": 4 + }, + { + "name": "unisex_top", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/none.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/top.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_full.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_full.png new file mode 100644 index 00000000000..cd5127bc90d Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_none.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_none.png new file mode 100644 index 00000000000..44e0c1358d8 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_top.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_top.png new file mode 100644 index 00000000000..126c9cb8299 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/female_top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/full.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/full.png new file mode 100644 index 00000000000..f78008f58a2 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_full.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_full.png new file mode 100644 index 00000000000..f78008f58a2 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_none.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_none.png new file mode 100644 index 00000000000..44e0c1358d8 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_top.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_top.png new file mode 100644 index 00000000000..a96eb3c2945 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/male_top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/meta.json new file mode 100644 index 00000000000..090804c6e80 --- /dev/null +++ b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "size": { "x": 32, "y": 32 }, + "license": "CC-BY-SA-3.0", + "copyright": "Discord PJB#3005", + "states": [ + { + "name": "female_full", + "directions": 4 + }, + { + "name": "female_none", + "directions": 1 + }, + { + "name": "female_top", + "directions": 4 + }, + { + "name": "male_full", + "directions": 4 + }, + { + "name": "male_none", + "directions": 1 + }, + { + "name": "male_top", + "directions": 4 + }, + { + "name": "unisex_full", + "directions": 4 + }, + { + "name": "unisex_none", + "directions": 1 + }, + { + "name": "unisex_top", + "directions": 4 + }, + { + "name": "full", + "directions": 4 + }, + { + "name": "none", + "directions": 1 + }, + { + "name": "top", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/none.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/none.png new file mode 100644 index 00000000000..6e3cb09bcf7 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/top.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/top.png new file mode 100644 index 00000000000..f78008f58a2 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_full.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_full.png new file mode 100644 index 00000000000..1b69c04a7a3 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_full.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_none.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_none.png new file mode 100644 index 00000000000..44e0c1358d8 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_none.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_top.png b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_top.png new file mode 100644 index 00000000000..44e0c1358d8 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/masking_helpers.rsi/unisex_top.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/spidereyes.rsi/eyes.png b/Resources/Textures/_EE/Mobs/Customization/spidereyes.rsi/eyes.png new file mode 100644 index 00000000000..0f253476944 Binary files /dev/null and b/Resources/Textures/_EE/Mobs/Customization/spidereyes.rsi/eyes.png differ diff --git a/Resources/Textures/_EE/Mobs/Customization/spidereyes.rsi/meta.json b/Resources/Textures/_EE/Mobs/Customization/spidereyes.rsi/meta.json new file mode 100644 index 00000000000..0eb61ec1dde --- /dev/null +++ b/Resources/Textures/_EE/Mobs/Customization/spidereyes.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "copyright" : "@Rane#7518", + "license" : "CC-BY-SA-3.0", + "size" : { + "x" : 32, + "y" : 32 + }, + "states" : [ + { + "directions" : 4, + "name" : "eyes" + } + ], + "version" : 1 +}