[Tweak] Много всякого. В основном генокрады. (#79)
* tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
@@ -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"),
|
||||
|
||||
@@ -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<GameRuleComponent>
|
||||
[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
|
||||
|
||||
/// <summary>
|
||||
/// 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<GameRuleComponent>
|
||||
}
|
||||
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<GameRuleComponent>
|
||||
|
||||
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;
|
||||
|
||||
@@ -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<ChangelingRuleComponen
|
||||
[Dependency] private readonly ObjectivesSystem _objectives = default!;
|
||||
[Dependency] private readonly ChangelingNameGenerator _nameGenerator = default!;
|
||||
|
||||
private const int PlayersPerChangeling = 10;
|
||||
private const int MaxChangelings = 5;
|
||||
private const int PlayersPerChangeling = 15;
|
||||
private const int MaxChangelings = 4;
|
||||
|
||||
private const float ChangelingStartDelay = 3f * 60;
|
||||
private const float ChangelingStartDelayVariance = 3f * 60;
|
||||
@@ -56,11 +55,16 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
SubscribeLocalEvent<ChangelingRuleComponent, ObjectivesTextGetInfoEvent>(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<ChangelingRuleComponen
|
||||
if (!GameTicker.IsGameRuleAdded(uid, gameRule))
|
||||
continue;
|
||||
|
||||
var minPlayers = ChangelingMinPlayers;
|
||||
if (!ev.Forced && ev.Players.Length < minPlayers)
|
||||
if (!ev.Forced && ev.Players.Length < ChangelingMinPlayers)
|
||||
{
|
||||
_chatManager.SendAdminAnnouncement(Loc.GetString("changeling-not-enough-ready-players",
|
||||
("readyPlayersCount", ev.Players.Length), ("minimumPlayers", minPlayers)));
|
||||
("readyPlayersCount", ev.Players.Length), ("minimumPlayers", ChangelingMinPlayers)));
|
||||
|
||||
ev.Cancel();
|
||||
continue;
|
||||
}
|
||||
@@ -88,16 +92,21 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DoChangelingStart(ChangelingRuleComponent component)
|
||||
{
|
||||
if (!component.StartCandidates.Any())
|
||||
if (component.StartCandidates.Count == 0)
|
||||
{
|
||||
Log.Error("Tried to start Changeling mode without any candidates.");
|
||||
return;
|
||||
}
|
||||
|
||||
var numChangelings = MathHelper.Clamp(component.StartCandidates.Count / PlayersPerChangeling, 1, MaxChangelings);
|
||||
var changelingPool = _antagSelection.FindPotentialAntags(component.StartCandidates, component.ChangelingPrototypeId);
|
||||
var numChangelings =
|
||||
MathHelper.Clamp(component.StartCandidates.Count / PlayersPerChangeling, 1, MaxChangelings);
|
||||
|
||||
var changelingPool =
|
||||
_antagSelection.FindPotentialAntags(component.StartCandidates, component.ChangelingPrototypeId);
|
||||
|
||||
var selectedChangelings = _antagSelection.PickAntag(numChangelings, changelingPool);
|
||||
|
||||
foreach (var changeling in selectedChangelings)
|
||||
@@ -115,6 +124,7 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
{
|
||||
if (!GameTicker.IsGameRuleAdded(uid, gameRule))
|
||||
continue;
|
||||
|
||||
foreach (var player in ev.Players)
|
||||
{
|
||||
if (!ev.Profiles.ContainsKey(player.UserId))
|
||||
@@ -123,7 +133,8 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
changeling.StartCandidates[player] = ev.Profiles[player.UserId];
|
||||
}
|
||||
|
||||
var delay = TimeSpan.FromSeconds(ChangelingStartDelay + _random.NextFloat(0f, ChangelingStartDelayVariance));
|
||||
var delay = TimeSpan.FromSeconds(ChangelingStartDelay +
|
||||
_random.NextFloat(0f, ChangelingStartDelayVariance));
|
||||
|
||||
changeling.AnnounceAt = _gameTiming.CurTime + delay;
|
||||
|
||||
@@ -183,21 +194,18 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
readyChangeling.HiveName = _nameGenerator.GetName();
|
||||
Dirty(entity, readyChangeling);
|
||||
|
||||
if (!giveObjectives)
|
||||
return true;
|
||||
|
||||
if (giveObjectives)
|
||||
var difficulty = 0f;
|
||||
for (var pick = 0; pick < ChangelingMaxPicks && ChangelingMaxDifficulty > 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<ObjectiveComponent>(objective.Value).Difficulty;
|
||||
}
|
||||
_mindSystem.AddObjective(mindId, mind, objective.Value);
|
||||
difficulty += Comp<ObjectiveComponent>(objective.Value).Difficulty;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -221,8 +229,10 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
|
||||
if (changeling.TotalChangelings >= MaxChangelings)
|
||||
continue;
|
||||
|
||||
if (!ev.LateJoin)
|
||||
continue;
|
||||
|
||||
if (!ev.Profile.AntagPreferences.Contains(changeling.ChangelingPrototypeId))
|
||||
continue;
|
||||
|
||||
@@ -249,7 +259,7 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
}
|
||||
else
|
||||
{
|
||||
chance *= ((ev.JoinOrder + 1) - target);
|
||||
chance *= ev.JoinOrder + 1 - target;
|
||||
}
|
||||
|
||||
if (chance > 1)
|
||||
@@ -262,7 +272,10 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
|
||||
}
|
||||
}
|
||||
|
||||
private void OnObjectivesTextGetInfo(EntityUid uid, ChangelingRuleComponent comp, ref ObjectivesTextGetInfoEvent args)
|
||||
private void OnObjectivesTextGetInfo(
|
||||
EntityUid uid,
|
||||
ChangelingRuleComponent comp,
|
||||
ref ObjectivesTextGetInfoEvent args)
|
||||
{
|
||||
args.Minds = comp.ChangelingMinds;
|
||||
args.AgentName = Loc.GetString("changeling-round-end-agent-name");
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using Content.Server.Administration.Systems;
|
||||
using Content.Server.Body.Components;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Cuffs;
|
||||
using Content.Server.DoAfter;
|
||||
using Content.Server.Forensics;
|
||||
using Content.Server.Humanoid;
|
||||
@@ -14,6 +15,7 @@ using Content.Server.Temperature.Systems;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Changeling;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Cuffs.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Eye.Blinding.Components;
|
||||
@@ -34,7 +36,6 @@ using Content.Shared.StatusEffect;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.GameObjects.Components.Localization;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
|
||||
namespace Content.Server.Changeling;
|
||||
@@ -59,12 +60,11 @@ public sealed partial class ChangelingSystem
|
||||
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly InventorySystem _inventorySystem = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly ActionContainerSystem _actionContainerSystem = default!;
|
||||
[Dependency] private readonly SharedPullingSystem _pullingSystem = default!;
|
||||
[Dependency] private readonly MindSystem _mindSystem = default!;
|
||||
[Dependency] private readonly BloodstreamSystem _blood = default!;
|
||||
|
||||
[Dependency] private readonly CuffableSystem _cuffable = default!;
|
||||
|
||||
private void InitializeAbilities()
|
||||
{
|
||||
@@ -73,6 +73,7 @@ public sealed partial class ChangelingSystem
|
||||
SubscribeLocalEvent<ChangelingComponent, RegenerateActionEvent>(OnRegenerate);
|
||||
SubscribeLocalEvent<ChangelingComponent, LesserFormActionEvent>(OnLesserForm);
|
||||
|
||||
SubscribeLocalEvent<ChangelingComponent, ExtractionStingActionEvent>(OnExtractionSting);
|
||||
SubscribeLocalEvent<ChangelingComponent, TransformStingActionEvent>(OnTransformSting);
|
||||
SubscribeLocalEvent<ChangelingComponent, TransformStingItemSelectedMessage>(OnTransformStingMessage);
|
||||
SubscribeLocalEvent<ChangelingComponent, BlindStingActionEvent>(OnBlindSting);
|
||||
@@ -82,6 +83,8 @@ public sealed partial class ChangelingSystem
|
||||
|
||||
SubscribeLocalEvent<ChangelingComponent, AdrenalineSacsActionEvent>(OnAdrenalineSacs);
|
||||
SubscribeLocalEvent<ChangelingComponent, FleshmendActionEvent>(OnFleshMend);
|
||||
SubscribeLocalEvent<ChangelingComponent, BiodegradeActionEvent>(OnBiodegrade);
|
||||
|
||||
SubscribeLocalEvent<ChangelingComponent, ArmbladeActionEvent>(OnArmBlade);
|
||||
SubscribeLocalEvent<ChangelingComponent, OrganicShieldActionEvent>(OnShield);
|
||||
SubscribeLocalEvent<ChangelingComponent, ChitinousArmorActionEvent>(OnArmor);
|
||||
@@ -95,7 +98,7 @@ public sealed partial class ChangelingSystem
|
||||
SubscribeLocalEvent<ChangelingComponent, ListViewItemSelectedMessage>(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<HumanoidAppearanceComponent>(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<AbsorbedComponent>(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<DnaComponent>(args.Target, out var dnaComponent))
|
||||
if (!TryComp<DnaComponent>(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<SharedPullableComponent>(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<ActorComponent>(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<HumanoidAppearanceComponent>(args.Target))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("changeling-popup-absorb-not-human"), args.Performer, args.Performer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (HasComp<AbsorbedComponent>(args.Target))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("changeling-popup-already-absorbed"), args.Performer, args.Performer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryComp<DnaComponent>(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<HumanoidAppearanceComponent>(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<ChangelingComponent>(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<HumanoidAppearanceComponent>(args.Target) ||
|
||||
!HasComp<BlindableComponent>(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<HumanoidAppearanceComponent>(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<HumanoidAppearanceComponent>(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<HumanoidAppearanceComponent>(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<ChangelingComponent>(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<ChangelingComponent>(args.Target.Value, out _))
|
||||
{
|
||||
AbsorbLing(uid, component);
|
||||
}
|
||||
|
||||
KillUser(args.Target.Value, "Cellular");
|
||||
|
||||
@@ -578,7 +641,7 @@ public sealed partial class ChangelingSystem
|
||||
|
||||
if (HasComp<AbsorbedComponent>(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<MetaDataComponent>(target, out var targetMeta))
|
||||
return;
|
||||
|
||||
if (!TryComp<HumanoidAppearanceComponent>(target, out var targetAppearance))
|
||||
return;
|
||||
|
||||
if (!TryComp<DnaComponent>(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
|
||||
/// <param name="target">Acceptor</param>
|
||||
/// <param name="sourceHumanoid">Source appearance</param>
|
||||
/// <param name="targetHumanoid">Acceptor appearance component</param>
|
||||
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<HumanoidVisualLayers,
|
||||
CustomBaseLayerInfo>(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<ImplantedComponent>(uid, out var implant))
|
||||
return;
|
||||
|
||||
@@ -870,22 +947,12 @@ public sealed partial class ChangelingSystem
|
||||
if (!TryComp<StoreComponent>(entity, out var store))
|
||||
continue;
|
||||
|
||||
if (_mobStateSystem.IsDead(absorbed))
|
||||
{
|
||||
var points = _random.Next(1, 3);
|
||||
var toAdd = new Dictionary<string, FixedPoint2> { { "ChangelingPoint", points } };
|
||||
_storeSystem.TryAddCurrency(toAdd, entity, store);
|
||||
}
|
||||
else
|
||||
{
|
||||
var points = _random.Next(2, 4);
|
||||
var toAdd = new Dictionary<string, FixedPoint2> { { "ChangelingPoint", points } };
|
||||
_storeSystem.TryAddCurrency(toAdd, entity, store);
|
||||
}
|
||||
var toAdd = new Dictionary<string, FixedPoint2> { { "ChangelingPoint", 5 } };
|
||||
_storeSystem.TryAddCurrency(toAdd, entity, store);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -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<SubdermalImplantComponent>(implant, out var implantComp))
|
||||
if (!TryComp<SubdermalImplantComponent>(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
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ public sealed partial class NukeopsRuleComponent : Component
|
||||
/// This amount of TC will be given to each nukie
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public int WarTCAmountPerNukie = 40;
|
||||
public int WarTCAmountPerNukie = 20;
|
||||
|
||||
/// <summary>
|
||||
/// Time allowed for declaration of war
|
||||
|
||||
@@ -12,12 +12,6 @@ namespace Content.Server.GameTicking.Rules.Components;
|
||||
[RegisterComponent, Access(typeof(ThiefRuleSystem))]
|
||||
public sealed partial class ThiefRuleComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Add a Pacified comp to thieves
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool PacifistThieves = true;
|
||||
|
||||
/// <summary>
|
||||
/// A chance for this mode to be added to the game.
|
||||
/// </summary>
|
||||
|
||||
@@ -52,7 +52,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem<ThiefRuleComponent>
|
||||
var query = EntityQueryEnumerator<ThiefRuleComponent, GameRuleComponent>();
|
||||
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<ThiefRuleComponent>
|
||||
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<ThiefRuleComponent>
|
||||
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<PacifiedComponent>(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<ThiefRuleComponent>
|
||||
return true;
|
||||
}
|
||||
|
||||
public void AdminMakeThief(ICommonSession thief, bool addPacified)
|
||||
public void AdminMakeThief(ICommonSession thief)
|
||||
{
|
||||
var thiefRule = EntityQuery<ThiefRuleComponent>().FirstOrDefault();
|
||||
if (thiefRule == null)
|
||||
@@ -180,7 +173,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem<ThiefRuleComponent>
|
||||
thiefRule = Comp<ThiefRuleComponent>(ruleEntity);
|
||||
}
|
||||
|
||||
MakeThief(thiefRule, thief, addPacified);
|
||||
MakeThief(thiefRule, thief);
|
||||
}
|
||||
|
||||
//Add mind briefing
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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]
|
||||
35
Resources/Locale/ru-RU/White/changeling/changeling.ftl
Normal file
@@ -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} химикатов
|
||||
@@ -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 = генокрад
|
||||
@@ -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 = набор лунатика
|
||||
|
||||
@@ -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 = Поглотите столько, сколько сможете.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -540,7 +540,7 @@
|
||||
amount: 6
|
||||
whitelist:
|
||||
components:
|
||||
- HitscanBatteryAmmoProvider
|
||||
- ProjectileBatteryAmmoProvider
|
||||
|
||||
- type: cargoBounty
|
||||
id: BountyFood
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 753 B |
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": null,
|
||||
"copyright": null,
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "blade"
|
||||
},
|
||||
{
|
||||
"name": "absorb"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 231 B |
|
Before Width: | Height: | Size: 231 B After Width: | Height: | Size: 231 B |
|
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 260 B |
|
Before Width: | Height: | Size: 753 B After Width: | Height: | Size: 753 B |
|
Before Width: | Height: | Size: 364 B After Width: | Height: | Size: 364 B |
BIN
Resources/Textures/White/Actions/changeling.rsi/biodegrade.png
Normal file
|
After Width: | Height: | Size: 264 B |
|
Before Width: | Height: | Size: 150 B After Width: | Height: | Size: 150 B |
|
Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 263 B |
62
Resources/Textures/White/Actions/changeling.rsi/meta.json
Normal file
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 403 B After Width: | Height: | Size: 403 B |
|
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 241 B |
|
Before Width: | Height: | Size: 270 B After Width: | Height: | Size: 270 B |
|
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 245 B |
|
After Width: | Height: | Size: 263 B |
|
Before Width: | Height: | Size: 324 B After Width: | Height: | Size: 324 B |
|
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 266 B |
|
Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 263 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 705 B After Width: | Height: | Size: 705 B |