This commit is contained in:
storm! 2026-08-14 01:46:09 +00:00 committed by GitHub
commit ac2107cb09
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 714 additions and 73 deletions

View File

@ -18,19 +18,36 @@ public sealed class ConspiratorSystem : SharedConspiratorSystem
base.Initialize();
SubscribeLocalEvent<ConspiratorComponent, GetStatusIconsEvent>(OnConspiratorGetIcons);
SubscribeLocalEvent<ConspiratorLeaderComponent, GetStatusIconsEvent>(OnConspiratorLeaderGetIcons);
}
private void OnConspiratorGetIcons(Entity<ConspiratorComponent> entity, ref GetStatusIconsEvent args)
{
if (_playerManager.LocalSession?.AttachedEntity is { } playerEntity)
{
if (!HasComp<ShowAntagIconsComponent>(playerEntity) &&
if ((!HasComp<ShowAntagIconsComponent>(playerEntity) &&
!HasComp<ConspiratorComponent>(playerEntity) &&
!HasComp<GhostComponent>(playerEntity)) // DeltaV - add GhostComponent
!HasComp<GhostComponent>(playerEntity) )) // DeltaV - add GhostComponent and conspirators v2
return;
}
if (_prototypeManager.TryIndex(entity.Comp.ConspiratorIcon, out var iconPrototype))
args.StatusIcons.Add(iconPrototype);
}
//DV conspirators v2 addtions start
private void OnConspiratorLeaderGetIcons(Entity<ConspiratorLeaderComponent> entity, ref GetStatusIconsEvent args)
{
if (_playerManager.LocalSession?.AttachedEntity is { } playerEntity)
{
if (!HasComp<ShowAntagIconsComponent>(playerEntity) &&
!HasComp<ConspiratorComponent>(playerEntity) &&
!HasComp<GhostComponent>(playerEntity))
return;
}
if (_prototypeManager.TryIndex(entity.Comp.ConspiratorIcon, out var iconPrototype))
args.StatusIcons.Add(iconPrototype);
}
//DV conspirators v2 addtions end
}

View File

@ -9,6 +9,7 @@ using Content.Server.Chat.Managers;
using Content.Server.GameTicking;
using Content.Server.Maps;
using Content.Shared._DV.CosmicCult.Components; // DeltaV - Cosmic Cult
using Content.Shared._Harmony.Conspirators.Components; //deltaV conspirators v2
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Content.Shared.Database;
@ -461,6 +462,13 @@ namespace Content.Server.Voting.Managers
return false;
}
// End DeltaV - Cosmic Cult
//begin deltaV conspirators v2
if (eligibility == VoterEligibility.Conspirators)
{
if (!_entityManager.HasComponent<ConspiratorComponent>(player.AttachedEntity))
return false;
}
//end deltaV conspirators v2
return true;
}
@ -561,6 +569,7 @@ namespace Content.Server.Voting.Managers
GhostMinimumPlaytime, // Player needs to be a ghost, with a minimum playtime and deathtime as defined by votekick CCvars.
MinimumPlaytime, //Player needs to have a minimum playtime and deathtime as defined by votekick CCvars.
CosmicCult, // DeltaV - Player needs to be a cosmic cultist. Used by the cosmic cult gamemode.
Conspirators // DeltaV - Player needs to be a Conspirators. Used by the Conspirators subgamemode.
}
#endregion

View File

@ -1,5 +1,6 @@
using Content.Shared.Random;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server._Harmony.GameTicking.Rules.Components;
@ -7,11 +8,15 @@ namespace Content.Server._Harmony.GameTicking.Rules.Components;
/// Game rule for conspirators. Handles their shared objective.
/// </summary>
[RegisterComponent, Access(typeof(ConspiratorRuleSystem))]
[AutoGenerateComponentPause]
public sealed partial class ConspiratorRuleComponent : Component
{
[DataField]
public EntProtoId? Objective = null;
[DataField]
public ProtoId<WeightedRandomPrototype> ObjectiveGroup = "ConspiratorObjectiveGroup";
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField]
public TimeSpan? ConspiratorLeaderVoteTimer;
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField]
public TimeSpan? ConspiratorObjectiveVoteTimer;
}

View File

@ -3,24 +3,48 @@ using Content.Server.Antag;
using Content.Server.GameTicking;
using Content.Server.GameTicking.Rules;
using Content.Server.Roles;
using Content.Server.Administration.Logs;
using Content.Server.Voting.Managers;
using Content.Server.Voting;
using Content.Server.Objectives;
using Content.Server.Polymorph.Components;
using Content.Shared._Harmony.Conspirators.Components;
using Content.Shared._Harmony.Roles.Components;
using Content.Shared.GameTicking.Components;
using Content.Shared.Mind;
using Content.Shared.IdentityManagement;
using Content.Shared.Random.Helpers;
using Content.Shared._DV.CCVars;
using Content.Shared.Database;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
using Robust.Shared.Timing;
using Robust.Shared.Enums;
using Robust.Shared.Configuration;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace Content.Server._Harmony.GameTicking.Rules;
public sealed class ConspiratorRuleSystem : GameRuleSystem<ConspiratorRuleComponent>
{
// [Dependency] private readonly AntagSelectionSystem _antag = default!; // Delta V - Never used
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IVoteManager _votes = default!;
private TimeSpan _objectiveVoteTimer = default!;
private TimeSpan _objectiveVoteDelay = default!;
private TimeSpan _leaderVoteTimer = default!;
private TimeSpan _leaderVoteDelay = default!;
private readonly SoundSpecifier _conspiratorBriefing = new SoundPathSpecifier("/Audio/_Harmony/Misc/conspirator_greeting.ogg");
public override void Initialize()
{
@ -28,14 +52,31 @@ public sealed class ConspiratorRuleSystem : GameRuleSystem<ConspiratorRuleCompon
SubscribeLocalEvent<ConspiratorRoleComponent, GetBriefingEvent>(OnGetBriefing);
SubscribeLocalEvent<ConspiratorRuleComponent, AfterAntagEntitySelectedEvent>(OnAntagSelected);
}
// deltav additions, conspirators v2
Subs.CVar(_config,
DCCVars.ConspiratorObjectiveVoteTimer,
value => _objectiveVoteTimer = TimeSpan.FromSeconds(value),
true);
Subs.CVar(_config,
DCCVars.ConspiratorObjectiveVoteDelayTimer,
value => _objectiveVoteDelay = TimeSpan.FromSeconds(value),
true);
Subs.CVar(_config,
DCCVars.ConspiratorLeaderVoteTimer,
value => _leaderVoteTimer = TimeSpan.FromSeconds(value),
true);
Subs.CVar(_config,
DCCVars.ConspiratorLeaderVoteDelayTimer,
value => _leaderVoteDelay = TimeSpan.FromSeconds(value),
true);
// deltav additions, conspirators v2
}
/* DeltaV - removed custom round end text in favor of individually displayed objective summaries
protected override void AppendRoundEndText(EntityUid uid,
ConspiratorRuleComponent component,
GameRuleComponent gameRule,
ref RoundEndTextAppendEvent args)
protected override void AppendRoundEndText(EntityUid uid, ConspiratorRuleComponent component,GameRuleComponent gameRule,ref RoundEndTextAppendEvent args)
{
base.AppendRoundEndText(uid, component, gameRule, ref args);
@ -68,21 +109,26 @@ public sealed class ConspiratorRuleSystem : GameRuleSystem<ConspiratorRuleCompon
args.Append(Loc.GetString("conspirator-radio-implant"));
}
private void OnAntagSelected(Entity<ConspiratorRuleComponent> ent, ref AfterAntagEntitySelectedEvent args)
{
if (!_mind.TryGetMind(args.Session, out var mindId, out var mind))
return;
if (ent.Comp.Objective is null)
{
/*
if (ent.Comp.Objective is null){
if (GetRandomObjectivePrototype(ent.Comp, out var objectiveProtoId))
ent.Comp.Objective = objectiveProtoId;
ent.Comp.Objective = objectiveProtoId;
}
*/
if (ent.Comp.Objective is not null)
_mind.TryAddObjective(mindId, mind, ent.Comp.Objective);
}
}
/* deltaV conspirators v2, now uneeded so.
private bool GetRandomObjectivePrototype(ConspiratorRuleComponent comp, [NotNullWhen(true)] out EntProtoId? objectiveProto)
{
objectiveProto = null;
@ -98,5 +144,178 @@ public sealed class ConspiratorRuleSystem : GameRuleSystem<ConspiratorRuleCompon
}
return false;
}
*/
//delta V addition - conspirators vote system. i am too scared to make generic systems so woe, copy paste code be upon ye
protected override void Started(EntityUid uid, ConspiratorRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
{
component.ConspiratorLeaderVoteTimer = _timing.CurTime + _leaderVoteDelay;
component.ConspiratorObjectiveVoteTimer = _timing.CurTime + _objectiveVoteDelay;
}
protected override void ActiveTick(EntityUid uid, ConspiratorRuleComponent component, GameRuleComponent gameRule, float frameTime)
{
if (component.ConspiratorLeaderVoteTimer is { } _objectiveVoteTimer && _timing.CurTime >= _objectiveVoteTimer)
{
component.ConspiratorLeaderVoteTimer = null;
ConspiratorObjectiveVote(component);
} else if (component.ConspiratorObjectiveVoteTimer is { } _leaderVoteTimer && _timing.CurTime >= _leaderVoteTimer)
{
component.ConspiratorObjectiveVoteTimer = null;
ConspiratorLeaderVote();
}
}
private void ConspiratorLeaderVote()
{
// If there's already an entity with ConspiratorLeader, don't hold a vote. This allows admins to add the conspirators rule a 2nd time
// in the case that there is only one cultist and they've been chosen as the leader already.
if (EntityQuery<ConspiratorLeaderComponent>().Any())
{
_adminLogger.Add(LogType.Vote, LogImpact.Medium,
$"conspirator leader already exists. Cancelling leader vote.");
return;
}
var conspirators = new List<(string, EntityUid)>();
var conspiratorsQuery = EntityQueryEnumerator<ConspiratorComponent, MetaDataComponent>();
while (conspiratorsQuery.MoveNext(out var conspirator, out _, out var metadata))
{
var playerInfo = metadata.EntityName;
if (TryComp<PolymorphedEntityComponent>(conspirator, out var polyComp) && polyComp.Parent.HasValue) // If the cultist is polymorphed, we use the original entity instead and hope that they'll polymorph back eventually
conspirators.Add((playerInfo, polyComp.Parent.Value));
else
conspirators.Add((playerInfo, conspirator));
}
var options = new VoteOptions
{
Title = Loc.GetString("conspirator-vote-leader-title"),
InitiatorText = Loc.GetString("conspirators-vote-leader-initiator"),
Duration = _leaderVoteTimer,
VoterEligibility = VoteManager.VoterEligibility.Conspirators
};
// If there are no conspirators, don't hold a vote, or the server will crash.
if (conspirators.Count == 0)
{
Log.Warning($"There are no conspirators present for the leader vote. Voting is cancelled to prevent the server crashing.");
_adminLogger.Add(LogType.Vote, LogImpact.Extreme, $"There are no conspirators for the leader vote. Leader vote is cancelled to prevent the server crashing.");
return;
}
foreach (var (name, ent) in conspirators)
{
options.Options.Add((Loc.GetString(name), ent));
}
// If somehow there are conspirators but no options, still don't hold a vote.
// Holding a vote with zero options crashes the server.
if (options.Options.Count == 0)
{
Log.Warning($"There are {conspirators.Count} conspirators but no options for the leader vote. Voting is cancelled to prevent the server crashing.");
_adminLogger.Add(LogType.Vote, LogImpact.Extreme, $"There are {conspirators.Count} conspirators but no options for the leader vote. Steward vote is cancelled to prevent the server crashing.");
return;
}
var vote = _votes.CreateVote(options);
vote.OnFinished += (_, args) =>
{
EntityUid picked;
if (args.Winner == null)
{
picked = (EntityUid)_random.Pick(args.Winners);
}
else
{
picked = (EntityUid)args.Winner;
}
//changing the icon of the head conspirator
EnsureComp<ConspiratorLeaderComponent>(picked);
_adminLogger.Add(LogType.Vote, LogImpact.Medium, $"conspirators leadership vote finished: {Identity.Entity(picked, EntityManager)} is now leader.");
};
}
//summary -> voting system for the conspirators objective
private void ConspiratorObjectiveVote(ConspiratorRuleComponent component)
{
//getting all conspirators and checking if they already have a objective
var conspirators = new List<EntityUid>();
var conspiratorsQuery = EntityQueryEnumerator<ConspiratorComponent>();
while (conspiratorsQuery.MoveNext(out var conspirator, out _))
{
if (TryComp<PolymorphedEntityComponent>(conspirator, out var polyComp) && polyComp.Parent.HasValue) // If the cultist is polymorphed, we use the original entity instead and hope that they'll polymorph back eventually
conspirators.Add((polyComp.Parent.Value));
else
conspirators.Add((conspirator));
}
// If there are no conspirators, don't hold a vote, or the server will crash.
if (conspirators.Count == 0)
{
Log.Warning($"There are no conspirators present for the objective vote. Voting is cancelled");
_adminLogger.Add(LogType.Vote, LogImpact.Extreme, $"There are no conspirators for the objective vote. objective vote is cancelled");
return;
}
var options = new VoteOptions
{
Title = Loc.GetString("conspirator-vote-objective-title"),
InitiatorText = Loc.GetString("conspirators-vote-leader-initiator"),
Duration = _objectiveVoteTimer,
VoterEligibility = VoteManager.VoterEligibility.Conspirators
};
//dumb array go! from here use it to add the options, will have to add the new objectives to this.
int ObjectiveArrayNumber = 0;
string[] ConspiratorObjectiveIds = ["ConspiratorBusinessObjective","ConspiratorUsurpObjective","ConspiratorHordeObjective","ConspiratorDistrustObjective","ConspiratorVigilanteObjective","ConspiratorFreedomObjective","ConspiratorNukeObjective","ConspiratorDangerObjective","ConspiratorFreeObjective"];
string[] ConspiratorObjectiveNames = ["Set up a business outside Nanotrasen.","Become the true leaders of the station.","Build a horde of valuables.","Brew distrust and hatred.","Enforce the laws secuirty can not.","Free the station of access.","Steal the nuke disk","Arm yourselves","Make your own conspiracy."];
foreach (string objective in ConspiratorObjectiveNames)
{
options.Options.Add((Loc.GetString(objective),ConspiratorObjectiveIds[ObjectiveArrayNumber]));
ObjectiveArrayNumber++;
}
// If somehow there are cultists but no options, still don't hold a vote.
// Holding a vote with zero options crashes the server.
if (options.Options.Count == 0)
{
Log.Warning($"There are {conspirators.Count} conspirators but no options for the leader vote. Voting is cancelled to prevent the server crashing.");
_adminLogger.Add(LogType.Vote, LogImpact.Extreme, $"There are {conspirators.Count} conspirators but no options for the leader vote. Steward vote is cancelled to prevent the server crashing.");
return;
}
var vote = _votes.CreateVote(options);
vote.OnFinished += (_, args) =>
{
string picked;
if (args.Winner == null)
{
picked = (string)_random.Pick(args.Winners);
}
else
{
picked = (string)args.Winner;
}
//add an objective for each member of the conspiracy, skip if it cant get them
foreach (EntityUid ent in conspirators){
_mind.TryGetMind(ent, out var mindId, out var mind);
if (mind == null){
continue;
}
_mind.TryAddObjective(mindId, mind, picked);
}
component.Objective = picked;
_adminLogger.Add(LogType.Vote, LogImpact.Medium, $"conspirators objective vote finished: {picked} is the objective.");
};
}
// deltav additions, conspirators v2
}

View File

@ -343,4 +343,28 @@ public sealed partial class DCCVars
/// </summary>
public static readonly CVarDef<bool> RoundEndIsOOCVote =
CVarDef.Create("deltav.round_end_is_ooc_vote", false, CVar.SERVER);
/// <summary>
/// How long the timer for the Conspirator leader vote lasts.
/// </summary>
public static readonly CVarDef<int> ConspiratorLeaderVoteTimer =
CVarDef.Create("conspirator.leader_vote_timer", 60, CVar.SERVER);
/// <summary>
/// How long we wait before starting the Conspirator leader vote.
/// </summary>
public static readonly CVarDef<int> ConspiratorLeaderVoteDelayTimer =
CVarDef.Create("conspirator.leader_vote_delay", 150, CVar.SERVER);
/// <summary>
/// How long the timer for the Conspirator objective vote lasts.
/// </summary>
public static readonly CVarDef<int> ConspiratorObjectiveVoteTimer =
CVarDef.Create("conspirator.objective_vote_timer", 120, CVar.SERVER);
/// <summary>
/// How long we wait before starting the Conspirator objective vote.
/// </summary>
public static readonly CVarDef<int> ConspiratorObjectiveVoteDelayTimer =
CVarDef.Create("conspirator.objective_vote_delay", 25, CVar.SERVER);
}

View File

@ -0,0 +1,14 @@
using Content.Shared.StatusIcon;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Harmony.Conspirators.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class ConspiratorLeaderComponent : Component
{
[DataField]
public ProtoId<FactionIconPrototype> ConspiratorIcon = "ConspiratorLeaderFaction";
public override bool SessionSpecific => true;
}

View File

@ -0,0 +1,31 @@
conspirator-generic-kit-name = Generic
conspirator-generic-kit-description =
A kit for the basics.
Contains 90 sheets of glass, steel and plastic.
Also grants a full toolbelt and insulated gloves.
conspirator-premium-kit-name = Premium
conspirator-premium-kit-description =
A kit for the finer stuff.
Contains 30 ingots of silvar, gold, plasma, plasteel and uranium.
Also grants 10,000 spesos.
conspirator-weapons-kit-name = weapons
conspirator-weapons-kit-description =
A kit for arming yourselves.
Contains 30 wood, Cloth, and gunpowder.
also gives a Utility Knife, and 3 Igniters.
conspirator-electronics-kit-name = Electronics
conspirator-electronics-kit-description =
A kit for making machines.
Contains 30 of each wire type, and 10 modular machine parts.
Also grants a Circuit Imprinter board.
conspirator-maintenance-kit-name = Maintenance
conspirator-maintenance-kit-description =
A kit for gamblers.
contains an entire locker full of random items from the maintenance tunnels.
conspirator-package-window-title = Conspirator Package
conspirator-package-window-description = What did you bring to the table?

View File

@ -0,0 +1,5 @@
conspirator-vote-leader-title = Who should lead the Conspiracy
conspirators-vote-leader-initiator = The Conspiracy
conspirators-vote-leader-briefing = The leader of the Conspiracy is
conspirator-vote-objective-title = what is the Conspiracys objective.

View File

@ -1,4 +1,4 @@
conspirator-objective-issuer = [color=#724F29]Conspiracy[/color]
conspirator-objective-issuer = [color=#746694]Criminal[/color]
conspirator-role-greeting =
You are a conspirator.

View File

@ -30,10 +30,12 @@
#- id: Xenoborgs
# prob: 0.05
# End DeltaV additions - Disable Xenoborgs
#begin DeltaV additions - add hitman
#begin DeltaV additions - add hitman (now add conspirators)
- id: Hitman
prob: 0.2 #as requested
# end deltaV additions - add hitman
- id: Conspirators
prob: 0.2
# end deltaV additions - add hitman (now add conspirators)
- type: entity
parent: BaseGameRule
@ -49,10 +51,12 @@
#- id: Xenoborgs
# prob: 0.05
# End DeltaV additions - Disable Xenoborgs
#begin DeltaV additions - add hitman
#begin DeltaV additions - add hitman (now add conspirators)
- id: Hitman
prob: 0.2 #as requested
# end deltaV additions - add hitman
- id: Conspirators
prob: 0.2
# end deltaV additions - add hitman (now add conspirators)
- type: entity
parent: BaseGameRule
@ -64,10 +68,12 @@
prob: 0.5
- id: SubWizard
prob: 0.05
#begin DeltaV additions - add hitman
#begin DeltaV additions - add hitman (now add conspirators)
- id: Hitman
prob: 0.2 #as requested
# end deltaV additions - add hitman
- id: Conspirators
prob: 0.2
# end deltaV additions - add hitman (now add conspirators)
- type: entity
parent: BaseGameRule
@ -77,10 +83,12 @@
rules:
- id: Thief
prob: 0.5
#begin DeltaV additions - add hitman
#begin DeltaV additions - add hitman (now add conspirators)
- id: Hitman
prob: 0.2 #as requested
# end deltaV additions - add hitman
- id: Conspirators
prob: 0.2
# end deltaV additions - add hitman (now add conspirators)
- type: entity
parent: BaseGameRule

View File

@ -0,0 +1,51 @@
- type: entity
parent: LockerBaseSecureDeltaV
id: LockerConspiratorFilledRandom
suffix: conspirator
components:
- type: EntityTableContainerFill
containers:
entity_storage: !type:NestedSelector
tableId: conspiratorLockerLoot
- type: entityTable
id: conspiratorLockerLoot
table: !type:AllSelector
children:
#Weapons
# fluff
- !type:NestedSelector
tableId: MaintToolsTable
prob: 1
- !type:NestedSelector
tableId: MaintFluffTable
prob: 1
#tools
- !type:NestedSelector
tableId: ToiletCisternCommonToolsTable
prob: 1
- !type:NestedSelector
tableId: ToiletCisternRareToolsTable
prob: 1
- !type:NestedSelector
tableId: ToiletCisternUtilityTable
prob: 1
#Weapons
- !type:NestedSelector
tableId: MaintWeaponTable
prob: 1
- !type:NestedSelector
tableId: ToiletCisternWeaponsTable
prob: 1
# Syndie Loot
- !type:NestedSelector
tableId: SyndieMaintLoot
prob: 1
- !type:NestedSelector
tableId: ToiletCisternSyndicateTable
prob: 1
# Recursive
- !type:NestedSelector
tableId: conspiratorLockerLoot
prob: 0.25

View File

@ -0,0 +1,74 @@
- type: thiefBackpackSet
id: ConspiratorGenericKit
name: conspirator-generic-kit-name
description: conspirator-generic-kit-description
sprite:
sprite: Objects/Materials/Sheets/metal.rsi
state: steel
content:
- SheetSteel
- SheetSteel
- SheetSteel
- SheetGlass
- SheetGlass
- SheetGlass
- SheetPlastic
- SheetPlastic
- SheetPlastic
- ClothingBeltUtilityFilled
- ClothingHandsGlovesColorYellow
- type: thiefBackpackSet
id: ConspiratorPremiumKit
name: conspirator-premium-kit-name
description: conspirator-premium-kit-description
sprite:
sprite: Objects/Materials/ingots.rsi
state: gold
content:
- SheetPlasma
- SheetUranium
- SheetPlasteel
- IngotGold
- IngotSilver
- SpaceCash10000
- type: thiefBackpackSet
id: ConspiratorWeaponsKit
name: conspirator-weapons-kit-name
description: conspirator-weapons-kit-description
sprite:
sprite: _DV/Objects/Weapons/Guns/Rifles/musket.rsi
state: base
content:
- MaterialWoodPlank
- MaterialCloth
- MaterialGunpowder30
- UtilityKnife
- Igniter
- Igniter
- Igniter
- type: thiefBackpackSet
id: ConspiratorElectronicsKit
name: conspirator-electronics-kit-name
description: conspirator-electronics-kit-description
sprite:
sprite: Objects/Tools/cable-coils.rsi
state: coil-30
content:
- CableHVStack
- CableMVStack
- CableApcStack
- CircuitImprinterMachineCircuitboard
- MicroManipulatorStockPart10
- type: thiefBackpackSet
id: ConspiratorMaintenanceKit
name: conspirator-maintenance-kit-name
description: conspirator-maintenance-kit-description
sprite:
sprite: Structures/Storage/wall_locker.rsi
state: generic_icon
content:
- LockerConspiratorFilledRandom

View File

@ -244,3 +244,19 @@
componentsToAdd:
- type: PyrokinesisPower
- type: Psionic
- type: entity
parent: MicroManipulatorStockPart
id: MicroManipulatorStockPart10
suffix: 10
components:
- type: Stack
count: 10
- type: entity
parent: MaterialGunpowder
id: MaterialGunpowder30
suffix: 30
components:
- type: Stack
count: 30

View File

@ -0,0 +1,19 @@
- type: entity
id: ConspiratorsPackage
name: conspirators package
description: A unopened package with everything you've prepared.
parent: ToolboxThief
components:
- type: Sprite
sprite: _DV/Objects/Misc/conspirators_package.rsi
state: icon
- type: ThiefUndeterminedBackpack
maxSelectedSets: 1
toolName: conspirator-package-window-title
toolDesc: conspirator-package-window-description
possibleSets:
- ConspiratorGenericKit
- ConspiratorPremiumKit
- ConspiratorWeaponsKit
- ConspiratorElectronicsKit
- ConspiratorMaintenanceKit

View File

@ -25,3 +25,39 @@
sound: "/Audio/_DV/Ambience/Antag/hitman_briefing_piano_between.ogg"
- type: DynamicRuleCost
cost: 100 # bit more than thief
- type: entity
id: Conspirators
components:
- type: GameRule
minPlayers: 30
- type: AntagObjectives
objectives:
- ConspiratorPrepareObjective
- type: ConspiratorRule
- type: AntagSelection
selectionTime: IntraPlayerSpawn
agentName: conspirator-round-end-agent-name # DeltaV - previously unset
definitions:
- prefRoles: [ Conspirator ]
min: 3
max: 6
playerRatio: 10
departmentDistribution: true # DeltaV - previously unset
startingGear: ConspiratorGear
blacklist: # DeltaV - Blacklist AntagImmune
components:
- AntagImmune
briefing:
text: conspirator-role-greeting
color: "#724F29"
sound: /Audio/_Harmony/Misc/conspirator_greeting.ogg
components:
- type: Conspirator
- type: AutoImplant
implants:
- RadioImplantConspiracy
mindRoles:
- MindRoleConspirator
- type: DynamicRuleCost
cost: 150 # more than hitman by a lot

View File

@ -6,38 +6,3 @@
rules:
- id: Thief
prob: 0.5
- type: entity
parent: BaseGameRule
id: Conspirators
components:
- type: GameRule
minPlayers: 15 # DeltaV - changed from 28 to 15
minTotalPlayers: 40 # DeltaV - added attribute
delay: # DeltaV - add delay to make sure as many people as possible join the round
min: 600
max: 900
- type: ConspiratorRule
- type: AntagSelection
selectionTime: PostPlayerSpawn # DeltaV - previously IntraPlayerSpawn
agentName: conspirator-round-end-agent-name # DeltaV - previously unset
definitions:
- prefRoles: [ Conspirator ]
min: 4
max: 7
playerRatio: 7
departmentDistribution: true # DeltaV - previously unset
blacklist: # DeltaV - Blacklist AntagImmune
components:
- AntagImmune
briefing:
text: conspirator-role-greeting
color: "#724F29"
sound: /Audio/_Harmony/Misc/conspirator_greeting.ogg
components:
- type: Conspirator
- type: AutoImplant
implants:
- RadioImplantConspiracy
mindRoles:
- MindRoleConspirator

View File

@ -98,3 +98,115 @@
icon:
sprite: Mobs/Silicon/station_ai.rsi
state: ai_camera
# dv addtions - dv conspirators v2
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorPrepareObjective
name: Plan and prepare.
description: Gather with your other Conspirators and prepare your conspiracy.
components:
- type: Objective
icon:
sprite: Objects/Weapons/Melee/stunprod.rsi
state: stunprod_off
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorBusinessObjective
name: Set up a business outside Nanotrasen.
description: You dont wanna work for nt anymore. Get a shuttle and whatever else would let you set up a profitable business of your own.
components:
- type: Objective
icon:
sprite: Structures/Machines/computers.rsi
state: avionics-systems
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorUsurpObjective
name: Become the true leaders of the station.
description: You want to be the top dogs. Through violence, blackmail, or popularity become the true captains.
components:
- type: Objective
icon:
sprite: Clothing/Head/Hats/captain.rsi
state: icon
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorHordeObjective
name: Build a horde of valuables.
description: You want it all. gather everything valuable on this station into a hidden location.
components:
- type: Objective
icon:
sprite: Objects/Materials/ingots.rsi
state: gold
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorDistrustObjective
name: Brew distrust and hatred.
description: A angry people is a controlable people. Try and get everyone isolated and angry at everyone else.
components:
- type: Objective
icon:
sprite: Structures/Machines/computers.rsi
state: television
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorVigilanteObjective
name: Enforce the laws secuirty can not.
description: Trespassing, minor theft, contraband, demolish these criminals so secuirty can focus on the real problems.
components:
- type: Objective
icon:
sprite: Objects/Weapons/Melee/baseball_bat.rsi
state: icon
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorFreedomObjective
name: Free the station of access.
description: The people are constrained by access and departments. Give the people the power to go anywhere.
components:
- type: Objective
icon:
sprite: Structures/Doors/Airlocks/Glass/basic.rsi
state: closed
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorNukeObjective
name: Steal the nuke disk
description: You know the nuclear operatives are coming. If you dont have the disk this station is doomed!
components:
- type: Objective
icon:
sprite: Objects/Misc/nukedisk.rsi
state: icon
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorDangerObjective
name: Arm yourselves
description: You're all in danger, get as many weapons and armor as you can to protect yourself.
components:
- type: Objective
icon:
sprite: Objects/Weapons/Guns/Pistols/mk58.rsi
state: icon
- type: entity
parent: BaseConspiratorObjective
id: ConspiratorFreeObjective
name: Make your own conspiracy.
description: you know what you want to do.
components:
- type: Objective
icon:
sprite: _ST/Effects/interaction.rsi
state: hand

View File

@ -2,12 +2,12 @@
- type: weightedRandom
id: ConspiratorObjectiveGroup # if you want to add another objective, feel free
weights:
ConspiratorUnionObjective: 1
ConspiratorGameshowObjective: 1
ConspiratorTechnologyObjective: 1
ConspiratorArmsObjective: 1
ConspiratorThiefObjective: 1
ConspiratorMafiaObjective: 1
ConspiratorArrestObjective: 1
# ConspiratorCameraObjective: 1 -- DeltaV - remove from pool
ConspiratorSiliconObjective: 1 # DeltaV
ConspiratorUnionObjective: 1 #deltaV conspirators v2
#ConspiratorGameshowObjective: 1
#ConspiratorTechnologyObjective: 1
#ConspiratorArmsObjective: 1
#ConspiratorThiefObjective: 1
#ConspiratorMafiaObjective: 1
#ConspiratorArrestObjective: 1
#ConspiratorCameraObjective: 1 -- DeltaV - remove from pool
#ConspiratorSiliconObjective: 1 # DeltaV

View File

@ -1,10 +1,16 @@
- type: antag
id: Conspirator
name: roles-antag-conspirator-name
objective: roles-antag-conspirator-objective
antagonist: true
setPreference: true
objective: roles-antag-conspirator-objective
guides: [ Conspirators ]
requirements:
- !type:OverallPlaytimeRequirement
time: 86400 # DeltaV - 24h
time: 24h # DeltaV - 24h
- type: startingGear
id: ConspiratorGear
storage:
back:
- ConspiratorsPackage

View File

@ -9,3 +9,16 @@
icon:
sprite: /Textures/_Harmony/Interface/Misc/job_icons.rsi
state: Conspirator
## conspirators v2
- type: factionIcon
id: ConspiratorLeaderFaction
isShaded: true
priority: 11
showTo:
components:
- ShowAntagIcons
- Conspirator
icon:
sprite: /Textures/_Harmony/Interface/Misc/job_icons.rsi
state: ConspiratorLead

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

View File

@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-4.0",
"copyright": "modifed mail capsuler from Frontier by erhardsteinhauer (discord). modifed by storymatt on github",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

View File

@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Conspirator made by SuperGDPWYL (GitHub).",
"copyright": "Conspirator made by SuperGDPWYL (GitHub). ConspiratorLead modified from Conspirator by stormyatt (github)",
"size": {
"x": 8,
"y": 8
@ -9,6 +9,9 @@
"states": [
{
"name": "Conspirator"
},
{
"name": "ConspiratorLead"
}
]
}