diff --git a/Content.Shared/Atmos/Rotting/PerishableComponent.cs b/Content.Shared/Atmos/Rotting/PerishableComponent.cs index 6983b872b8..99b30fc906 100644 --- a/Content.Shared/Atmos/Rotting/PerishableComponent.cs +++ b/Content.Shared/Atmos/Rotting/PerishableComponent.cs @@ -45,6 +45,12 @@ public sealed partial class PerishableComponent : Component [DataField, AutoNetworkedField] public int Stage; + + /// + /// If true, rot will always progress. + /// + [DataField, AutoNetworkedField] + public bool ForceRotProgression; } diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index 840818dee5..60c89c012a 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -115,6 +115,10 @@ public abstract class SharedRottingSystem : EntitySystem if (!Resolve(uid, ref perishable, false)) return false; + // Overrides all the other checks. + if (perishable.ForceRotProgression) + return true; + // only dead things or inanimate objects can rot if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) return false; diff --git a/Content.Shared/Damage/Components/IgnoreSlowOnDamageComponent.cs b/Content.Shared/Damage/Components/IgnoreSlowOnDamageComponent.cs new file mode 100644 index 0000000000..e933eb1a79 --- /dev/null +++ b/Content.Shared/Damage/Components/IgnoreSlowOnDamageComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Damage.Components; + +/// +/// This is used for an effect that nullifies and adds an alert. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SlowOnDamageSystem))] +public sealed partial class IgnoreSlowOnDamageComponent : Component; diff --git a/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs b/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs index 3e50ee3557..6b5f57c595 100644 --- a/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs +++ b/Content.Shared/Damage/Systems/SlowOnDamageSystem.cs @@ -22,6 +22,10 @@ namespace Content.Shared.Damage SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnGotEquipped); SubscribeLocalEvent(OnGotUnequipped); + + SubscribeLocalEvent(OnIgnoreStartup); + SubscribeLocalEvent(OnIgnoreShutdown); + SubscribeLocalEvent(OnIgnoreModifySpeed); } private void OnRefreshMovespeed(EntityUid uid, SlowOnDamageComponent component, RefreshMovementSpeedModifiersEvent args) @@ -84,6 +88,21 @@ namespace Content.Shared.Damage { _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(args.Wearer); } + + private void OnIgnoreStartup(Entity ent, ref ComponentStartup args) + { + _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(ent); + } + + private void OnIgnoreShutdown(Entity ent, ref ComponentShutdown args) + { + _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(ent); + } + + private void OnIgnoreModifySpeed(Entity ent, ref ModifySlowOnDamageSpeedEvent args) + { + args.Speed = 1f; + } } [ByRefEvent] diff --git a/Content.Shared/Weapons/Ranged/Components/RechargeBasicEntityAmmoComponent.cs b/Content.Shared/Weapons/Ranged/Components/RechargeBasicEntityAmmoComponent.cs index f478405bec..25d0453b59 100644 --- a/Content.Shared/Weapons/Ranged/Components/RechargeBasicEntityAmmoComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/RechargeBasicEntityAmmoComponent.cs @@ -17,7 +17,7 @@ public sealed partial class RechargeBasicEntityAmmoComponent : Component [DataField("rechargeSound")] [AutoNetworkedField] - public SoundSpecifier RechargeSound = new SoundPathSpecifier("/Audio/Magic/forcewall.ogg") + public SoundSpecifier? RechargeSound = new SoundPathSpecifier("/Audio/Magic/forcewall.ogg") { Params = AudioParams.Default.WithVolume(-5f) }; @@ -27,4 +27,7 @@ public sealed partial class RechargeBasicEntityAmmoComponent : Component AutoNetworkedField] [AutoPausedField] public TimeSpan? NextCharge; + + [DataField, AutoNetworkedField] + public bool ShowExamineText = true; } diff --git a/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs b/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs index 9d6d552400..3316df0b96 100644 --- a/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs @@ -66,6 +66,9 @@ public sealed class RechargeBasicEntityAmmoSystem : EntitySystem private void OnExamined(EntityUid uid, RechargeBasicEntityAmmoComponent component, ExaminedEvent args) { + if (!component.ShowExamineText) + return; + if (!TryComp(uid, out var ammo) || ammo.Count == ammo.Capacity || component.NextCharge == null) diff --git a/Resources/Locale/en-US/alerts/alerts.ftl b/Resources/Locale/en-US/alerts/alerts.ftl index 319809da40..37af416c3a 100644 --- a/Resources/Locale/en-US/alerts/alerts.ftl +++ b/Resources/Locale/en-US/alerts/alerts.ftl @@ -96,6 +96,9 @@ alerts-bleed-desc = You're [color=red]bleeding[/color]. alerts-pacified-name = [color=green]Pacified[/color] alerts-pacified-desc = You're pacified; you won't be able to harm living creatures. +alerts-adrenaline-name = [color=red]Adrenaline[/color] +alerts-adrenaline-desc = You're full of adrenaline: pain won't slow you down. + alerts-suit-power-name = Suit Power alerts-suit-power-desc = How much power your space ninja suit has. diff --git a/Resources/Locale/en-US/guidebook/chemistry/statuseffects.ftl b/Resources/Locale/en-US/guidebook/chemistry/statuseffects.ftl index 9a8f2f6c8a..13d9ed5d6b 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/statuseffects.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/statuseffects.ftl @@ -13,3 +13,4 @@ reagent-effect-status-effect-RatvarianLanguage = ratvarian language patterns reagent-effect-status-effect-StaminaModifier = modified stamina reagent-effect-status-effect-RadiationProtection = radiation protection reagent-effect-status-effect-Drowsiness = drowsiness +reagent-effect-status-effect-Adrenaline = adrenaline diff --git a/Resources/Locale/en-US/reagents/meta/chemicals.ftl b/Resources/Locale/en-US/reagents/meta/chemicals.ftl index 1d70ff65ff..ad9d12e26f 100644 --- a/Resources/Locale/en-US/reagents/meta/chemicals.ftl +++ b/Resources/Locale/en-US/reagents/meta/chemicals.ftl @@ -28,3 +28,5 @@ reagent-desc-sodium-polyacrylate = A super-absorbent polymer with assorted indus reagent-name-cellulose = cellulose fibers reagent-desc-cellulose = A crystaline polydextrose polymer, plants swear by this stuff. +reagent-name-rororium = rororium +reagent-desc-rororium = A strange substance which fills the cores of the hivelords that roam the mining asteroid. Thought to be the source of their regenerative powers. diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index 4ee4fdce0c..80fcc44a55 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -427,6 +427,14 @@ name: alerts-pacified-name description: alerts-pacified-desc +- type: alert + id: Adrenaline + icons: + - sprite: Mobs/Species/Human/organs.rsi + state: heart-on + name: alerts-adrenaline-name + description: alerts-adrenaline-desc + - type: alert id: Debug1 icons: diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml index d16499aa76..7e147ba711 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml @@ -476,3 +476,21 @@ amount: !type:ConstantNumberSelector value: 3 +- type: entity + parent: MarkerBase + id: SalvageSpawnerMobMiningAsteroid + name: Mining Asteroid Mob Spawner + components: + - type: Sprite + layers: + - state: green + - sprite: Mobs/Aliens/Asteroid/goliath.rsi + state: goliath + - type: EntityTableSpawner + table: !type:GroupSelector + children: + - id: MobGoliath + weight: 65 + - id: MobHivelord + weight: 35 + diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml index 8cbd40b5cc..877dd40cc3 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml @@ -26,6 +26,7 @@ - TemporaryBlindness - RadiationProtection - Drowsiness + - Adrenaline - type: StandingState - type: Tag tags: @@ -180,3 +181,156 @@ state: goliath_tentacle_retract - type: EffectVisuals - type: AnimationPlayer + +- type: entity + id: MobHivelord + parent: [ BaseMobAsteroid, FlyingMobBase ] + name: hivelord + description: A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original. + components: + - type: Sprite + sprite: Mobs/Aliens/Asteroid/hivelord.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: hivelord + - type: DamageStateVisuals + states: + Alive: + Base: hivelord + Dead: + Base: hivelord_dead + - type: MovementSpeedModifier + baseWalkSpeed : 3.5 + baseSprintSpeed : 4.0 + - type: MobThresholds + thresholds: + 0: Alive + 75: Dead + - type: MeleeWeapon + damage: + types: + Blunt: 0 + - type: Gun + fireRate: 0.66 + selectedMode: SemiAuto + showExamineText: false + availableModes: + - SemiAuto + soundGunshot: null + - type: RechargeBasicEntityAmmo + showExamineText: false + rechargeCooldown: 0 + rechargeSound: null + - type: BasicEntityAmmoProvider + proto: MobHivelordBrood + capacity: 1 + count: 1 + - type: NpcFactionMember + factions: + - SimpleHostile + - type: HTN + rootTask: + task: SimpleRangedHostileCompound + blackboard: + VisionRadius: !type:Single + 4 + AggroVisionRadius: !type:Single + 9 + - type: Butcherable + spawned: + - id: FoodHivelordRemains + +- type: entity + id: MobHivelordBrood + parent: [ BaseMobAsteroid, FlyingMobBase ] + name: hivelord brood + description: A fragment of the original hivelord, rallying behind its original. One isn't much of a threat, but... + components: + - type: Sprite + sprite: Mobs/Aliens/Asteroid/hivelord.rsi + layers: + - state: hivelordbrood + - type: MovementSpeedModifier + baseWalkSpeed : 3.5 + baseSprintSpeed : 4.0 + - type: MobThresholds + thresholds: + 0: Alive + 5: Dead + - type: MeleeWeapon + soundHit: + path: /Audio/Weapons/bladeslice.ogg + angle: 0 + attackRate: 1.0 + range: 0.75 + animation: WeaponArcPunch + damage: + types: + Slash: 7 + - type: Ammo + muzzleFlash: null + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 5 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: NpcFactionMember + factions: + - SimpleHostile + - type: HTN + rootTask: + task: SimpleHostileCompound + blackboard: # highly aggressive + VisionRadius: !type:Single + 15 + AggroVisionRadius: !type:Single + 15 + - type: TimedDespawn + lifetime: 100 + +- type: entity + id: FoodHivelordRemains + parent: FoodBase + name: hivelord remains + description: All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly. Try not to think about what you're eating. + components: + - type: SolutionContainerManager + solutions: + food: + maxVol: 5 + reagents: + - ReagentId: Rororium + Quantity: 5 + - type: Sprite + sprite: Objects/Consumable/Food/rorocore.rsi + state: boiled + - type: Item + size: Normal + - type: Perishable + rotAfter: 120 # rot after 2 minutes + molsPerSecondPerUnitMass: 0 + forceRotProgression: true + - type: RotInto + entity: FoodHivelordRemainsInert + stage: 1 + - type: StaticPrice + price: 5000 + +- type: entity + id: FoodHivelordRemainsInert + parent: BaseItem + name: inert hivelord remains + description: All that remains of a hivelord... Now all is truly lost. + components: + - type: Sprite + sprite: Objects/Consumable/Food/rorocore.rsi + state: boiled + color: "#664444" + - type: SpaceGarbage + - type: Item + size: Normal + - type: StaticPrice + price: 500 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 8deefe9b8e..f400680eb0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -29,6 +29,7 @@ - Flashed - RadiationProtection - Drowsiness + - Adrenaline - type: Buckle - type: StandingState - type: Tag @@ -106,6 +107,7 @@ - Flashed - RadiationProtection - Drowsiness + - Adrenaline - type: Bloodstream bloodMaxVolume: 150 - type: MobPrice diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index fe2416510e..16e3038fcd 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -106,6 +106,7 @@ - Pacified - RadiationProtection - Drowsiness + - Adrenaline - type: Temperature heatDamageThreshold: 800 - type: Metabolizer diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index cbe09c29ad..2349eddd3a 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -135,6 +135,7 @@ - Flashed - RadiationProtection - Drowsiness + - Adrenaline - type: Body prototype: Human requiredLegs: 2 diff --git a/Resources/Prototypes/Procedural/vgroid.yml b/Resources/Prototypes/Procedural/vgroid.yml index 05ab652ece..0747a58b30 100644 --- a/Resources/Prototypes/Procedural/vgroid.yml +++ b/Resources/Prototypes/Procedural/vgroid.yml @@ -180,7 +180,7 @@ minCount: 8 maxCount: 15 groups: - - id: MobGoliath + - id: SalvageSpawnerMobMiningAsteroid amount: 1 #- type: dungeonConfig @@ -207,10 +207,10 @@ # Mobs # If you want exterior dungeon mobs add them under the prototype. - !type:MobsDunGen - minCount: 20 - maxCount: 30 + minCount: 25 + maxCount: 35 groups: - - id: MobGoliath + - id: SalvageSpawnerMobMiningAsteroid amount: 1 #- type: dungeonConfig diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index b2b4850c8f..769b7748f3 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -166,3 +166,23 @@ color: "#E6E6DA" physicalDesc: reagent-physical-desc-crystalline slippery: false + +- type: reagent + id: Rororium + name: reagent-name-rororium + desc: reagent-desc-rororium + group: Biological + flavor: tingly + physicalDesc: reagent-physical-desc-refreshing + color: "#bf1365" + metabolisms: + Medicine: + effects: + - !type:HealthChange + damage: + groups: + Brute: -4 + - !type:GenericStatusEffect + key: Adrenaline + component: IgnoreSlowOnDamage + time: 120 diff --git a/Resources/Prototypes/status_effects.yml b/Resources/Prototypes/status_effects.yml index 96379323fd..49e5ccc579 100644 --- a/Resources/Prototypes/status_effects.yml +++ b/Resources/Prototypes/status_effects.yml @@ -68,3 +68,7 @@ - type: statusEffect id: Drowsiness #blurs your vision and makes you randomly fall asleep + +- type: statusEffect + id: Adrenaline + alert: Adrenaline diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord.png b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord.png new file mode 100644 index 0000000000..09d70265e6 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_alert.png b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_alert.png new file mode 100644 index 0000000000..e9ecab5eb7 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_alert.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_alert_nocore.png b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_alert_nocore.png new file mode 100644 index 0000000000..dc61d81d2b Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_alert_nocore.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_dead.png b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_dead.png new file mode 100644 index 0000000000..4e09b49b40 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_dead.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_dead_nocore.png b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_dead_nocore.png new file mode 100644 index 0000000000..5f2a004190 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_dead_nocore.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_nocore.png b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_nocore.png new file mode 100644 index 0000000000..7d38dbfe89 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelord_nocore.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelordbrood.png b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelordbrood.png new file mode 100644 index 0000000000..ddce7a9b19 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/hivelordbrood.png differ diff --git a/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/meta.json new file mode 100644 index 0000000000..b11726cf73 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Asteroid/hivelord.rsi/meta.json @@ -0,0 +1,74 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/9bd459b27c73575fd5e3bf2efea13b816d0ac7c8/icons/mob/animal.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "hivelord", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "hivelord_nocore", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "hivelord_alert", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "hivelord_alert_nocore", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "hivelord_dead" + }, + { + "name": "hivelord_dead_nocore" + }, + { + "name": "hivelordbrood", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/boiled.png b/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/boiled.png new file mode 100644 index 0000000000..1a1d0c92dc Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/boiled.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/icon.png b/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/icon.png new file mode 100644 index 0000000000..de235cca3c Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/meta.json new file mode 100644 index 0000000000..84b5983a1c --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/rorocore.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "boiled" + } + ] +}