Ling fixes and tweaks (#259)

* - fix: Bees fix.

* - fix: Transform transfers body type.

* - fix: Chemcap is transfered on transform.

* - fix: Gulag objective actual fix.

* - fix: Fix escape with identity not working.

* - tweak: Fixes & objective tweaks.

* - tweak: More slowdown from ling armor.
This commit is contained in:
Aviu00
2024-04-01 20:36:32 +09:00
committed by GitHub
parent 9603c83adf
commit 2e57cbf514
19 changed files with 143 additions and 45 deletions

View File

@@ -385,7 +385,7 @@ namespace Content.Server.Administration.Systems
var senderSession = eventArgs.SenderSession; var senderSession = eventArgs.SenderSession;
//No bwoink for banned //No bwoink for banned
if (_gulagSystem.IsUserGulaged(senderSession.UserId, out _)) if (_gulagSystem.IsUserGulagged(senderSession.UserId, out _))
{ {
return; return;
} }

View File

@@ -104,7 +104,7 @@ public sealed class AntagSelectionSystem : GameRuleSystem<GameRuleComponent>
chosen = new List<EntityUid>(); chosen = new List<EntityUid>();
foreach (var player in allPlayers) foreach (var player in allPlayers)
{ {
if (_gulag.IsUserGulaged(player.UserId, out _)) // WD if (_gulag.IsUserGulagged(player.UserId, out _)) // WD
continue; continue;
if (includeHeads == false) if (includeHeads == false)
@@ -179,7 +179,7 @@ public sealed class AntagSelectionSystem : GameRuleSystem<GameRuleComponent>
foreach (var player in candidates.Keys) foreach (var player in candidates.Keys)
{ {
if (_gulag.IsUserGulaged(player.UserId, out _)) // WD if (_gulag.IsUserGulagged(player.UserId, out _)) // WD
continue; continue;
if (_sharedPlayerSystem.ContentData(player) is not {Mind: { } mindId} || _roles.MindIsAntagonist(mindId)) if (_sharedPlayerSystem.ContentData(player) is not {Mind: { } mindId} || _roles.MindIsAntagonist(mindId))

View File

@@ -235,7 +235,7 @@ public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponen
if (changeling.TotalChangelings >= MaxChangelings) if (changeling.TotalChangelings >= MaxChangelings)
continue; continue;
if (_gulag.IsUserGulaged(ev.Player.UserId, out _)) if (_gulag.IsUserGulagged(ev.Player.UserId, out _))
continue; continue;
if (!ev.LateJoin) if (!ev.LateJoin)

View File

@@ -819,6 +819,7 @@ public sealed partial class ChangelingSystem
var toAdd = new ChangelingComponent var toAdd = new ChangelingComponent
{ {
HiveName = component.HiveName, HiveName = component.HiveName,
ChemicalCapacity = component.ChemicalCapacity,
ChemicalsBalance = component.ChemicalsBalance, ChemicalsBalance = component.ChemicalsBalance,
AbsorbedEntities = component.AbsorbedEntities, AbsorbedEntities = component.AbsorbedEntities,
IsInited = component.IsInited, IsInited = component.IsInited,
@@ -902,10 +903,10 @@ public sealed partial class ChangelingSystem
if (component.AbsorbedEntities.ContainsKey(targetDna.DNA)) if (component.AbsorbedEntities.ContainsKey(targetDna.DNA))
return; return;
if (component.AbsorbedEntities.Count == 7) /*if (component.AbsorbedEntities.Count == 7)
{ {
component.AbsorbedEntities.Remove(component.AbsorbedEntities.ElementAt(2).Key); component.AbsorbedEntities.Remove(component.AbsorbedEntities.ElementAt(2).Key);
} }*/
var appearance = _serializationManager.CreateCopy(targetAppearance, notNullableOverride: true); var appearance = _serializationManager.CreateCopy(targetAppearance, notNullableOverride: true);
var meta = _serializationManager.CreateCopy(targetMeta, notNullableOverride: true); var meta = _serializationManager.CreateCopy(targetMeta, notNullableOverride: true);
@@ -966,6 +967,7 @@ public sealed partial class ChangelingSystem
var toAdd = new ChangelingComponent var toAdd = new ChangelingComponent
{ {
HiveName = lingComp.HiveName, HiveName = lingComp.HiveName,
ChemicalCapacity = lingComp.ChemicalCapacity,
ChemicalsBalance = lingComp.ChemicalsBalance, ChemicalsBalance = lingComp.ChemicalsBalance,
AbsorbedEntities = lingComp.AbsorbedEntities, AbsorbedEntities = lingComp.AbsorbedEntities,
IsInited = lingComp.IsInited, IsInited = lingComp.IsInited,
@@ -1104,7 +1106,8 @@ public sealed partial class ChangelingSystem
targetHumanoid.EyeColor = sourceHumanoid.EyeColor; targetHumanoid.EyeColor = sourceHumanoid.EyeColor;
targetHumanoid.Age = sourceHumanoid.Age; targetHumanoid.Age = sourceHumanoid.Age;
_humanoidAppearance.SetSex(target, sourceHumanoid.Sex, false, targetHumanoid); _humanoidAppearance.SetSex(target, sourceHumanoid.Sex, false, targetHumanoid);
_humanoidAppearance.SetSpecies(target, sourceHumanoid.Species); _humanoidAppearance.SetBodyType(target, sourceHumanoid.BodyType, false, targetHumanoid);
_humanoidAppearance.SetSpecies(target, sourceHumanoid.Species, true, targetHumanoid);
targetHumanoid.CustomBaseLayers = new Dictionary<HumanoidVisualLayers, targetHumanoid.CustomBaseLayers = new Dictionary<HumanoidVisualLayers,
CustomBaseLayerInfo>(sourceHumanoid.CustomBaseLayers); CustomBaseLayerInfo>(sourceHumanoid.CustomBaseLayers);

View File

@@ -2,6 +2,7 @@ using Content.Server.Actions;
using Content.Shared.Actions; using Content.Shared.Actions;
using Content.Shared.Changeling; using Content.Shared.Changeling;
using Content.Shared.Inventory; using Content.Shared.Inventory;
using Content.Shared.Mobs.Systems;
namespace Content.Server.Changeling; namespace Content.Server.Changeling;
@@ -9,6 +10,7 @@ public sealed class HiveHeadSystem : EntitySystem
{ {
[Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly ActionsSystem _actions = default!;
[Dependency] private readonly ActionContainerSystem _actionContainer = default!; [Dependency] private readonly ActionContainerSystem _actionContainer = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -22,6 +24,9 @@ public sealed class HiveHeadSystem : EntitySystem
private void OnReleaseBees(Entity<HiveHeadComponent> ent, ref ReleaseBeesEvent args) private void OnReleaseBees(Entity<HiveHeadComponent> ent, ref ReleaseBeesEvent args)
{ {
if (!_mobState.IsAlive(args.Performer))
return;
args.Handled = true; args.Handled = true;
var coords = Transform(args.Performer).Coordinates; var coords = Transform(args.Performer).Coordinates;
@@ -34,8 +39,11 @@ public sealed class HiveHeadSystem : EntitySystem
private void OnGetActions(Entity<HiveHeadComponent> ent, ref GetItemActionsEvent args) private void OnGetActions(Entity<HiveHeadComponent> ent, ref GetItemActionsEvent args)
{ {
if (args.SlotFlags == SlotFlags.HEAD) if (args.SlotFlags != SlotFlags.HEAD)
args.AddAction(ref ent.Comp.ActionEntity, ent.Comp.Action); return;
args.AddAction(ref ent.Comp.ActionEntity, ent.Comp.Action);
_actions.SetCooldown(ent.Comp.ActionEntity, TimeSpan.FromSeconds(5));
} }
private void OnShutdown(Entity<HiveHeadComponent> ent, ref ComponentShutdown args) private void OnShutdown(Entity<HiveHeadComponent> ent, ref ComponentShutdown args)

View File

@@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using Content.Server._Miracle.Components; using Content.Server._Miracle.Components;
using Content.Server._Miracle.GulagSystem;
using Content.Server.Changeling.Objectives.Components; using Content.Server.Changeling.Objectives.Components;
using Content.Server.Forensics; using Content.Server.Forensics;
using Content.Server.Mind; using Content.Server.Mind;
@@ -20,6 +21,7 @@ public sealed class ChangelingConditionsSystem : EntitySystem
[Dependency] private readonly TargetObjectiveSystem _target = default!; [Dependency] private readonly TargetObjectiveSystem _target = default!;
[Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly MindSystem _mind = default!;
[Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!;
[Dependency] private readonly GulagSystem _gulag = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -185,14 +187,19 @@ public sealed class ChangelingConditionsSystem : EntitySystem
return; return;
var allHumans = _mind.GetAliveHumansExcept(args.MindId); var allHumans = _mind.GetAliveHumansExcept(args.MindId);
allHumans = allHumans.Where(x => !HasComp<GulagBoundComponent>(x)).ToList(); allHumans = allHumans.Where(x => !_gulag.IsMindGulagged(x)).ToList();
if (allHumans.Count == 0) if (allHumans.Count == 0)
{ {
args.Cancelled = true; args.Cancelled = true;
return; return;
} }
_target.SetTarget(uid, _random.Pick(allHumans), target); var targetMindId = _random.Pick(allHumans);
if (TryComp(targetMindId, out MindComponent? mind) && TryComp(mind.CurrentEntity, out DnaComponent? dna))
component.DNA = dna.DNA;
_target.SetTarget(uid, targetMindId, target);
} }
private void OnEscapeWithIdentityGetProgress(EntityUid uid, EscapeWithIdentityConditionComponent component, ref ObjectiveGetProgressEvent args) private void OnEscapeWithIdentityGetProgress(EntityUid uid, EscapeWithIdentityConditionComponent component, ref ObjectiveGetProgressEvent args)
@@ -200,10 +207,15 @@ public sealed class ChangelingConditionsSystem : EntitySystem
if (!_target.GetTarget(uid, out var target)) if (!_target.GetTarget(uid, out var target))
return; return;
args.Progress = GetEscapeWithIdentityProgress(args.Mind, target.Value); var fallbackDNA = string.Empty;
if (TryComp(uid, out PickRandomIdentityComponent? pickIdentity))
fallbackDNA = pickIdentity.DNA;
args.Progress = GetEscapeWithIdentityProgress(args.Mind, target.Value, fallbackDNA);
} }
private float GetEscapeWithIdentityProgress(MindComponent mind, EntityUid target) private float GetEscapeWithIdentityProgress(MindComponent mind, EntityUid target, string DNA)
{ {
var progress = 0f; var progress = 0f;
@@ -213,24 +225,21 @@ public sealed class ChangelingConditionsSystem : EntitySystem
if (!TryComp<MindComponent>(target, out var targetMind)) if (!TryComp<MindComponent>(target, out var targetMind))
return 0f; return 0f;
if (!TryComp<DnaComponent>(targetMind.CurrentEntity, out var targetDna)) if (TryComp<DnaComponent>(targetMind.CurrentEntity, out var targetDna))
return 0f; DNA = targetDna.DNA;
if (!TryComp<ChangelingComponent>(mind.CurrentEntity, out var changeling)) if (!TryComp<ChangelingComponent>(mind.CurrentEntity, out var changeling))
return 0f; return 0f;
if (!changeling.AbsorbedEntities.ContainsKey(targetDna.DNA)) if (!changeling.AbsorbedEntities.ContainsKey(DNA))
return 0f; return 0f;
//Target absorbed by this changeling, so 50% of work is done //Target absorbed by this changeling, so 50% of work is done
progress += 0.5f; progress += 0.5f;
if (_emergencyShuttle.IsTargetEscaping(mind.CurrentEntity.Value) && selfDna.DNA == targetDna.DNA) if (_emergencyShuttle.IsTargetEscaping(mind.CurrentEntity.Value) && selfDna.DNA == DNA)
progress += 0.5f; progress += 0.5f;
if (_emergencyShuttle.ShuttlesLeft)
return progress;
return progress; return progress;
} }

View File

@@ -3,5 +3,6 @@
[RegisterComponent] [RegisterComponent]
public sealed partial class PickRandomIdentityComponent : Component public sealed partial class PickRandomIdentityComponent : Component
{ {
[ViewVariables]
public string DNA = string.Empty;
} }

View File

@@ -21,7 +21,7 @@ namespace Content.Server.Chat.Commands
} }
var gulag = EntitySystem.Get<GulagSystem>(); var gulag = EntitySystem.Get<GulagSystem>();
if (gulag.IsUserGulaged(shell.Player.UserId, out var _)) if (gulag.IsUserGulagged(shell.Player.UserId, out var _))
{ {
return; return;
} }

View File

@@ -634,7 +634,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
// ReSharper disable once ForeachCanBeConvertedToQueryUsingAnotherGetEnumerator // ReSharper disable once ForeachCanBeConvertedToQueryUsingAnotherGetEnumerator
foreach (var player in everyone) foreach (var player in everyone)
{ {
if (_gulag.IsUserGulaged(player.UserId, out _)) // WD if (_gulag.IsUserGulagged(player.UserId, out _)) // WD
continue; continue;
if (!ev.Profiles.ContainsKey(player.UserId)) if (!ev.Profiles.ContainsKey(player.UserId))

View File

@@ -310,7 +310,7 @@ public sealed class TraitorRuleSystem : GameRuleSystem<TraitorRuleComponent>
if (!GameTicker.IsGameRuleAdded(uid, gameRule)) if (!GameTicker.IsGameRuleAdded(uid, gameRule))
continue; continue;
if (_gulag.IsUserGulaged(ev.Player.UserId, out _)) // WD if (_gulag.IsUserGulagged(ev.Player.UserId, out _)) // WD
continue; continue;
if (traitor.TotalTraitors >= MaxTraitors) if (traitor.TotalTraitors >= MaxTraitors)

View File

@@ -274,7 +274,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem<ZombieRuleComponent>
var prefList = new List<ICommonSession>(); var prefList = new List<ICommonSession>();
foreach (var player in allPlayers) foreach (var player in allPlayers)
{ {
if (_gulag.IsUserGulaged(player.UserId, out _)) // WD if (_gulag.IsUserGulagged(player.UserId, out _)) // WD
continue; continue;
if (player.AttachedEntity == null || !HasComp<HumanoidAppearanceComponent>(player.AttachedEntity) || HasComp<ZombieImmuneComponent>(player.AttachedEntity)) if (player.AttachedEntity == null || !HasComp<HumanoidAppearanceComponent>(player.AttachedEntity) || HasComp<ZombieImmuneComponent>(player.AttachedEntity))

View File

@@ -204,7 +204,7 @@ namespace Content.Server.Ghost.Roles
if (!_ghostRoles.TryGetValue(identifier, out var role)) if (!_ghostRoles.TryGetValue(identifier, out var role))
return; return;
if (_gulagSystem.IsUserGulaged(player.UserId, out _)) if (_gulagSystem.IsUserGulagged(player.UserId, out _))
{ {
return; return;
} }

View File

@@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using Content.Server._Miracle.Components; using Content.Server._Miracle.Components;
using Content.Server._Miracle.GulagSystem;
using Content.Server._White.Cult.GameRule; using Content.Server._White.Cult.GameRule;
using Content.Server.Objectives.Components; using Content.Server.Objectives.Components;
using Content.Server.Shuttles.Systems; using Content.Server.Shuttles.Systems;
@@ -23,6 +24,7 @@ public sealed class KillPersonConditionSystem : EntitySystem
[Dependency] private readonly SharedJobSystem _job = default!; [Dependency] private readonly SharedJobSystem _job = default!;
[Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly TargetObjectiveSystem _target = default!; [Dependency] private readonly TargetObjectiveSystem _target = default!;
[Dependency] private readonly GulagSystem _gulag = default!; // WD
public override void Initialize() public override void Initialize()
{ {
@@ -60,7 +62,7 @@ public sealed class KillPersonConditionSystem : EntitySystem
// no other humans to kill // no other humans to kill
var allHumans = _mind.GetAliveHumansExcept(args.MindId); var allHumans = _mind.GetAliveHumansExcept(args.MindId);
allHumans = allHumans.Where(x => !HasComp<GulagBoundComponent>(x)).ToList(); // WD allHumans = allHumans.Where(x => !_gulag.IsMindGulagged(x)).ToList();
if (allHumans.Count == 0) if (allHumans.Count == 0)
{ {
args.Cancelled = true; args.Cancelled = true;
@@ -85,7 +87,7 @@ public sealed class KillPersonConditionSystem : EntitySystem
// no other humans to kill // no other humans to kill
var allHumans = _mind.GetAliveHumansExcept(args.MindId); var allHumans = _mind.GetAliveHumansExcept(args.MindId);
allHumans = allHumans.Where(x => !HasComp<GulagBoundComponent>(x)).ToList(); // WD allHumans = allHumans.Where(x => !_gulag.IsMindGulagged(x)).ToList();
if (allHumans.Count == 0) if (allHumans.Count == 0)
{ {
args.Cancelled = true; args.Cancelled = true;

View File

@@ -25,6 +25,7 @@ using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Inventory; using Content.Shared.Inventory;
using Content.Shared.Materials; using Content.Shared.Materials;
using Content.Shared.Mind;
using Content.Shared.Parallax.Biomes; using Content.Shared.Parallax.Biomes;
using Content.Shared.Popups; using Content.Shared.Popups;
using Content.Shared.Preferences; using Content.Shared.Preferences;
@@ -121,7 +122,7 @@ public sealed partial class GulagSystem : SharedGulagSystem
private void OnJoinedLobby(PlayerJoinedLobbyEvent ev) private void OnJoinedLobby(PlayerJoinedLobbyEvent ev)
{ {
if(IsUserGulaged(ev.PlayerSession.UserId, out _)) if(IsUserGulagged(ev.PlayerSession.UserId, out _))
{ {
_chatManager.DispatchServerMessage(ev.PlayerSession, Loc.GetString("gulag-chat-join-message")); _chatManager.DispatchServerMessage(ev.PlayerSession, Loc.GetString("gulag-chat-join-message"));
} }
@@ -141,7 +142,7 @@ public sealed partial class GulagSystem : SharedGulagSystem
var player = source.PlayerId; var player = source.PlayerId;
if (!IsUserGulaged(player, out var ban)) if (!IsUserGulagged(player, out var ban))
{ {
return; return;
} }
@@ -289,13 +290,21 @@ public sealed partial class GulagSystem : SharedGulagSystem
_popupSystem.PopupEntity(Loc.GetString("gulag-ban-time-changed", ("Time", $"{time.TotalSeconds}")), uid, PopupType.Medium); _popupSystem.PopupEntity(Loc.GetString("gulag-ban-time-changed", ("Time", $"{time.TotalSeconds}")), uid, PopupType.Medium);
} }
public bool IsUserGulaged(NetUserId playerId, out HashSet<ServerBanDef> bans) public bool IsUserGulagged(NetUserId playerId, out HashSet<ServerBanDef> bans)
{ {
bans = _banManager.GetServerBans(playerId); bans = _banManager.GetServerBans(playerId);
return bans.Count != 0; return bans.Count != 0;
} }
public bool IsMindGulagged(EntityUid mindId)
{
if (!TryComp(mindId, out MindComponent? mind) || mind.UserId == null)
return false;
return IsUserGulagged(mind.UserId.Value, out _);
}
private void SendToGulag(EntityUid playerEntity) private void SendToGulag(EntityUid playerEntity)
{ {
if (_inventorySystem.TryGetContainerSlotEnumerator(playerEntity, out var enumerator)) if (_inventorySystem.TryGetContainerSlotEnumerator(playerEntity, out var enumerator))

View File

@@ -325,7 +325,7 @@ public sealed class CultRuleSystem : GameRuleSystem<CultRuleComponent>
if (entity == default) if (entity == default)
continue; continue;
if (_gulag.IsUserGulaged(actor.PlayerSession.UserId, out _)) if (_gulag.IsUserGulagged(actor.PlayerSession.UserId, out _))
continue; continue;
if (exclude?.Contains(actor.PlayerSession) is true) if (exclude?.Contains(actor.PlayerSession) is true)
@@ -348,7 +348,7 @@ public sealed class CultRuleSystem : GameRuleSystem<CultRuleComponent>
foreach (var player in candidates.Keys) foreach (var player in candidates.Keys)
{ {
// Gulag // Gulag
if (_gulag.IsUserGulaged(player.UserId, out _)) if (_gulag.IsUserGulagged(player.UserId, out _))
continue; continue;
// Role prevents antag. // Role prevents antag.

View File

@@ -97,7 +97,7 @@ public sealed class ChemicalsSystem : EntitySystem
if(_net.IsServer) if(_net.IsServer)
{ {
_alertsSystem.ShowAlert(uid, AlertType.Chemicals, _alertsSystem.ShowAlert(uid, AlertType.Chemicals,
(short) Math.Clamp(Math.Round(component.ChemicalsBalance / 10f), 0, 7)); (short) Math.Clamp(Math.Round(component.ChemicalsBalance / 10f), 0, 16));
} }
} }
} }

View File

@@ -172,6 +172,9 @@
- type: ExplosionResistance - type: ExplosionResistance
damageCoefficient: 0.5 damageCoefficient: 0.5
- type: GroupExamine - type: GroupExamine
- type: ClothingSpeedModifier
walkModifier: 0.85
sprintModifier: 0.85
- type: Unremoveable - type: Unremoveable
deleteOnDrop: true deleteOnDrop: true
- type: ClothingModifyChemicalRegen - type: ClothingModifyChemicalRegen

View File

@@ -17,11 +17,11 @@
id: BaseChangelingStealObjective id: BaseChangelingStealObjective
components: components:
- type: StealCondition - type: StealCondition
verifyMapExistance: false verifyMapExistence: false
- type: Objective - type: Objective
difficulty: 2.75 difficulty: 2.75
- type: ObjectiveLimit - type: ObjectiveLimit
limit: 1 limit: 2
- type: entity - type: entity
noSpawn: true noSpawn: true
@@ -63,6 +63,22 @@
- type: PickRandomChangeling - type: PickRandomChangeling
- type: AbsorbChangelingCondition - type: AbsorbChangelingCondition
# escape
- type: entity
noSpawn: true
parent: [BaseChangelingObjective, BaseLivingObjective]
id: EscapeShuttleObjectiveCh
name: Escape to centcom alive and unrestrained.
description: One of our undercover agents will debrief you when you arrive. Don't show up in cuffs.
components:
- type: Objective
difficulty: 1.3
icon:
sprite: Structures/Furniture/chairs.rsi
state: shuttle
- type: EscapeShuttleCondition
- type: entity - type: entity
noSpawn: true noSpawn: true
parent: BaseChangelingObjective parent: BaseChangelingObjective
@@ -76,6 +92,11 @@
title: objective-condition-escape-with-identity-title title: objective-condition-escape-with-identity-title
- type: PickRandomIdentity - type: PickRandomIdentity
- type: EscapeWithIdentityCondition - type: EscapeWithIdentityCondition
- type: ObjectiveBlacklistRequirement
blacklist:
components:
- EscapeShuttleCondition
- DieCondition
# steal # steal
@@ -225,3 +246,37 @@
- type: StealCondition - type: StealCondition
stealGroup: NukeDisk stealGroup: NukeDisk
owner: objective-condition-steal-station owner: objective-condition-steal-station
# kill
- type: entity
noSpawn: true
parent: [BaseChangelingObjective, BaseKillObjective]
id: KillRandomPersonObjectiveCh
description: Do it however you like, just make sure they don't make it to centcom.
components:
- type: Objective
difficulty: 1.75
unique: false
- type: TargetObjective
title: objective-condition-kill-person-title
- type: PickRandomPerson
- type: entity
noSpawn: true
parent: [BaseChangelingObjective, BaseKillObjective]
id: KillRandomHeadObjectiveCh
description: We need this head gone and you probably know why. Good luck, agent.
components:
- type: Objective
# technically its still possible for KillRandomPersonObjective to roll a head but this is guaranteed, so higher difficulty
difficulty: 3.0
# killing 1 head is enough
unique: true
- type: TargetObjective
title: objective-condition-kill-head-title
- type: PickRandomHead
- type: KillPersonCondition
# don't count missing evac as killing as heads are higher profile, so you really need to do the dirty work
# if ce flies a shittle to centcom you better find a way onto it
requireDead: true

View File

@@ -133,17 +133,18 @@
weights: weights:
ChangelingObjectiveGroupSteal: 1 ChangelingObjectiveGroupSteal: 1
ChangelingObjectiveGroupKill: 1 ChangelingObjectiveGroupKill: 1
ChangelingObjectiveGroupEscape: 1
- type: weightedRandom - type: weightedRandom
id: ChangelingObjectiveGroupSteal id: ChangelingObjectiveGroupSteal
weights: weights:
CaptainIDStealObjectiveCh: 0.5 CaptainIDStealObjectiveCh: 1
CMOHyposprayStealObjectiveCh: 0.5 CMOHyposprayStealObjectiveCh: 1
RDHardsuitStealObjectiveCh: 0.5 RDHardsuitStealObjectiveCh: 1
NukeDiskStealObjectiveCh: 0.5 NukeDiskStealObjectiveCh: 1
MagbootsStealObjectiveCh: 0.5 MagbootsStealObjectiveCh: 1
CorgiMeatStealObjectiveCh: 0.5 CorgiMeatStealObjectiveCh: 1
ClipboardStealObjectiveCh: 0.5 ClipboardStealObjectiveCh: 1
CaptainGunStealObjectiveCh: 0.5 CaptainGunStealObjectiveCh: 0.5
CaptainJetpackStealObjectiveCh: 0.5 CaptainJetpackStealObjectiveCh: 0.5
HandTeleporterStealObjectiveCh: 0.5 HandTeleporterStealObjectiveCh: 0.5
@@ -154,5 +155,12 @@
weights: weights:
AbsorbDnaObjective: 1 AbsorbDnaObjective: 1
AbsorbMoreDnaObjective: 0.75 AbsorbMoreDnaObjective: 0.75
AbsorbChangelingObjective: 0.25 #AbsorbChangelingObjective: 0.25
EscapeWithIdentityObjective: 0.75 KillRandomPersonObjectiveCh: 1
KillRandomHeadObjectiveCh: 0.25
- type: weightedRandom
id: ChangelingObjectiveGroupEscape
weights:
EscapeShuttleObjectiveCh: 1
EscapeWithIdentityObjective: 0.5