diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index 94a5ee843c..51ca58b2d2 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -69,7 +69,7 @@ public sealed partial class AdminVerbSystem { Text = Loc.GetString("admin-verb-text-make-changeling"), Category = VerbCategory.Antag, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/Actions/ling_absorb.png")), + Icon = new SpriteSpecifier.Texture(new ("/Textures/White/Actions/changeling.rsi/absorb.png")), Act = () => { if (!_minds.TryGetSession(targetMindComp.Mind, out var session)) @@ -160,7 +160,7 @@ public sealed partial class AdminVerbSystem if (!_minds.TryGetSession(targetMindComp.Mind, out var session)) return; - _thief.AdminMakeThief(session, false); //Midround add pacific is bad + _thief.AdminMakeThief(session); //Midround add pacific is bad }, Impact = LogImpact.High, Message = Loc.GetString("admin-verb-make-thief"), diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index c748b7c4d8..759bc998f4 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -13,7 +13,6 @@ using System.Numerics; using Content.Shared.Inventory; using Content.Server.Storage.EntitySystems; using Robust.Shared.Audio; -using Robust.Server.GameObjects; using Content.Server.Chat.Managers; using Content.Server.GameTicking; using Content.Server.Roles; @@ -27,7 +26,6 @@ using Robust.Server.Containers; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Content.Server.Shuttles.Components; -using Content.Server._White.Reputation; using Content.Shared.Players; namespace Content.Server.Antag; @@ -48,7 +46,6 @@ public sealed class AntagSelectionSystem : GameRuleSystem [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; [Dependency] private readonly RoleSystem _roles = default!; // WD [Dependency] private readonly SharedPlayerSystem _sharedPlayerSystem = default!; // WD - [Dependency] private readonly ReputationManager _reputationManager = default!; // WD /// /// Attempts to start the game rule by checking if there are enough players in lobby and readied. @@ -135,11 +132,7 @@ public sealed class AntagSelectionSystem : GameRuleSystem } else { - //chosenPlayer = _random.PickAndTake(prefList); - // WD EDIT START - chosenPlayer = _reputationManager.PickPlayerBasedOnReputation(prefList); - prefList.Remove(chosenPlayer); - // WD EDIT END + chosenPlayer = _random.PickAndTake(prefList); playerList.Remove(chosenPlayer); } @@ -223,12 +216,7 @@ public sealed class AntagSelectionSystem : GameRuleSystem for (var i = 0; i < antagCount; i++) { - //results.Add(_random.PickAndTake(prefList)); - // WD EDIT START - var pref = _reputationManager.PickPlayerBasedOnReputation(prefList); - prefList.Remove(pref); - results.Add(pref); - // WD EDIT END + results.Add(_random.PickAndTake(prefList)); Log.Info("Selected a preferred antag."); } return results; diff --git a/Content.Server/Changeling/ChangelingRuleSystem.cs b/Content.Server/Changeling/ChangelingRuleSystem.cs index 55b4e7ba18..fd5afb8ab9 100644 --- a/Content.Server/Changeling/ChangelingRuleSystem.cs +++ b/Content.Server/Changeling/ChangelingRuleSystem.cs @@ -10,7 +10,6 @@ using Content.Server.Objectives; using Content.Server.Roles; using Content.Shared.Changeling; using Content.Shared.GameTicking; -using Content.Shared.Mobs.Systems; using Content.Shared.Objectives.Components; using Content.Shared.Roles; using Robust.Shared.Player; @@ -33,8 +32,8 @@ public sealed class ChangelingRuleSystem : GameRuleSystem(OnObjectivesTextGetInfo); } - protected override void ActiveTick(EntityUid uid, ChangelingRuleComponent component, GameRuleComponent gameRule, float frameTime) + protected override void ActiveTick( + EntityUid uid, + ChangelingRuleComponent component, + GameRuleComponent gameRule, + float frameTime) { base.ActiveTick(uid, component, gameRule, frameTime); - if (component.SelectionStatus == ChangelingRuleComponent.SelectionState.ReadyToSelect && _gameTiming.CurTime > component.AnnounceAt) + if (component.SelectionStatus == ChangelingRuleComponent.SelectionState.ReadyToSelect && + _gameTiming.CurTime > component.AnnounceAt) DoChangelingStart(component); } @@ -72,11 +76,11 @@ public sealed class ChangelingRuleSystem : GameRuleSystem difficulty; pick++) { - var maxDifficulty = ChangelingMaxDifficulty; - var maxPicks = ChangelingMaxPicks; - var difficulty = 0f; - for (var pick = 0; pick < maxPicks && maxDifficulty > difficulty; pick++) - { - var objective = _objectives.GetRandomObjective(mindId, mind, "ChangelingObjectiveGroups"); - if (objective == null) - continue; + var objective = _objectives.GetRandomObjective(mindId, mind, "ChangelingObjectiveGroups"); + if (objective == null) + continue; - _mindSystem.AddObjective(mindId, mind, objective.Value); - difficulty += Comp(objective.Value).Difficulty; - } + _mindSystem.AddObjective(mindId, mind, objective.Value); + difficulty += Comp(objective.Value).Difficulty; } return true; @@ -221,8 +229,10 @@ public sealed class ChangelingRuleSystem : GameRuleSystem= MaxChangelings) continue; + if (!ev.LateJoin) continue; + if (!ev.Profile.AntagPreferences.Contains(changeling.ChangelingPrototypeId)) continue; @@ -249,7 +259,7 @@ public sealed class ChangelingRuleSystem : GameRuleSystem 1) @@ -262,7 +272,10 @@ public sealed class ChangelingRuleSystem : GameRuleSystem(OnRegenerate); SubscribeLocalEvent(OnLesserForm); + SubscribeLocalEvent(OnExtractionSting); SubscribeLocalEvent(OnTransformSting); SubscribeLocalEvent(OnTransformStingMessage); SubscribeLocalEvent(OnBlindSting); @@ -82,6 +83,8 @@ public sealed partial class ChangelingSystem SubscribeLocalEvent(OnAdrenalineSacs); SubscribeLocalEvent(OnFleshMend); + SubscribeLocalEvent(OnBiodegrade); + SubscribeLocalEvent(OnArmBlade); SubscribeLocalEvent(OnShield); SubscribeLocalEvent(OnArmor); @@ -95,7 +98,7 @@ public sealed partial class ChangelingSystem SubscribeLocalEvent(OnTransformUiMessage); } - #region Data +#region Data private const string ChangelingAbsorb = "ActionChangelingAbsorb"; private const string ChangelingTransform = "ActionChangelingTransform"; @@ -113,62 +116,55 @@ public sealed partial class ChangelingSystem private const string ChangelingArmor = "ActionArmor"; private const string ChangelingTentacleArm = "ActionTentacleArm"; - #endregion +#endregion - - #region Handlers +#region Handlers private void OnAbsorb(EntityUid uid, ChangelingComponent component, AbsorbDnaActionEvent args) { if (!HasComp(args.Target)) { - _popup.PopupEntity("You can't absorb not humans!", args.Performer, args.Performer); + _popup.PopupEntity(Loc.GetString("changeling-popup-absorb-not-human"), args.Performer, args.Performer); return; } if (HasComp(args.Target)) { - _popup.PopupEntity("This person already absorbed!", args.Performer, args.Performer); + _popup.PopupEntity(Loc.GetString("changeling-popup-already-absorbed"), args.Performer, args.Performer); return; } - if (!TryComp(args.Target, out var dnaComponent)) + if (!TryComp(args.Target, out _)) { - _popup.PopupEntity("Unknown creature!", uid, uid); - return; - } - - if (component.AbsorbedEntities.ContainsKey(dnaComponent.DNA)) - { - _popup.PopupEntity("This DNA already absorbed!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-absorb-unknown"), uid, uid); return; } if (!_stateSystem.IsDown(args.Target)) { - _popup.PopupEntity("Target must be down!", args.Performer, args.Performer); + _popup.PopupEntity(Loc.GetString("changeling-popup-absorb-down"), args.Performer, args.Performer); return; } if (!TryComp(args.Target, out var pulled)) { - _popup.PopupEntity("You must pull target!", args.Performer, args.Performer); + _popup.PopupEntity(Loc.GetString("changeling-popup-absorb-pull"), args.Performer, args.Performer); return; } if (!pulled.BeingPulled) { - _popup.PopupEntity("You must pull target!", args.Performer, args.Performer); + _popup.PopupEntity(Loc.GetString("changeling-popup-absorb-pull"), args.Performer, args.Performer); return; } - _doAfterSystem.TryStartDoAfter( - new DoAfterArgs(EntityManager, args.Performer, component.AbsorbDnaDelay, new AbsorbDnaDoAfterEvent(), uid, - args.Target, uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, component.AbsorbDnaDelay, + new AbsorbDnaDoAfterEvent(), uid, args.Target, uid) { BreakOnTargetMove = true, BreakOnUserMove = true - }); + } + ); } private void OnTransform(EntityUid uid, ChangelingComponent component, TransformActionEvent args) @@ -178,7 +174,7 @@ public sealed partial class ChangelingSystem if (component.AbsorbedEntities.Count <= 1 && !component.IsLesserForm) { - _popup.PopupEntity("You don't have any persons to transform!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-transform-no-dna"), uid, uid); return; } @@ -211,11 +207,11 @@ public sealed partial class ChangelingSystem _doAfterSystem.TryStartDoAfter( new DoAfterArgs(EntityManager, user, component.TransformDelay, - new TransformDoAfterEvent { SelectedDna = selectedDna }, user, - user, user) + new TransformDoAfterEvent { SelectedDna = selectedDna }, user, user, user) { BreakOnUserMove = true - }); + } + ); if (!TryComp(uid, out var actorComponent)) return; @@ -233,7 +229,7 @@ public sealed partial class ChangelingSystem if (component.ChemicalsBalance < 15) { - _popup.PopupEntity("We're lacking of chemicals!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-lack-chemicals"), uid, uid); return; } @@ -242,7 +238,7 @@ public sealed partial class ChangelingSystem KillUser(uid, "Cellular"); } - _popup.PopupEntity("We beginning our regeneration.", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-start-regeneration"), uid, uid); _doAfterSystem.TryStartDoAfter( new DoAfterArgs(EntityManager, args.Performer, component.RegenerateDelay, @@ -259,13 +255,13 @@ public sealed partial class ChangelingSystem { if (_mobStateSystem.IsDead(uid) || component.IsRegenerating) { - _popup.PopupEntity("We can do this right now!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-cant-perform"), uid, uid); return; } if (component.IsLesserForm) { - _popup.PopupEntity("We're already in the lesser form!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-already-lesser-form"), uid, uid); return; } @@ -276,11 +272,47 @@ public sealed partial class ChangelingSystem }); } + private void OnExtractionSting(EntityUid uid, ChangelingComponent component, ExtractionStingActionEvent args) + { + if (!HasComp(args.Target)) + { + _popup.PopupEntity(Loc.GetString("changeling-popup-absorb-not-human"), args.Performer, args.Performer); + return; + } + + if (HasComp(args.Target)) + { + _popup.PopupEntity(Loc.GetString("changeling-popup-already-absorbed"), args.Performer, args.Performer); + return; + } + + if (!TryComp(args.Target, out var dnaComponent)) + { + _popup.PopupEntity(Loc.GetString("changeling-popup-absorb-unknown"), uid, uid); + return; + } + + if (component.AbsorbedEntities.ContainsKey(dnaComponent.DNA)) + { + _popup.PopupEntity(Loc.GetString("changeling-popup-already-absorbed"), uid, uid); + return; + } + + if (!TakeChemicals(uid, component, 25)) + return; + + _popup.PopupEntity(Loc.GetString("changeling-popup-dna-taken"), uid, uid); + CopyHumanoidData(uid, args.Target, component); + args.Handled = true; + } + private void OnTransformSting(EntityUid uid, ChangelingComponent component, TransformStingActionEvent args) { if (!HasComp(args.Target)) { - _popup.PopupEntity("We can't transform that!", args.Performer, args.Performer); + _popup.PopupEntity(Loc.GetString("changeling-popup-cant-transform-someone"), args.Performer, + args.Performer); + return; } @@ -289,7 +321,7 @@ public sealed partial class ChangelingSystem if (component.AbsorbedEntities.Count < 1) { - _popup.PopupEntity("You don't have any persons to transform!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-transform-no-dna"), uid, uid); return; } @@ -306,7 +338,9 @@ public sealed partial class ChangelingSystem _ui.OpenUi(bui, actorComponent.PlayerSession); } - private void OnTransformStingMessage(EntityUid uid, ChangelingComponent component, + private void OnTransformStingMessage( + EntityUid uid, + ChangelingComponent component, TransformStingItemSelectedMessage args) { var selectedDna = args.SelectedItem; @@ -322,7 +356,7 @@ public sealed partial class ChangelingSystem if (HasComp(target)) { - _popup.PopupEntity("Transform virus was ineffective!", user, user); + _popup.PopupEntity(Loc.GetString("changeling-popup-transform-not-effective"), user, user); return; } @@ -331,7 +365,9 @@ public sealed partial class ChangelingSystem if (TryComp(target, out SharedPullerComponent? puller) && puller.Pulling is { } pulled && TryComp(pulled, out SharedPullableComponent? pullable)) + { _pullingSystem.TryStopPull(pullable); + } TransformPerson(target, humanData); @@ -345,7 +381,7 @@ public sealed partial class ChangelingSystem if (!HasComp(args.Target) || !HasComp(args.Target)) { - _popup.PopupEntity("We cannot sting that!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-cant-sting"), uid, uid); return; } @@ -363,7 +399,7 @@ public sealed partial class ChangelingSystem { if (!HasComp(args.Target)) { - _popup.PopupEntity("We cannot sting that!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-cant-sting"), uid, uid); return; } @@ -371,8 +407,7 @@ public sealed partial class ChangelingSystem return; var statusTimeSpan = TimeSpan.FromSeconds(30); - _statusEffectsSystem.TryAddStatusEffect(args.Target, "Muted", - statusTimeSpan, false, "Muted"); + _statusEffectsSystem.TryAddStatusEffect(args.Target, "Muted", statusTimeSpan, false, "Muted"); args.Handled = true; } @@ -381,7 +416,7 @@ public sealed partial class ChangelingSystem { if (!HasComp(args.Target)) { - _popup.PopupEntity("We cannot sting that!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-cant-sting"), uid, uid); return; } @@ -389,8 +424,7 @@ public sealed partial class ChangelingSystem return; var statusTimeSpan = TimeSpan.FromSeconds(30); - _statusEffectsSystem.TryAddStatusEffect(args.Target, "BlurryVision", - statusTimeSpan, false, "BlurryVision"); + _statusEffectsSystem.TryAddStatusEffect(args.Target, "BlurryVision", statusTimeSpan, false, "BlurryVision"); args.Handled = true; } @@ -399,7 +433,7 @@ public sealed partial class ChangelingSystem { if (!HasComp(args.Target)) { - _popup.PopupEntity("We cannot sting that!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-cant-sting"), uid, uid); return; } @@ -407,8 +441,7 @@ public sealed partial class ChangelingSystem return; var statusTimeSpan = TimeSpan.FromSeconds(30); - _statusEffectsSystem.TryAddStatusEffect(args.Target, "SlowedDown", - statusTimeSpan, false, "SlowedDown"); + _statusEffectsSystem.TryAddStatusEffect(args.Target, "SlowedDown", statusTimeSpan, false, "SlowedDown"); _temperatureSystem.ForceChangeTemperature(args.Target, 100); @@ -426,7 +459,7 @@ public sealed partial class ChangelingSystem if (!TakeChemicals(uid, component, 30)) return; - _solutionContainer.TryAddReagent(injectable.Value, "Stimulants", 10); + _solutionContainer.TryAddReagent(injectable.Value, "Stimulants", 5); args.Handled = true; } @@ -444,7 +477,31 @@ public sealed partial class ChangelingSystem _solutionContainer.TryAddReagent(injectable.Value, "Omnizine", 25); if (TryComp(uid, out BloodstreamComponent? bloodstream)) + { _blood.TryModifyBleedAmount(uid, -bloodstream.BleedAmount, bloodstream); + } + + args.Handled = true; + } + + private void OnBiodegrade(EntityUid uid, ChangelingComponent component, BiodegradeActionEvent args) + { + if (_mobStateSystem.IsDead(uid)) + return; + + if (!TryComp(uid, out CuffableComponent? cuffs) || cuffs.Container.ContainedEntities.Count < 1) + return; + + if (!TakeChemicals(uid, component, 30)) + return; + + var lastAddedCuffs = cuffs.LastAddedCuffs; + + _cuffable.Uncuff(uid, lastAddedCuffs, lastAddedCuffs); + + Del(lastAddedCuffs); + + _popup.PopupEntity(Loc.GetString("changeling-popup-biodegrade"), uid); args.Handled = true; } @@ -488,7 +545,7 @@ public sealed partial class ChangelingSystem if (meta.EntityPrototype.ID == protoName) { - _inventorySystem.TryUnequip(uid, outerName, out var removedItem); + _inventorySystem.TryUnequip(uid, outerName, out var removedItem, force: true); QueueDel(removedItem); return; } @@ -507,9 +564,9 @@ public sealed partial class ChangelingSystem args.Handled = true; } - #endregion +#endregion - #region DoAfters +#region DoAfters private void OnTransformDoAfter(EntityUid uid, ChangelingComponent component, TransformDoAfterEvent args) { @@ -535,18 +592,21 @@ public sealed partial class ChangelingSystem return; } - if(!_mindSystem.TryGetMind(uid, out var mindId, out _)) + if (!_mindSystem.TryGetMind(uid, out var mindId, out _)) return; if (TryComp(uid, out SharedPullerComponent? puller) && puller.Pulling is { } pulled && TryComp(pulled, out SharedPullableComponent? pullable)) + { _pullingSystem.TryStopPull(pullable); + } if (TryComp(args.Target.Value, out var changelingComponent)) { var total = component.AbsorbedEntities .Concat(changelingComponent.AbsorbedEntities) .ToDictionary(pair => pair.Key, pair => pair.Value); + component.AbsorbedEntities = total; } else @@ -554,7 +614,10 @@ public sealed partial class ChangelingSystem CopyHumanoidData(uid, args.Target.Value, component); } - AddCurrency(uid, args.Target.Value); + if (TryComp(args.Target.Value, out _)) + { + AbsorbLing(uid, component); + } KillUser(args.Target.Value, "Cellular"); @@ -578,7 +641,7 @@ public sealed partial class ChangelingSystem if (HasComp(args.Target)) { - _popup.PopupEntity("You're lost.", args.Target.Value, args.Target.Value); + _popup.PopupEntity(Loc.GetString("changeling-popup-was-absorbed"), args.Target.Value, args.Target.Value); component.IsRegenerating = false; return; } @@ -588,7 +651,7 @@ public sealed partial class ChangelingSystem _rejuvenate.PerformRejuvenate(args.Target.Value); - _popup.PopupEntity("We're fully regenerated!", args.Target.Value, args.Target.Value); + _popup.PopupEntity(Loc.GetString("changeling-popup-fully-regenerated"), args.Target.Value, args.Target.Value); component.IsRegenerating = false; @@ -632,9 +695,9 @@ public sealed partial class ChangelingSystem args.Handled = true; } - #endregion +#endregion - #region Helpers +#region Helpers private void RemoveLesserFormActions(EntityUid uid) { @@ -680,20 +743,29 @@ public sealed partial class ChangelingSystem { if (!TryComp(target, out var targetMeta)) return; + if (!TryComp(target, out var targetAppearance)) return; + if (!TryComp(target, out var targetDna)) return; + if (!TryPrototype(target, out var prototype, targetMeta)) return; + if (component.AbsorbedEntities.ContainsKey(targetDna.DNA)) return; + if (component.AbsorbedEntities.Count == 7) + { + component.AbsorbedEntities.Remove(component.AbsorbedEntities.ElementAt(2).Key); + } + var appearance = _serializationManager.CreateCopy(targetAppearance, notNullableOverride: true); var meta = _serializationManager.CreateCopy(targetMeta, notNullableOverride: true); var name = string.IsNullOrEmpty(meta.EntityName) - ? "Unknown Creature" + ? Loc.GetString("changeling-unknown-creature") : meta.EntityName; component.AbsorbedEntities.Add(targetDna.DNA, new HumanoidData @@ -778,7 +850,7 @@ public sealed partial class ChangelingSystem _implantSystem.TransferImplants(uid, reverted.Value); _actionContainerSystem.TransferAllActionsFiltered(uid, reverted.Value); - _action.GrantContainedActions(reverted.Value,reverted.Value); + _action.GrantContainedActions(reverted.Value, reverted.Value); if (component.IsLesserForm) { @@ -797,7 +869,9 @@ public sealed partial class ChangelingSystem /// Acceptor /// Source appearance /// Acceptor appearance component - private void ClonePerson(EntityUid target, HumanoidAppearanceComponent sourceHumanoid, + private void ClonePerson( + EntityUid target, + HumanoidAppearanceComponent sourceHumanoid, HumanoidAppearanceComponent targetHumanoid) { targetHumanoid.Species = sourceHumanoid.Species; @@ -808,6 +882,7 @@ public sealed partial class ChangelingSystem _humanoidAppearance.SetSpecies(target, sourceHumanoid.Species); targetHumanoid.CustomBaseLayers = new Dictionary(sourceHumanoid.CustomBaseLayers); + targetHumanoid.MarkingSet = new MarkingSet(sourceHumanoid.MarkingSet); targetHumanoid.Gender = sourceHumanoid.Gender; @@ -835,7 +910,7 @@ public sealed partial class ChangelingSystem if (!_handsSystem.TryGetEmptyHand(target, out var hand)) { - _popup.PopupEntity("We need to have at least one empty hand!", target, target); + _popup.PopupEntity(Loc.GetString("changeling-popup-need-hand"), target, target); return; } @@ -851,17 +926,19 @@ public sealed partial class ChangelingSystem { if (!_chemicalsSystem.RemoveChemicals(uid, component, quantity)) { - _popup.PopupEntity("We're lacking of chemicals!", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-lack-chemicals"), uid, uid); return false; } - _popup.PopupEntity($"Used {quantity} of chemicals.", uid, uid); + _popup.PopupEntity(Loc.GetString("changeling-popup-used-chemicals", ("quantity", quantity)), uid, uid); return true; } - private void AddCurrency(EntityUid uid, EntityUid absorbed) + private void AbsorbLing(EntityUid uid, ChangelingComponent changelingComponent) { + changelingComponent.ChemicalCapacity += 40; + if (!TryComp(uid, out var implant)) return; @@ -870,22 +947,12 @@ public sealed partial class ChangelingSystem if (!TryComp(entity, out var store)) continue; - if (_mobStateSystem.IsDead(absorbed)) - { - var points = _random.Next(1, 3); - var toAdd = new Dictionary { { "ChangelingPoint", points } }; - _storeSystem.TryAddCurrency(toAdd, entity, store); - } - else - { - var points = _random.Next(2, 4); - var toAdd = new Dictionary { { "ChangelingPoint", points } }; - _storeSystem.TryAddCurrency(toAdd, entity, store); - } + var toAdd = new Dictionary { { "ChangelingPoint", 5 } }; + _storeSystem.TryAddCurrency(toAdd, entity, store); return; } } - #endregion +#endregion } diff --git a/Content.Server/Changeling/ChangelingSystem.cs b/Content.Server/Changeling/ChangelingSystem.cs index 049a305be5..4e07e442bb 100644 --- a/Content.Server/Changeling/ChangelingSystem.cs +++ b/Content.Server/Changeling/ChangelingSystem.cs @@ -27,7 +27,7 @@ public sealed partial class ChangelingSystem : EntitySystem InitializeShop(); } - #region Handlers +#region Handlers private void OnInit(EntityUid uid, ChangelingComponent component, ComponentInit args) { @@ -41,12 +41,12 @@ public sealed partial class ChangelingSystem : EntitySystem private void OnExamine(EntityUid uid, AbsorbedComponent component, ExaminedEvent args) { - args.PushMarkup("[color=#A30000]His juices sucked up![/color]"); + args.PushMarkup(Loc.GetString("changeling-juices-sucked-up")); } - #endregion +#endregion - #region Helpers +#region Helpers private void SetupShop(EntityUid uid, ChangelingComponent component) { @@ -56,7 +56,7 @@ public sealed partial class ChangelingSystem : EntitySystem var coords = Transform(uid).Coordinates; var implant = Spawn("ChangelingShopImplant", coords); - if(!TryComp(implant, out var implantComp)) + if (!TryComp(implant, out var implantComp)) return; _implantSystem.ForceImplant(uid, implant, implantComp); @@ -77,5 +77,5 @@ public sealed partial class ChangelingSystem : EntitySystem _action.AddAction(uid, ChangelingRegenerate); } - #endregion +#endregion } diff --git a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs index 8d9da3646d..8d72b00c0c 100644 --- a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs @@ -90,7 +90,7 @@ public sealed partial class NukeopsRuleComponent : Component /// This amount of TC will be given to each nukie /// [DataField] - public int WarTCAmountPerNukie = 40; + public int WarTCAmountPerNukie = 20; /// /// Time allowed for declaration of war diff --git a/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs index 01ca9df114..0cd5d7cdee 100644 --- a/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs @@ -12,12 +12,6 @@ namespace Content.Server.GameTicking.Rules.Components; [RegisterComponent, Access(typeof(ThiefRuleSystem))] public sealed partial class ThiefRuleComponent : Component { - /// - /// Add a Pacified comp to thieves - /// - [DataField] - public bool PacifistThieves = true; - /// /// A chance for this mode to be added to the game. /// diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs index 11ce2314a1..096df6e2d1 100644 --- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs @@ -52,7 +52,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var thief, out var gameRule)) { - //Chance to not lauch gamerule + //Chance to not lauch gamerule if (_random.Prob(thief.RuleChance)) { if (!GameTicker.IsGameRuleAdded(uid, gameRule)) @@ -92,12 +92,12 @@ public sealed class ThiefRuleSystem : GameRuleSystem var selectedThieves = _antagSelection.PickAntag(numberOfThievesToSelect - component.ThievesMinds.Count, thiefPool); foreach (var thief in selectedThieves) { - MakeThief(component, thief, component.PacifistThieves); + MakeThief(component, thief); } } } - public bool MakeThief(ThiefRuleComponent thiefRule, ICommonSession thief, bool addPacified) + public bool MakeThief(ThiefRuleComponent thiefRule, ICommonSession thief) { //checks if (!_mindSystem.TryGetMind(thief, out var mindId, out var mind)) @@ -122,13 +122,6 @@ public sealed class ThiefRuleSystem : GameRuleSystem PrototypeId = thiefRule.ThiefPrototypeId }); - //Add Pacified - //To Do: Long-term this should just be using the antag code to add components. - if (addPacified) //This check is important because some servers may want to disable the thief's pacifism. Do not remove. - { - EnsureComp(mind.OwnedEntity.Value); - } - // Notificate player about new role assignment if (_mindSystem.TryGetSession(mindId, out var session)) { @@ -171,7 +164,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem return true; } - public void AdminMakeThief(ICommonSession thief, bool addPacified) + public void AdminMakeThief(ICommonSession thief) { var thiefRule = EntityQuery().FirstOrDefault(); if (thiefRule == null) @@ -180,7 +173,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem thiefRule = Comp(ruleEntity); } - MakeThief(thiefRule, thief, addPacified); + MakeThief(thiefRule, thief); } //Add mind briefing diff --git a/Content.Shared/Changeling/ChangelingComponent.cs b/Content.Shared/Changeling/ChangelingComponent.cs index bd4ff0b370..e8b7e0e0e7 100644 --- a/Content.Shared/Changeling/ChangelingComponent.cs +++ b/Content.Shared/Changeling/ChangelingComponent.cs @@ -48,7 +48,7 @@ public sealed partial class ChangelingComponent : Component public float TransformDelay = 2f; [ViewVariables(VVAccess.ReadWrite), DataField("RegenerateDelay")] - public float RegenerateDelay = 20f; + public float RegenerateDelay = 60f; [ViewVariables(VVAccess.ReadWrite), DataField("LesserFormDelay")] public float LesserFormDelay = 5f; diff --git a/Content.Shared/Changeling/SharedChangeling.cs b/Content.Shared/Changeling/SharedChangeling.cs index 3346a3819d..6ddd5ea630 100644 --- a/Content.Shared/Changeling/SharedChangeling.cs +++ b/Content.Shared/Changeling/SharedChangeling.cs @@ -13,7 +13,6 @@ public sealed partial class AbsorbDnaActionEvent : EntityTargetActionEvent { } - [Serializable, NetSerializable] public sealed partial class TransformDoAfterEvent : SimpleDoAfterEvent { @@ -22,7 +21,6 @@ public sealed partial class TransformDoAfterEvent : SimpleDoAfterEvent public sealed partial class TransformActionEvent : InstantActionEvent { - } [Serializable, NetSerializable] @@ -32,7 +30,6 @@ public sealed partial class RegenerateDoAfterEvent : SimpleDoAfterEvent public sealed partial class RegenerateActionEvent : InstantActionEvent { - } [Serializable, NetSerializable] @@ -42,64 +39,61 @@ public sealed partial class LesserFormDoAfterEvent : SimpleDoAfterEvent public sealed partial class LesserFormActionEvent : InstantActionEvent { +} +public sealed partial class ExtractionStingActionEvent : EntityTargetActionEvent +{ } public sealed partial class TransformStingActionEvent : EntityTargetActionEvent { - } public sealed partial class BlindStingActionEvent : EntityTargetActionEvent { - } public sealed partial class MuteStingActionEvent : EntityTargetActionEvent { - } + public sealed partial class HallucinationStingActionEvent : EntityTargetActionEvent { - } public sealed partial class CryoStingActionEvent : EntityTargetActionEvent { - } public sealed partial class AdrenalineSacsActionEvent : InstantActionEvent { - } public sealed partial class FleshmendActionEvent : InstantActionEvent { - } public sealed partial class ArmbladeActionEvent : InstantActionEvent { - } public sealed partial class OrganicShieldActionEvent : InstantActionEvent { - } public sealed partial class ChitinousArmorActionEvent : InstantActionEvent { - } public sealed partial class TentacleArmActionEvent : InstantActionEvent { - } public sealed partial class ChangelingShopActionEvent : InstantActionEvent { - } + +public sealed partial class BiodegradeActionEvent : InstantActionEvent +{ +} + diff --git a/Resources/Locale/ru-RU/Miracle/changeling.ftl b/Resources/Locale/ru-RU/Miracle/changeling.ftl deleted file mode 100644 index b597766f81..0000000000 --- a/Resources/Locale/ru-RU/Miracle/changeling.ftl +++ /dev/null @@ -1,3 +0,0 @@ -chat-manager-changeling-channel-name = УЛЕЙ -hud-chatbox-select-channel-Changeling = Улей -chat-manager-send-changeling-chat-wrap-message = [bold]\[УЛЕЙ\][/bold] [font size=13][italic][bold]{ $player }[/bold] шипит, "{ $message }"[/italic][/font] diff --git a/Resources/Locale/ru-RU/White/changeling/changeling.ftl b/Resources/Locale/ru-RU/White/changeling/changeling.ftl new file mode 100644 index 0000000000..bab073c4e3 --- /dev/null +++ b/Resources/Locale/ru-RU/White/changeling/changeling.ftl @@ -0,0 +1,35 @@ +chat-manager-changeling-channel-name = УЛЕЙ +hud-chatbox-select-channel-Changeling = Улей +chat-manager-send-changeling-chat-wrap-message = [bold]\[УЛЕЙ\][/bold] [font size=13][italic][bold]{ $player }[/bold] шипит, "{ $message }"[/italic][/font] + +changeling-juices-sucked-up = [color=#A30000]Все его соки были высосаны![/color] + +changeling-unknown-creature = Неизвестное существо + +changeling-popup-lack-chemicals = Нам не хватает химикатов! +changeling-popup-cant-perform = Мы не можем сделать это сейчас! + +changeling-popup-absorb-not-human = Мы не можем поглотить не гуманоида! +changeling-popup-already-absorbed = Оно уже поглощено! +changeling-popup-absorb-unknown = Мы не можем поглотить это! +changeling-popup-absorb-pull = Мы должны тянуть его за собой! +changeling-popup-absorb-down = Оно должно лежать на земле! +changeling-popup-dna-taken = Мы успешно взяли образец ДНК! + +changeling-popup-cant-sting = Мы не можем ужалить это! + +changeling-popup-transform-no-dna = У нас нет поглощенного ДНК! +changeling-popup-cant-transform-someone = Мы не можем превратит это! +changeling-popup-transform-not-effective = Вирус перевоплощения не сработал! + +changeling-popup-already-lesser-form = Мы уже заняли примитивную форму жизни! + +changeling-popup-start-regeneration = Мы начинаем регенерацию +changeling-popup-was-absorbed = Мы... проиграли +changeling-popup-fully-regenerated = Мы полностью восстановились! + +changeling-popup-biodegrade = Наручники растворяются и опадают на пол! + +changeling-popup-need-hand = Нам нужна хотя бы одна свободная рука + +changeling-popup-used-chemicals = Использовано {$quantity} химикатов diff --git a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-changeling.ftl b/Resources/Locale/ru-RU/White/changeling/preset-changeling.ftl similarity index 65% rename from Resources/Locale/ru-RU/game-ticking/game-presets/preset-changeling.ftl rename to Resources/Locale/ru-RU/White/changeling/preset-changeling.ftl index 5b605585e2..66df6d91ca 100644 --- a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-changeling.ftl +++ b/Resources/Locale/ru-RU/White/changeling/preset-changeling.ftl @@ -1,8 +1,8 @@ #Changeling changeling-title = Генокрад -changeling-description = A changeling has boarded the station! -changeling-not-enough-ready-players = ННедостаточно игроков готовы к игре! Из { $minimumPlayers } необходимых игроков готовы { $readyPlayersCount }. Невозможно начать режим Генокрад +changeling-description = Генокрад прокрался на станцию! +changeling-not-enough-ready-players = Недостаточно игроков готовы к игре! Из { $minimumPlayers } необходимых игроков готовы { $readyPlayersCount }. Невозможно начать режим Генокрад changeling-no-one-ready = Нет готовых игроков! Не удалось начать режим Генокрад. changeling-round-end-agent-name = генокрад diff --git a/Resources/Locale/ru-RU/thief/backpack.ftl b/Resources/Locale/ru-RU/thief/backpack.ftl index 50804ebc55..6ff25fa3c5 100644 --- a/Resources/Locale/ru-RU/thief/backpack.ftl +++ b/Resources/Locale/ru-RU/thief/backpack.ftl @@ -2,7 +2,7 @@ thief-backpack-window-title = Ящик для инструментов вора thief-backpack-window-description = Этот ящик для инструментов заполнен различным содержимым. - Теперь вам нужно запомнить, что вы в него положили. + Теперь вам нужно вспомнить, что вы в него положили. Выберите 2 разных набора из списка. thief-backpack-window-selected = Наборы выбраны: ({$selectedCount}/{$maxCount}) @@ -26,13 +26,13 @@ thief-backpack-category-tools-description = thief-backpack-category-chemistry-name = набор химика thief-backpack-category-chemistry-description = - Набор для тех, кто любит совершенствовать свое тело.В него входит имплант Хранилище, + Набор для тех, кто любит совершенствовать свое тело. В него входит имплант Хранилище, имплант скремблера ДНК, набор химикатов на черный день и омега-мыло. thief-backpack-category-syndie-name = набор синдиката thief-backpack-category-syndie-description = Набор предметов агента синдиката, которого вы ограбилив прошлом. - Включает в себя ID-карту агента, криптографический секвенсор, PAI синдиката, + Включает в себя ID-карту агента, криптографический секвенсор, ПИИ синдиката, и несколько странных красных кристаллов. thief-backpack-category-sleeper-name = набор лунатика diff --git a/Resources/Locale/ru-RU/white/changeling/changeling-entities.ftl b/Resources/Locale/ru-RU/white/changeling/changeling-entities.ftl new file mode 100644 index 0000000000..22ef824925 --- /dev/null +++ b/Resources/Locale/ru-RU/white/changeling/changeling-entities.ftl @@ -0,0 +1,65 @@ +changeling-ability-fleshmend = Восстановление тканей +changeling-ability-fleshmend-desc = Быстро вылечить большую часть повреждений + +changeling-ability-biodegrade = Биоразложение +changeling-ability-biodegrade-desc = Растворяет наручники и прочие сдерживающие элементы. + +changeling-ability-adrenaline-sacks = Мешки с адреналином +changeling-ability-adrenaline-sacks-desc = Дает кратковременный прилив адреналина в крови. + +changeling-ability-cryo-sting = Жало заморозки +changeling-ability-cryo-sting-desc = Вводит в кровь цели химикаты, которые со временем превращают её кровь в лед. + +changeling-ability-hallucination-sting = Жало галлюцинаций +changeling-ability-hallucination-sting-desc = Вводит в кровь цели химикаты, вызывающие сильные галлюцинации. + +changeling-ability-mute-sting = Жало безмолвия +changeling-ability-mute-sting-desc = Вводит в кровь цели химикаты, заставляющие цель замолчать за короткий срок. + +changeling-ability-blind-sting = Жало слепоты +changeling-ability-blind-sting-desc = Вводит в кровь цели химикаты, заставляющие цель временно ослепнуть. + +changeling-ability-transform-sting = Жало трансформации +changeling-ability-transform-sting-desc = Вводит в кровь цели вирус, заставляющий её превратиться в другое существо. + +changeling-ability-extraction-sting = Жало извлечения +changeling-ability-extraction-sting-desc = Безшумно и безопасно извлекает ДНК из цели. + +changeling-ability-tentacle-arm = Рука-щупальце +changeling-ability-tentacle-arm-desc = Превращает одну из рук в щупальце, способное притягивать людей или забирать вещи из их рук. + +changeling-ability-changeling-armor = Хитиновая броня +changeling-ability-changeling-armor-desc = Надувает тело, превращая его в крепкую хитиновую броню. + +changeling-ability-changeling-shield = Органический щит +changeling-ability-changeling-shield-desc = Превращает одну из рук в крепкий органический щит. + +changeling-ability-changeling-armblade = Рука-клинок +changeling-ability-changeling-armblade-desc = Превращает одну из рук в клинок, созданный из костей и плоти. + +changeling-ability-changeling-lesser-form = Примитивная форма +changeling-ability-changeling-lesser-form-desc = Превращает в самую примитивную форму. Полезно для побега из наручников. + +ent-ActionChangelingShop = Эволюции + .desc = Эволюционируйте и развивайтесь. + +ent-ActionChangelingAbsorb = Поглотить + .desc = Поглотить существо. + +ent-ActionChangelingTransform = Превращение + .desc = Превратиться в одну из поглощенных личностей. + +ent-ActionChangelingRegenerate = Регенерация + .desc = Войти в регенерирующий стазис. + +ent-OrganicShield = органический щит + .desc = Большой щит из плоти. + +ent-ClothingOuterChangeling = хитиновая броня + .desc = Броня из хитина и плоти. + +ent-TentacleArmGun = рука-щупальце + .desc = Огромное щупальце, способное притягивать людей и вырывать предметы из их рук. + +ent-AbsorbMoreDnaObjective = Поглотите больше людей, чем кто-либо еще в Улье + .desc = Поглотите столько, сколько сможете. diff --git a/Resources/Prototypes/Actions/changeling.yml b/Resources/Prototypes/Actions/changeling.yml index 0618871bb3..77df3acc27 100644 --- a/Resources/Prototypes/Actions/changeling.yml +++ b/Resources/Prototypes/Actions/changeling.yml @@ -18,7 +18,7 @@ components: - type: EntityTargetAction itemIconStyle: NoItem - icon: Interface/Actions/ling_absorb.png + icon: White/Actions/changeling.rsi/absorb.png event: !type:AbsorbDnaActionEvent canTargetSelf: false useDelay: 10 @@ -32,7 +32,7 @@ components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/transform.png + icon: White/Actions/changeling.rsi/transform.png event: !type:TransformActionEvent useDelay: 30 @@ -44,7 +44,7 @@ components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/reviving_stasis.png + icon: White/Actions/changeling.rsi/reviving_stasis.png event: !type:RegenerateActionEvent checkCanInteract: false useDelay: 120 @@ -52,26 +52,40 @@ - type: entity id: ActionChangelingLesserForm - name: Lesser Form - description: Become a lesser form of self. + name: changeling-ability-changeling-lesser-form + description: changeling-ability-changeling-lesser-form-desc noSpawn: true components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/lesser_form.png + icon: White/Actions/changeling.rsi/lesser_form.png event: !type:LesserFormActionEvent useDelay: 90 - type: LesserFormRestricted +- type: entity + id: ActionExtractionSting + name: changeling-ability-extraction-sting + description: changeling-ability-extraction-sting-desc + noSpawn: true + components: + - type: EntityTargetAction + itemIconStyle: NoItem + icon: White/Actions/changeling.rsi/sting_extract.png + event: !type:ExtractionStingActionEvent + canTargetSelf: false + useDelay: 40 + - type: LesserFormRestricted + - type: entity id: ActionTransformSting - name: Transform Sting - description: Injects a retrovirus that forces human victim to transform into another. + name: changeling-ability-transform-sting + description: changeling-ability-transform-sting-desc noSpawn: true components: - type: EntityTargetAction itemIconStyle: NoItem - icon: Interface/Actions/sting_transform.png + icon: White/Actions/changeling.rsi/sting_transform.png event: !type:TransformStingActionEvent canTargetSelf: false useDelay: 120 @@ -79,13 +93,13 @@ - type: entity id: ActionBlindSting - name: Blind Sting - description: Stings a human, completely blinding them for a short time. + name: changeling-ability-blind-sting + description: changeling-ability-blind-sting-desc noSpawn: true components: - type: EntityTargetAction itemIconStyle: NoItem - icon: Interface/Actions/sting_blind.png + icon: White/Actions/changeling.rsi/sting_blind.png event: !type:BlindStingActionEvent canTargetSelf: false useDelay: 30 @@ -93,13 +107,13 @@ - type: entity id: ActionMuteSting - name: Mute Sting - description: Silently stings a human, temporarily silencing them. + name: changeling-ability-mute-sting + description: changeling-ability-mute-sting-desc noSpawn: true components: - type: EntityTargetAction itemIconStyle: NoItem - icon: Interface/Actions/sting_mute.png + icon: White/Actions/changeling.rsi/sting_mute.png event: !type:MuteStingActionEvent canTargetSelf: false useDelay: 30 @@ -107,13 +121,13 @@ - type: entity id: ActionHallucinationSting - name: Hallucination Sting - description: Injects large doses of hallucinogenic chemicals into their victim. + name: changeling-ability-hallucination-sting + description: changeling-ability-hallucination-sting-desc noSpawn: true components: - type: EntityTargetAction itemIconStyle: NoItem - icon: Interface/Actions/sting_hallucination.png + icon: White/Actions/changeling.rsi/sting_hallucination.png event: !type:HallucinationStingActionEvent canTargetSelf: false useDelay: 30 @@ -121,13 +135,13 @@ - type: entity id: ActionCryoSting - name: Cryogenic Sting - description: Injects the target with a blend of chemicals that begins to turn their blood to ice. + name: changeling-ability-cryo-sting + description: changeling-ability-cryo-sting-desc noSpawn: true components: - type: EntityTargetAction itemIconStyle: NoItem - icon: Interface/Actions/sting_cryo.png + icon: White/Actions/changeling.rsi/sting_cryo.png event: !type:CryoStingActionEvent canTargetSelf: false useDelay: 30 @@ -135,74 +149,91 @@ - type: entity id: ActionAdrenalineSacs - name: Adrenaline Sacs - description: Allows to make use of additional adrenaline to instantly recover from knockdown. + name: changeling-ability-adrenaline-sacks + description: changeling-ability-adrenaline-sacks.desc noSpawn: true components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/adrenaline_sacs.png + icon: White/Actions/changeling.rsi/adrenaline_sacs.png event: !type:AdrenalineSacsActionEvent useDelay: 60 - type: LesserFormRestricted - type: entity id: ActionFleshmend - name: Fleshmend - description: Rapidly heal all type of damage. + name: changeling-ability-fleshmend + description: changeling-ability-fleshmend-desc noSpawn: true components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/fleshmend.png + icon: White/Actions/changeling.rsi/fleshmend.png event: !type:FleshmendActionEvent useDelay: 60 - type: LesserFormRestricted - type: entity id: ActionArmblade - name: Arm Blade - description: Reforms one of the changeling's arms into a grotesque blade made out of bone and flesh. + name: changeling-ability-changeling-armblade + description: changeling-ability-changeling-armblade-desc noSpawn: true components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/arm_blade.png + icon: White/Actions/changeling.rsi/arm_blade.png event: !type:ArmbladeActionEvent + useDelay: 10 - type: LesserFormRestricted - type: entity id: ActionShield - name: Organic Shield - description: Reforms one of the changeling's arms into a large, fleshy shield. + name: changeling-ability-changeling-shield + description: changeling-ability-changeling-shield-desc noSpawn: true components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/changeling_shield.png + icon: White/Actions/changeling.rsi/shield.png event: !type:OrganicShieldActionEvent + useDelay: 10 - type: LesserFormRestricted - type: entity id: ActionArmor - name: Chitinous Armor - description: Inflates the changeling's body into an all-consuming chitinous mass of armor. + name: changeling-ability-changeling-armor + description: changeling-ability-changeling-armor-desc noSpawn: true components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/changeling_armor.png + icon: White/Actions/changeling.rsi/armor.png event: !type:ChitinousArmorActionEvent + useDelay: 10 - type: LesserFormRestricted - type: entity id: ActionTentacleArm - name: Tentacle Arm - description: Reforms one of the arms into a tentacle. Can grab items or humans depending on mode. + name: changeling-ability-tentacle-arm + description: changeling-ability-tentacle-arm-desc noSpawn: true components: - type: InstantAction itemIconStyle: NoItem - icon: Interface/Actions/tentacle_arm.png + icon: White/Actions/changeling.rsi/tentacle_arm.png event: !type:TentacleArmActionEvent + useDelay: 10 - type: LesserFormRestricted + +- type: entity + id: ActionBiodegrade + name: changeling-ability-biodegrade + description: changeling-ability-biodegrade-desc + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + checkCanInteract: false + icon: White/Actions/changeling.rsi/biodegrade.png + event: !type:BiodegradeActionEvent + useDelay: 120 diff --git a/Resources/Prototypes/Alerts/changeling.yml b/Resources/Prototypes/Alerts/changeling.yml index f007cd0b01..18c8516051 100644 --- a/Resources/Prototypes/Alerts/changeling.yml +++ b/Resources/Prototypes/Alerts/changeling.yml @@ -17,7 +17,25 @@ state: essence6 - sprite: /Textures/Interface/Alerts/essence_counter.rsi state: essence7 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence8 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence9 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence10 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence11 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence12 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence13 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence14 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence15 + - sprite: /Textures/Interface/Alerts/essence_counter.rsi + state: essence16 name: alerts-changeling-chemicals-name description: alerts-changeling-chemicals-desc minSeverity: 0 - maxSeverity: 7 + maxSeverity: 16 diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 62a3a4162f..0a33ca4e65 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -540,7 +540,7 @@ amount: 6 whitelist: components: - - HitscanBatteryAmmoProvider + - ProjectileBatteryAmmoProvider - type: cargoBounty id: BountyFood diff --git a/Resources/Prototypes/Catalog/changeling_catalog.yml b/Resources/Prototypes/Catalog/changeling_catalog.yml index 6bab595f0d..f817ac3d87 100644 --- a/Resources/Prototypes/Catalog/changeling_catalog.yml +++ b/Resources/Prototypes/Catalog/changeling_catalog.yml @@ -1,8 +1,8 @@ # Body Transforms - type: listing id: ChangelingLesserForm - name: Lesser Form - description: Become a lesser form of self. + name: changeling-ability-changeling-lesser-form + description: changeling-ability-changeling-lesser-form-desc productAction: ActionChangelingLesserForm cost: ChangelingPoint: 1 @@ -14,8 +14,8 @@ - type: listing id: ChangelingArmblade - name: Arm Blade - description: Reforms one of the changeling's arms into a grotesque blade made out of bone and flesh. + name: changeling-ability-changeling-armblade + description: changeling-ability-changeling-armblade-desc productAction: ActionArmblade cost: ChangelingPoint: 3 @@ -27,8 +27,8 @@ - type: listing id: ChangelingShield - name: Organic Shield - description: Reforms one of the changeling's arms into a large, fleshy shield. + name: changeling-ability-changeling-shield + description: changeling-ability-changeling-shield-desc productAction: ActionShield cost: ChangelingPoint: 3 @@ -40,8 +40,8 @@ - type: listing id: ChangelingArmor - name: Chitinous Armor - description: Inflates the changeling's body into an all-consuming chitinous mass of armor. + name: changeling-ability-changeling-armor + description: changeling-ability-changeling-armor-desc productAction: ActionArmor cost: ChangelingPoint: 1 @@ -53,8 +53,8 @@ - type: listing id: ChangelingTentacleArm - name: Tentacle Arm - description: Reforms one of the arms into a tentacle. Can grab items or humans depending on mode. + name: changeling-ability-tentacle-arm + description: changeling-ability-tentacle-arm-desc productAction: ActionTentacleArm cost: ChangelingPoint: 4 @@ -65,10 +65,23 @@ stock: 1 # Stings +- type: listing + id: ChangelingExtractionString + name: changeling-ability-extraction-sting + description: changeling-ability-extraction-sting-desc + productAction: ActionExtractionSting + cost: + ChangelingPoint: 0 + categories: + - ChangelingStings + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + - type: listing id: ChangelingTransformSting - name: Transform Sting - description: Injects a retrovirus that forces human victim to transform into another. + name: changeling-ability-transform-sting + description: changeling-ability-transform-sting-desc productAction: ActionTransformSting cost: ChangelingPoint: 3 @@ -80,8 +93,8 @@ - type: listing id: ChangelingBlindSting - name: Blind Sting - description: Stings a human, completely blinding them for a short time. + name: changeling-ability-blind-sting + description: changeling-ability-blind-sting-desc productAction: ActionBlindSting cost: ChangelingPoint: 2 @@ -93,8 +106,8 @@ - type: listing id: ChangelingMuteSting - name: Mute Sting - description: Silently stings a human, temporarily silencing them. + name: changeling-ability-mute-sting + description: changeling-ability-mute-sting-desc productAction: ActionMuteSting cost: ChangelingPoint: 3 @@ -106,8 +119,8 @@ - type: listing id: ChangelingHallucinationSting - name: Hallucination Sting - description: Injects large doses of hallucinogenic chemicals into their victim. + name: changeling-ability-hallucination-sting + description: changeling-ability-hallucination-sting-desc productAction: ActionHallucinationSting cost: ChangelingPoint: 1 @@ -119,8 +132,8 @@ - type: listing id: ChangelingCryogenicSting - name: Cryogenic Sting - description: Injects the target with a blend of chemicals that begins to turn their blood to ice. + name: changeling-ability-cryo-sting + description: changeling-ability-cryo-sting-desc productAction: ActionCryoSting cost: ChangelingPoint: 3 @@ -133,11 +146,11 @@ # Boosters - type: listing id: ChangelingAdrenalineSacs - name: Adrenaline Sacs - description: Allows to make use of additional adrenaline to instantly recover from knockdown. + name: changeling-ability-adrenaline-sacks + description: changeling-ability-adrenaline-sacks-desc productAction: ActionAdrenalineSacs cost: - ChangelingPoint: 3 + ChangelingPoint: 2 categories: - ChangelingBoosters conditions: @@ -146,8 +159,8 @@ - type: listing id: ChangelingFleshmend - name: Fleshmend - description: Rapidly heal all type of damage. + name: changeling-ability-fleshmend + description: changeling-ability-fleshmend-desc productAction: ActionFleshmend cost: ChangelingPoint: 2 @@ -156,3 +169,16 @@ conditions: - !type:ListingLimitedStockCondition stock: 1 + +- type: listing + id: ChangelingBiodegrade + name: changeling-ability-biodegrade + description: changeling-ability-biodegrade-desc + productAction: ActionBiodegrade + cost: + ChangelingPoint: 2 + categories: + - ChangelingBoosters + conditions: + - !type:ListingLimitedStockCondition + stock: 1 diff --git a/Resources/Prototypes/Objectives/changeling.yml b/Resources/Prototypes/Objectives/changeling.yml index 965ad84510..ef14c052a3 100644 --- a/Resources/Prototypes/Objectives/changeling.yml +++ b/Resources/Prototypes/Objectives/changeling.yml @@ -30,7 +30,7 @@ components: - type: Objective icon: - sprite: /Textures/Actions/changeling.rsi # TODO: Change icon + sprite: White/Actions/changeling.rsi state: absorb - type: AbsorbDnaCondition @@ -44,7 +44,7 @@ - type: Objective difficulty: 2.0 icon: - sprite: /Textures/Actions/changeling.rsi # TODO: Change icon + sprite: White/Actions/changeling.rsi state: absorb - type: AbsorbMoreCondition @@ -56,8 +56,8 @@ - type: Objective difficulty: 3.0 icon: - sprite: /Textures/Actions/changeling.rsi # TODO: Change icon - state: blade + sprite: White/Actions/changeling.rsi + state: arm_blade - type: TargetObjective title: objective-condition-absorb-changeling-title - type: PickRandomChangeling diff --git a/Resources/Textures/Actions/changeling.rsi/blade.png b/Resources/Textures/Actions/changeling.rsi/blade.png deleted file mode 100644 index 792dde4500..0000000000 Binary files a/Resources/Textures/Actions/changeling.rsi/blade.png and /dev/null differ diff --git a/Resources/Textures/Actions/changeling.rsi/meta.json b/Resources/Textures/Actions/changeling.rsi/meta.json deleted file mode 100644 index 3c3625c5a0..0000000000 --- a/Resources/Textures/Actions/changeling.rsi/meta.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": 1, - "license": null, - "copyright": null, - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "blade" - }, - { - "name": "absorb" - } - ] -} diff --git a/Resources/Textures/Interface/Actions/ling_absorb.png b/Resources/Textures/Interface/Actions/ling_absorb.png deleted file mode 100644 index 1eb4a0bb0b..0000000000 Binary files a/Resources/Textures/Interface/Actions/ling_absorb.png and /dev/null differ diff --git a/Resources/Textures/Actions/changeling.rsi/absorb.png b/Resources/Textures/White/Actions/changeling.rsi/absorb.png similarity index 100% rename from Resources/Textures/Actions/changeling.rsi/absorb.png rename to Resources/Textures/White/Actions/changeling.rsi/absorb.png diff --git a/Resources/Textures/Interface/Actions/adrenaline_sacs.png b/Resources/Textures/White/Actions/changeling.rsi/adrenaline_sacs.png similarity index 100% rename from Resources/Textures/Interface/Actions/adrenaline_sacs.png rename to Resources/Textures/White/Actions/changeling.rsi/adrenaline_sacs.png diff --git a/Resources/Textures/Interface/Actions/arm_blade.png b/Resources/Textures/White/Actions/changeling.rsi/arm_blade.png similarity index 100% rename from Resources/Textures/Interface/Actions/arm_blade.png rename to Resources/Textures/White/Actions/changeling.rsi/arm_blade.png diff --git a/Resources/Textures/Interface/Actions/changeling_armor.png b/Resources/Textures/White/Actions/changeling.rsi/armor.png similarity index 100% rename from Resources/Textures/Interface/Actions/changeling_armor.png rename to Resources/Textures/White/Actions/changeling.rsi/armor.png diff --git a/Resources/Textures/White/Actions/changeling.rsi/biodegrade.png b/Resources/Textures/White/Actions/changeling.rsi/biodegrade.png new file mode 100644 index 0000000000..05d97232f0 Binary files /dev/null and b/Resources/Textures/White/Actions/changeling.rsi/biodegrade.png differ diff --git a/Resources/Textures/Interface/Actions/fleshmend.png b/Resources/Textures/White/Actions/changeling.rsi/fleshmend.png similarity index 100% rename from Resources/Textures/Interface/Actions/fleshmend.png rename to Resources/Textures/White/Actions/changeling.rsi/fleshmend.png diff --git a/Resources/Textures/Interface/Actions/lesser_form.png b/Resources/Textures/White/Actions/changeling.rsi/lesser_form.png similarity index 100% rename from Resources/Textures/Interface/Actions/lesser_form.png rename to Resources/Textures/White/Actions/changeling.rsi/lesser_form.png diff --git a/Resources/Textures/White/Actions/changeling.rsi/meta.json b/Resources/Textures/White/Actions/changeling.rsi/meta.json new file mode 100644 index 0000000000..bbb9992932 --- /dev/null +++ b/Resources/Textures/White/Actions/changeling.rsi/meta.json @@ -0,0 +1,62 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "By SS14 White Dream", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "absorb" + }, + { + "name": "adrenaline_sacs" + }, + { + "name": "arm_blade" + }, + { + "name": "armor" + }, + { + "name": "biodegrade" + }, + { + "name": "fleshmend" + }, + { + "name": "lesser_form" + }, + { + "name": "reviving_stasis" + }, + { + "name": "shield" + }, + { + "name": "sting_blind" + }, + { + "name": "sting_cryo" + }, + { + "name": "sting_extract" + }, + { + "name": "sting_hallucination" + }, + { + "name": "sting_mute" + }, + { + "name": "sting_transform" + }, + { + "name": "tentacle_arm" + }, + { + "name": "transform" + } + ] +} diff --git a/Resources/Textures/Interface/Actions/reviving_stasis.png b/Resources/Textures/White/Actions/changeling.rsi/reviving_stasis.png similarity index 100% rename from Resources/Textures/Interface/Actions/reviving_stasis.png rename to Resources/Textures/White/Actions/changeling.rsi/reviving_stasis.png diff --git a/Resources/Textures/Interface/Actions/changeling_shield.png b/Resources/Textures/White/Actions/changeling.rsi/shield.png similarity index 100% rename from Resources/Textures/Interface/Actions/changeling_shield.png rename to Resources/Textures/White/Actions/changeling.rsi/shield.png diff --git a/Resources/Textures/Interface/Actions/sting_blind.png b/Resources/Textures/White/Actions/changeling.rsi/sting_blind.png similarity index 100% rename from Resources/Textures/Interface/Actions/sting_blind.png rename to Resources/Textures/White/Actions/changeling.rsi/sting_blind.png diff --git a/Resources/Textures/Interface/Actions/sting_cryo.png b/Resources/Textures/White/Actions/changeling.rsi/sting_cryo.png similarity index 100% rename from Resources/Textures/Interface/Actions/sting_cryo.png rename to Resources/Textures/White/Actions/changeling.rsi/sting_cryo.png diff --git a/Resources/Textures/White/Actions/changeling.rsi/sting_extract.png b/Resources/Textures/White/Actions/changeling.rsi/sting_extract.png new file mode 100644 index 0000000000..9d51ce7900 Binary files /dev/null and b/Resources/Textures/White/Actions/changeling.rsi/sting_extract.png differ diff --git a/Resources/Textures/Interface/Actions/sting_hallucination.png b/Resources/Textures/White/Actions/changeling.rsi/sting_hallucination.png similarity index 100% rename from Resources/Textures/Interface/Actions/sting_hallucination.png rename to Resources/Textures/White/Actions/changeling.rsi/sting_hallucination.png diff --git a/Resources/Textures/Interface/Actions/sting_mute.png b/Resources/Textures/White/Actions/changeling.rsi/sting_mute.png similarity index 100% rename from Resources/Textures/Interface/Actions/sting_mute.png rename to Resources/Textures/White/Actions/changeling.rsi/sting_mute.png diff --git a/Resources/Textures/Interface/Actions/sting_transform.png b/Resources/Textures/White/Actions/changeling.rsi/sting_transform.png similarity index 100% rename from Resources/Textures/Interface/Actions/sting_transform.png rename to Resources/Textures/White/Actions/changeling.rsi/sting_transform.png diff --git a/Resources/Textures/Interface/Actions/tentacle_arm.png b/Resources/Textures/White/Actions/changeling.rsi/tentacle_arm.png similarity index 100% rename from Resources/Textures/Interface/Actions/tentacle_arm.png rename to Resources/Textures/White/Actions/changeling.rsi/tentacle_arm.png diff --git a/Resources/Textures/Interface/Actions/transform.png b/Resources/Textures/White/Actions/changeling.rsi/transform.png similarity index 100% rename from Resources/Textures/Interface/Actions/transform.png rename to Resources/Textures/White/Actions/changeling.rsi/transform.png