From db56d5ef609a9b907e7cc466f542bdc4a28310fd Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 18 Apr 2022 18:30:22 -0400 Subject: [PATCH] Zombies!!! (#7509) * wip * heal on bite * more fixes and additions * don't crash * Update medicine.yml * zombie claw item and damage resist * ignoredcomponents.cs * Add zombie claw, fix infection, add immunities * fix * razzle dazzle * yaml fix * Update Content.Server/Disease/DiseaseZombieSystem.cs Co-authored-by: Moony * Update Content.Server/Disease/DiseaseZombieSystem.cs Co-authored-by: Moony * Update Content.Server/Disease/DiseaseZombieSystem.cs Co-authored-by: Moony * Update Content.Server/Disease/DiseaseZombieSystem.cs Co-authored-by: Moony * sdasadsadsadasd * Generalize DiseaseProgression.cs * final final final final final final cope seethe * Update medicine.yml * Update Content.Server/Disease/Components/DiseaseZombieComponent.cs Co-authored-by: mirrorcult * Update BloodstreamSystem.cs * Update Content.Server/Disease/Components/DiseaseZombieComponent.cs Co-authored-by: mirrorcult * Update Content.Server/Disease/DiseaseZombieSystem.cs Co-authored-by: mirrorcult * fixing until i die * folder + zombietransfer fix * smol fixe * the smallest of fixes * aaaa * Infection timer buff Co-authored-by: Moony Co-authored-by: mirrorcult --- Content.Client/Entry/IgnoredComponents.cs | 3 + .../Body/Systems/BloodstreamSystem.cs | 8 + .../Components/DiseaseBuildupComponent.cs | 19 +++ Content.Server/Disease/DiseaseSystem.cs | 4 +- .../Disease/Effects/DiseaseProgression.cs | 46 ++++++ .../Components/DiseaseZombieComponent.cs | 37 +++++ .../Disease/Zombie/DiseaseZombieSystem.cs | 139 ++++++++++++++++++ .../StationEvents/Events/ZombieOutbreak.cs | 54 +++++++ .../Components/ZombieTransferComponent.cs | 7 + .../ZombieTransfer/ZombieTransferSystem.cs | 67 +++++++++ .../Systems/SharedHumanoidAppearanceSystem.cs | 11 ++ .../Damage/Systems/DamageableSystem.cs | 10 ++ Resources/Locale/en-US/disease/zombie.ftl | 6 + .../station-events/events/zombie-outbreak.ftl | 1 + Resources/Prototypes/Damage/modifier_sets.yml | 11 ++ .../Prototypes/Diseases/noninfectious.yml | 25 ++++ .../Specific/Medical/healthanalyzer.yml | 10 ++ .../Objects/Weapons/Melee/zombieclaw.yml | 21 +++ .../Structures/Wallmounts/Signs/signs.yml | 8 + Resources/Prototypes/Reagents/medicine.yml | 15 ++ .../Prototypes/Recipes/Reactions/medicine.yml | 10 ++ Resources/Prototypes/accents.yml | 8 + .../Weapons/Melee/zombie_claw.rsi/icon.png | Bin 0 -> 6932 bytes .../Melee/zombie_claw.rsi/inhand-left.png | Bin 0 -> 5868 bytes .../Melee/zombie_claw.rsi/inhand-right.png | Bin 0 -> 5553 bytes .../Weapons/Melee/zombie_claw.rsi/meta.json | 22 +++ .../Structures/Wallmounts/signs.rsi/meta.json | 8 + .../Wallmounts/signs.rsi/zomlab.png | Bin 0 -> 6115 bytes 28 files changed, 549 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Disease/Components/DiseaseBuildupComponent.cs create mode 100644 Content.Server/Disease/Effects/DiseaseProgression.cs create mode 100644 Content.Server/Disease/Zombie/Components/DiseaseZombieComponent.cs create mode 100644 Content.Server/Disease/Zombie/DiseaseZombieSystem.cs create mode 100644 Content.Server/StationEvents/Events/ZombieOutbreak.cs create mode 100644 Content.Server/Weapon/Melee/ZombieTransfer/Components/ZombieTransferComponent.cs create mode 100644 Content.Server/Weapon/Melee/ZombieTransfer/ZombieTransferSystem.cs create mode 100644 Resources/Locale/en-US/disease/zombie.ftl create mode 100644 Resources/Locale/en-US/station-events/events/zombie-outbreak.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Melee/zombieclaw.yml create mode 100644 Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/meta.json create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/zomlab.png diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index 83d6e142a2..b108266e4f 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -45,6 +45,9 @@ namespace Content.Client.Entry "DiseaseDiagnoser", "DiseaseVaccine", "DiseaseVaccineCreator", + "DiseaseZombie", + "DiseaseBuildup", + "ZombieTransfer", "Mineable", "RangedMagazine", "Ammo", diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index db6c4c1bbc..7b066360a9 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -226,6 +226,14 @@ public sealed class BloodstreamSystem : EntitySystem return (component.BloodSolution.CurrentVolume / component.BloodSolution.MaxVolume).Float(); } + public void SetBloodLossThreshold(EntityUid uid, float threshold, BloodstreamComponent? comp = null) + { + if (!Resolve(uid, ref comp)) + return; + + comp.BloodlossThreshold = threshold; + } + /// /// Attempts to modify the blood level of this entity directly. /// diff --git a/Content.Server/Disease/Components/DiseaseBuildupComponent.cs b/Content.Server/Disease/Components/DiseaseBuildupComponent.cs new file mode 100644 index 0000000000..8c562b0662 --- /dev/null +++ b/Content.Server/Disease/Components/DiseaseBuildupComponent.cs @@ -0,0 +1,19 @@ +namespace Content.Server.Disease.Components +{ + /// + /// The component which records the buildup/progression of an infection + /// + [RegisterComponent] + public sealed class DiseaseBuildupComponent : Component + { + /// This could be served to be generalized to allow for multiple + /// diseases to build up at once, but it doesn't matter too much. + + /// + /// The current amount of progression that has built up. + /// + [DataField("progression")] + [ViewVariables(VVAccess.ReadWrite)] + public float Progression = 0.00f; + } +} diff --git a/Content.Server/Disease/DiseaseSystem.cs b/Content.Server/Disease/DiseaseSystem.cs index 3d29338bad..82db96ddf2 100644 --- a/Content.Server/Disease/DiseaseSystem.cs +++ b/Content.Server/Disease/DiseaseSystem.cs @@ -94,8 +94,10 @@ namespace Content.Server.Disease continue; } - foreach (var disease in carrierComp.Diseases) + for (var i = 0; i < carrierComp.Diseases.Count; i++) //this is a for-loop so that it doesn't break when new diseases are added { + var disease = carrierComp.Diseases[i]; + var args = new DiseaseEffectArgs(carrierComp.Owner, disease, EntityManager); disease.Accumulator += frameTime; if (disease.Accumulator >= disease.TickTime) diff --git a/Content.Server/Disease/Effects/DiseaseProgression.cs b/Content.Server/Disease/Effects/DiseaseProgression.cs new file mode 100644 index 0000000000..0fc35761a4 --- /dev/null +++ b/Content.Server/Disease/Effects/DiseaseProgression.cs @@ -0,0 +1,46 @@ +using Content.Server.Disease.Components; +using JetBrains.Annotations; +using Content.Shared.Disease; +using Robust.Shared.IoC; + +namespace Content.Server.Disease.Effects +{ + /// + /// Handles a disease which incubates over a period of time + /// before adding another component to the infected entity + /// currently used for zombie virus + /// + [UsedImplicitly] + public sealed class DiseaseProgression : DiseaseEffect + { + /// + /// The rate that's increased over time. Defaults to 1% so the probability can be varied in yaml + /// + [DataField("rate")] + [ViewVariables(VVAccess.ReadWrite)] + public float Rate = 0.01f; + + /// + /// The component that is added at the end of build up + /// + [DataField("comp")] + public string? Comp = null; + + public override void Effect(DiseaseEffectArgs args) + { + args.EntityManager.EnsureComponent(args.DiseasedEntity, out var buildup); + if (buildup.Progression < 1) //increases steadily until 100% + { + buildup.Progression += Rate; + } + else if (Comp != null)//adds the component for the later stage of the disease. + { + EntityUid uid = args.DiseasedEntity; + var newComponent = (Component) IoCManager.Resolve().GetComponent(Comp); + newComponent.Owner = uid; + if (!args.EntityManager.HasComponent(uid, newComponent.GetType())) + args.EntityManager.AddComponent(uid, newComponent); + } + } + } +} diff --git a/Content.Server/Disease/Zombie/Components/DiseaseZombieComponent.cs b/Content.Server/Disease/Zombie/Components/DiseaseZombieComponent.cs new file mode 100644 index 0000000000..14cfcf7970 --- /dev/null +++ b/Content.Server/Disease/Zombie/Components/DiseaseZombieComponent.cs @@ -0,0 +1,37 @@ +namespace Content.Server.Disease.Zombie.Components +{ + /// + /// The component which gives an entity zombie traits. + /// + [RegisterComponent] + public sealed class DiseaseZombieComponent : Component + { + /// + /// The probability that a given bite will infect a player. + /// zombie infection is not based on disease resist items like masks or gloves. + /// + [DataField("probability")] + [ViewVariables(VVAccess.ReadWrite)] + public float Probability = 0.33f; + + /// + /// A multiplier on the movement speed that zombies recieve. + /// + [DataField("slowAmount")] + [ViewVariables(VVAccess.ReadWrite)] + public float SlowAmount = 0.75f; + + /// + /// Whether or not the zombie needs all the zombie traits initialized upon component init + /// useful for entities that already are zombies and do not need the additional traits. + /// + [DataField("applyZombieTraits")] + public bool ApplyZombieTraits = true; + + /// + /// The color of the zombie's skin + /// + [DataField("skinColor")] + public readonly Color SkinColor = (0.70f, 0.72f, 0.48f, 1); + } +} diff --git a/Content.Server/Disease/Zombie/DiseaseZombieSystem.cs b/Content.Server/Disease/Zombie/DiseaseZombieSystem.cs new file mode 100644 index 0000000000..0be6c14c55 --- /dev/null +++ b/Content.Server/Disease/Zombie/DiseaseZombieSystem.cs @@ -0,0 +1,139 @@ +using Robust.Shared.Containers; +using Content.Server.Speech.Components; +using Content.Server.Ghost.Roles.Components; +using Content.Server.Disease.Components; +using Content.Server.Disease.Zombie.Components; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Server.Popups; +using Content.Server.Atmos.Components; +using Content.Server.Hands.Components; +using Content.Server.Nutrition.Components; +using Content.Server.Mind.Components; +using Content.Server.Chat.Managers; +using Content.Shared.Damage; +using Content.Shared.MobState.Components; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Movement.EntitySystems; +using Content.Shared.CharacterAppearance.Components; +using Content.Shared.CharacterAppearance.Systems; +using Content.Server.Weapons.Melee.ZombieTransfer.Components; + +namespace Content.Server.Disease.Zombie +{ + /// + /// Handles zombie propagation and inherent zombie traits + /// + public sealed class DiseaseZombieSystem : EntitySystem + { + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly BloodstreamSystem _bloodstream = default!; + [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; + [Dependency] private readonly SharedHandsSystem _sharedHands = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _sharedHumanoidAppearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnRefreshMovementSpeedModifiers); + } + + /// + /// I would imagine that if this component got assigned to something other than a mob, it would throw hella errors. + /// + private void OnComponentInit(EntityUid uid, DiseaseZombieComponent component, ComponentInit args) + { + if (!component.ApplyZombieTraits || !HasComp(uid)) + return; + + RemComp(uid); + RemComp(uid); + RemComp(uid); + RemComp(uid); + RemComp(uid); + RemComp(uid); + + EntityManager.EnsureComponent(uid, out var bloodstream); //zoms need bloodstream anyway for healing + _bloodstream.SetBloodLossThreshold(uid, 0f, bloodstream); + _bloodstream.TryModifyBleedAmount(uid, -bloodstream.BleedAmount, bloodstream); + _movementSpeedModifier.RefreshMovementSpeedModifiers(uid); + EntityManager.EnsureComponent(uid).Accent = "zombie"; + + if (TryComp(uid, out var comp)) + { + _damageable.SetDamageModifierSetId(uid, "Zombie", comp); + _damageable.SetAllDamage(comp, 0); + } + + if (TryComp(uid, out var spritecomp)) + { + var oldapp = spritecomp.Appearance; + var newapp = oldapp.WithSkinColor(component.SkinColor); + _sharedHumanoidAppearance.UpdateAppearance(uid, newapp); + + _sharedHumanoidAppearance.ForceAppearanceUpdate(uid); + } + + if (TryComp(uid, out var handcomp)) + { + foreach (var hand in handcomp.Hands) + { + _sharedHands.TrySetActiveHand(uid, hand.Key); + _sharedHands.TryDrop(uid); + + var pos = EntityManager.GetComponent(uid).Coordinates; + var virtualItem = EntityManager.SpawnEntity("ZombieClaw", pos); + _sharedHands.DoPickup(uid, hand.Value, virtualItem); + } + } + else + { + EnsureComp(uid); + } + + if (TryComp(uid, out var cmcomp)) + { + foreach (var container in cmcomp.Containers) + { + if (container.Value.ID == "gloves") + { + foreach (var entity in container.Value.ContainedEntities) + { + container.Value.Remove(entity); + } + } + } + } + + if (TryComp(uid, out var mindcomp)) + { + if (mindcomp.Mind != null && mindcomp.Mind.TryGetSession(out var session)) + { + var chatMgr = IoCManager.Resolve(); + chatMgr.DispatchServerMessage(session, Loc.GetString("zombie-infection-greeting")); + } + } + + uid.PopupMessageEveryone(Loc.GetString("zombie-transform", ("target", uid))); + if (TryComp(uid, out var metacomp)) + { + metacomp.EntityName = Loc.GetString("zombie-name-prefix", ("target", metacomp.EntityName)); + + if (!HasComp(uid)) //this specific component gives build test trouble so pop off, ig + { + EntityManager.EnsureComponent(uid, out var ghostcomp); + ghostcomp.RoleName = metacomp.EntityName; + ghostcomp.RoleDescription = Loc.GetString("zombie-role-desc"); + ghostcomp.RoleRules = Loc.GetString("zombie-role-rules"); + } + } + } + + private void OnRefreshMovementSpeedModifiers(EntityUid uid, DiseaseZombieComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.SlowAmount, component.SlowAmount); + } + } +} diff --git a/Content.Server/StationEvents/Events/ZombieOutbreak.cs b/Content.Server/StationEvents/Events/ZombieOutbreak.cs new file mode 100644 index 0000000000..43083c1587 --- /dev/null +++ b/Content.Server/StationEvents/Events/ZombieOutbreak.cs @@ -0,0 +1,54 @@ +using Robust.Shared.Random; +using Content.Server.Chat.Managers; +using Content.Server.Disease.Zombie.Components; +using Content.Shared.MobState.Components; + +namespace Content.Server.StationEvents.Events +{ + /// + /// Revives several dead entities as zombies + /// + public sealed class ZombieOutbreak : StationEvent + { + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IChatManager _chatManager = default!; + + public override string Name => "ZombieOutbreak"; + public override float Weight => WeightLow; + + public override string? StartAudio => "/Audio/Announcements/bloblarm.ogg"; + protected override float EndAfter => 1.0f; + + public override int? MaxOccurrences => 1; + + /// + /// Finds 1-3 random, dead entities accross the station + /// and turns them into zombies. + /// + public override void Startup() + { + base.Startup(); + List deadList = new(); + foreach (var mobState in _entityManager.EntityQuery()) + { + if (mobState.IsDead() || mobState.IsCritical()) + deadList.Add(mobState); + } + _random.Shuffle(deadList); + + var toInfect = _random.Next(1, 3); + + /// Now we give it to people in the list of dead entities earlier. + foreach (var target in deadList) + { + if (toInfect-- == 0) + break; + + _entityManager.EnsureComponent(target.Owner); + } + _chatManager.DispatchStationAnnouncement(Loc.GetString("station-event-zombie-outbreak-announcement"), + playDefaultSound: false, colorOverride: Color.DarkMagenta); + } + } +} diff --git a/Content.Server/Weapon/Melee/ZombieTransfer/Components/ZombieTransferComponent.cs b/Content.Server/Weapon/Melee/ZombieTransfer/Components/ZombieTransferComponent.cs new file mode 100644 index 0000000000..f0e95efb04 --- /dev/null +++ b/Content.Server/Weapon/Melee/ZombieTransfer/Components/ZombieTransferComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.Weapons.Melee.ZombieTransfer.Components +{ + [RegisterComponent] + public sealed class ZombieTransferComponent : Component + { + } +} diff --git a/Content.Server/Weapon/Melee/ZombieTransfer/ZombieTransferSystem.cs b/Content.Server/Weapon/Melee/ZombieTransfer/ZombieTransferSystem.cs new file mode 100644 index 0000000000..2f3c1b14c9 --- /dev/null +++ b/Content.Server/Weapon/Melee/ZombieTransfer/ZombieTransferSystem.cs @@ -0,0 +1,67 @@ +using System.Linq; +using Robust.Shared.Random; +using Content.Server.Body.Systems; +using Content.Server.Disease.Components; +using Content.Server.Disease.Zombie.Components; +using Content.Server.Drone.Components; +using Content.Server.Weapon.Melee; +using Content.Shared.Chemistry.Components; +using Content.Shared.Damage; +using Content.Shared.MobState.Components; +using Content.Server.Disease; +using Content.Server.Weapons.Melee.ZombieTransfer.Components; + +namespace Content.Server.Weapons.Melee.ZombieTransfer +{ + public sealed class ZombieTransferSystem : EntitySystem + { + [Dependency] private readonly DiseaseSystem _disease = default!; + [Dependency] private readonly BloodstreamSystem _bloodstream = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMeleeHit); + } + + private void OnMeleeHit(EntityUid uid, ZombieTransferComponent component, MeleeHitEvent args) + { + if (!EntityManager.TryGetComponent(args.User, out var diseaseZombieComp)) + return; + + if (!args.HitEntities.Any()) + return; + + foreach (EntityUid entity in args.HitEntities) + { + if (args.User == entity) + continue; + + if (!HasComp(entity)) + continue; + + if (_robustRandom.Prob(diseaseZombieComp.Probability) && HasComp(entity)) + { + _disease.TryAddDisease(entity, "ZombieInfection"); + } + + EntityManager.EnsureComponent(entity, out var mobState); + if ((mobState.IsDead() || mobState.IsCritical()) && !HasComp(entity)) //dead entities are eautomatically infected. MAYBE: have activated infect ability? + { + EntityManager.AddComponent(entity); + var dspec = new DamageSpecifier(); + //these damages match the zombie claw + dspec.DamageDict.TryAdd("Slash", -12); + dspec.DamageDict.TryAdd("Piercing", -7); + args.BonusDamage += dspec; + } + else if (mobState.IsAlive() && !HasComp(entity)) //heals when zombies bite live entities + { + var healingSolution = new Solution(); + healingSolution.AddReagent("Bicaridine", 1.00); //if OP, reduce/change chem + _bloodstream.TryAddToChemicals(args.User, healingSolution); + } + } + } + } +} diff --git a/Content.Shared/CharacterAppearance/Systems/SharedHumanoidAppearanceSystem.cs b/Content.Shared/CharacterAppearance/Systems/SharedHumanoidAppearanceSystem.cs index 45b98ffde5..df7491e922 100644 --- a/Content.Shared/CharacterAppearance/Systems/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/CharacterAppearance/Systems/SharedHumanoidAppearanceSystem.cs @@ -48,6 +48,17 @@ namespace Content.Shared.CharacterAppearance.Systems RaiseLocalEvent(uid, new ChangedHumanoidAppearanceEvent(appearance, sex, gender, species)); } + public void UpdateAppearance(EntityUid uid, HumanoidCharacterAppearance appearance, HumanoidAppearanceComponent? component = null) + { + if (!Resolve(uid, ref component)) return; + + component.Appearance = appearance; + + component.Dirty(); + + RaiseLocalEvent(uid, new ChangedHumanoidAppearanceEvent(appearance, component.Sex, component.Gender, component.Species)); + } + private void OnAppearanceGetState(EntityUid uid, HumanoidAppearanceComponent component, ref ComponentGetState args) { args.State = new HumanoidAppearanceComponentState(component.Appearance, component.Sex, component.Gender, component.Species); diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index d2a198c329..958b45cd97 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -186,6 +186,16 @@ namespace Content.Shared.Damage DamageChanged(component, new DamageSpecifier()); } + public void SetDamageModifierSetId(EntityUid uid, string damageModifierSetId, DamageableComponent? comp = null) + { + if (!Resolve(uid, ref comp)) + return; + + comp.DamageModifierSetId = damageModifierSetId; + + Dirty(comp); + } + private void DamageableGetState(EntityUid uid, DamageableComponent component, ref ComponentGetState args) { args.State = new DamageableComponentState(component.Damage.DamageDict, component.DamageModifierSetId); diff --git a/Resources/Locale/en-US/disease/zombie.ftl b/Resources/Locale/en-US/disease/zombie.ftl new file mode 100644 index 0000000000..29c8d222bd --- /dev/null +++ b/Resources/Locale/en-US/disease/zombie.ftl @@ -0,0 +1,6 @@ +zombie-transform = {CAPITALIZE(THE($target))} turned into a zombie! +zombie-infection-greeting = You have become a zombie. Your goal is to seek out the living and to try to infect them. Work together with your fellow zombies to overpower the remaining crewmates. + +zombie-name-prefix = zombified {$target} +zombie-role-desc = A malevolent creature of the dead. +zombie-role-rules = You are an antagonist. Search out the living and bite them in order to infect them and turn them into zombies. Work together with other the zombies to overtake the station. diff --git a/Resources/Locale/en-US/station-events/events/zombie-outbreak.ftl b/Resources/Locale/en-US/station-events/events/zombie-outbreak.ftl new file mode 100644 index 0000000000..da6d8fa4f1 --- /dev/null +++ b/Resources/Locale/en-US/station-events/events/zombie-outbreak.ftl @@ -0,0 +1 @@ +station-event-zombie-outbreak-announcement = Confirmed sightings of various undead aboard the station. All personnel should arm themselves, barricade doors, and secure their location in order to prevent further infection. \ No newline at end of file diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 98bfe724d2..2c242ebb21 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -104,6 +104,17 @@ Heat: 0.9 Poison: 0.9 +- type: damageModifierSet + id: Zombie #Blunt resistent and immune to biological threats, but can be hacked apart and burned + coefficients: + Blunt: 0.4 + Slash: 0.8 + Piercing: 0.9 + Shock: 0.8 + Cold: 0.2 + Heat: 3.0 + Poison: 0.0 + # Represents which damage types should be modified # in relation to how they cause bloodloss damage. - type: damageModifierSet diff --git a/Resources/Prototypes/Diseases/noninfectious.yml b/Resources/Prototypes/Diseases/noninfectious.yml index af1a722d09..4ad5e27be1 100644 --- a/Resources/Prototypes/Diseases/noninfectious.yml +++ b/Resources/Prototypes/Diseases/noninfectious.yml @@ -15,4 +15,29 @@ - !type:DiseaseReagentCure reagent: Phalanximine min: 15 + ### Once radiation is refactored I want it to have a small chance of giving you regular cancer + +- type: disease + id: ZombieInfection + name: Zombie Infection #This is the incubation period of the zombie disease. + infectious: false + cureResist: 0.2 + effects: + - !type:DiseaseHealthChange + probability: 0.05 + damage: + types: + Blunt: 3 + - !type:DiseaseSnough + probability: 0.005 + snoughMessage: disease-cough + snoughSound: + collection: Coughs + - !type:DiseaseProgression + probability: 0.5 + comp: DiseaseZombie + cures: + - !type:DiseaseReagentCure + reagent: Romerol + min: 10 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml index 4a09a05415..c9d4220cb5 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml @@ -35,3 +35,13 @@ - type: HealthAnalyzer fake: true disease: OwOnavirus + +- type: entity + parent: HandheldHealthAnalyzer + id: HandheldHealthAnalyzerZombie + name: Zombie Infector + suffix: DEBUG + components: + - type: HealthAnalyzer + fake: true + disease: ZombieInfection \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/zombieclaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/zombieclaw.yml new file mode 100644 index 0000000000..794b2c5596 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/zombieclaw.yml @@ -0,0 +1,21 @@ +# Special entity used to fill zombie's hands when they turn undead +- type: entity + id: ZombieClaw + name: Zombie Claw + noSpawn: true + components: + - type: Sprite + sprite: Objects/Weapons/Melee/zombie_claw.rsi + state: icon + - type: Item + - type: ZombieTransfer + - type: Unremoveable + - type: MeleeWeapon + damage: + types: + Slash: 13 + Piercing: 7 + range: 1 + arcwidth: 0 + arc: claw + diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml index 4523c7c85b..e29fdbafc6 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml @@ -726,6 +726,14 @@ - type: Sprite state: xenolab +- type: entity + parent: BaseSign + id: SignZomlab + name: zombie lab sign + components: + - type: Sprite + state: zomlab + - type: entity parent: BaseSign id: SignSecureMedRed diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index bfdddeea2f..df074697a8 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -319,6 +319,21 @@ Cellular: -1 Radiation: 1 +- type: reagent + id: Romerol + name: romerol + group: Medicine + desc: A difficult to procure chemical used in the reversal of the zombification process. Tastes like death. + physicalDesc: acrid + color: "#7e916e" + metabolisms: + Medicine: + effects: + - !type:HealthChange + damage: + types: + Poison: 2 + - type: reagent id: PulpedBananaPeel name: pulped banana peel diff --git a/Resources/Prototypes/Recipes/Reactions/medicine.yml b/Resources/Prototypes/Recipes/Reactions/medicine.yml index 57e0ebc4f9..443479d0ba 100644 --- a/Resources/Prototypes/Recipes/Reactions/medicine.yml +++ b/Resources/Prototypes/Recipes/Reactions/medicine.yml @@ -189,6 +189,16 @@ products: Phalanximine: 3 +- type: reaction + id: Romerol + reactants: + Phalanximine: + amount: 1 + Tricordrazine: + amount: 1 + products: + Romerol: 2 + - type: reaction id: Synaptizine reactants: diff --git a/Resources/Prototypes/accents.yml b/Resources/Prototypes/accents.yml index 45fd9491f3..2b62fddd81 100644 --- a/Resources/Prototypes/accents.yml +++ b/Resources/Prototypes/accents.yml @@ -47,6 +47,14 @@ - Hisssuuu... - Hiss...! +- type: accent + id: zombie + words: + - Gruaahhhh... + - Mmuaaaa.. + - Braainnssss... + - Grrrrr... + - type: accent id: genericAggressive words: diff --git a/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/icon.png b/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..361dfbf844f4d3d12a5c9c67616b0f6198067673 GIT binary patch literal 6932 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb0ee924af197895894f3b4f9a4866b588c998d GIT binary patch literal 5868 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 Nqgm0Z7dG$S`ybm+IPm}g literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..69a0bef26f03602491e777ea28ad2778a80b9add GIT binary patch literal 5553 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 F_%G_)jhz4h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/meta.json new file mode 100644 index 0000000000..a0d45845d1 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Melee/zombie_claw.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Illustrated by EmoGarbage", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json index 39e8bab3b3..e389951cab 100644 --- a/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json @@ -975,6 +975,14 @@ ] ] }, + { + "name": "zomlab", + "delays": [ + [ + 1 + ] + ] + }, { "name": "small_secure_red", "delays": [ diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/zomlab.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/zomlab.png new file mode 100644 index 0000000000000000000000000000000000000000..09d54e603dc3fd202cf25852de243e422c49f007 GIT binary patch literal 6115 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