diff --git a/Content.Server/EnergyDome/EnergyDomeSystem.cs b/Content.Server/EnergyDome/EnergyDomeSystem.cs index d04935304e..d39aa401ce 100644 --- a/Content.Server/EnergyDome/EnergyDomeSystem.cs +++ b/Content.Server/EnergyDome/EnergyDomeSystem.cs @@ -1,3 +1,4 @@ +using Content.Server.Damage.Components; using Content.Server.DeviceLinking.Events; using Content.Server.DeviceLinking.Systems; using Content.Server.Power.Components; @@ -12,6 +13,7 @@ using Content.Shared.Inventory; using Content.Shared.Popups; using Content.Shared.PowerCell; using Content.Shared.PowerCell.Components; +using Content.Shared.Throwing; using Content.Shared.Timing; using Content.Shared.Toggleable; using Content.Shared.Verbs; @@ -35,6 +37,8 @@ public sealed partial class EnergyDomeSystem : EntitySystem { base.Initialize(); + SubscribeLocalEvent(OnThrow); + //Generator events SubscribeLocalEvent(OnInit); @@ -62,6 +66,14 @@ public sealed partial class EnergyDomeSystem : EntitySystem SubscribeLocalEvent(OnDomeDamaged); } + private void OnThrow(Entity ent, ref ThrownEvent args) + { + if (args.User == null) + return; + + RaiseLocalEvent(args.User.Value, new EnergyDomeClothesTurnOffEvent()); + } + private void OnClothesTurnOff(Entity ent, ref InventoryRelayedEvent args) { diff --git a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs index a02807293f..38da1506a6 100644 --- a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs @@ -30,7 +30,7 @@ public sealed partial class NukeopsRuleComponent : Component /// What will happen if all of the nuclear operatives will die. Used by LoneOpsSpawn event. /// [DataField] - public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.ShuttleCall; + public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.InstantEnd; /// /// Text for shuttle call if RoundEndBehavior is ShuttleCall. @@ -84,7 +84,7 @@ public sealed partial class NukeopsRuleComponent : Component /// This amount of TC will be given to each nukie /// [DataField] - public int WarTCAmountPerNukie = 50; + public int WarTCAmountPerNukie = 40; /// /// Delay between war declaration and nuke ops arrival on station map. Gives crew time to prepare diff --git a/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs index 4fe91e3a5f..7e66ac98c0 100644 --- a/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs @@ -36,13 +36,13 @@ public sealed partial class ZombieRuleComponent : Component /// The minimum amount of time after the round starts that the initial infected will be chosen. /// [DataField] - public TimeSpan MinStartDelay = TimeSpan.FromMinutes(10); + public TimeSpan MinStartDelay = TimeSpan.FromMinutes(3); /// /// The maximum amount of time after the round starts that the initial infected will be chosen. /// [DataField] - public TimeSpan MaxStartDelay = TimeSpan.FromMinutes(15); + public TimeSpan MaxStartDelay = TimeSpan.FromMinutes(6); /// /// The sound that plays when someone becomes an initial infected. diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs index ebdbdd480f..620864bfb3 100644 --- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs @@ -45,6 +45,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; using System.Linq; +using Content.Server.StationEvents.Components; using Content.Shared.FixedPoint; using Content.Shared.Mind; @@ -683,9 +684,14 @@ public sealed class NukeopsRuleSystem : GameRuleSystem : WinCondition.AllNukiesDead); SetWinType(uid, WinType.CrewMajor, nukeops, false); - _roundEndSystem.DoRoundEndBehavior( - nukeops.RoundEndBehavior, nukeops.EvacShuttleTime, nukeops.RoundEndTextSender, - nukeops.RoundEndTextShuttleCall, nukeops.RoundEndTextAnnouncement); + + // WD EDIT, check for all at once gamemode + if (!GameTicker.GetActiveGameRules().Where(HasComp).Any()) + { + _roundEndSystem.DoRoundEndBehavior( + nukeops.RoundEndBehavior, nukeops.EvacShuttleTime, nukeops.RoundEndTextSender, + nukeops.RoundEndTextShuttleCall, nukeops.RoundEndTextAnnouncement); + } // prevent it called multiple times nukeops.RoundEndBehavior = RoundEndBehavior.Nothing; diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index 69d0396e3a..0c389c5029 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -107,10 +107,8 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem).Any()) - _roundEnd.DoRoundEndBehavior(RoundEndBehavior.ShuttleCall, component.ShuttleCallTime); - else + // Check for all at once gamemode + if (!_gameTicker.GetActiveGameRules().Where(HasComp).Any()) _roundEnd.EndRound(); // WD EDIT END @@ -429,4 +427,4 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem(transferTo); RemComp(transferFrom); } -} \ No newline at end of file +} diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs index f7c204899e..513571c970 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs @@ -14,6 +14,7 @@ using Content.Shared.Item; using Content.Shared.Bed.Sleep; using System.Linq; using System.Numerics; +using Content.Server._White.Wizard; using Content.Server.Bible.Components; using Content.Server.Maps; using Content.Server.Revenant.Components; @@ -335,10 +336,12 @@ public sealed partial class RevenantSystem // WD START var cultistQuery = GetEntityQuery(); + var wizardQuery = GetEntityQuery(); var humanoidQuery = GetEntityQuery(); foreach (var e in _lookup.GetEntitiesInRange(uid, component.BlightRadius)) { - if (!humanoidQuery.HasComponent(e) || !_mobState.IsAlive(e) || cultistQuery.HasComponent(e)) + if (!humanoidQuery.HasComponent(e) || !_mobState.IsAlive(e) || cultistQuery.HasComponent(e) || + wizardQuery.HasComponent(e)) continue; var blight = EnsureComp(e); diff --git a/Content.Server/RoundEnd/RoundEndSystem.cs b/Content.Server/RoundEnd/RoundEndSystem.cs index 07ebffa3c4..cf90f9b84f 100644 --- a/Content.Server/RoundEnd/RoundEndSystem.cs +++ b/Content.Server/RoundEnd/RoundEndSystem.cs @@ -53,7 +53,7 @@ namespace Content.Server.RoundEnd /// /// Countdown to use where there is no station alert countdown to be found. /// - public TimeSpan DefaultCountdownDuration { get; set; } = TimeSpan.FromMinutes(10); + public TimeSpan DefaultCountdownDuration { get; set; } = TimeSpan.FromMinutes(5); private CancellationTokenSource? _countdownTokenSource; private CancellationTokenSource? _cooldownTokenSource; diff --git a/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs b/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs index 5ef0ce6407..f419ad95af 100644 --- a/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs +++ b/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs @@ -311,7 +311,7 @@ public sealed class CultRuleSystem : GameRuleSystem cult.WinCondition = CultWinCondition.Failure; - // Check for all in once gamemode + // Check for all at once gamemode if (!GameTicker.GetActiveGameRules().Where(HasComp).Any()) _roundEndSystem.EndRound(); } diff --git a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs index 3e0ac10fa8..a3382739fb 100644 --- a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs +++ b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs @@ -13,14 +13,18 @@ using Content.Server.Emp; using Content.Server.EUI; using Content.Server.Lightning; using Content.Server.Magic; +using Content.Server.Mind; using Content.Server.Singularity.EntitySystems; using Content.Server.Standing; using Content.Server.Weapons.Ranged.Systems; using Content.Shared._White.BetrayalDagger; +using Content.Shared._White.Cult.Components; using Content.Shared._White.Events; using Content.Shared._White.Wizard; using Content.Shared._White.Wizard.Magic; using Content.Shared.Actions; +using Content.Shared.Borer; +using Content.Shared.Changeling; using Content.Shared.Cluwne; using Content.Shared.Coordinates.Helpers; using Content.Shared.Hands.Components; @@ -35,6 +39,7 @@ using Content.Shared.Maps; using Content.Shared.Mobs.Components; using Content.Shared.Physics; using Content.Shared.Popups; +using Content.Shared.Revolutionary.Components; using Content.Shared.StatusEffect; using Content.Shared.Throwing; using Robust.Shared.Audio.Systems; @@ -71,6 +76,8 @@ public sealed class WizardSpellsSystem : EntitySystem [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly TelefragSystem _telefrag = default!; [Dependency] private readonly EuiManager _euiManager = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly ActionContainerSystem _actionContainer = default!; #endregion @@ -78,6 +85,7 @@ public sealed class WizardSpellsSystem : EntitySystem { base.Initialize(); + SubscribeLocalEvent(OnMindswapSpell); SubscribeLocalEvent(OnTeleportSpell); SubscribeLocalEvent(OnInstantRecallSpell); SubscribeLocalEvent(OnMimeTouchSpell); @@ -95,6 +103,73 @@ public sealed class WizardSpellsSystem : EntitySystem SubscribeLocalEvent(OnBeforeCastSpell); } + #region Mindswap + + private void OnMindswapSpell(MindswapSpellEvent msg) + { + if (!CanCast(msg)) + return; + + var target = msg.Target; + var uid = msg.Performer; + + if (HasComp(target) || HasComp(target) || + HasComp(target)) + { + _popupSystem.PopupEntity("Не работает на культистов, генокрадов и революционеров.", uid, uid, + PopupType.MediumCaution); + return; + } + + if (TryComp(target, out InfestedBorerComponent? borer) && borer.ControllingBrain) + { + _popupSystem.PopupEntity("Им уже кто-то управляет.", uid, uid, PopupType.MediumCaution); + return; + } + + var userHasMind = _mindSystem.TryGetMind(uid, out var mindId, out var mind); + var targetHasMind = _mindSystem.TryGetMind(target, out var targetMindId, out var targetMind); + + if (!userHasMind) + return; + + _mindSystem.TransferTo(mindId, target, mind: mind); + + if (targetHasMind) + { + _mindSystem.TransferTo(targetMindId, uid, mind: targetMind); + _popupSystem.PopupEntity(Loc.GetString("Ваш разум подменили!"), uid, uid, PopupType.LargeCaution); + } + + TransferAllMagicActions(uid, target); + + _standing.TryLieDown(uid); + _standing.TryLieDown(target); + + msg.Handled = true; + Speak(msg); + + var hasWiz = HasComp(uid); + var targetHasWiz = HasComp(target); + + if (hasWiz == targetHasWiz) + return; + + if (hasWiz) + { + RemComp(uid); + EnsureComp(target); + } + + if (targetHasWiz) + { + RemComp(target); + EnsureComp(uid); + } + } + + #endregion + #region Teleport private void OnTeleportSpell(TeleportSpellEvent msg) @@ -797,27 +872,48 @@ public sealed class WizardSpellsSystem : EntitySystem private void OnBeforeCastSpell(Entity ent, ref BeforeCastSpellEvent args) { var comp = ent.Comp; + + if (!comp.RequiresClothes) + return; + var hasReqs = false; - if (comp.RequiresClothes) + var enumerator = _inventory.GetSlotEnumerator(args.Performer, SlotFlags.OUTERCLOTHING | SlotFlags.HEAD); + while (enumerator.MoveNext(out var containerSlot)) { - var enumerator = _inventory.GetSlotEnumerator(args.Performer, SlotFlags.OUTERCLOTHING | SlotFlags.HEAD); - while (enumerator.MoveNext(out var containerSlot)) - { - if (containerSlot.ContainedEntity is { } item) - hasReqs = HasComp(item); - else - hasReqs = false; + if (containerSlot.ContainedEntity is { } item) + hasReqs = HasComp(item); + else + hasReqs = false; - if (!hasReqs) - break; - } + if (!hasReqs) + break; } - if (!hasReqs) + if (hasReqs) + return; + + args.Cancelled = true; + _popupSystem.PopupEntity(Loc.GetString("magic-component-missing-req"), args.Performer, args.Performer); + } + + private void TransferAllMagicActions(EntityUid uid1, EntityUid uid2) + { + if (!TryComp(uid1, out ActionsContainerComponent? container1) || + !TryComp(uid2, out ActionsContainerComponent? container2)) + return; + + var actions1 = container1.Container.ContainedEntities.Where(HasComp).ToList(); + var actions2 = container2.Container.ContainedEntities.Where(HasComp).ToList(); + + foreach (var act in actions1) { - args.Cancelled = true; - _popupSystem.PopupEntity(Loc.GetString("magic-component-missing-req"), args.Performer, args.Performer); + _actionContainer.TransferActionWithNewAttached(act, uid2, uid2, container: container2); + } + + foreach (var act in actions2) + { + _actionContainer.TransferActionWithNewAttached(act, uid1, uid1, container: container1); } } diff --git a/Content.Server/_White/Wizard/WizardRuleComponent.cs b/Content.Server/_White/Wizard/WizardRuleComponent.cs index 3bdda39bbd..9495e2b208 100644 --- a/Content.Server/_White/Wizard/WizardRuleComponent.cs +++ b/Content.Server/_White/Wizard/WizardRuleComponent.cs @@ -50,7 +50,7 @@ public sealed partial class WizardRuleComponent : Component [DataField] public ProtoId Faction = "Wizard"; - public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.ShuttleCall; + public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.InstantEnd; [DataField] public string RoundEndTextSender = "comms-console-announcement-title-centcom"; diff --git a/Content.Server/_White/Wizard/WizardRuleSystem.cs b/Content.Server/_White/Wizard/WizardRuleSystem.cs index c5b45ef761..b98f86c63e 100644 --- a/Content.Server/_White/Wizard/WizardRuleSystem.cs +++ b/Content.Server/_White/Wizard/WizardRuleSystem.cs @@ -23,6 +23,7 @@ using Robust.Shared.Prototypes; using System.Linq; using Content.Server.Objectives; using Content.Server.Station.Components; +using Content.Server.StationEvents.Components; using Content.Shared.Mind; using Content.Shared.NPC.Components; using Content.Shared.Objectives.Components; @@ -62,7 +63,6 @@ public sealed class WizardRuleSystem : GameRuleSystem SubscribeLocalEvent(OnStartAttempt); SubscribeLocalEvent(OnPlayersSpawning); SubscribeLocalEvent(OnRunLevelChanged); - SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnPlayersGhostSpawning); SubscribeLocalEvent(OnMindAdded); @@ -123,11 +123,6 @@ public sealed class WizardRuleSystem : GameRuleSystem SpawnWizardGhostRole(uid, component); } - private void OnComponentRemove(EntityUid uid, WizardComponent component, ComponentRemove args) - { - CheckAnnouncement(); - } - private void OnMobStateChanged(EntityUid uid, WizardComponent component, MobStateChangedEvent ev) { if (ev.NewMobState == MobState.Dead) @@ -249,6 +244,10 @@ public sealed class WizardRuleSystem : GameRuleSystem private void CheckAnnouncement() { + // Check for all at once gamemode + if (GameTicker.GetActiveGameRules().Where(HasComp).Any()) + return; + var query = QueryActiveRules(); while (query.MoveNext(out _, out _, out var wizard, out _)) { diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 873e3eeaa6..c77817d2d3 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Numerics; +using Content.Shared._White.Events; using Content.Shared._White.WeaponModules; using Content.Shared.ActionBlocker; using Content.Shared.Actions; @@ -353,6 +354,7 @@ public abstract partial class SharedGunSystem : EntitySystem return; } + RaiseLocalEvent(user, new EnergyDomeClothesTurnOffEvent()); // WD // Shoot confirmed - sounds also played here in case it's invalid (e.g. cartridge already spent). Shoot(gunUid, gun, ev.Ammo, fromCoordinates, toCoordinates.Value, out var userImpulse, user, throwItems: attemptEv.ThrowItems); var shotEv = new GunShotEvent(user, ev.Ammo); diff --git a/Content.Shared/_White/Knockdown/KnockdownOnCollideComponent.cs b/Content.Shared/_White/Knockdown/KnockdownOnCollideComponent.cs new file mode 100644 index 0000000000..5e33cac2e4 --- /dev/null +++ b/Content.Shared/_White/Knockdown/KnockdownOnCollideComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared._White.Knockdown; + +[RegisterComponent] +public sealed partial class KnockdownOnCollideComponent : Component +{ + [DataField] + public float BlurTime = 20f; +} diff --git a/Content.Shared/_White/Knockdown/KnockdownOnCollideSystem.cs b/Content.Shared/_White/Knockdown/KnockdownOnCollideSystem.cs new file mode 100644 index 0000000000..5806f41a36 --- /dev/null +++ b/Content.Shared/_White/Knockdown/KnockdownOnCollideSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Projectiles; +using Content.Shared.Standing.Systems; +using Content.Shared.StatusEffect; + +namespace Content.Shared._White.Knockdown; + +public sealed class KnockdownOnCollideSystem : EntitySystem +{ + [Dependency] private readonly SharedStandingStateSystem _standing = default!; + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnProjectileHit); + } + + private void OnProjectileHit(Entity ent, ref ProjectileHitEvent args) + { + _standing.TryLieDown(args.Target, null, true); + + if (ent.Comp.BlurTime <= 0f) + return; + + _statusEffects.TryAddStatusEffect(args.Target, "BlurryVision", + TimeSpan.FromSeconds(ent.Comp.BlurTime), true); + } +} diff --git a/Content.Shared/_White/Wizard/WizardEvents.cs b/Content.Shared/_White/Wizard/WizardEvents.cs index 944ee69c91..e55ff3b241 100644 --- a/Content.Shared/_White/Wizard/WizardEvents.cs +++ b/Content.Shared/_White/Wizard/WizardEvents.cs @@ -178,4 +178,10 @@ public sealed partial class TeleportSpellEvent : InstantActionEvent, ISpeakSpell public string? Speech { get; private set; } } +public sealed partial class MindswapSpellEvent : EntityTargetActionEvent, ISpeakSpell +{ + [DataField("speech")] + public string? Speech { get; private set; } +} + #endregion diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index 7c9fb0322f..15afb03c99 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -4427,3 +4427,116 @@ id: 307 time: '2024-06-16T15:33:26.0000000+00:00' url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/360 +- author: Aviu + changes: + - message: "\u041C\u0438\u043D\u0438 \u0430\u0440\u0431\u0430\u043B\u0435\u0442\ + \ \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D. \u0422\ + \u0435\u043F\u0435\u0440\u044C \u043E\u043D \u043D\u0435 \u0441\u0442\u0430\u043D\ + \u0438\u0442, \u0430 \u043A\u043B\u0430\u0434\u0435\u0442 \u043D\u0430 \u0437\ + \u0435\u043C\u043B\u044E. \u041D\u0430\u043D\u043E\u0441\u0438\u0442 60 \u0443\ + \u0440\u043E\u043D\u0430 \u043F\u043E \u0441\u0442\u0430\u043C\u0438\u043D\u0435\ + \ (\u043D\u0435 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u0442\ + \ \u0431\u0440\u043E\u043D\u044E), \u043F\u0435\u0440\u0435\u0437\u0430\u0440\ + \u044F\u0436\u0430\u0435\u0442\u0441\u044F \u0431\u044B\u0441\u0442\u0440\u0435\ + \u0435, \u0440\u0430\u0437\u043C\u044B\u0432\u0430\u0435\u0442 \u0437\u0440\u0435\ + \u043D\u0438\u0435 \u043F\u0440\u0438 \u043F\u043E\u043F\u0430\u0434\u0430\u043D\ + \u0438\u0438." + type: Add + - message: "\u041C\u0438\u043D\u0443\u0441 10 \u0442\u043A \u0437\u0430 \u0432\u043E\ + \u0439\u043D\u0443." + type: Tweak + - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0440\u0435\u0437\u0438\ + \u0441\u0442 \u043A \u0442\u0435\u043F\u043B\u043E\u0432\u043E\u043C\u0443 \u0443\ + \ \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u044D\u043B\u0438\u0442\ + \u044B \u0438 \u0434\u0436\u0430\u0433\u0433\u0435\u0440\u043D\u0430\u0443\u0442\ + \u0430." + type: Tweak + - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0440\u0435\u0437\u0438\ + \u0441\u0442 \u043A \u043F\u0440\u043E\u043D\u0438\u043A\u0430\u044E\u0449\u0435\ + \u043C\u0443 \u0443 \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043A\ + \u043E\u043C\u0430\u043D\u0434\u0438\u0440\u0430 \u043E\u043F\u0435\u0440\u0430\ + \u0442\u0438\u0432\u043D\u0438\u043A\u043E\u0432/\u043B\u0438\u0434\u0435\u0440\ + \u0430 \u0415\u0420\u0422 \u0438 \u0443 \u043F\u0440\u043E\u0442\u0438\u0432\ + \u043E\u0443\u0434\u0430\u0440\u043A\u0438." + type: Tweak + - message: "\u041E\u0442\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0439 \u0436\u0438\ + \u043B\u0435\u0442 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043E\u0442\ + \u0440\u0430\u0436\u0430\u0435\u0442 100% \u0432\u044B\u0441\u0442\u0440\u0435\ + \u043B\u043E\u0432." + type: Tweak + - message: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0430 \u0446\u0435\u043D\ + \u0430 \u043F\u0438\u0442\u043E\u043D\u0430 \u043E\u0431\u0440\u0430\u0442\u043D\ + \u043E \u0434\u043E 8." + type: Tweak + - message: "\u041D\u0435\u043C\u043D\u043E\u0433\u043E \u0443\u0432\u0435\u043B\u0438\ + \u0447\u0435\u043D \u0440\u0430\u0437\u0431\u0440\u043E\u0441 \u0443 \u0434\u0440\ + \u043E\u0431\u043E\u0432\u0438\u043A\u043E\u0432." + type: Tweak + - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0430 \u0441\u043A\u043E\ + \u0440\u043E\u0441\u0442\u0440\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\ + \ \u0445\u0440\u0438\u0441\u0442\u043E\u0432\u0430." + type: Tweak + - message: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D \u0443\u0440\u043E\u043D\ + \ \u0441\u043B\u0430\u0433\u043E\u0432 \u0434\u043E 40." + type: Tweak + id: 308 + time: '2024-06-17T17:12:02.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/361 +- author: Aviu + changes: + - message: "\u0422\u0432\u0438\u043A\u0438 \u044D\u043A\u0441\u043F\u0435\u0434\u0438\ + \u0446\u0438\u0439." + type: Tweak + - message: "\u0424\u0438\u043A\u0441 \u0431\u043E\u043B\u044C\u0448\u043E\u0439\ + \ \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u043A\u0430\u0440\u043F\u043E\ + \u0432." + type: Fix + - message: "\u041A\u0430\u0440\u043F\u044B \u0438 \u0434\u0440\u0430\u043A\u043E\ + \u043D \u043D\u0430\u0443\u0447\u0438\u043B\u0438\u0441\u044C \u043E\u0442\u043A\ + \u0440\u044B\u0432\u0430\u0442\u044C \u0434\u0432\u0435\u0440\u0438." + type: Add + id: 309 + time: '2024-06-18T10:58:36.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/362 +- author: Aviu + changes: + - message: "\u0417\u0430\u043A\u043B\u0438\u043D\u0430\u043D\u0438\u0435 \u043F\u043E\ + \u0434\u043C\u0435\u043D\u044B \u0441\u043E\u0437\u043D\u0430\u043D\u0438\u044F\ + ." + type: Add + - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0443\u043D\u0434\ + \ \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F\ + \ \u043F\u0440\u0438 \u0441\u043C\u0435\u0440\u0442\u0438 \u043C\u0430\u0433\ + \u0430 \u0438\u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\ + \u0438\u043A\u043E\u0432." + type: Add + - message: "\u041C\u0430\u0433 \u043D\u0435\u0432\u043E\u0441\u043F\u0440\u0438\u0438\ + \u043C\u0447\u0438\u0432 \u043A \u0431\u043E\u043B\u0435\u0437\u043D\u0438 \u0440\ + \u0435\u0432\u0435\u043D\u0430\u043D\u0442\u0430." + type: Add + - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0449\u0438\u0442 \u0441\u043A\ + \u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043C\u0430\u0433\u0430 \u0430\u0432\ + \u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\ + \u043A\u043B\u044E\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u043F\ + \u043E\u043F\u044B\u0442\u043A\u0435 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\ + \u0438\u0442\u044C \u0438\u043B\u0438 \u0431\u0440\u043E\u0441\u0438\u0442\u044C\ + \ \u043D\u0430\u043D\u043E\u0441\u044F\u0449\u0438\u0439 \u0443\u0440\u043E\u043D\ + \ \u043F\u0440\u0435\u0434\u043C\u0435\u0442." + type: Add + - message: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0430 \u0446\u0435\u043D\ + \u0430 \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043C\u0430\u0433\ + \u0430 \u0434\u043E 5." + type: Tweak + - message: "\u041E\u0441\u043B\u0430\u0431\u043B\u0435\u043D \u0449\u0438\u0442\ + \ \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043C\u0430\u0433\u0430\ + ." + type: Tweak + - message: "\u041D\u0443\u043B\u0435\u0432\u044B\u0435 \u0437\u0430\u0440\u0430\u0436\ + \u0435\u043D\u043D\u044B\u0435 \u0442\u0435\u043F\u0435\u0440\u044C \u0432\u044B\ + \u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437\ + \ 3-6 \u043C\u0438\u043D\u0443\u0442 \u043F\u043E\u0441\u043B\u0435 \u043D\u0430\ + \u0447\u0430\u043B\u0430 \u0440\u0430\u0443\u043D\u0434\u0430." + type: Tweak + id: 310 + time: '2024-06-18T14:55:21.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/363 diff --git a/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl b/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl index dcc484032d..ccc869fa86 100644 --- a/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl +++ b/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl @@ -16,6 +16,7 @@ scroll-component-silence = тишину scroll-component-recall = призыв scroll-component-teleport = телепортацию scroll-component-smite = кару +scroll-component-mindswap = подмену сознания ent-BaseScroll = магический свиток .desc = Этот древний пергамент, ставший реликвией в арканных преданиях, хранит в себе бесчисленные мистические заклятия и забытые заклинания. @@ -47,3 +48,5 @@ ent-ScrollInstantRecall = свиток мгновенного призыва .desc = { ent-BaseScroll.desc } ent-ScrollTeleport = свиток телепортации .desc = { ent-BaseScroll.desc } +ent-ScrollSmite = свиток кары + .desc = { ent-BaseScroll.desc } diff --git a/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl b/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl index 1d3f6e353e..2cf05319f0 100644 --- a/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl +++ b/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl @@ -40,6 +40,9 @@ spellbook-recall-desc = { ent-ActionInstantRecallSpell.desc } spellbook-smite-name = { ent-ActionSmite } spellbook-smite-desc = { ent-ActionSmite.desc } +spellbook-mindswap-name = { ent-ActionMindswapSpell } +spellbook-mindswap-desc = { ent-ActionMindswapSpell.desc } + spellbook-hardsuit-name = Скафандр волшебника spellbook-hardsuit-desc = Украшенный магическими драгоценными камнями скафандр, функционирующий так же, как и обычная мантия волшебника, но в то же время является пригодным для использования в космосе и бронированным. Небольшое замедление. Теперь вы можете произносить заклинания в космосе и местах с низкой температурой! Имеет функцию энергетического щита,который защищает от всех снарядов. Щит разряжается при получении урона и автоматически заряжается. diff --git a/Resources/Locale/ru-RU/_white/wizard/spells.ftl b/Resources/Locale/ru-RU/_white/wizard/spells.ftl index 075acfc6c4..c54b13bb07 100644 --- a/Resources/Locale/ru-RU/_white/wizard/spells.ftl +++ b/Resources/Locale/ru-RU/_white/wizard/spells.ftl @@ -42,3 +42,6 @@ ent-ActionKnock = Стук ent-ActionSmite = Кара .desc = Заряжает вашу руку мерзкой энергией, которую можно использовать для взрыва жертв. Заклинание требует, чтобы вы коснулись своей цели, поэтому вы не сможете использовать его в наручниках или будучи оглушённым. Не работает без волшебной мантии и шляпы. + +ent-ActionMindswapSpell = Подмена сознания + .desc = Позволяет заклинателю переключаться между телами с целью. Вы должны быть рядом с целью, в которую хотите перейти, после чего вы оба будете нокаутированы. Не работает на культистов, генокрадов и революционеров. diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 17b530d031..d7934b1d6b 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -17,7 +17,7 @@ description: uplink-revolver-python-desc productEntity: WeaponRevolverPythonAP cost: - Telecrystal: 6 # Originally was 13 TC but was not used due to high cost + Telecrystal: 8 # Originally was 13 TC but was not used due to high cost categories: - UplinkWeaponry saleLimit: 1 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 6dc1eb2a83..2599f28127 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -61,7 +61,7 @@ coefficients: Blunt: 0.4 Slash: 0.4 - Piercing: 0.7 + Piercing: 0.9 Heat: 0.9 Caustic: 0.9 - type: ExplosionResistance @@ -106,7 +106,7 @@ Piercing: 0.9 Heat: 0.4 # this technically means it protects against fires pretty well? -heat is just for lasers and stuff, not atmos temperature - type: Reflect - reflectProb: 1 + reflectProb: 0.5 reflects: - Energy diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index 9c13d1fe69..1238cd3785 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -179,7 +179,7 @@ Blunt: 0.6 Slash: 0.6 Piercing: 0.5 - Heat: 0.3 + Heat: 0.5 Radiation: 0.1 Caustic: 0.5 - type: ExplosionResistance @@ -576,7 +576,7 @@ Blunt: 0.5 Slash: 0.5 Piercing: 0.5 - Heat: 0.2 + Heat: 0.4 Radiation: 0.01 Caustic: 0.5 - type: Item @@ -609,7 +609,7 @@ coefficients: Blunt: 0.4 Slash: 0.4 - Piercing: 0.3 + Piercing: 0.4 Heat: 0.5 Radiation: 0.25 Caustic: 0.4 @@ -642,7 +642,7 @@ Blunt: 0.2 Slash: 0.2 Piercing: 0.2 - Heat: 0.2 + Heat: 0.4 Radiation: 0.2 Caustic: 0.2 - type: ClothingSpeedModifier @@ -685,17 +685,19 @@ toggleable-clothing: !type:ContainerSlot - type: PowerCellSlot cellSlotId: cell_slot + fitsInCharger: false - type: ItemSlots slots: cell_slot: name: power-cell-slot-component-slot-name-default startingItem: PowerCellMicroreactor + disableEject: true whitelist: tags: - PowerCell - PowerCellSmall - type: EnergyDomeGenerator - damageEnergyDraw: 5 + damageEnergyDraw: 20 domePrototype: EnergyDomeSmallPink - type: ClothingSpeedModifier walkModifier: 0.9 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 4550d029fd..ff0627f79c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -11,6 +11,10 @@ rootTask: task: SimpleHostileCompound blackboard: + NavInteract: !type:Bool + true + NavPry: !type:Bool + true NavSmash: !type:Bool true - type: NpcFactionMember @@ -82,6 +86,17 @@ - type: NightVision toggleSound: null color: "#404040" + - type: Tool + speed: 2 + qualities: + - Prying + - type: Prying + pryPowered: !type:Bool + true + force: !type:Bool + true + useSound: + path: /Audio/Items/crowbar.ogg - type: entity parent: BaseMobCarp @@ -100,8 +115,6 @@ alive: Rainbow enum.DamageStateVisualLayers.BaseUnshaded: mouth: "" - - type: MovementSpeedModifier - baseSprintSpeed: 6 - type: entity name: magicarp @@ -148,6 +161,8 @@ energy: 0.5 - type: RgbLightController layers: [ 0 ] + - type: MovementSpeedModifier + baseSprintSpeed: 6 - type: entity id: MobCarpSalvage diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index 5973c2ed3b..d67c9220b8 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -22,7 +22,7 @@ NavSmash: !type:Bool true - type: Tool - speed: 1.5 + speed: 2 qualities: - Prying - type: Prying @@ -140,12 +140,12 @@ - type: MobThresholds thresholds: 0: Alive - 150: Dead + 200: Dead - type: Stamina critThreshold: 300 - type: SlowOnDamage speedModifierThresholds: - 130: 0.7 + 180: 0.7 - type: Fixtures fixtures: fix1: @@ -178,10 +178,10 @@ - type: MobThresholds thresholds: 0: Alive - 150: Dead + 200: Dead - type: SlowOnDamage speedModifierThresholds: - 130: 0.7 + 180: 0.7 - type: MeleeWeapon damage: groups: @@ -256,7 +256,7 @@ - type: MobThresholds thresholds: 0: Alive - 100: Dead + 150: Dead - type: MovementSpeedModifier baseSprintSpeed: 4 - type: MeleeWeapon @@ -265,7 +265,7 @@ Brute: 20 - type: SlowOnDamage speedModifierThresholds: - 80: 0.7 + 130: 0.7 - type: Fixtures fixtures: fix1: @@ -322,6 +322,10 @@ spawned: - id: FoodMeatRouny amount: 3 + - type: MeleeWeapon + damage: + groups: + Brute: 15 - type: entity name: Spitter diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index c2534e6d0e..451fb132bb 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -131,6 +131,17 @@ - type: NightVision toggleSound: null color: "#404040" + - type: Tool + speed: 3 + qualities: + - Prying + - type: Prying + pryPowered: !type:Bool + true + force: !type:Bool + true + useSound: + path: /Audio/Items/crowbar.ogg - type: entity parent: BaseMobDragon @@ -151,6 +162,13 @@ components: - type: GhostRole description: ghost-role-information-space-dragon-dungeon-description + - type: MobThresholds + thresholds: + 0: Alive + 200: Dead + - type: SlowOnDamage + speedModifierThresholds: + 180: 0.7 # less meat spawned since it's a lot easier to kill - type: Butcherable spawned: @@ -159,7 +177,7 @@ - type: MeleeWeapon damage: groups: - Brute: 20 + Brute: 25 - type: ExpeditionGhostRole - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml index 1439f1eb32..fb7cb21ae3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml @@ -10,7 +10,7 @@ - ShellShotgun - type: CartridgeAmmo count: 6 - spread: 22 + spread: 28 soundEject: collection: ShellEject - type: Sprite @@ -130,7 +130,7 @@ maxTransferAmount: 7 - type: SpentAmmoVisuals state: "practice" - + - type: entity id: ShellShotgunImprovised name: improvised shotgun shell @@ -146,7 +146,7 @@ node: shell - type: CartridgeAmmo count: 10 - spread: 45 + spread: 45 proto: PelletShotgunImprovised - type: SpentAmmoVisuals state: "improvised" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index 698e6b7b19..8f07ec2a4a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -10,7 +10,7 @@ - type: Projectile damage: types: - Piercing: 28 + Piercing: 40 - type: entity id: PelletShotgunBeanbag @@ -87,7 +87,7 @@ damage: types: Piercing: 3 - Slash: 3 + Slash: 3 - type: entity id: PelletShotgunTranquilizer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml index 5e3cf9944a..ebd0a74a03 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml @@ -26,10 +26,7 @@ hard: false mask: - Opaque - - type: StunOnCollide - stunAmount: 1 - knockdownAmount: 1 - slowdownAmount: 5 - walkSpeedModifier: 0.5 - runSpeedModifier: 0.3 - + - type: KnockdownOnCollide + - type: StaminaDamageOnCollide + ignoreResistances: false + damage: 60 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 71ba30fb3e..7c3df718df 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -1106,7 +1106,7 @@ - type: Projectile damage: types: - Heat: 9 + Heat: 10 - type: Trail scale: 0.03, 0.0 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index 485c2a9f0c..6336098609 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -65,6 +65,8 @@ - CartridgeAntiMateriel capacity: 5 proto: CartridgeAntiMateriel + - type: Gun + fireRate: 0.6 - type: Wieldable forceTwoHanded: True - type: Telescope diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml index aaadbb7aa5..9e058ee512 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml @@ -15,11 +15,11 @@ - Belt - type: Gun resetOnHandSelected: false - fireRate: 0.3 + fireRate: 0.5 soundGunshot: path: /Audio/Weapons/click.ogg - type: RechargeBasicEntityAmmo - rechargeCooldown: 2.5 + rechargeCooldown: 1.5 rechargeSound: path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg - type: BasicEntityAmmoProvider diff --git a/Resources/Prototypes/Magic/knock_spell.yml b/Resources/Prototypes/Magic/knock_spell.yml index dc7b38117d..d2a280ae5a 100644 --- a/Resources/Prototypes/Magic/knock_spell.yml +++ b/Resources/Prototypes/Magic/knock_spell.yml @@ -4,6 +4,8 @@ description: This spell opens nearby doors. noSpawn: true components: + - type: Magic + requiresClothes: false - type: InstantAction useDelay: 8 itemIconStyle: BigAction diff --git a/Resources/Prototypes/Magic/white.yml b/Resources/Prototypes/Magic/white.yml index 92be6e994f..a7111a8b68 100644 --- a/Resources/Prototypes/Magic/white.yml +++ b/Resources/Prototypes/Magic/white.yml @@ -38,6 +38,8 @@ name: Force noSpawn: true components: + - type: Magic + requiresClothes: false - type: WorldTargetAction itemIconStyle: BigAction useDelay: 60 @@ -100,6 +102,8 @@ name: Cards noSpawn: true components: + - type: Magic + requiresClothes: false - type: WorldTargetAction itemIconStyle: BigAction useDelay: 60 @@ -167,6 +171,8 @@ name: Blink noSpawn: true components: + - type: Magic + requiresClothes: false - type: InstantAction useDelay: 6 itemIconStyle: BigAction @@ -216,6 +222,8 @@ name: Cluwne Curse noSpawn: true components: + - type: Magic + requiresClothes: false - type: EntityTargetAction whitelist: components: @@ -235,6 +243,8 @@ name: Banana Touch noSpawn: true components: + - type: Magic + requiresClothes: false - type: EntityTargetAction whitelist: components: @@ -254,6 +264,8 @@ name: Mime Touch noSpawn: true components: + - type: Magic + requiresClothes: false - type: EntityTargetAction whitelist: components: @@ -273,6 +285,8 @@ name: Instant Recall noSpawn: true components: + - type: Magic + requiresClothes: false - type: InstantRecall - type: InstantAction useDelay: 10 @@ -288,6 +302,8 @@ name: Teleport noSpawn: true components: + - type: Magic + requiresClothes: false - type: InstantAction checkCanInteract: false useDelay: 60 @@ -297,3 +313,25 @@ state: teleport event: !type:TeleportSpellEvent speech: "SCYAR FIDE!" + +- type: entity + id: ActionMindswapSpell + name: Mindswap + noSpawn: true + components: + - type: Magic + requiresClothes: false + - type: EntityTargetAction + whitelist: + components: + - MindContainer + - ActionContainer + canTargetSelf: false + checkCanInteract: false + useDelay: 60 + itemIconStyle: BigAction + icon: + sprite: Objects/Magic/magicactions.rsi + state: mindswap + event: !type:MindswapSpellEvent + speech: "GIN'YU CAPAN!" diff --git a/Resources/Prototypes/Procedural/salvage_difficulties.yml b/Resources/Prototypes/Procedural/salvage_difficulties.yml index a87cd15548..067ba42552 100644 --- a/Resources/Prototypes/Procedural/salvage_difficulties.yml +++ b/Resources/Prototypes/Procedural/salvage_difficulties.yml @@ -1,6 +1,6 @@ - type: salvageDifficulty id: Minimal - lootBudget: 10 + lootBudget: 5 mobBudget: 10 modifierBudget: 1 color: "#9FED5896" @@ -8,7 +8,7 @@ - type: salvageDifficulty id: Minor - lootBudget: 30 + lootBudget: 15 mobBudget: 30 modifierBudget: 1 color: "#EFB34196" @@ -16,24 +16,24 @@ - type: salvageDifficulty id: Moderate - lootBudget: 50 - mobBudget: 50 + lootBudget: 30 + mobBudget: 60 modifierBudget: 2 color: "#52B4E996" recommendedPlayers: 2 - type: salvageDifficulty id: Hazardous - lootBudget: 70 - mobBudget: 70 + lootBudget: 50 + mobBudget: 100 modifierBudget: 2 color: "#DE3A3A96" recommendedPlayers: 3 - type: salvageDifficulty id: Extreme - lootBudget: 100 - mobBudget: 100 + lootBudget: 75 + mobBudget: 150 modifierBudget: 3 color: "#D381C996" recommendedPlayers: 4 diff --git a/Resources/Prototypes/Procedural/salvage_factions.yml b/Resources/Prototypes/Procedural/salvage_factions.yml index cbd1dd4aa1..9187ff1ce0 100644 --- a/Resources/Prototypes/Procedural/salvage_factions.yml +++ b/Resources/Prototypes/Procedural/salvage_factions.yml @@ -6,21 +6,24 @@ cost: 2 - proto: MobXenoPraetorian cost: 5 - prob: 0.1 + prob: 0.5 - proto: MobXenoQueen cost: 10 - prob: 0.02 + prob: 0.1 - proto: MobXenoRavager - cost: 5 + cost: 4 - proto: MobXenoRunner cost: 2 - proto: MobXenoRouny - cost: 3 - prob: 0.02 + cost: 2 + prob: 0.5 - proto: MobXenoSpitter cost: 3 - proto: WeaponTurretXeno prob: 0.1 + - proto: MobLaserRaptor + cost: 5 + prob: 0.5 configs: DefenseStructure: XenoWardingTower Megafauna: MobXenoQueen @@ -31,20 +34,23 @@ - proto: MobCarpDungeon # These do too much damage for salvage, need nerfs - proto: MobCarpHolo - cost: 5 - prob: 0.05 + cost: 8 + prob: 0.25 - proto: MobCarpMagic - cost: 4 - prob: 0.1 + cost: 2 + prob: 0.5 - proto: MobCarpRainbow # carp version of rouny... - cost: 6 - prob: 0.05 + cost: 4 + prob: 0.5 - proto: MobShark cost: 8 - prob: 0.035 + prob: 0.25 - proto: MobDragonDungeon cost: 12 - prob: 0.02 + prob: 0.1 + - proto: MobLaserRaptor + cost: 5 + prob: 0.5 configs: DefenseStructure: CarpStatue Megafauna: MobDragonDungeon diff --git a/Resources/Prototypes/Procedural/salvage_loot.yml b/Resources/Prototypes/Procedural/salvage_loot.yml index 7c4bf2a8f0..17bfe7ad02 100644 --- a/Resources/Prototypes/Procedural/salvage_loot.yml +++ b/Resources/Prototypes/Procedural/salvage_loot.yml @@ -107,97 +107,119 @@ cost: 2 - proto: EnergyBattleAxe prob: 0.1 - cost: 8 + cost: 20 - proto: WeaponRifleAk - cost: 5 + cost: 16 - proto: TimeBeacon cost: 2 prob: 0.5 - proto: ClothingBackpackDuffelSyndicateFilledSMG - cost: 6 - prob: 0.5 + cost: 15 + prob: 0.2 - proto: ClothingBackpackDuffelSyndicateFilledShotgun - cost: 8 - prob: 0.5 + cost: 17 + prob: 0.2 - proto: BriefcaseSyndieSniperBundleFilled - cost: 10 - prob: 0.5 + cost: 20 + prob: 0.2 - proto: ClothingBackpackDuffelSyndicateFilledLMG - cost: 12 - prob: 0.5 + cost: 25 + prob: 0.2 - proto: WeaponRevolverMateba - cost: 5 + cost: 10 + prob: 0.1 - proto: WeaponRevolverDeckard - cost: 4 + cost: 10 - proto: ExGrenade - cost: 3 + cost: 8 - proto: SupermatterGrenade - cost: 5 + cost: 12 - proto: WhiteholeGrenade - cost: 3 - - proto: ClothingOuterHardsuitMaxim cost: 5 + - proto: ClothingOuterHardsuitMaxim + cost: 12 - proto: GrenadeIncendiary - cost: 4 + cost: 8 - proto: ExperimentalSyndicateTeleporter cost: 8 - prob: 0.5 + prob: 0.2 - proto: ClothingHeadHelmetSwat cost: 4 + prob: 0.5 - proto: ClothingBeltMilitaryWebbing cost: 2 - proto: ClothingOuterVestWeb cost: 5 + prob: 0.5 - proto: ClothingEyesNightVisionGoggles - cost: 5 + cost: 8 - proto: ClothingHandsGlovesCombat cost: 3 - proto: Katana - cost: 3 + cost: 5 - proto: WeaponMakeshiftLaser - cost: 4 - - proto: WeaponLaserGun - cost: 5 - - proto: WeaponEgun - cost: 5 - - proto: WeaponXrayCannon - cost: 6 - - proto: WeaponLaserCannon - cost: 6 - - proto: WeaponTempGun - cost: 4 - - proto: WeaponAdvancedLaser cost: 10 prob: 0.5 + - proto: WeaponLaserGun + cost: 12 + prob: 0.1 + - proto: WeaponEgun + cost: 16 + prob: 0.1 + - proto: WeaponXrayCannon + cost: 18 + prob: 0.1 + - proto: WeaponLaserCannon + cost: 20 + prob: 0.1 - proto: Stimpack - cost: 6 - - proto: StimkitFilled cost: 8 prob: 0.5 + - proto: StimkitFilled + cost: 12 + prob: 0.5 - proto: CrateSecurityRiot - cost: 5 + cost: 12 prob: 0.5 - proto: CrateSecurityNonlethal - cost: 4 + cost: 10 prob: 0.5 - proto: ClothingShoesBootsMagSyndie - cost: 5 + cost: 4 + prob: 0.2 - proto: JetpackBlackFilled cost: 3 + prob: 0.5 - proto: WeaponLauncherRocket - cost: 8 + cost: 20 - proto: WeaponLauncherPirateCannon - cost: 5 + cost: 15 - proto: LightModule - cost: 2 - - proto: LaserModule - cost: 4 - - proto: FlameHiderModule - cost: 2 - - proto: SilencerModule cost: 3 - - proto: AcceleratorModule + - proto: LaserModule + cost: 8 + - proto: FlameHiderModule + cost: 3 + - proto: SilencerModule cost: 5 + - proto: AcceleratorModule + cost: 12 + - proto: MedkitFilled + cost: 3 + - proto: MedkitRadiationFilled + cost: 5 + - proto: MedkitOxygenFilled + cost: 3 + - proto: MedkitBruteFilled + cost: 5 + - proto: MedkitCombatFilled + cost: 10 + - proto: MedkitToxinFilled + cost: 5 + - proto: MedkitBurnFilled + cost: 5 + - proto: MedkitAdvancedFilled + cost: 8 # Mob loot table diff --git a/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml b/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml index ab691c602a..1af1de715e 100644 --- a/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml +++ b/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml @@ -151,3 +151,12 @@ - type: Scroll actionId: ActionSmite learnPopup: scroll-component-smite + +- type: entity + id: ScrollMindswap + parent: BaseScroll + name: "Mindswap scroll" + components: + - type: Scroll + actionId: ActionMindswapSpell + learnPopup: scroll-component-mindswap diff --git a/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml b/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml index a9cd7016b0..97fdecd3ea 100644 --- a/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml +++ b/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml @@ -222,13 +222,29 @@ - !type:ListingLimitedStockCondition stock: 1 +- type: listing + id: SpellBookMindswap + name: spellbook-mindswap-name + description: spellbook-mindswap-desc + productEntity: ScrollMindswap + icon: + sprite: Objects/Magic/magicactions.rsi + state: mindswap + cost: + SpellPoint: 2 + categories: + - UtilitySpells + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + - type: listing id: SpellBookHardsuit name: spellbook-hardsuit-name description: spellbook-hardsuit-desc productEntity: ClothingOuterHardsuitWizard cost: - SpellPoint: 4 + SpellPoint: 5 categories: - MagicItems conditions: diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json index b84afefb47..248ab268d2 100644 --- a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json +++ b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json @@ -57,6 +57,9 @@ }, { "name": "icebeam_active" + }, + { + "name": "mindswap" } ] } diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png b/Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png new file mode 100644 index 0000000000..53b8b47a49 Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png differ