From 0b5712ce9702d1ac42ccfe7ee94d520f07d408a4 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Fri, 7 Mar 2025 14:52:43 +0300 Subject: [PATCH] Vampire antag (#988) * new blood types * vampire systems setup * death under sun * vampire blood nutrition * alerts * autolearn skills * base bite actions * suck blood spell * polish * Update blood.yml * unshitcode * vampire hunger visual * nerf speed * hypnosis + map update * darkness demiplane warning --- .../Vampire/CP14ClientVampireVisualsSystem.cs | 31 + .../Systems/AdminVerbSystem.Antags.cs | 21 + .../Rules/CP14VampireRuleSystem.cs | 97 + .../Components/CP14VampireRuleComponent.cs | 7 + .../CP14AutoLearnActionComponent.cs | 10 + .../_CP14/MagicSpell/CP14MagicSystem.cs | 13 + .../_CP14/Roles/CP14VampireRoleComponent.cs | 11 + .../_CP14/Vampire/CP14VampireComponent.cs | 29 + .../_CP14/Vampire/CP14VampireVisualsSystem.cs | 7 + .../Nutrition/EntitySystems/HungerSystem.cs | 12 + .../MagicSpell/Spells/CP14SpellSuckBlood.cs | 30 + .../Vampire/CP14SharedVampireVisualsSystem.cs | 43 + .../Vampire/CP14VampireVisualsComponent.cs | 16 + .../Audio/_CP14/Effects/attributions.yml | 6 +- .../Audio/_CP14/Effects/vampire_bite.ogg | Bin 0 -> 22269 bytes .../en-US/_CP14/administration/antag.ftl | 2 + Resources/Locale/en-US/_CP14/antag/antags.ftl | 3 + .../en-US/_CP14/demiplane/modifiers.ftl | 3 +- .../reagents/meta/thaumaturgy/precurser.ftl | 6 + .../Locale/en-US/_CP14/vampire/vampire.ftl | 3 + .../ru-RU/_CP14/administration/antag.ftl | 2 + Resources/Locale/ru-RU/_CP14/antag/antags.ftl | 3 + .../ru-RU/_CP14/demiplane/modifiers.ftl | 3 +- .../reagents/meta/thaumaturgy/precurser.ftl | 6 + .../Locale/ru-RU/_CP14/vampire/vampire.ftl | 3 + Resources/Maps/_CP14/comoss.yml | 1139 ++++-- Resources/Maps/_CP14/comoss_d.yml | 3540 +++++++++-------- Resources/Maps/_CP14/dev_map.yml | 1 + .../Reagents/Consumable/Food/food.yml | 15 + Resources/Prototypes/_CP14/Alerts/alerts.yml | 20 +- .../_CP14/Chemistry/metabolizer_types.yml | 4 + .../Actions/Spells/Life/T0_plant_growth.yml | 4 + .../Actions/Spells/Vampire/T0_Bite.yml | 62 + .../Actions/Spells/Vampire/T1_Hypnosis.yml | 71 + .../_CP14/Entities/Mobs/NPC/animals.yml | 10 +- .../_CP14/Entities/Mobs/NPC/dinosaurs.yml | 2 +- .../Entities/Mobs/NPC/invisible_whistler.yml | 2 +- .../_CP14/Entities/Mobs/NPC/mole.yml | 2 +- .../_CP14/Entities/Mobs/Species/base.yml | 4 + .../_CP14/Entities/Mobs/Species/goblin.yml | 54 +- .../_CP14/Entities/Mobs/Species/silva.yml | 4 + .../_CP14/Entities/Mobs/Species/skeleton.yml | 4 + .../_CP14/Entities/Mobs/Species/zombie.yml | 4 + .../Prototypes/_CP14/GameRules/roundstart.yml | 9 + .../_CP14/GameRules/subgamemodes.yml | 48 + .../_CP14/Loadouts/antag_loadouts.yml | 4 + .../Demiplane/Modifiers/MapLight/mapLight.yml | 5 + Resources/Prototypes/_CP14/Reagents/blood.yml | 156 +- .../_CP14/Reagents/target_effects.yml | 4 + .../Thaumaturgy/Precursor/blood_flower.yml | 15 +- .../Prototypes/_CP14/Roles/Antags/vampire.yml | 10 + .../_CP14/Roles/MindRoles/mind_roles.yml | 14 + Resources/Prototypes/_CP14/game_presets.yml | 3 +- .../_CP14/Actions/Spells/vampire.rsi/bite.png | Bin 0 -> 489 bytes .../Actions/Spells/vampire.rsi/blood_moon.png | Bin 0 -> 457 bytes .../Actions/Spells/vampire.rsi/meta.json | 17 + .../Alerts/vampire_hunger.rsi/meta.json | 30 + .../Alerts/vampire_hunger.rsi/peckish.png | Bin 0 -> 559 bytes .../Alerts/vampire_hunger.rsi/starving.png | Bin 0 -> 860 bytes .../Mobs/Species/Vampire/fangs.rsi/goblin.png | Bin 0 -> 149 bytes .../Mobs/Species/Vampire/fangs.rsi/human.png | Bin 0 -> 148 bytes .../Mobs/Species/Vampire/fangs.rsi/meta.json | 19 + 62 files changed, 3640 insertions(+), 2003 deletions(-) create mode 100644 Content.Client/_CP14/Vampire/CP14ClientVampireVisualsSystem.cs create mode 100644 Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs create mode 100644 Content.Server/_CP14/GameTicking/Rules/Components/CP14VampireRuleComponent.cs create mode 100644 Content.Server/_CP14/MagicSpell/CP14AutoLearnActionComponent.cs create mode 100644 Content.Server/_CP14/Roles/CP14VampireRoleComponent.cs create mode 100644 Content.Server/_CP14/Vampire/CP14VampireComponent.cs create mode 100644 Content.Server/_CP14/Vampire/CP14VampireVisualsSystem.cs create mode 100644 Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSuckBlood.cs create mode 100644 Content.Shared/_CP14/Vampire/CP14SharedVampireVisualsSystem.cs create mode 100644 Content.Shared/_CP14/Vampire/CP14VampireVisualsComponent.cs create mode 100644 Resources/Audio/_CP14/Effects/vampire_bite.ogg create mode 100644 Resources/Locale/en-US/_CP14/administration/antag.ftl create mode 100644 Resources/Locale/en-US/_CP14/antag/antags.ftl create mode 100644 Resources/Locale/en-US/_CP14/vampire/vampire.ftl create mode 100644 Resources/Locale/ru-RU/_CP14/administration/antag.ftl create mode 100644 Resources/Locale/ru-RU/_CP14/antag/antags.ftl create mode 100644 Resources/Locale/ru-RU/_CP14/vampire/vampire.ftl create mode 100644 Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T0_Bite.yml create mode 100644 Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T1_Hypnosis.yml create mode 100644 Resources/Prototypes/_CP14/GameRules/subgamemodes.yml create mode 100644 Resources/Prototypes/_CP14/Loadouts/antag_loadouts.yml create mode 100644 Resources/Prototypes/_CP14/Roles/Antags/vampire.yml create mode 100644 Resources/Textures/_CP14/Actions/Spells/vampire.rsi/bite.png create mode 100644 Resources/Textures/_CP14/Actions/Spells/vampire.rsi/blood_moon.png create mode 100644 Resources/Textures/_CP14/Actions/Spells/vampire.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Interface/Alerts/vampire_hunger.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Interface/Alerts/vampire_hunger.rsi/peckish.png create mode 100644 Resources/Textures/_CP14/Interface/Alerts/vampire_hunger.rsi/starving.png create mode 100644 Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/goblin.png create mode 100644 Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/human.png create mode 100644 Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json diff --git a/Content.Client/_CP14/Vampire/CP14ClientVampireVisualsSystem.cs b/Content.Client/_CP14/Vampire/CP14ClientVampireVisualsSystem.cs new file mode 100644 index 0000000000..574cd73ff7 --- /dev/null +++ b/Content.Client/_CP14/Vampire/CP14ClientVampireVisualsSystem.cs @@ -0,0 +1,31 @@ +using Content.Shared._CP14.Vampire; +using Content.Shared.Humanoid; +using Robust.Client.GameObjects; + +namespace Content.Client._CP14.Vampire; + +public sealed class CP14ClientVampireVisualsSystem : CP14SharedVampireVisualsSystem +{ + protected override void OnVampireVisualsInit(Entity vampire, ref ComponentInit args) + { + base.OnVampireVisualsInit(vampire, ref args); + + if (!EntityManager.TryGetComponent(vampire, out SpriteComponent? sprite)) + return; + + if (sprite.LayerMapTryGet(vampire.Comp.FangsMap, out var fangsLayerIndex)) + sprite.LayerSetVisible(fangsLayerIndex, true); + + } + + protected override void OnVampireVisualsShutdown(Entity vampire, ref ComponentShutdown args) + { + base.OnVampireVisualsShutdown(vampire, ref args); + + if (!EntityManager.TryGetComponent(vampire, out SpriteComponent? sprite)) + return; + + if (sprite.LayerMapTryGet(vampire.Comp.FangsMap, out var fangsLayerIndex)) + sprite.LayerSetVisible(fangsLayerIndex, false); + } +} diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index c69c865d84..48781a703e 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -1,3 +1,4 @@ +using Content.Server._CP14.GameTicking.Rules.Components; using Content.Server.Administration.Commands; using Content.Server.Antag; using Content.Server.GameTicking.Rules.Components; @@ -36,6 +37,11 @@ public sealed partial class AdminVerbSystem [ValidatePrototypeId] private const string PirateGearId = "PirateGear"; + //CP14 + [ValidatePrototypeId] + private const string CP14VampireRule = "CP14Vampire"; + //CP14 end + // All antag verbs have names so invokeverb works. private void AddAntagVerbs(GetVerbsEvent args) { @@ -52,6 +58,21 @@ public sealed partial class AdminVerbSystem var targetPlayer = targetActor.PlayerSession; + Verb vampire = new() + { + Text = Loc.GetString("cp14-admin-verb-text-make-vampire"), + Category = VerbCategory.Antag, + Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/_CP14/Actions/Spells/vampire.rsi"), + "bite"), + Act = () => + { + _antag.ForceMakeAntag(targetPlayer, CP14VampireRule); + }, + Impact = LogImpact.High, + Message = Loc.GetString("cp14-admin-verb-make-vampire"), + }; + args.Verbs.Add(vampire); + /* CP14 disable default antags Verb traitor = new() { diff --git a/Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs b/Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs new file mode 100644 index 0000000000..a723067ecd --- /dev/null +++ b/Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs @@ -0,0 +1,97 @@ +using Content.Server._CP14.DayCycle; +using Content.Server._CP14.GameTicking.Rules.Components; +using Content.Server._CP14.Vampire; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Server.GameTicking.Rules; +using Content.Server.Temperature.Components; +using Content.Server.Temperature.Systems; +using Content.Shared._CP14.Vampire; +using Content.Shared.Nutrition.Components; +using Content.Shared.Nutrition.EntitySystems; +using Content.Shared.Popups; +using Robust.Shared.Timing; + +namespace Content.Server._CP14.GameTicking.Rules; + +public sealed class CP14VampireRuleSystem : GameRuleSystem +{ + [Dependency] private readonly BloodstreamSystem _bloodstream = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly TemperatureSystem _temperature = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly CP14DayCycleSystem _dayCycle = default!; + [Dependency] private readonly FlammableSystem _flammable = default!; + [Dependency] private readonly BodySystem _body = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnVampireInit); + SubscribeLocalEvent(OnVampireHungerChanged); + } + + private void OnVampireHungerChanged(Entity ent, ref CP14HungerChangedEvent args) + { + if (args.NewThreshold == HungerThreshold.Starving || args.NewThreshold == HungerThreshold.Dead) + { + RevealVampire(ent); + } + else + { + HideVampire(ent); + } + } + + private void RevealVampire(Entity ent) + { + EnsureComp(ent); + } + + private void HideVampire(Entity ent) + { + RemCompDeferred(ent); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var vampire, out var temperature, out var flammable)) + { + if (_timing.CurTime < vampire.NextHeatTime) + continue; + + vampire.NextHeatTime = _timing.CurTime + vampire.HeatFrequency; + + if (!_dayCycle.TryDaylightThere(uid)) + continue; + + _temperature.ChangeHeat(uid, vampire.HeatUnderSunTemperature); + _popup.PopupEntity(Loc.GetString("cp14-heat-under-sun"), uid, uid, PopupType.SmallCaution); + + if (temperature.CurrentTemperature > vampire.IgniteThreshold && !flammable.OnFire) + { + _flammable.AdjustFireStacks(uid, 1, flammable); + _flammable.Ignite(uid, uid, flammable); + } + } + } + + private void OnVampireInit(Entity ent, ref MapInitEvent args) + { + _bloodstream.ChangeBloodReagent(ent, ent.Comp.NewBloodReagent); + + foreach (var (organUid, _) in _body.GetBodyOrgans(ent)) + { + if (TryComp(organUid, out var metabolizer) && metabolizer.MetabolizerTypes is not null) + { + metabolizer.MetabolizerTypes.Add(ent.Comp.MetabolizerType); + } + } + } +} diff --git a/Content.Server/_CP14/GameTicking/Rules/Components/CP14VampireRuleComponent.cs b/Content.Server/_CP14/GameTicking/Rules/Components/CP14VampireRuleComponent.cs new file mode 100644 index 0000000000..b7ed3b81ac --- /dev/null +++ b/Content.Server/_CP14/GameTicking/Rules/Components/CP14VampireRuleComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server._CP14.GameTicking.Rules.Components; + +/// +/// Stores data for . +/// +[RegisterComponent, Access(typeof(CP14VampireRuleSystem))] +public sealed partial class CP14VampireRuleComponent : Component; diff --git a/Content.Server/_CP14/MagicSpell/CP14AutoLearnActionComponent.cs b/Content.Server/_CP14/MagicSpell/CP14AutoLearnActionComponent.cs new file mode 100644 index 0000000000..9534ba2184 --- /dev/null +++ b/Content.Server/_CP14/MagicSpell/CP14AutoLearnActionComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server._CP14.MagicSpell; + +[RegisterComponent] +public sealed partial class CP14AutoLearnActionComponent : Component +{ + [DataField(required: true)] + public HashSet Actions = new(); +} diff --git a/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs b/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs index ca84aceabd..055b444e06 100644 --- a/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs +++ b/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs @@ -7,6 +7,7 @@ using Content.Shared._CP14.MagicSpell; using Content.Shared._CP14.MagicSpell.Components; using Content.Shared._CP14.MagicSpell.Events; using Content.Shared._CP14.MagicSpell.Spells; +using Content.Shared.Actions; using Content.Shared.FixedPoint; using Content.Shared.Projectiles; using Content.Shared.Throwing; @@ -25,6 +26,7 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedActionsSystem _action = default!; public override void Initialize() { @@ -43,6 +45,17 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem SubscribeLocalEvent(OnManaConsume); SubscribeLocalEvent(OnMusicCheck); + + SubscribeLocalEvent(OnAutoLearnAction); + } + + private void OnAutoLearnAction(Entity ent, ref MapInitEvent args) + { + foreach (var action in ent.Comp.Actions) + { + _action.AddAction(ent, action); + } + RemCompDeferred(ent); } private void OnProjectileHit(Entity ent, ref ThrowDoHitEvent args) diff --git a/Content.Server/_CP14/Roles/CP14VampireRoleComponent.cs b/Content.Server/_CP14/Roles/CP14VampireRoleComponent.cs new file mode 100644 index 0000000000..a0f3e25eb9 --- /dev/null +++ b/Content.Server/_CP14/Roles/CP14VampireRoleComponent.cs @@ -0,0 +1,11 @@ +using Content.Shared.Roles; + +namespace Content.Server._CP14.Roles; + +/// +/// Added to mind role entities to tag that they are a Vampire. +/// +[RegisterComponent] +public sealed partial class CP14VampireRoleComponent : BaseMindRoleComponent +{ +} diff --git a/Content.Server/_CP14/Vampire/CP14VampireComponent.cs b/Content.Server/_CP14/Vampire/CP14VampireComponent.cs new file mode 100644 index 0000000000..d427eed368 --- /dev/null +++ b/Content.Server/_CP14/Vampire/CP14VampireComponent.cs @@ -0,0 +1,29 @@ +using Content.Server._CP14.GameTicking.Rules; +using Content.Shared.Body.Prototypes; +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.Prototypes; + +namespace Content.Server._CP14.Vampire; + +[RegisterComponent] +[Access(typeof(CP14VampireRuleSystem))] +public sealed partial class CP14VampireComponent : Component +{ + [DataField] + public ProtoId NewBloodReagent = "CP14BloodVampire"; + + [DataField] + public ProtoId MetabolizerType = "CP14Vampire"; + + [DataField] + public float HeatUnderSunTemperature = 12000f; + + [DataField] + public TimeSpan HeatFrequency = TimeSpan.FromSeconds(1); + + [DataField] + public TimeSpan NextHeatTime = TimeSpan.Zero; + + [DataField] + public float IgniteThreshold = 350f; +} diff --git a/Content.Server/_CP14/Vampire/CP14VampireVisualsSystem.cs b/Content.Server/_CP14/Vampire/CP14VampireVisualsSystem.cs new file mode 100644 index 0000000000..6b225e2072 --- /dev/null +++ b/Content.Server/_CP14/Vampire/CP14VampireVisualsSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared._CP14.Vampire; + +namespace Content.Server._CP14.Vampire; + +public sealed class CP14VampireVisualsSystem : CP14SharedVampireVisualsSystem +{ +} diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index a8697ffee4..d70a67610c 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -134,6 +134,11 @@ public sealed class HungerSystem : EntitySystem if (calculatedHungerThreshold == component.CurrentThreshold) return; + //CP14 Raise hunger event for vampire + var ev = new CP14HungerChangedEvent(component.CurrentThreshold, calculatedHungerThreshold); + RaiseLocalEvent(uid, ev); + //CP14 Raise hunger event for vampire end + component.CurrentThreshold = calculatedHungerThreshold; DoHungerThresholdEffects(uid, component); } @@ -277,3 +282,10 @@ public sealed class HungerSystem : EntitySystem } } } + + +public sealed class CP14HungerChangedEvent(HungerThreshold oldThreshold, HungerThreshold newThreshold) : EntityEventArgs +{ + public HungerThreshold OldThreshold { get; } = oldThreshold; + public HungerThreshold NewThreshold { get; } = newThreshold; +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSuckBlood.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSuckBlood.cs new file mode 100644 index 0000000000..199682e082 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSuckBlood.cs @@ -0,0 +1,30 @@ +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.FixedPoint; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellSuckBlood : CP14SpellEffect +{ + [DataField] + public FixedPoint2 SuckAmount = 25; + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Target is null) + return; + + if (args.User is null) + return; + + var solutionContainerSystem = entManager.System(); + + if (!solutionContainerSystem.TryGetSolution(args.Target.Value, "bloodstream", out var targetBloodstreamSolution)) + return; + + if (!solutionContainerSystem.TryGetSolution(args.User.Value, "chemicals", out var userSolution)) + return; + + solutionContainerSystem.TryTransferSolution(userSolution.Value, + targetBloodstreamSolution.Value.Comp.Solution, + SuckAmount); + } +} diff --git a/Content.Shared/_CP14/Vampire/CP14SharedVampireVisualsSystem.cs b/Content.Shared/_CP14/Vampire/CP14SharedVampireVisualsSystem.cs new file mode 100644 index 0000000000..01ea701b6a --- /dev/null +++ b/Content.Shared/_CP14/Vampire/CP14SharedVampireVisualsSystem.cs @@ -0,0 +1,43 @@ +using Content.Shared.Examine; +using Content.Shared.Humanoid; + +namespace Content.Shared._CP14.Vampire; + +public abstract class CP14SharedVampireVisualsSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnVampireExamine); + + SubscribeLocalEvent(OnVampireVisualsInit); + SubscribeLocalEvent(OnVampireVisualsShutdown); + } + + protected virtual void OnVampireVisualsShutdown(Entity vampire, ref ComponentShutdown args) + { + if (!EntityManager.TryGetComponent(vampire, out HumanoidAppearanceComponent? humanoidAppearance)) + return; + + humanoidAppearance.EyeColor = vampire.Comp.OriginalEyesColor; + + Dirty(vampire, humanoidAppearance); + } + + protected virtual void OnVampireVisualsInit(Entity vampire, ref ComponentInit args) + { + if (!EntityManager.TryGetComponent(vampire, out HumanoidAppearanceComponent? humanoidAppearance)) + return; + + vampire.Comp.OriginalEyesColor = humanoidAppearance.EyeColor; + humanoidAppearance.EyeColor = vampire.Comp.EyesColor; + + Dirty(vampire, humanoidAppearance); + } + + private void OnVampireExamine(Entity ent, ref ExaminedEvent args) + { + args.PushMarkup(Loc.GetString("cp14-vampire-examine")); + } +} diff --git a/Content.Shared/_CP14/Vampire/CP14VampireVisualsComponent.cs b/Content.Shared/_CP14/Vampire/CP14VampireVisualsComponent.cs new file mode 100644 index 0000000000..e629875521 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/CP14VampireVisualsComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Vampire; + +[RegisterComponent, NetworkedComponent] +public sealed partial class CP14VampireVisualsComponent : Component +{ + [DataField] + public Color EyesColor = Color.Red; + + [DataField] + public Color OriginalEyesColor = Color.White; + + [DataField] + public string FangsMap = "vampire_fangs"; +} diff --git a/Resources/Audio/_CP14/Effects/attributions.yml b/Resources/Audio/_CP14/Effects/attributions.yml index 2bd4ed0020..5a25bbf900 100644 --- a/Resources/Audio/_CP14/Effects/attributions.yml +++ b/Resources/Audio/_CP14/Effects/attributions.yml @@ -63,8 +63,12 @@ copyright: 'by SpaceLife on Freesound.org' source: "https://freesound.org/people/SpaceLife/sounds/545938/" - - files: ["essence_consume.ogg"] license: "CC0-1.0" copyright: 'by DustyWind on Freesound.org' source: "https://freesound.org/people/DustyWind/sounds/715784/" + +- files: ["vampire_bite.ogg"] + license: "CC0-1.0" + copyright: 'by magnuswaker on Freesound.org' + source: "https://freesound.org/people/magnuswaker/sounds/563491/" diff --git a/Resources/Audio/_CP14/Effects/vampire_bite.ogg b/Resources/Audio/_CP14/Effects/vampire_bite.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bd8e986a33255539c27fe12bed6003f6fef49009 GIT binary patch literal 22269 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Interface/Alerts/vampire_hunger.rsi/starving.png b/Resources/Textures/_CP14/Interface/Alerts/vampire_hunger.rsi/starving.png new file mode 100644 index 0000000000000000000000000000000000000000..535c4796cf6885cf651426fb3907ad4709b6673f GIT binary patch literal 860 zcmV-i1Ec(jP)Px&7D+@wRA_6R1o6QB5klb3AGL`4nj&N zQG_BLI#hAc$t8-2h+83}4joELnm^Q(Lf6`+k<{=A)N_zu{N3f!yZ6#+h4+E*-d%oo zzx(~UyWaysLPA19{x6DgSJ?E~(9!;K{tjedG46^?sY^0g?epUdC&*$v&lBC<-Hxg6 zxF7>#kvcM^E=&~G@ZsWR#3FS7XzC-`!R0OEdOB?vp&H2Bp67|9Wc{K>kQ+$w_C#S# zE33|Sx%st8=JUfxT3NqPwE2$=q~}rkxvV;mZfj^WfG=Jb$^6DP`ui_P zeY=$dtwE-_IAlDJD35v&{pwuBxGQ)jXfxo;<0n#^yh{d5O^!L#NB`e^`P|_$YLvLV ziB|e)j~^zJQ1$;zrxAph*zWgD`d=Lz06QH;AHs{IV}%C@*ts$aw~?0h9y~bE*tn59%b6Ud>`|^Sfq~Z z_zfu|g6IbzM=~fu=1?P9jJw+C9W`DzhfelH3YX)67e9dh4mXVlU@VGGtpfmiBXr|z zoo7`DtZ1g@KuAm}-6XTY(B86GjK5XXnJF2loRky}dJp3^|{;4zAzk zV~803^sZ$ENLXb+;n@qRt&6UjC2HN!4qQKvE**9}OZ@6LI$&?)3iiu;l7acfCCLe^ z^9xdzc%COJ)$hTtAB}!)V198)s`UqErW;v84zks6bimZ)n6uv7hqL3?8h!hfvgBds zOlMPRy58G|smZaxhb-Ochsh*@>OV{-jfZET1-`v=PgH9)+BKUwfe mqgIA~E5(qIkdTm&-~0l_34W)UywfoN0000X5=`k@dG?W_|zyIyJxX7;mX9Q3i2>e^3 nJiT1?N040n%M(w9Y(PTQF_CVPrQG7@=7D&gu6{1-oD!M<*V-&> literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/human.png b/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/human.png new file mode 100644 index 0000000000000000000000000000000000000000..907f66d04d4e4cf44d58f48d87160651629e58b1 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|{5)M8Ln`LH zy|s~(K~ccfap%9?m(ecyQH#{@a0crvPn|CSN n8-8CelD}Ymlk0^LSgbB%#y>UP*Yh^)0dYND{an^LB{Ts5KgKVi literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json b/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json new file mode 100644 index 0000000000..0635f3bb06 --- /dev/null +++ b/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "human", + "directions": 4 + }, + { + "name": "goblin", + "directions": 4 + } + ] +}