diff --git a/Content.Server/ADT/Abilities/XenoQeen/XenoQeenComponent.cs b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenComponent.cs new file mode 100644 index 00000000000..1e4b46a9c18 --- /dev/null +++ b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Abilities.XenoQeen +{ + /// + /// Lets its owner entity use mime powers, like placing invisible walls. + /// + [RegisterComponent] + public sealed partial class XenoQeenComponent : Component + { + /// + /// Whether this component is active or not. + /// + [DataField("enabled")] + public bool Enabled = true; + + /// + /// The wall prototype to use. + /// + [DataField("wallPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string XenoTurret = "WeaponTurretXeno"; + + [DataField("xenoTurretAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? XenoTurretAction = "ActionXenoQeenTurret"; + + [DataField("xenoTurretActionEntity")] public EntityUid? XenoTurretActionEntity; + } +} diff --git a/Content.Server/ADT/Abilities/XenoQeen/XenoQeenSystem.cs b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenSystem.cs new file mode 100644 index 00000000000..fb4f41abde3 --- /dev/null +++ b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenSystem.cs @@ -0,0 +1,66 @@ +using Content.Server.Popups; +using Content.Shared.Actions; +using Content.Shared.Actions.Events; +using Content.Shared.Coordinates.Helpers; +using Content.Shared.Maps; +using Content.Shared.Physics; +using Robust.Shared.Containers; +using Robust.Shared.Map; + +namespace Content.Server.Abilities.XenoQeen +{ + public sealed class XenoQeenSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly TurfSystem _turf = default!; + [Dependency] private readonly IMapManager _mapMan = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnCreateTurret); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + } + private void OnComponentInit(EntityUid uid, XenoQeenComponent component, ComponentInit args) + { + _actionsSystem.AddAction(uid, ref component.XenoTurretActionEntity, component.XenoTurretAction, uid); + } + private void OnCreateTurret(EntityUid uid, XenoQeenComponent component, InvisibleWallActionEvent args) + { + if (!component.Enabled) + return; + + if (_container.IsEntityOrParentInContainer(uid)) + return; + + var xform = Transform(uid); + // Get the tile in front of the Qeen + var offsetValue = xform.LocalRotation.ToWorldVec(); + var coords = xform.Coordinates.Offset(offsetValue).SnapToGrid(EntityManager, _mapMan); + var tile = coords.GetTileRef(EntityManager, _mapMan); + if (tile == null) + return; + + // Check if the tile is blocked by a wall or mob, and don't create the wall if so + if (_turf.IsTileBlocked(tile.Value, CollisionGroup.Impassable | CollisionGroup.Opaque)) + { + _popupSystem.PopupEntity(Loc.GetString("create-turret-failed"), uid, uid); + return; + } + + _popupSystem.PopupEntity(Loc.GetString("create-turret"), uid); + // Make sure we set the invisible wall to despawn properly + Spawn(component.XenoTurret, _turf.GetTileCenter(tile.Value)); + // Handle args so cooldown works + args.Handled = true; + } + + } +} diff --git a/Resources/Locale/ru-RU/ADT/prototypes/Actions/XenoQeen.ftl b/Resources/Locale/ru-RU/ADT/prototypes/Actions/XenoQeen.ftl new file mode 100644 index 00000000000..9a3337faeba --- /dev/null +++ b/Resources/Locale/ru-RU/ADT/prototypes/Actions/XenoQeen.ftl @@ -0,0 +1,14 @@ +ent-ActionXenoQeenTurret = Создать ксено турель. + .desc = Создаёт перед вами ксену турель, если хватает места. +create-turret-failed = Найдите другое место. +create-turret = Арргхсс. Шшшшш! +ent-ActionSpawnMobXenoSpitter = Призвать Плевальщик + .desc = Родите Плевальщика, который будет плеваться! +ent-ActionSpawnMobXenoPraetorian = Призвать Преторианеца + .desc = Родите Преторианеца, который будет сражаться за вас! +ent-ActionSpawnMobXenoDrone = Просто Дрон. Кому он нужен? + .desc = Родите рабочего, Дрон. +ent-ActionSpawnMobXenoRavager = Призвать Разрушителя + .desc = Родите смерть во плоти! +ent-ActionSpawnMobXenoRunner = Призвать Бегуна + .desc = Родите самую быструю личинку! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl index d6fbec371b1..f1912d62683 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl @@ -1,19 +1,19 @@ ent-MobXeno = Бурильщик .desc = Обычно они приходят ночью. Обычно. ent-MobXenoPraetorian = Преторианец - .desc = { ent-MobXeno.desc } + .desc = Преторианец. Личная гвардия королевы, задача которого - защитить королеву. Стойкий воин ксено с хорошим уроном. ent-MobXenoDrone = Дрон - .desc = { ent-MobXeno.desc } + .desc = Дрон. Рядовой представитель ксеносов, задача которых - защищать улей и иногда охотиться. Не обладают выдающимися характеристиками. Самый типичный ксено. ent-MobXenoQueen = Королева - .desc = { ent-MobXeno.desc } + .desc = Королева. Предводительница стаи, невероятно сильная и живучая, если она оказалась перед вами - считайте, что вы мертвы. ent-MobXenoRavager = Разрушитель - .desc = { ent-MobXeno.desc } + .desc = Разрушитель. Самый сильный и живучий ксенос, после королевы. ent-MobXenoRunner = Бегун - .desc = { ent-MobXeno.desc } + .desc = Бегун. Обладает малым уроном, но отличается большой скоростью, так что быстро бегает и бьёт. ent-MobXenoRouny = Руни .desc = { ent-MobXenoRunner.desc } ent-MobXenoSpitter = Плевальщик - .desc = { ent-MobXeno.desc } + .desc = Плевальщик. Рядовой представитель ксеносов, который плюётся едкой кислотой, прожигающую даже броню. Однако слаб в ближнем бою. ent-MobPurpleSnake = космическая гадюка .desc = Грозная пурпурная змея с Kepler-283c. ent-MobSmallPurpleSnake = космическая гадюка diff --git a/Resources/Prototypes/ADT/Actions/XenoQeen.yml b/Resources/Prototypes/ADT/Actions/XenoQeen.yml new file mode 100644 index 00000000000..2c853b949ad --- /dev/null +++ b/Resources/Prototypes/ADT/Actions/XenoQeen.yml @@ -0,0 +1,109 @@ +# Спавн турелей у королевы +- type: entity + id: ActionXenoQeenTurret + name: Create Xeno turret + description: Create an xeno turret in front of you, if placeable there. + components: + - type: InstantAction + priority: -1 + useDelay: 180 + icon: + sprite: Objects/Weapons/Guns/Turrets/xenoturret.rsi + state: icon + event: !type:InvisibleWallActionEvent +# Я не смог сделать отдельный ивент для спавнта турели. Он не видел прототип ивента. + +- type: entity + id: ActionSpawnMobXenoSpitter + name: Spawn Spitter + description: Give birth to Spitter who will spit! + categories: [ HideSpawnMenu ] + components: + - type: WorldTargetAction + useDelay: 240 + range: 4 + itemIconStyle: BigAction + icon: + sprite: Mobs/Aliens/Xenos/spitter.rsi + state: crit + event: !type:WorldSpawnSpellEvent + prototypes: + - id: MobXenoSpitter + amount: 1 + offset: 0, 1 + +- type: entity + id: ActionSpawnMobXenoPraetorian + name: Spawn Praetorian + description: Give birth to a Praetorian who will fight for you! + categories: [ HideSpawnMenu ] + components: + - type: WorldTargetAction + useDelay: 300 + range: 4 + itemIconStyle: BigAction + icon: + sprite: Mobs/Aliens/Xenos/praetorian.rsi + state: crit + event: !type:WorldSpawnSpellEvent + prototypes: + - id: MobXenoPraetorian + amount: 1 + offset: 0, 1 + +- type: entity + id: ActionSpawnMobXenoDrone + name: Just a Drone. Who needs it? + description: Give birth to a worker, Drone. + categories: [ HideSpawnMenu ] + components: + - type: WorldTargetAction + useDelay: 80 + range: 4 + itemIconStyle: BigAction + icon: + sprite: Mobs/Aliens/Xenos/drone.rsi + state: crit + event: !type:WorldSpawnSpellEvent + prototypes: + - id: MobXenoDrone + amount: 1 + offset: 0, 1 + +- type: entity + id: ActionSpawnMobXenoRavager + name: Spawn Ravager + description: Give birth to death in the flesh! + categories: [ HideSpawnMenu ] + components: + - type: WorldTargetAction + useDelay: 480 + range: 4 + itemIconStyle: BigAction + icon: + sprite: Mobs/Aliens/Xenos/ravager.rsi + state: crit + event: !type:WorldSpawnSpellEvent + prototypes: + - id: MobXenoRavager + amount: 1 + offset: 0, 1 + +- type: entity + id: ActionSpawnMobXenoRunner + name: Spawn Runner + description: Give birth to the fastest larva! + categories: [ HideSpawnMenu ] + components: + - type: WorldTargetAction + useDelay: 120 + range: 4 + itemIconStyle: BigAction + icon: + sprite: Mobs/Aliens/Xenos/runner.rsi + state: crit + event: !type:WorldSpawnSpellEvent + prototypes: + - id: MobXenoRunner + amount: 1 + offset: 0, 1 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index a71adfc57cf..eacda126d91 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -146,12 +146,18 @@ - type: MobThresholds thresholds: 0: Alive - 100: Dead + 350: Dead # ADT Tweak - type: Stamina critThreshold: 300 - type: SlowOnDamage speedModifierThresholds: 50: 0.7 + #ADT Start: Xeno baff + - type: MeleeWeapon + damage: + groups: + Brute: 8 + # ADT End - type: Fixtures fixtures: fix1: @@ -183,14 +189,14 @@ - type: MobThresholds thresholds: 0: Alive - 80: Dead + 100: Dead # ADT Tweak - type: SlowOnDamage speedModifierThresholds: 40: 0.7 - type: MeleeWeapon damage: groups: - Brute: 6 + Brute: 5 # ADT Tweak - type: MovementSpeedModifier baseSprintSpeed: 4 - type: Fixtures @@ -214,6 +220,16 @@ parent: MobXeno id: MobXenoQueen components: + # ADT Start: Xeno buff + - type: XenoQeen # ADT Tweak: Способность спавнта турелей + - type: ActionGrant + actions: + - ActionSpawnMobXenoSpitter # Призыв Плевальщиков + - ActionSpawnMobXenoPraetorian # Призыв Преторианеца + - ActionSpawnMobXenoDrone # Призыв Дрона + - ActionSpawnMobXenoRavager # Призыв Разрушителя + - ActionSpawnMobXenoRunner # Призыв бегуна + #ADT End - type: Sprite drawdepth: Mobs sprite: Mobs/Aliens/Xenos/queen.rsi @@ -224,7 +240,7 @@ - type: MobThresholds thresholds: 0: Alive - 300: Dead + 1000: Dead # ADT Tweak - type: SlowOnDamage speedModifierThresholds: 150: 0.7 @@ -232,7 +248,7 @@ - type: MeleeWeapon damage: groups: - Brute: 12 + Brute: 20 # ADT Tweak - type: Fixtures fixtures: fix1: @@ -252,7 +268,6 @@ rankName: collective-mind-queen-rank # ADT-CollectiveMind-Tweak-End - - type: entity name: ravager parent: MobXeno @@ -268,13 +283,13 @@ - type: MobThresholds thresholds: 0: Alive - 100: Dead + 750: Dead # ADT Tweak - type: MovementSpeedModifier - baseSprintSpeed: 4 + baseSprintSpeed: 2 # ADT Tweak - type: MeleeWeapon damage: groups: - Brute: 10 + Brute: 30 # ADT Tweak - type: SlowOnDamage speedModifierThresholds: 50: 0.7 @@ -306,8 +321,14 @@ layers: - map: ["enum.DamageStateVisualLayers.Base"] state: running + # ADT Start: Xeno buff + - type: MobThresholds + thresholds: + 0: Alive + 100: Dead + # ADT End - type: MovementSpeedModifier - baseSprintSpeed: 6.0 + baseSprintSpeed: 12.0 # ADT Tweak - type: MeleeWeapon damage: groups: @@ -362,7 +383,7 @@ - type: MobThresholds thresholds: 0: Alive - 50: Dead + 80: Dead # ADT Tweak - type: SlowOnDamage speedModifierThresholds: 25: 0.7 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index f4043820d0c..247d3dcb314 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -805,7 +805,7 @@ - type: Projectile damage: types: - Caustic: 5 + Caustic: 12 # ADT Tweak - type: Sprite sprite: Objects/Weapons/Guns/Projectiles/xeno_toxic.rsi layers: diff --git a/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/icon.png b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/icon.png new file mode 100644 index 00000000000..7eef088dfb6 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json index 3adb37ea5c3..071f869db31 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json @@ -7,6 +7,9 @@ "y": 32 }, "states": [ + { + "name": "icon" + }, { "name": "acid_turret", "directions": 4,