diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs new file mode 100644 index 0000000000..b4f6f8d11e --- /dev/null +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -0,0 +1,38 @@ +using Content.Shared.Damage; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server._White.Headcrab; + +[Access(typeof(HeadcrabSystem))] +[RegisterComponent] +public sealed partial class HeadcrabComponent : Component +{ + /// + /// WorldTargetAction + /// + [DataField(required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + public string JumpAction = "ActionHeadcrabJump"; + + [DataField] + public float ParalyzeTime = 3f; + + [DataField] + public int ChancePounce = 33; + + [DataField(required: true)] + public DamageSpecifier Damage = default!; + + public EntityUid EquippedOn; + + [ViewVariables] + public float Accumulator = 0; + + [DataField] + public float DamageFrequency = 5; + + [DataField] + public SoundSpecifier? JumpSound = new SoundPathSpecifier("/Audio/_White/Misc/Headcrab/headcrab_jump.ogg"); + +} diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs new file mode 100644 index 0000000000..b8a3971561 --- /dev/null +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -0,0 +1,200 @@ +using System.Linq; +using Content.Server.Actions; +using Content.Server.NPC.Components; +using Content.Server.Popups; +using Content.Server.NPC.Systems; +using Content.Shared.Zombies; +using Content.Shared.CombatMode; +using Content.Shared.Ghost; +using Content.Shared.Damage; +using Content.Shared.CombatMode.Pacification; +using Content.Shared.Hands; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Humanoid; +using Content.Shared.Nutrition.Components; +using Content.Shared._White.Headcrab; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; +using Content.Shared.Mobs.Systems; +using Content.Shared.Popups; +using Content.Shared.Stunnable; +using Content.Shared.Throwing; +using Content.Shared.Weapons.Melee.Events; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; +using Robust.Shared.Random; + +namespace Content.Server._White.Headcrab; + +public sealed partial class HeadcrabSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedStunSystem _stunSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly NpcFactionSystem _npcFaction = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedCombatModeSystem _combat = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly ActionsSystem _action = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMeleeHit); + SubscribeLocalEvent(OnThrowDoHit); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnGotEquippedHand); + SubscribeLocalEvent(OnUnequipAttempt); + SubscribeLocalEvent(OnJump); + } + + private void OnStartup(EntityUid uid, HeadcrabComponent component, ComponentStartup args) + { + _action.AddAction(uid, component.JumpAction); + } + + private void OnThrowDoHit(EntityUid uid, HeadcrabComponent component, ThrowDoHitEvent args) + { + TryEquipHeadcrab(uid, args.Target, component); + } + + private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquippedEvent args) + { + if (args.Slot != "mask") + return; + + component.EquippedOn = args.Equipee; + EnsureComp(uid); + RemComp(uid); + _npcFaction.AddFaction(args.Equipee, "Zombie"); + + if (_mobState.IsDead(uid)) + return; + + _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", + ("entity", args.Equipee)), + uid, uid, PopupType.LargeCaution); + + _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", + ("entity", args.Equipee)), args.Equipee, Filter.PvsExcept(uid), true, PopupType.Large); + + _stunSystem.TryParalyze(args.Equipee, TimeSpan.FromSeconds(component.ParalyzeTime), true); + _damageableSystem.TryChangeDamage(args.Equipee, component.Damage, origin: uid); + } + + private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingUnequippedAttemptEvent args) + { + if (args.Slot != "mask" || + component.EquippedOn != args.Unequipee || + HasComp(args.Unequipee) || + _mobState.IsDead(uid)) + return; + + _popup.PopupEntity(Loc.GetString("headcrab-try-unequip"), + args.Unequipee, args.Unequipee, PopupType.Large); + args.Cancel(); + } + + private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEquippedHandEvent args) + { + if (_mobState.IsDead(uid) || + HasComp(args.User) || + HasComp(args.User)) + return; + + _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); + _damageableSystem.TryChangeDamage(args.User, component.Damage); + _popup.PopupEntity(Loc.GetString("headcrab-entity-bite"), + args.User, args.User); + } + + private void OnGotUnequipped(EntityUid uid, HeadcrabComponent component, GotUnequippedEvent args) + { + if (args.Slot != "mask") + return; + + component.EquippedOn = EntityUid.Invalid; + RemCompDeferred(uid); + var combatMode = EnsureComp(uid); + _combat.SetInCombatMode(uid, true, combatMode); + EnsureComp(uid); + _npcFaction.RemoveFaction(args.Equipee, "Zombie"); + } + + private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEvent args) + { + if (!args.HitEntities.Any() + || _random.Next(1, 101) <= component.ChancePounce) + return; + + TryEquipHeadcrab(uid, args.HitEntities.First(), component); + } + + private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent args) + { + if (args.Handled || component.EquippedOn is { Valid: true }) + return; + + args.Handled = true; + var xform = Transform(uid); + var mapCoords = _transform.ToMapCoordinates(args.Target); + var direction = mapCoords.Position - _transform.GetMapCoordinates(xform).Position; + + _throwing.TryThrow(uid, direction, 7F, uid, 10F); + if (component.JumpSound != null) + _audioSystem.PlayPvs(component.JumpSound, uid, component.JumpSound.Params); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + comp.Accumulator += frameTime; + + if (comp.Accumulator <= comp.DamageFrequency) + continue; + + comp.Accumulator = 0; + + if (comp.EquippedOn is not { Valid: true } targetId || + HasComp(comp.EquippedOn) || + _mobState.IsDead(uid)) + continue; + + if (!_mobState.IsAlive(targetId)) + { + _inventory.TryUnequip(targetId, "mask", true, true); + comp.EquippedOn = EntityUid.Invalid; + continue; + } + + _damageableSystem.TryChangeDamage(targetId, comp.Damage); + _popup.PopupEntity(Loc.GetString("headcrab-eat-entity-face"), + targetId, targetId, PopupType.LargeCaution); + _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", + ("entity", targetId)), targetId, Filter.PvsExcept(targetId), true); + } + } + + private bool TryEquipHeadcrab(EntityUid uid, EntityUid target, HeadcrabComponent component) + { + if (_mobState.IsDead(uid) + || !_mobState.IsAlive(target) + || !HasComp(target) + || HasComp(target)) + return false; + + _inventory.TryGetSlotEntity(target, "head", out var headItem); + return !HasComp(headItem) + && !_inventory.TryEquip(target, uid, "mask", true); + } +} diff --git a/Content.Shared/_White/Headcrab/SharedHeadcrab.cs b/Content.Shared/_White/Headcrab/SharedHeadcrab.cs new file mode 100644 index 0000000000..521b70293c --- /dev/null +++ b/Content.Shared/_White/Headcrab/SharedHeadcrab.cs @@ -0,0 +1,10 @@ +using Content.Shared.Actions; +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared._White.Headcrab; + +public sealed partial class JumpActionEvent : WorldTargetActionEvent +{ + +} diff --git a/Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg b/Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg new file mode 100644 index 0000000000..0071d77342 Binary files /dev/null and b/Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg differ diff --git a/Resources/Locale/en-US/_white/popups/headcrab.ftl b/Resources/Locale/en-US/_white/popups/headcrab.ftl new file mode 100644 index 0000000000..cd8cc9a183 --- /dev/null +++ b/Resources/Locale/en-US/_white/popups/headcrab.ftl @@ -0,0 +1,11 @@ +ghost-role-information-headcrab-name = Headcrab +ghost-role-information-headcrab-description = Ride the carrier, bite off its head and protect your nest. + +headcrab-eat-entity-face = Headcrab is eating your head! +headcrab-eat-other-entity-face = Headcrab is eating { CAPITALIZE($entity) } head! + +headcrab-hit-entity-head = You got { CAPITALIZE($entity) } head! + +headcrab-entity-bite = Headcrab bit your hand! + +headcrab-try-unequip = You cant take headcrab off your head. diff --git a/Resources/Locale/en-US/_white/station-events/events/events.ftl b/Resources/Locale/en-US/_white/station-events/events/events.ftl index 2e3cf6311c..c959643c9c 100644 --- a/Resources/Locale/en-US/_white/station-events/events/events.ftl +++ b/Resources/Locale/en-US/_white/station-events/events/events.ftl @@ -1,2 +1,4 @@ station-event-stray-supply-pod-announcement = Stray capsule with goods was found on long-range scanners. The approximate landing location is unknown. station-event-stray-supply-pod-syndicate-announcement = Stray capsule with goods was found on long-range scanners. The approximate landing location is unknown. + +station-event-headcrab-invasion-announcement = Confirmed sightings of hostile wildlife on the station. Personnel are advised to arm themselves, barricade doors, and defend themselves if necessary. Security is advised to eradicate the threat as soon as possible. diff --git a/Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl b/Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl new file mode 100644 index 0000000000..49f09dcab2 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl @@ -0,0 +1,5 @@ +antagonist-name-headcrabs = Хедкрабы + +antagonist-name-headcrab = Хедкраб +antagonist-name-headcrab-fast = Быстрый хедкраб +antagonist-name-headcrab-poison = Ядовитый хедкраб diff --git a/Resources/Locale/ru-RU/_white/guidbook/main.ftl b/Resources/Locale/ru-RU/_white/guidbook/main.ftl new file mode 100644 index 0000000000..fa1f25acf7 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/guidbook/main.ftl @@ -0,0 +1,3 @@ +guide-entry-wwdp = WWDP + +guide-entry-antagonist = Антагонисты diff --git a/Resources/Locale/ru-RU/_white/popups/headcrab.ftl b/Resources/Locale/ru-RU/_white/popups/headcrab.ftl new file mode 100644 index 0000000000..6d19540cdc --- /dev/null +++ b/Resources/Locale/ru-RU/_white/popups/headcrab.ftl @@ -0,0 +1,11 @@ +ghost-role-information-headcrab-name = Хедкраб +ghost-role-information-headcrab-description = Оседлай носителя, откуси ему голову и защити своё гнездо. + +headcrab-eat-entity-face = Хедкраб пожирает твою голову! +headcrab-eat-other-entity-face = Хедкраб ест голову { CAPITALIZE($entity) }! + +headcrab-hit-entity-head = Вы ухватились за голову { CAPITALIZE($entity) }! + +headcrab-entity-bite = Хедкраб укусил вас за руку! + +headcrab-try-unequip = Вы не можете снять хедкраба со своей головы. diff --git a/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl b/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl index d899cbf275..82a9b83cf4 100644 --- a/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl +++ b/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl @@ -9,3 +9,6 @@ ent-ToggleNightVision = Переключить ночное зрение ent-ToggleThermalVision = Переключить термальное зрение .desc = Переключает термальное зрение. + +ent-ActionHeadcrabJump = Прыгнуть + .desc = Сделать крутой прыжок. diff --git a/Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl b/Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl new file mode 100644 index 0000000000..ff04fd5e94 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl @@ -0,0 +1,5 @@ +ent-SpawnHeadcrabNest = спавнер гнездо хедкраба + +ent-SpawnMobHeadcrab = спавнер хедкраб +ent-SpawnMobHeadcrabFast = спавнер быстрый хедкраб +ent-SpawnMobHeadcrabPoison = спавнер ядовитый хедкраб diff --git a/Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl b/Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl new file mode 100644 index 0000000000..b62a874158 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl @@ -0,0 +1,9 @@ +ent-BaseMobHeadcrab = хедкраб + .desc = Похоже на что-то паразитирующее. + +ent-MobHeadcrab = { ent-BaseMobHeadcrab } + .desc = { ent-BaseMobHeadcrab.desc } +ent-MobHeadcrabFast = быстрый хедкраб + .desc = { ent-BaseMobHeadcrab.desc } +ent-MobHeadcrabPoison = ядовитый хедкраб + .desc = { ent-BaseMobHeadcrab.desc } diff --git a/Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl b/Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl new file mode 100644 index 0000000000..b63b0458de --- /dev/null +++ b/Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl @@ -0,0 +1,2 @@ +ent-HeadcrabNest = гнездо хедкрабов + .desc = Кажется оно шевелится. diff --git a/Resources/Locale/ru-RU/_white/station-events/events/events.ftl b/Resources/Locale/ru-RU/_white/station-events/events/events.ftl index 5424e0c09a..42cbd3613d 100644 --- a/Resources/Locale/ru-RU/_white/station-events/events/events.ftl +++ b/Resources/Locale/ru-RU/_white/station-events/events/events.ftl @@ -1,2 +1,4 @@ station-event-stray-supply-pod-announcement = На сканерах дальнего действия обнаружена бродячая капсула с товарами. Примерное место приземления неизвестно. station-event-stray-supply-pod-syndicate-announcement = На сканерах дальнего действия обнаружена бродячая капсула с товарами. Примерное место приземления неизвестно. + +station-event-headcrab-invasion-announcement = Подтверждено наличие на станции враждебной фауны. Персоналу рекомендуется вооружиться, забаррикадировать двери и защищаться в случае необходимости. Службе безопасности следует как можно скорее ликвидировать угрозу. diff --git a/Resources/Prototypes/_White/Actions/types.yml b/Resources/Prototypes/_White/Actions/types.yml index 6e0ac4502f..e90d6bb477 100644 --- a/Resources/Prototypes/_White/Actions/types.yml +++ b/Resources/Prototypes/_White/Actions/types.yml @@ -54,4 +54,21 @@ icon: sprite: _White/Clothing/Eyes/Goggles/thermal.rsi state: icon - event: !type:ToggleThermalVisionEvent \ No newline at end of file + event: !type:ToggleThermalVisionEvent + +- type: entity + id: ActionHeadcrabJump + name: Jump + description: Do super jump. + categories: [ HideSpawnMenu ] + components: + - type: WorldTargetAction + icon: + sprite: _White/Interface/Actions/headcrab.rsi + state: jump-off + iconOn: + sprite: _White/Interface/Actions/headcrab.rsi + state: jump-on + event: !type:JumpActionEvent + useDelay: 6 + range: 160 diff --git a/Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml b/Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml new file mode 100644 index 0000000000..d092a6bb92 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml @@ -0,0 +1,55 @@ +- type: entity + parent: MarkerBase + id: SpawnHeadcrabNest + name: headcrab nest spawner + components: + - type: Sprite + layers: + - state: green + - sprite: _White/Structures/Other/headcrab_nest.rsi + state: icon + - type: ConditionalSpawner + prototypes: + - HeadcrabNest + +- type: entity + parent: MarkerBase + id: SpawnMobHeadcrab + name: headcrab spawner + components: + - type: Sprite + layers: + - state: green + - sprite: _White/Mobs/Animals/headcrab.rsi + state: alive + - type: ConditionalSpawner + prototypes: + - MobHeadcrab + +- type: entity + parent: MarkerBase + id: SpawnMobHeadcrabFast + name: fast headcrab spawner + components: + - type: Sprite + layers: + - state: green + - sprite: _White/Mobs/Animals/headcrab_fast.rsi + state: alive + - type: ConditionalSpawner + prototypes: + - MobHeadcrabFast + +- type: entity + parent: MarkerBase + id: SpawnMobHeadcrabPoison + name: poison headcrab spawner + components: + - type: Sprite + layers: + - state: green + - sprite: _White/Mobs/Animals/headcrab_poison.rsi + state: alive + - type: ConditionalSpawner + prototypes: + - MobHeadcrabPoison diff --git a/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml new file mode 100644 index 0000000000..590aaf752f --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml @@ -0,0 +1,157 @@ +# BASE + +- type: entity + parent: + - BaseMob + - MobDamageable + - MobCombat + - MobAtmosStandard + - MobBloodstream + - MobFlammable + id: BaseMobHeadcrab + abstract: true + name: headcrab + description: It looks like something parasitic. + components: + - type: GhostTakeoverAvailable + - type: GhostRole + allowSpeech: false + name: ghost-role-information-headcrab-name + description: ghost-role-information-headcrab-description + raffle: + settings: short + - type: Sprite + drawdepth: SmallMobs + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: alive + - type: MobThresholds + thresholds: + 0: Alive + 50: Dead + - type: Headcrab + paralyzeTime: 3 + chancePounce: 33 + damage: + types: + Piercing: 2 + jumpAction: ActionHeadcrabJump + - type: DamageStateVisuals + states: + Alive: + Base: alive + Dead: + Base: dead + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.2 + density: 100 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: ZombieImmune + - type: Item + size: Large + - type: Clothing + quickEquip: false + slots: + - MASK + - HEAD + - type: Physics + bodyType: Dynamic + - type: MeleeWeapon + hidden: true + soundHit: + path: /Audio/Effects/bite.ogg + angle: 0 + animation: WeaponArcBite + damage: + types: + Piercing: 2 + - type: IgnoreSpiderWeb + - type: NoSlip + - type: NameIdentifier + group: GenericNumber + - type: NpcFactionMember + factions: + - Zombie + - type: HTN + rootTask: + task: SimpleHostileCompound + - type: MovementSpeedModifier + baseWalkSpeed: 2.9 + baseSprintSpeed: 3.9 + - type: Tag + tags: + - WhitelistChameleon + - MonkeyWearable + - PetWearable + - type: LanguageKnowledge + speaks: + - Hissing + understands: + - Xeno + - Hissing + - Draconic + - TauCetiBasic + - type: GuideHelp + guides: + - Headcrabs + +# HEADCRABS + +- type: entity + parent: BaseMobHeadcrab + id: MobHeadcrab + components: + - type: Sprite + sprite: _White/Mobs/Animals/headcrab.rsi + - type: Clothing + sprite: _White/Mobs/Animals/headcrab.rsi + - type: GuideHelp + guides: + - Headcrab + +- type: entity + parent: BaseMobHeadcrab + id: MobHeadcrabFast + name: fast headcrab + components: + - type: Sprite + sprite: _White/Mobs/Animals/headcrab_fast.rsi + - type: Clothing + sprite: _White/Mobs/Animals/headcrab_fast.rsi + - type: MovementSpeedModifier + baseWalkSpeed: 3.2 + baseSprintSpeed: 4.2 + - type: GuideHelp + guides: + - HeadcrabFast + +- type: entity + parent: BaseMobHeadcrab + id: MobHeadcrabPoison + name: poison headcrab + components: + - type: Sprite + sprite: _White/Mobs/Animals/headcrab_poison.rsi + - type: Clothing + sprite: _White/Mobs/Animals/headcrab_poison.rsi + - type: Headcrab + damage: + types: + Poison: 2 + - type: MeleeWeapon + damage: + types: + Poison: 2 + - type: MovementSpeedModifier + baseWalkSpeed: 2.6 + baseSprintSpeed: 3.6 + - type: GuideHelp + guides: + - HeadcrabPoison diff --git a/Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml b/Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml new file mode 100644 index 0000000000..c548967cb3 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml @@ -0,0 +1,51 @@ +- type: entity + parent: BaseStructure + id: HeadcrabNest + name: headcrab nest + description: It seems to be moving. + components: + - type: Sprite + sprite: _White/Structures/Other/headcrab_nest.rsi + layers: + - state: icon + - type: Damageable + damageContainer: Biological + - type: Flammable + fireSpread: true + damage: + types: + Heat: 10 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 250 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: desecration + - !type:SpawnEntitiesBehavior + spawn: + MobHeadcrab: + min: 0 + max: 1 + MobHeadcrabFast: + min: 0 + max: 1 + MobHeadcrabPoison: + min: 0 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Timer + - type: TimedSpawner + prototypes: + - MobHeadcrab + - MobHeadcrabFast + - MobHeadcrabPoison + intervalSeconds: 60 + minimumEntitiesSpawned: 1 + maximumEntitiesSpawned: 2 + - type: GuideHelp + guides: + - Headcrabs diff --git a/Resources/Prototypes/_White/GameRules/events.yml b/Resources/Prototypes/_White/GameRules/events.yml index 71d433c40c..8437d287b3 100644 --- a/Resources/Prototypes/_White/GameRules/events.yml +++ b/Resources/Prototypes/_White/GameRules/events.yml @@ -44,3 +44,18 @@ reoccurrenceDelay: 40 - type: RandomSpawnRule prototype: SpawnStraySupplyPodSyndicate + +- type: entity + parent: BaseGameRule + id: HeadcrabInvasion + categories: [ HideSpawnMenu ] + components: + - type: StationEvent + startAnnouncement: true + weight: 8 + duration: 1 + minimumPlayers: 15 + earliestStart: 15 + reoccurrenceDelay: 25 + - type: RandomSpawnRule + prototype: SpawnHeadcrabNest diff --git a/Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml b/Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml new file mode 100644 index 0000000000..d713fc4307 --- /dev/null +++ b/Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml @@ -0,0 +1,14 @@ +- type: guideEntry + id: Headcrab + name: antagonist-name-headcrab + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml" + +- type: guideEntry + id: HeadcrabFast + name: antagonist-name-headcrab-fast + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml" + +- type: guideEntry + id: HeadcrabPoison + name: antagonist-name-headcrab-poison + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml" diff --git a/Resources/Prototypes/_White/Guidebook/WWDP.yml b/Resources/Prototypes/_White/Guidebook/WWDP.yml new file mode 100644 index 0000000000..63e5e20f46 --- /dev/null +++ b/Resources/Prototypes/_White/Guidebook/WWDP.yml @@ -0,0 +1,6 @@ +- type: guideEntry + id: WWDP + name: guide-entry-wwdp + text: "/ServerInfo/_White/Guidebook/WWDP.xml" + children: + - WhiteAntagonist diff --git a/Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml b/Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml new file mode 100644 index 0000000000..cfec4c5fe1 --- /dev/null +++ b/Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml @@ -0,0 +1,19 @@ +# ANTAGONIST + +- type: guideEntry + id: WhiteAntagonist + name: guide-entry-antagonist + text: "/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml" + children: + - Headcrabs + +# Headcrab + +- type: guideEntry + id: Headcrabs + name: antagonist-name-headcrabs + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml" + children: + - Headcrab + - HeadcrabFast + - HeadcrabPoison diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml new file mode 100644 index 0000000000..a219148df9 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml @@ -0,0 +1,11 @@ + + # Антагонисты + + Простая и общая информация об уникальных антагонистах сборки. + + Мидраунд антагонисты: + + + + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml new file mode 100644 index 0000000000..da863ee938 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml @@ -0,0 +1,22 @@ + + # Хедкрабы + + Хедкрабы (Headcrab, дословный перевод — головной краб, головокраб) — самые многочисленные создания-паразиты из мира Зен. Вырвавшись на свободу из мира Зен во время инцидента в исследовательском центре «Чёрная Меза», эти существа выжили и размножились на Земле, а после и вовсе перебрались по всей галактике. + + Хедкрабы начинают размножение из своего гнезда. + + ## Виды + + Гнездо: + + + + + Хедкрабы: + + + + + + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml new file mode 100644 index 0000000000..74e11049b4 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml @@ -0,0 +1,19 @@ + + # Обычный хедкраб + + + + + Данный вид хедкрабов называют обыкновенным или классическим хедкрабом. Он выглядит как небольшое мешкообразное создание с четырьмя заострёнными конечностями. Существо передвигается при помощи задних конечностей и маленьких передних лапок (при этом подняв передние лапы-клешни) или на задних и передних больших лапах. Снизу тела хедкраба расположено широкое ротовое отверстие-присоска с острыми зубами-крючками по краям. Кожа у создания белёсого цвета с желтоватым оттенком. Ноги окрашены в кроваво-красный и чёрный цвет. Помимо четырёх больших конечностей и двух маленьких лапок, у хедкраба есть два образования в передней части тела, напоминающие паучьи челюсти-хелицеры с крючковидными зубами на конце. Возможно, эти челюсти используются для прокуса черепа добычи. + + По размерам хедкраб соизмерим с тушкой индейки. Длина его тела от передних конечностей до задних примерно равна 60 см. + + Несмотря на то что хедкраб небольшой, медлительный и уязвимый, он может совершать прыжки на расстояния порядка 5-10 метров при помощи своих задних лап. В полёте существо расставляет лапы широко в стороны. При успешной атаке хедкраб зацепляется за голову жертвы с целью получить контроль над её нервной системой, головным и спинным мозгом и, следовательно, над всем телом. + + ## Особенности + + - Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении. + - Имеет 50 ХП. + - Передвигается на 10% медленее. + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml new file mode 100644 index 0000000000..4ce86a8e42 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml @@ -0,0 +1,19 @@ + + # Быстрый хедкраб + + + + + Быстрый хедкраб по строению схож с обычным, однако его тело несколько меньше, а конечности более длинные и тонкие, отдалённо похожие на паучьи лапки. При помощи своих лап быстрый хедкраб способен висеть на стенах и потолках. Отличается тем, что быстро передвигается. + + По размерам хедкраб соизмерим с тушкой индейки. Длина его тела от передних конечностей до задних примерно равна 60 см. + + Несмотря на то что хедкраб небольшой и уязвимый, он может совершать прыжки на расстояния порядка 5-10 метров при помощи своих задних лап. В полёте существо расставляет лапы широко в стороны. При успешной атаке хедкраб зацепляется за голову жертвы с целью получить контроль над её нервной системой, головным и спинным мозгом и, следовательно, над всем телом. + + ## Особенности + + - Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении. + - Имеет 50 ХП. + - Передвигается на 20% быстрее. + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml new file mode 100644 index 0000000000..26311305d5 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml @@ -0,0 +1,19 @@ + + # Ядовитый хедкраб + + + + + Ядовитый хедкраб, в отличие от быстрого, больше похож на паука, чем на обычного хедкраба — сходны лишь очертания и пропорции. Ядовитого краба легко определить по его чёрной коже и конечностям, похожим на паучьи, а также по «приземлённой» посадке туловища. Покрыт редкими волосами. Присутствуют челюсти-хелицеры с острыми зубами, которыми он наносит ядовитый укус. На спине существа находится рисунок, похожий на рисунок пауков вида «крестовик обыкновенный». Передвигается ядовитый хедкраб по-паучьи, поочерёдно переставляя ногами. Нейротоксин ядовитых хедкрабов очень опасен. + + По размерам хедкраб соизмерим с тушкой индейки. Длина его тела от передних конечностей до задних примерно равна 60 см. + + Несмотря на то что хедкраб небольшой, медлительный и уязвимый, он может совершать прыжки на расстояния порядка 5-10 метров при помощи своих задних лап. В полёте существо расставляет лапы широко в стороны. При успешной атаке хедкраб зацепляется за голову жертвы с целью получить контроль над её нервной системой, головным и спинным мозгом и, следовательно, над всем телом. + + ## Особенности + + - Наносит [color=#46A446]2 яда[/color] своими челюстями, в том числе при закреплении. + - Имеет 50 ХП. + - Передвигается на 40% медленее. + + diff --git a/Resources/ServerInfo/_White/Guidebook/WWDP.xml b/Resources/ServerInfo/_White/Guidebook/WWDP.xml new file mode 100644 index 0000000000..0fc478bc05 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/WWDP.xml @@ -0,0 +1,11 @@ + + # WWDP + + Добро пожаловать в руководства [color=#DC143C]WWDP[/color]. + + ## Сервер + [color=#DC143C]WWDP[/color] - форк [color=#7B68EE]Einstein Engines[/color], представляющего из себя хард-форк репозитория [color=#2F4F4F]Space Wizards[/color], построенный на идеалах и дизайнерском вдохновении семейства серверов BayStation 12 от Space Station 13 с упором на модульный код, который каждый может использовать для создания RP-сервера своей мечты. + + [color=#DC143C]WWDP[/color] - один из основных серверов русского коммьюнити, который выступает за идеалы свободы отыгрыша, свободы слова и настоящей классической атмосферы Space Station 13 - хаос, веселье, возможности. + + diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-off.png b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-off.png new file mode 100644 index 0000000000..84c62a3083 Binary files /dev/null and b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-off.png differ diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-on.png b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-on.png new file mode 100644 index 0000000000..09bf1929d9 Binary files /dev/null and b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-on.png differ diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json new file mode 100644 index 0000000000..46526b2e82 --- /dev/null +++ b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "license": "CC-BY-NC-SA-4.0", + "copyright": "Sprited by PuroSlavKing (Github)", + "version": 1, + "size": { "y": 32, "x": 32 }, + "states": [ + { + "name": "jump-on" + }, + { + "name": "jump-off" + } + ] +} diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png new file mode 100644 index 0000000000..dd87a27835 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/dead.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/dead.png new file mode 100644 index 0000000000..a8a2cac6f5 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/dead.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-vox.png new file mode 100644 index 0000000000..230f44b455 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-vox.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..d4d010141d Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-vox.png new file mode 100644 index 0000000000..230f44b455 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-vox.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK.png new file mode 100644 index 0000000000..d4d010141d Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json new file mode 100644 index 0000000000..4b92e8e92c --- /dev/null +++ b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/commit/befbde4d72e7b7ed609209f77afb083b1bbf1aa5 | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dead" + }, + { + "name": "alive", + "directions": 4 + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-vox", + "directions": 4 + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/alive.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/alive.png new file mode 100644 index 0000000000..63e350616f Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/alive.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png new file mode 100644 index 0000000000..96b7e9e77b Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png new file mode 100644 index 0000000000..cc9ca35351 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..54e47a342e Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png new file mode 100644 index 0000000000..cc9ca35351 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK.png new file mode 100644 index 0000000000..54e47a342e Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json new file mode 100644 index 0000000000..4b92e8e92c --- /dev/null +++ b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/commit/befbde4d72e7b7ed609209f77afb083b1bbf1aa5 | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dead" + }, + { + "name": "alive", + "directions": 4 + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-vox", + "directions": 4 + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/alive.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/alive.png new file mode 100644 index 0000000000..d6af368824 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/alive.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png new file mode 100644 index 0000000000..e5b4fd2dd3 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png new file mode 100644 index 0000000000..dce1ff1268 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..3fd1446e07 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png new file mode 100644 index 0000000000..dce1ff1268 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png new file mode 100644 index 0000000000..3fd1446e07 Binary files /dev/null and b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json new file mode 100644 index 0000000000..4b92e8e92c --- /dev/null +++ b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/commit/befbde4d72e7b7ed609209f77afb083b1bbf1aa5 | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dead" + }, + { + "name": "alive", + "directions": 4 + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-vox", + "directions": 4 + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/icon.png b/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/icon.png new file mode 100644 index 0000000000..7d334ba273 Binary files /dev/null and b/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/icon.png differ diff --git a/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json b/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json new file mode 100644 index 0000000000..fa249acc50 --- /dev/null +++ b/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/commit/befbde4d72e7b7ed609209f77afb083b1bbf1aa5 | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon", + "delays": [ + [ + 0.6, + 0.3 + ] + ] + } + ] +}