Merge remote-tracking branch 'refs/remotes/wizards/master'

# Conflicts:
#	Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml
#	Resources/Prototypes/Entities/Mobs/Player/humanoid.yml
This commit is contained in:
VigersRay 2024-06-21 18:08:24 +03:00
commit 9fd0e0cff7
44 changed files with 4089 additions and 128 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,27 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Postgres
{
/// <inheritdoc />
public partial class ConnectionLogTimeIndex : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_connection_log_time",
table: "connection_log",
column: "time");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_connection_log_time",
table: "connection_log");
}
}
}

View file

@ -559,6 +559,8 @@ namespace Content.Server.Database.Migrations.Postgres
b.HasIndex("ServerId")
.HasDatabaseName("IX_connection_log_server_id");
b.HasIndex("Time");
b.HasIndex("UserId");
b.ToTable("connection_log", null, t =>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,27 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Content.Server.Database.Migrations.Sqlite
{
/// <inheritdoc />
public partial class ConnectionLogTimeIndex : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_connection_log_time",
table: "connection_log",
column: "time");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_connection_log_time",
table: "connection_log");
}
}
}

View file

@ -528,6 +528,8 @@ namespace Content.Server.Database.Migrations.Sqlite
b.HasIndex("ServerId")
.HasDatabaseName("IX_connection_log_server_id");
b.HasIndex("Time");
b.HasIndex("UserId");
b.ToTable("connection_log", (string)null);

View file

@ -187,6 +187,9 @@ namespace Content.Server.Database
modelBuilder.Entity<ConnectionLog>()
.HasIndex(p => p.UserId);
modelBuilder.Entity<ConnectionLog>()
.HasIndex(p => p.Time);
modelBuilder.Entity<ConnectionLog>()
.Property(p => p.ServerId)
.HasDefaultValue(0);
@ -694,6 +697,14 @@ namespace Content.Server.Database
/// Intended use is for users with shared connections. This should not be used as an alternative to <see cref="Datacenter"/>.
/// </remarks>
IP = 1 << 1,
/// <summary>
/// Ban is an IP range that is only applied for first time joins.
/// </summary>
/// <remarks>
/// Intended for use with residential IP ranges that are often used maliciously.
/// </remarks>
BlacklistedRange = 1 << 2,
// @formatter:on
}

View file

@ -21,6 +21,9 @@ public sealed partial class AdminVerbSystem
[ValidatePrototypeId<EntityPrototype>]
private const string DefaultTraitorRule = "Traitor";
[ValidatePrototypeId<EntityPrototype>]
private const string DefaultInitialInfectedRule = "Zombie";
[ValidatePrototypeId<EntityPrototype>]
private const string DefaultNukeOpRule = "LoneOpsSpawn";
@ -63,6 +66,20 @@ public sealed partial class AdminVerbSystem
};
args.Verbs.Add(traitor);
Verb initialInfected = new()
{
Text = Loc.GetString("admin-verb-text-make-initial-infected"),
Category = VerbCategory.Antag,
Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/job_icons.rsi"), "InitialInfected"),
Act = () =>
{
_antag.ForceMakeAntag<ZombieRuleComponent>(targetPlayer, DefaultInitialInfectedRule);
},
Impact = LogImpact.High,
Message = Loc.GetString("admin-verb-make-initial-infected"),
};
args.Verbs.Add(initialInfected);
Verb zombie = new()
{
Text = Loc.GetString("admin-verb-text-make-zombie"),

View file

@ -633,6 +633,11 @@ namespace Content.Server.Database
return record == null ? null : MakePlayerRecord(record);
}
protected async Task<bool> PlayerRecordExists(DbGuard db, NetUserId userId)
{
return await db.DbContext.Player.AnyAsync(p => p.UserId == userId);
}
[return: NotNullIfNotNull(nameof(player))]
protected PlayerRecord? MakePlayerRecord(Player? player)
{

View file

@ -78,7 +78,8 @@ namespace Content.Server.Database
await using var db = await GetDbImpl();
var exempt = await GetBanExemptionCore(db, userId);
var query = MakeBanLookupQuery(address, userId, hwId, db, includeUnbanned: false, exempt)
var newPlayer = userId == null || !await PlayerRecordExists(db, userId.Value);
var query = MakeBanLookupQuery(address, userId, hwId, db, includeUnbanned: false, exempt, newPlayer)
.OrderByDescending(b => b.BanTime);
var ban = await query.FirstOrDefaultAsync();
@ -98,7 +99,8 @@ namespace Content.Server.Database
await using var db = await GetDbImpl();
var exempt = await GetBanExemptionCore(db, userId);
var query = MakeBanLookupQuery(address, userId, hwId, db, includeUnbanned, exempt);
var newPlayer = !await db.PgDbContext.Player.AnyAsync(p => p.UserId == userId);
var query = MakeBanLookupQuery(address, userId, hwId, db, includeUnbanned, exempt, newPlayer);
var queryBans = await query.ToArrayAsync();
var bans = new List<ServerBanDef>(queryBans.Length);
@ -122,7 +124,8 @@ namespace Content.Server.Database
ImmutableArray<byte>? hwId,
DbGuardImpl db,
bool includeUnbanned,
ServerBanExemptFlags? exemptFlags)
ServerBanExemptFlags? exemptFlags,
bool newPlayer)
{
DebugTools.Assert(!(address == null && userId == null && hwId == null));
@ -141,7 +144,9 @@ namespace Content.Server.Database
{
var newQ = db.PgDbContext.Ban
.Include(p => p.Unban)
.Where(b => b.Address != null && EF.Functions.ContainsOrEqual(b.Address.Value, address));
.Where(b => b.Address != null
&& EF.Functions.ContainsOrEqual(b.Address.Value, address)
&& !(b.ExemptFlags.HasFlag(ServerBanExemptFlags.BlacklistedRange) && !newPlayer));
query = query == null ? newQ : query.Union(newQ);
}
@ -167,6 +172,9 @@ namespace Content.Server.Database
if (exemptFlags is { } exempt)
{
if (exempt != ServerBanExemptFlags.None)
exempt |= ServerBanExemptFlags.BlacklistedRange; // Any kind of exemption should bypass BlacklistedRange
query = query.Where(b => (b.ExemptFlags & exempt) == 0);
}

View file

@ -86,11 +86,13 @@ namespace Content.Server.Database
var exempt = await GetBanExemptionCore(db, userId);
var newPlayer = userId == null || !await PlayerRecordExists(db, userId.Value);
// SQLite can't do the net masking stuff we need to match IP address ranges.
// So just pull down the whole list into memory.
var bans = await GetAllBans(db.SqliteDbContext, includeUnbanned: false, exempt);
return bans.FirstOrDefault(b => BanMatches(b, address, userId, hwId, exempt)) is { } foundBan
return bans.FirstOrDefault(b => BanMatches(b, address, userId, hwId, exempt, newPlayer)) is { } foundBan
? ConvertBan(foundBan)
: null;
}
@ -103,12 +105,14 @@ namespace Content.Server.Database
var exempt = await GetBanExemptionCore(db, userId);
var newPlayer = !await db.SqliteDbContext.Player.AnyAsync(p => p.UserId == userId);
// SQLite can't do the net masking stuff we need to match IP address ranges.
// So just pull down the whole list into memory.
var queryBans = await GetAllBans(db.SqliteDbContext, includeUnbanned, exempt);
return queryBans
.Where(b => BanMatches(b, address, userId, hwId, exempt))
.Where(b => BanMatches(b, address, userId, hwId, exempt, newPlayer))
.Select(ConvertBan)
.ToList()!;
}
@ -137,10 +141,18 @@ namespace Content.Server.Database
IPAddress? address,
NetUserId? userId,
ImmutableArray<byte>? hwId,
ServerBanExemptFlags? exemptFlags)
ServerBanExemptFlags? exemptFlags,
bool newPlayer)
{
// Any flag to bypass BlacklistedRange bans.
var exemptFromBlacklistedRange = exemptFlags != null && exemptFlags.Value != ServerBanExemptFlags.None;
if (!exemptFlags.GetValueOrDefault(ServerBanExemptFlags.None).HasFlag(ServerBanExemptFlags.IP)
&& address != null && ban.Address is not null && address.IsInSubnet(ban.Address.ToTuple().Value))
&& address != null
&& ban.Address is not null
&& address.IsInSubnet(ban.Address.ToTuple().Value)
&& (!ban.ExemptFlags.HasFlag(ServerBanExemptFlags.BlacklistedRange) ||
newPlayer && !exemptFromBlacklistedRange))
{
return true;
}

View file

@ -2,6 +2,7 @@ using Content.Server.Antag;
using Content.Server.Chat.Systems;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Popups;
using Content.Server.Roles;
using Content.Server.RoundEnd;
using Content.Server.Station.Components;
using Content.Server.Station.Systems;
@ -35,9 +36,27 @@ public sealed class ZombieRuleSystem : GameRuleSystem<ZombieRuleComponent>
{
base.Initialize();
SubscribeLocalEvent<InitialInfectedRoleComponent, GetBriefingEvent>(OnGetBriefing);
SubscribeLocalEvent<ZombieRoleComponent, GetBriefingEvent>(OnGetBriefing);
SubscribeLocalEvent<IncurableZombieComponent, ZombifySelfActionEvent>(OnZombifySelf);
}
private void OnGetBriefing(EntityUid uid, InitialInfectedRoleComponent component, ref GetBriefingEvent args)
{
if (!TryComp<MindComponent>(uid, out var mind) || mind.OwnedEntity == null)
return;
if (HasComp<ZombieRoleComponent>(uid)) // don't show both briefings
return;
args.Append(Loc.GetString("zombie-patientzero-role-greeting"));
}
private void OnGetBriefing(EntityUid uid, ZombieRoleComponent component, ref GetBriefingEvent args)
{
if (!TryComp<MindComponent>(uid, out var mind) || mind.OwnedEntity == null)
return;
args.Append(Loc.GetString("zombie-infection-greeting"));
}
protected override void AppendRoundEndText(EntityUid uid, ZombieRuleComponent component, GameRuleComponent gameRule,
ref RoundEndTextAppendEvent args)
{

View file

@ -24,6 +24,9 @@ public sealed partial class ToggleableGhostRoleComponent : Component
[DataField("roleDescription")]
public string RoleDescription = string.Empty;
[DataField("roleRules")]
public string RoleRules = string.Empty;
[DataField("wipeVerbText")]
public string WipeVerbText = string.Empty;

View file

@ -53,13 +53,14 @@ public sealed class ToggleableGhostRoleSystem : EntitySystem
EnsureComp<GhostTakeoverAvailableComponent>(uid);
ghostRole.RoleName = Loc.GetString(component.RoleName);
ghostRole.RoleDescription = Loc.GetString(component.RoleDescription);
ghostRole.RoleRules = Loc.GetString(component.RoleRules);
}
private void OnExamined(EntityUid uid, ToggleableGhostRoleComponent component, ExaminedEvent args)
{
if (!args.IsInDetailsRange)
return;
if (TryComp<MindContainerComponent>(uid, out var mind) && mind.HasMind)
{
args.PushMarkup(Loc.GetString(component.ExamineTextMindPresent));

View file

@ -13,10 +13,11 @@ public abstract partial class SharedBuckleSystem
private void InitializeInteraction()
{
SubscribeLocalEvent<StrapComponent, GetVerbsEvent<InteractionVerb>>(AddStrapVerbs);
SubscribeLocalEvent<StrapComponent, InteractHandEvent>(OnStrapInteractHand);
SubscribeLocalEvent<StrapComponent, InteractHandEvent>(OnStrapInteractHand, after: [typeof(InteractionPopupSystem)]);
SubscribeLocalEvent<StrapComponent, DragDropTargetEvent>(OnStrapDragDropTarget);
SubscribeLocalEvent<StrapComponent, CanDropTargetEvent>(OnCanDropTarget);
SubscribeLocalEvent<BuckleComponent, InteractHandEvent>(OnBuckleInteractHand, after: [typeof(InteractionPopupSystem)]);
SubscribeLocalEvent<BuckleComponent, GetVerbsEvent<InteractionVerb>>(AddUnbuckleVerb);
}
@ -58,6 +59,9 @@ public abstract partial class SharedBuckleSystem
if (args.Handled)
return;
if (!component.Enabled)
return;
if (!TryComp(args.User, out BuckleComponent? buckle))
return;
@ -68,7 +72,20 @@ public abstract partial class SharedBuckleSystem
else
return;
args.Handled = true; // This generate popups on failure.
// TODO BUCKLE add out bool for whether a pop-up was generated or not.
args.Handled = true;
}
private void OnBuckleInteractHand(Entity<BuckleComponent> ent, ref InteractHandEvent args)
{
if (args.Handled)
return;
if (ent.Comp.BuckledTo != null)
TryUnbuckle(ent!, args.User, popup: true);
// TODO BUCKLE add out bool for whether a pop-up was generated or not.
args.Handled = true;
}
private void AddStrapVerbs(EntityUid uid, StrapComponent component, GetVerbsEvent<InteractionVerb> args)

View file

@ -313,5 +313,22 @@ Entries:
id: 38
time: '2024-06-15T11:25:42.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/28899
- author: slarticodefast
changes:
- message: Added the "Make Inititial Infected" verb to the antag control.
type: Add
id: 39
time: '2024-06-21T05:42:17.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29259
- author: nikthechampiongr
changes:
- message: It is now possible to issue BlacklistedRanges bans(This requires you
to edit the database manually at the moment.) Bans marked as BlacklistedRange
will lead to players joining for the first time who match an ip range to be
denied. Players that have joined the server before will be unaffected.
type: Add
id: 40
time: '2024-06-21T12:06:07.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29258
Name: Admin
Order: 1

View file

@ -1,26 +1,4 @@
Entries:
- author: deltanedas
changes:
- message: Disabled scooping foam due to a reagent duplication bug.
type: Fix
id: 6296
time: '2024-04-03T13:41:23.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26686
- author: Aserovich
changes:
- message: New lobby art!
type: Add
id: 6297
time: '2024-04-04T05:28:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26505
- author: Beck Thompson
changes:
- message: Items thrown at disposals now have to be insertable to display the miss
message.
type: Fix
id: 6298
time: '2024-04-04T06:25:47.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26716
- author: Tayrtahn
changes:
- message: Some devices may have broken wiring at the start of each round.
@ -3845,3 +3823,30 @@
id: 6795
time: '2024-06-21T03:02:23.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29268
- author: slarticodefast
changes:
- message: Fixed initial infected status icons not showing up.
type: Fix
- message: Added an antagonist message to the character menu for initial infected
and zombies.
type: Add
id: 6796
time: '2024-06-21T05:42:17.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29259
- author: Chief_Engineer and TsjipTsjip
changes:
- message: All ghostroles now have their role type, as defined in the rules, defined
in their ghostrole request box.
type: Tweak
id: 6797
time: '2024-06-21T09:41:54.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29249
- author: ElectroJr
changes:
- message: Fixed not being able to pick up folded rollerbeds.
type: Fix
- message: Fixed not being able to unbuckle entities by clicking on them.
type: Fix
id: 6798
time: '2024-06-21T10:50:53.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/29293

View file

@ -1,5 +1,6 @@
verb-categories-antag = Antag ctrl
admin-verb-make-traitor = Make the target into a traitor.
admin-verb-make-initial-infected = Make the target into an Initial Infected.
admin-verb-make-zombie = Zombifies the target immediately.
admin-verb-make-nuclear-operative = Make target into a lone Nuclear Operative.
admin-verb-make-pirate = Make the target into a pirate. Note this doesn't configure the game rule.
@ -7,8 +8,9 @@ admin-verb-make-head-rev = Make the target into a Head Revolutionary.
admin-verb-make-thief = Make the target into a thief.
admin-verb-text-make-traitor = Make Traitor
admin-verb-text-make-initial-infected = Make Initial Infected
admin-verb-text-make-zombie = Make Zombie
admin-verb-text-make-nuclear-operative = Make Nuclear Operative
admin-verb-text-make-pirate = Make Pirate
admin-verb-text-make-head-rev = Make Head Rev
admin-verb-text-make-thief = Make Thief
admin-verb-text-make-thief = Make Thief

View file

@ -3,6 +3,26 @@ ghost-role-component-default-rules = All normal rules apply unless an administra
You don't remember any of your previous life, and you don't remember anything you learned as a ghost.
You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc.
You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character.
ghost-role-information-nonantagonist-rules = You are a [color=green][bold]Non-antagonist[/bold][/color]. You should generally not seek to harm the station and its crew.
You don't remember any of your previous life, and you don't remember anything you learned as a ghost.
You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc.
You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character.
ghost-role-information-freeagent-rules = You are a [color=yellow][bold]Free Agent[/bold][/color]. You are free to act as either an antagonist or a non-antagonist.
You don't remember any of your previous life, and you don't remember anything you learned as a ghost.
You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc.
You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character.
ghost-role-information-antagonist-rules = You are a [color=red][bold]Solo Antagonist[/bold][/color]. Your intentions are clear, and harmful to the station and its crew.
You don't remember any of your previous life, and you don't remember anything you learned as a ghost.
You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc.
You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character.
ghost-role-information-familiar-rules = You are a [color=#6495ed][bold]Familiar[/bold][/color]. Serve the interests of your master, whatever those may be.
You don't remember any of your previous life, and you don't remember anything you learned as a ghost.
You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc.
You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character.
ghost-role-information-silicon-rules = You are a [color=#6495ed][bold]Silicon[/bold][/color]. Obey your laws. You are a Free Agent if you are not currently bound by any laws.
You don't remember any of your previous life, and you don't remember anything you learned as a ghost.
You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc.
You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character.
ghost-role-information-mouse-name = Mouse
ghost-role-information-mouse-description = A hungry and mischievous mouse.
@ -12,6 +32,7 @@ ghost-role-information-mothroach-description = A cute but mischievous mothroach.
ghost-role-information-giant-spider-name = Giant spider
ghost-role-information-giant-spider-description = This station's inhabitants look mighty tasty, and your sticky web is perfect to catch them!
ghost-role-information-giant-spider-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other giant spiders.
ghost-role-information-cognizine-description = Made conscious with the magic of cognizine.
@ -26,6 +47,7 @@ ghost-role-information-slimes-description = An ordinary slime with no special ne
ghost-role-information-angry-slimes-name = Slime
ghost-role-information-angry-slimes-description = Everyone around you irritates your instincts, destroy them!
ghost-role-information-angry-slimes-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other angry slimes.
ghost-role-information-smile-name = Smile the Slime
ghost-role-information-smile-description = The sweetest creature in the world. Smile Slime!
@ -35,11 +57,10 @@ ghost-role-information-punpun-description = An honorable member of the monkey so
ghost-role-information-xeno-name = Xeno
ghost-role-information-xeno-description = You are a xeno, co-operate with your hive to kill all crewmembers!
ghost-role-information-xeno-rules = You are an antagonist, smack, slash, and wack!
ghost-role-information-xeno-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other xenos.
ghost-role-information-revenant-name = Revenant
ghost-role-information-revenant-description = You are a Revenant. Use your powers to harvest souls and unleash chaos upon the crew. Unlock new abilities with the essence you harvest.
ghost-role-information-revenant-rules = You are an antagonist, harvest, defile, and drive the crew insane.
ghost-role-information-kangaroo-name = Kangaroo
ghost-role-information-kangaroo-description = You're a kangaroo! Do whatever kangaroos do.
@ -51,31 +72,17 @@ ghost-role-information-kobold-name = Kobold
ghost-role-information-kobold-description = Be the little gremlin you are, yell at people and beg for meat!
ghost-role-information-rat-king-name = Rat King
ghost-role-information-rat-king-description = You are the Rat King, scavenge food in order to produce rat minions to do your bidding.
ghost-role-information-rat-king-rules = You are an antagonist, scavenge, attack, and grow your hoard!
ghost-role-information-rat-king-description = You are the Rat King, your interests are food, food, and more food. Cooperate with or fight against the station for food. Did I say food interests you?
ghost-role-information-rat-servant-name = Rat Servant
ghost-role-information-rat-servant-description = You are a Rat Servant. You must follow your king's orders.
ghost-role-information-rat-servant-rules = You are an antagonist, scavenge, attack, and serve your king!
ghost-role-information-salvage-carp-name = Space carp on salvage wreck
ghost-role-information-salvage-carp-description = Defend the loot inside the salvage wreck!
ghost-role-information-sentient-carp-name = Sentient Carp
ghost-role-information-sentient-carp-description = Help the dragon flood the station with carps!
ghost-role-information-salvage-shark-name = Space sharkminnow on salvage wreck
ghost-role-information-salvage-shark-description = Help the younger fellow carp protect their prey. Smell the blood!
ghost-role-information-willow-name = Willow the kangaroo
ghost-role-information-willow-description = You're a kangaroo named willow! Willow likes to box.
ghost-role-information-space-tick-name = Space tick
ghost-role-information-space-tick-description = Wreak havoc on the station!
ghost-role-information-salvage-tick-name = Space tick on salvage wreck
ghost-role-information-salvage-tick-description = Defend the loot inside the salvage wreck!
ghost-role-information-honkbot-name = Honkbot
ghost-role-information-honkbot-description = An artificial being of pure evil.
@ -85,39 +92,13 @@ ghost-role-information-jonkbot-description = An artificial being of pure evil.
ghost-role-information-mimebot-name = Mimebot
ghost-role-information-mimebot-description = A Mimebot, act like a mime but don't act like a greytider.
ghost-role-information-taxibot-name = TaxiBot
ghost-role-information-taxibot-description = Drive the station crew to their destination.
ghost-role-information-supplybot-name = SupplyBot
ghost-role-information-supplybot-description = Deliver goods around the station.
ghost-role-information-space-bear-name = Space bear
ghost-role-information-space-bear-description = Your tummy rumbles, and these people look really yummy... What a feast!
ghost-role-information-salvage-bear-name = Space bear on salvage wreck
ghost-role-information-salvage-bear-description = Defend the loot inside the salvage wreck!
ghost-role-information-space-kangaroo-name = Space kangaroo
ghost-role-information-space-kangaroo-description = Give the crew a taste of your sharp claws!
ghost-role-information-salvage-kangaroo-name = Space kangaroo on salvage wreck
ghost-role-information-salvage-kangaroo-description = Defend the loot inside the salvage wreck!
ghost-role-information-space-spider-name = Space spider
ghost-role-information-space-spider-description = Space spiders are just as aggressive as regular spiders, feed.
ghost-role-information-salvage-spider-name = Space spider on salvage wreck
ghost-role-information-salvage-spider-description = Space spiders are just as aggressive as regular spiders, feed.
ghost-role-information-space-cobra-name = Space cobra
ghost-role-information-space-cobra-description = Space cobras really don't like guests, and will always snack on a visitor.
ghost-role-information-salvage-cobra-name = Space cobra on salvage wreck
ghost-role-information-salvage-cobra-description = Space cobras really don't like guests, and will always snack on a visitor.
ghost-role-information-salvage-flesh-name = Aberrant flesh on salvage wreck
ghost-role-information-salvage-flesh-description = Defend the loot inside the salvage wreck!
# Still exists as a commented out reference for Tropico. Keeping it around. -TsjipTsjip, 2024-06-20
ghost-role-information-tropico-name = Tropico
ghost-role-information-tropico-description = The noble companion of Atmosia, and its most stalwart defender. Viva!
@ -135,7 +116,11 @@ ghost-role-information-ifrit-description = Listen to your owner. Don't tank dama
ghost-role-information-space-dragon-name = Space dragon
ghost-role-information-space-dragon-description = Call in 3 carp rifts and take over this quadrant! You have only 5 minutes in between each rift before you will disappear.
ghost-role-information-space-dragon-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all your summoned carp.
ghost-role-information-space-dragon-summoned-carp-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with your dragon and its allies.
ghost-role-information-space-dragon-dungeon-description = Defend the expedition dungeon with your fishy comrades!
ghost-role-information-space-dragon-dungeon-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all dungeon mobs.
ghost-role-information-cluwne-name = Cluwne
ghost-role-information-cluwne-description = Become a pitiful cluwne, your only goal in life is to find a sweet release from your suffering (usually by being beaten to death). A cluwne is not an antagonist but may defend itself. Crewmembers may murder cluwnes freely.
@ -147,19 +132,13 @@ ghost-role-information-skeleton-biker-name = Skeleton Biker
ghost-role-information-skeleton-biker-description = Ride around on your sweet ride.
ghost-role-information-closet-skeleton-name = Closet Skeleton
ghost-role-information-closet-skeleton-description = Wreak havoc! You are a primordial force with no allegiance. Live happily with the crew or wage sweet skeletal war.
ghost-role-information-onestar-mecha-name = Onestar Mecha
ghost-role-information-onestar-mecha-description = You are an experimental mecha created by who-knows-what, all you know is that you have weapons and you detect fleshy moving targets nearby...
ghost-role-information-onestar-mecha-rules = Use your weapons to cause havoc. You are an antagonist.
ghost-role-information-closet-skeleton-description = You are arguably one of the oldest members of the station! Get your old job back, or cause chaos! The world is yours to shape.
ghost-role-information-remilia-name = Remilia, the chaplain's familiar
ghost-role-information-remilia-description = Obey your master. Eat fruit.
ghost-role-information-remilia-rules = You are an intelligent fruit bat. Follow the chaplain around. Don't cause any trouble unless the chaplain tells you to.
ghost-role-information-remilia-description = Follow and obey the chaplain. Eat fruit. Screech loudly into people's ears and write it off as echolocation.
ghost-role-information-cerberus-name = Cerberus, Evil Familiar
ghost-role-information-cerberus-description = Obey your master. Spread chaos.
ghost-role-information-cerberus-rules = You are an intelligent, demonic dog. Try to help the chaplain and any of his flock. As an antagonist, you're otherwise unrestrained.
ghost-role-information-ert-leader-name = ERT Leader
ghost-role-information-ert-leader-description = Lead a team of specialists to resolve the station's issues.
@ -185,70 +164,64 @@ ghost-role-information-cburn-agent-description = A highly trained CentCom agent,
ghost-role-information-centcom-official-name = CentComm official
ghost-role-information-centcom-official-description = Perform CentComm related duties such as inspect the station, jotting down performance reviews for heads of staff, and managing the fax machine.
ghost-role-information-nukeop-rules = You are a syndicate operative tasked with the destruction of the station. As an antagonist, do whatever is required to complete this task.
ghost-role-information-nukeop-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other nuclear operatives. Covert syndicate agents are not guaranteed to help you.
ghost-role-information-loneop-name = Lone Operative
ghost-role-information-loneop-description = You are a lone nuclear operative. Destroy the station!
ghost-role-information-loneop-rules = You are a syndicate operative tasked with the destruction of the station. As an antagonist, do whatever is required to complete this task.
ghost-role-information-loneop-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other nuclear operatives. Covert syndicate agents are not guaranteed to help you.
ghost-role-information-behonker-name = Behonker
ghost-role-information-behonker-description = You are an antagonist, bring death and honks to those who do not follow the honkmother.
ghost-role-information-hellspawn-name = Hellspawn
ghost-role-information-hellspawn-description = You are an antagonist, bring death to those who do not follow the great god Nar'Sie.
ghost-role-information-hellspawn-description = Bring death to those who do not follow the great god Nar'Sie.
ghost-role-information-Death-Squad-name = Death Squad Operative
ghost-role-information-Death-Squad-description = One of Nanotrasen's top internal affairs agents. Await orders from CentComm or an official.
ghost-role-information-Death-Squad-rules = You are required to obey orders given by your superior, you are effectively their [color=#6495ed][bold]Familiar[/bold][/color].
ghost-role-information-SyndiCat-name = SyndiCat
ghost-role-information-SyndiCat-description = You're the faithful trained pet of nuclear operatives with a microbomb. Serve your master to the death!
ghost-role-information-SyndiCat-rules = You're the faithful trained pet of nuclear operatives with a microbomb. Serve your master to the death!
ghost-role-information-SyndiCat-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the agent who summoned you.
ghost-role-information-Cak-name = Cak
ghost-role-information-Cak-description = You are the chef's favorite child. You're a living cake cat.
ghost-role-information-Cak-rules = You are a living edible sweet cat. Your task is to find your place in this world where everything wants to eat you.
ghost-role-information-BreadDog-name = BreadDog
ghost-role-information-BreadDog-description = You are the chef's favorite child. You're a living bread dog.
ghost-role-information-BreadDog-rules = You're an edible dog made of bread. Your task is to find your place in this world where everything wants to eat you.
ghost-role-information-space-ninja-name = Space Ninja
ghost-role-information-space-ninja-description = Use stealth and deception to sabotage the station.
ghost-role-information-space-ninja-rules = You are an elite mercenary of the Spider Clan. You aren't required to follow your objectives, yet your NINJA HONOR demands you try.
ghost-role-information-syndicate-reinforcement-name = Syndicate Agent
ghost-role-information-syndicate-reinforcement-description = Someone needs reinforcements. You, the first person the syndicate could find, will help them.
ghost-role-information-syndicate-reinforcement-rules = Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them.
ghost-role-information-syndicate-reinforcement-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the agent who summoned you.
ghost-role-information-syndicate-monkey-reinforcement-name = Syndicate Monkey Agent
ghost-role-information-syndicate-monkey-reinforcement-description = Someone needs reinforcements. You, a trained monkey, will help them.
ghost-role-information-syndicate-monkey-reinforcement-rules = Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them.
ghost-role-information-syndicate-monkey-reinforcement-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the agent who summoned you.
ghost-role-information-lost-cargo-technical-name = Lost Cargo Technician
ghost-role-information-lost-cargo-technical-description = Something went wrong and your cargo shuttle with the goods was beamed into the sector to another station.
ghost-role-information-lost-cargo-technical-rules = You're a regular cargo technician from another station. Do what regular cargo do.
ghost-role-information-clown-troupe-name = Space Clown
ghost-role-information-clown-troupe-description = You and your troupe have come to cheer up this station with your best jokes. Honk!
ghost-role-information-clown-troupe-rules = Normal station crew rules apply.
ghost-role-information-traveling-chef-name = Traveling Chef
ghost-role-information-traveling-chef-description = You are a chef on a traveling shuttle of exotic cuisine. Delight the station with delicious food!
ghost-role-information-traveling-chef-rules = Normal station crew rules apply.
ghost-role-information-disaster-victim-name = Disaster Victim
ghost-role-information-disaster-victim-description = You were rescued in an escape pod from another station that suffered a terrible fate. Perhaps you will be found and rescued.
ghost-role-information-disaster-victim-rules = Normal station crew rules apply.
ghost-role-information-syndie-disaster-victim-name = Syndie Disaster Victim
ghost-role-information-syndie-disaster-victim-description = You're a regular passenger from a syndicate station. Unfortunately, an evacuation pod has thrown you into an enemy sector.....
ghost-role-information-syndie-disaster-victim-rules = Normal station crew rules apply. You are NOT an antagonist!
ghost-role-information-syndicate-kobold-reinforcement-name = Syndicate Kobold Agent
ghost-role-information-syndicate-kobold-reinforcement-description = Someone needs reinforcements. You, a trained kobold, will help them.
ghost-role-information-syndicate-kobold-reinforcement-rules = Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them.
ghost-role-information-syndicate-kobold-reinforcement-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the agent who summoned you.
ghost-role-information-artifact-name = Sentient Artifact
ghost-role-information-artifact-description =
Enact your eldritch whims.
Forcibly activate your nodes for good or for evil.
ghost-role-information-artifact-description = Enact your eldritch whims. Forcibly activate your nodes for good or for evil.
ghost-role-information-syndie-assaultborg-name = Syndicate Assault Borg
ghost-role-information-syndie-assaultborg-description = Nuclear operatives needs reinforcements. You, a cold silicon killing machine, will help them. More dakka!

View file

@ -29,7 +29,7 @@
- type: entity
id: BaseBorgArmLeft
parent: PartSilicon
name: left cyborg arm
name: cyborg left arm
abstract: true
components:
- type: BodyPart
@ -43,7 +43,7 @@
- type: entity
id: BaseBorgArmRight
parent: PartSilicon
name: right cyborg arm
name: cyborg right arm
abstract: true
components:
- type: BodyPart
@ -57,7 +57,7 @@
- type: entity
id: BaseBorgLegLeft
parent: PartSilicon
name: left cyborg leg
name: cyborg left leg
abstract: true
components:
- type: BodyPart
@ -71,7 +71,7 @@
- type: entity
id: BaseBorgLegRight
parent: PartSilicon
name: right cyborg leg
name: cyborg right leg
abstract: true
components:
- type: BodyPart

View file

@ -18,7 +18,7 @@
- type: GhostRole
name: ghost-role-information-rat-king-name
description: ghost-role-information-rat-king-description
rules: ghost-role-information-rat-king-rules
rules: ghost-role-information-freeagent-rules
requirements:
- !type:OverallPlaytimeRequirement
time: 36000 #10 hrs # Sunrise-RoleTime
@ -42,7 +42,7 @@
- type: GhostRole
name: ghost-role-information-remilia-name
description: ghost-role-information-remilia-description
rules: ghost-role-information-remilia-rules
rules: ghost-role-information-familiar-rules
raffle:
settings: short
- type: GhostRoleMobSpawner
@ -63,7 +63,7 @@
- type: GhostRole
name: ghost-role-information-cerberus-name
description: ghost-role-information-cerberus-description
rules: ghost-role-information-cerberus-rules
rules: ghost-role-information-familiar-rules
raffle:
settings: default
- type: GhostRoleMobSpawner
@ -181,7 +181,7 @@
- type: GhostRole
name: ghost-role-information-space-dragon-name
description: ghost-role-information-space-dragon-description
rules: ghost-role-component-default-rules
rules: ghost-role-component-space-dragon-rules
requirements:
- !type:OverallPlaytimeRequirement
time: 36000 #10 hrs # Sunrise-RoleTime
@ -202,7 +202,7 @@
- type: GhostRole
name: ghost-role-information-space-ninja-name
description: ghost-role-information-space-ninja-description
rules: ghost-role-information-space-ninja-rules
rules: ghost-role-information-antagonist-rules
requirements:
- !type:DepartmentTimeRequirement
department: Security

View file

@ -421,6 +421,7 @@
allowMovement: true
name: ghost-role-information-mothroach-name
description: ghost-role-information-mothroach-description
rules: ghost-role-information-freeagent-rules
- type: Fixtures
fixtures:
fix1:
@ -1104,6 +1105,7 @@
prob: 0.25
name: ghost-role-information-kangaroo-name
description: ghost-role-information-kangaroo-description
rules: ghost-role-information-nonantagonist-rules
- type: GhostTakeoverAvailable
- type: Vocal
sounds:
@ -1278,6 +1280,7 @@
makeSentient: true
name: ghost-role-information-monkey-name
description: ghost-role-information-monkey-description
rules: ghost-role-information-nonantagonist-rules
- type: GhostTakeoverAvailable
- type: Clumsy
clumsyDamage:
@ -1312,6 +1315,7 @@
makeSentient: true
name: ghost-role-information-monkey-name
description: ghost-role-information-monkey-description
rules: ghost-role-information-syndicate-monkey-reinforcement-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -1443,6 +1447,7 @@
makeSentient: true
name: ghost-role-information-kobold-name
description: ghost-role-information-kobold-description
rules: ghost-role-information-nonantagonist-rules
- type: entity
name: kobold
@ -1516,6 +1521,7 @@
allowMovement: true
name: ghost-role-information-mouse-name
description: ghost-role-information-mouse-description
rules: ghost-role-information-freeagent-rules
- type: GhostTakeoverAvailable
- type: Speech
speechSounds: Squeak
@ -2307,6 +2313,7 @@
makeSentient: true
name: ghost-role-information-giant-spider-name
description: ghost-role-information-giant-spider-description
rules: ghost-role-information-giant-spider-rules
raffle:
settings: short
- type: GhostTakeoverAvailable
@ -3087,6 +3094,7 @@
allowMovement: true
name: ghost-role-information-hamster-name
description: ghost-role-information-hamster-description
rules: ghost-role-information-nonantagonist-rules
- type: GhostTakeoverAvailable
- type: Speech
speechVerb: SmallMob

View file

@ -10,6 +10,7 @@
makeSentient: true
name: ghost-role-information-behonker-name
description: ghost-role-information-behonker-description
rules: ghost-role-information-antagonist-rules
raffle:
settings: default
- type: GhostTakeoverAvailable

View file

@ -163,6 +163,7 @@
makeSentient: true
name: ghost-role-information-sentient-carp-name
description: ghost-role-information-sentient-carp-description
rules: ghost-role-information-space-dragon-summoned-carp-rules
raffle:
settings: short
- type: GhostTakeoverAvailable

View file

@ -232,6 +232,7 @@
- type: GhostRole
prob: 0
description: ghost-role-information-angry-slimes-description
rules: ghost-role-information-angry-slimes-rules
raffle:
settings: short
- type: NpcFactionMember

View file

@ -12,6 +12,7 @@
makeSentient: true
name: ghost-role-information-hellspawn-name
description: ghost-role-information-hellspawn-description
rules: ghost-role-information-antagonist-rules
raffle:
settings: default
- type: RotationVisuals

View file

@ -574,6 +574,7 @@
allowMovement: true
name: ghost-role-information-hamlet-name
description: ghost-role-information-hamlet-description
rules: ghost-role-information-nonantagonist-rules
- type: GhostTakeoverAvailable
- type: InteractionPopup
successChance: 1
@ -688,6 +689,7 @@
prob: 0.25
name: ghost-role-information-willow-name
description: ghost-role-information-willow-description
rules: ghost-role-information-nonantagonist-rules
- type: GhostTakeoverAvailable
- type: Loadout
prototypes: [ BoxingKangarooGear ]
@ -758,6 +760,7 @@
- type: GhostRole
name: ghost-role-information-smile-name
description: ghost-role-information-smile-description
rules: ghost-role-information-nonantagonist-rules
- type: Grammar
attributes:
proper: true
@ -778,6 +781,7 @@
allowMovement: true
name: ghost-role-information-punpun-name
description: ghost-role-information-punpun-description
rules: ghost-role-information-nonantagonist-rules
- type: GhostTakeoverAvailable
- type: Butcherable
butcheringType: Spike
@ -811,6 +815,7 @@
# allowMovement: true
# name: ghost-role-information-tropico-name
# description: ghost-role-information-tropico-description
# rules: ghost-role-information-nonantagonist-rules
# - type: GhostTakeoverAvailable
- type: Tag
tags:

View file

@ -89,7 +89,7 @@
makeSentient: true
name: ghost-role-information-rat-king-name
description: ghost-role-information-rat-king-description
rules: ghost-role-information-rat-king-rules
rules: ghost-role-information-freeagent-rules
raffle:
settings: default
- type: GhostTakeoverAvailable

View file

@ -57,7 +57,7 @@
makeSentient: true
name: ghost-role-information-revenant-name
description: ghost-role-information-revenant-description
rules: ghost-role-information-revenant-rules
rules: ghost-role-information-antagonist-rules
raffle:
settings: default
- type: GhostTakeoverAvailable

View file

@ -158,6 +158,7 @@
makeSentient: true
name: ghost-role-information-honkbot-name
description: ghost-role-information-honkbot-description
rules: ghost-role-information-freeagent-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -185,6 +186,7 @@
makeSentient: true
name: ghost-role-information-jonkbot-name
description: ghost-role-information-jonkbot-description
rules: ghost-role-information-freeagent-rules
raffle:
settings: default
- type: InteractionPopup
@ -333,6 +335,7 @@
makeSentient: true
name: ghost-role-information-mimebot-name
description: ghost-role-information-mimebot-description
rules: ghost-role-information-freeagent-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -356,6 +359,7 @@
makeSentient: true
name: ghost-role-information-supplybot-name
description: ghost-role-information-supplybot-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: default
- type: GhostTakeoverAvailable

View file

@ -127,6 +127,7 @@
makeSentient: true
name: ghost-role-information-slimes-name
description: ghost-role-information-slimes-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Speech
@ -202,6 +203,7 @@
- SimpleHostile
- type: GhostRole
description: ghost-role-information-angry-slimes-description
rules: ghost-role-information-angry-slimes-rules
raffle:
settings: short
@ -239,6 +241,7 @@
- SimpleHostile
- type: GhostRole
description: ghost-role-information-angry-slimes-description
rules: ghost-role-information-angry-slimes-rules
raffle:
settings: short
@ -276,5 +279,6 @@
- SimpleHostile
- type: GhostRole
description: ghost-role-information-angry-slimes-description
rules: ghost-role-information-angry-slimes-rules
raffle:
settings: short

View file

@ -14,6 +14,7 @@
makeSentient: true
name: ghost-role-information-space-dragon-name
description: ghost-role-information-space-dragon-description
rules: ghost-role-information-space-dragon-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -142,7 +143,6 @@
- type: entity
parent: BaseMobDragon
id: MobDragon
suffix: No role or objectives
components:
- type: Dragon
spawnRiftAction: ActionSpawnRift
@ -180,6 +180,7 @@
components:
- type: GhostRole
description: ghost-role-information-space-dragon-dungeon-description
rules: ghost-role-information-space-dragon-dungeon-rules
raffle:
settings: default
- type: SlowOnDamage

View file

@ -10,7 +10,7 @@
allowSpeech: true
name: ghost-role-information-remilia-name
description: ghost-role-information-remilia-description
rules: ghost-role-information-remilia-rules
rules: ghost-role-information-familiar-rules
- type: GhostTakeoverAvailable
- type: Grammar
attributes:
@ -43,7 +43,7 @@
allowSpeech: true
name: ghost-role-information-cerberus-name
description: ghost-role-information-cerberus-description
rules: ghost-role-information-cerberus-rules
rules: ghost-role-information-familiar-rules
raffle:
settings: default
- type: GhostTakeoverAvailable

View file

@ -13,6 +13,7 @@
makeSentient: true
name: ghost-role-information-guardian-name
description: ghost-role-information-guardian-description
rules: ghost-role-information-familiar-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -122,6 +123,7 @@
makeSentient: true
name: ghost-role-information-holoparasite-name
description: ghost-role-information-holoparasite-description
rules: ghost-role-information-familiar-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -154,6 +156,7 @@
makeSentient: true
name: ghost-role-information-ifrit-name
description: ghost-role-information-ifrit-description
rules: ghost-role-information-familiar-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -182,6 +185,7 @@
makeSentient: true
name: ghost-role-information-holoclown-name
description: ghost-role-information-holoclown-description
rules: ghost-role-information-familiar-rules
raffle:
settings: default
- type: GhostTakeoverAvailable

View file

@ -41,6 +41,7 @@
- type: GhostRole
name: ghost-role-information-Death-Squad-name
description: ghost-role-information-Death-Squad-description
rules: ghost-role-information-Death-Squad-rules
raffle:
settings: short
- type: Loadout
@ -76,6 +77,7 @@
- type: GhostRole
name: ghost-role-information-ert-leader-name
description: ghost-role-information-ert-leader-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -104,6 +106,7 @@
- type: GhostRole
name: ghost-role-information-ert-leader-name
description: ghost-role-information-ert-leader-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -124,6 +127,7 @@
- type: GhostRole
name: ghost-role-information-ert-leader-name
description: ghost-role-information-ert-leader-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -154,6 +158,7 @@
- type: GhostRole
name: ghost-role-information-ert-chaplain-name
description: ghost-role-information-ert-chaplain-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: RandomMetadata
@ -182,6 +187,7 @@
- type: GhostRole
name: ghost-role-information-ert-chaplain-name
description: ghost-role-information-ert-chaplain-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -212,6 +218,7 @@
- type: GhostRole
name: ghost-role-information-ert-janitor-name
description: ghost-role-information-ert-janitor-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: RandomMetadata
@ -240,6 +247,7 @@
- type: GhostRole
name: ghost-role-information-ert-janitor-name
description: ghost-role-information-ert-janitor-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -270,6 +278,7 @@
- type: GhostRole
name: ghost-role-information-ert-engineer-name
description: ghost-role-information-ert-engineer-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: RandomMetadata
@ -298,6 +307,7 @@
- type: GhostRole
name: ghost-role-information-ert-engineer-name
description: ghost-role-information-ert-engineer-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -330,6 +340,7 @@
- type: GhostRole
name: ghost-role-information-ert-security-name
description: ghost-role-information-ert-security-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: RandomMetadata
@ -358,6 +369,7 @@
- type: GhostRole
name: ghost-role-information-ert-security-name
description: ghost-role-information-ert-security-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -378,6 +390,7 @@
- type: GhostRole
name: ghost-role-information-ert-security-name
description: ghost-role-information-ert-security-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -408,6 +421,7 @@
- type: GhostRole
name: ghost-role-information-ert-medical-name
description: ghost-role-information-ert-medical-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: RandomMetadata
@ -436,6 +450,7 @@
- type: GhostRole
name: ghost-role-information-ert-medical-name
description: ghost-role-information-ert-medical-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -465,6 +480,7 @@
- type: GhostRole
name: ghost-role-information-cburn-agent-name
description: ghost-role-information-cburn-agent-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: RandomMetadata
@ -491,6 +507,7 @@
- type: GhostRole
name: ghost-role-information-centcom-official-name
description: ghost-role-information-centcom-official-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: default
- type: Loadout
@ -558,6 +575,7 @@
- type: GhostRole
name: ghost-role-information-cluwne-name
description: ghost-role-information-cluwne-description
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: default
- type: Cluwne
@ -599,7 +617,7 @@
- type: GhostRole
name: ghost-role-information-lost-cargo-technical-name
description: ghost-role-information-lost-cargo-technical-description
rules: ghost-role-information-lost-cargo-technical-rules
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -650,7 +668,7 @@
- type: GhostRole
name: ghost-role-information-clown-troupe-name
description: ghost-role-information-clown-troupe-description
rules: ghost-role-information-clown-troupe-rules
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -700,7 +718,7 @@
- type: GhostRole
name: ghost-role-information-traveling-chef-name
description: ghost-role-information-traveling-chef-description
rules: ghost-role-information-traveling-chef-rules
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout
@ -760,7 +778,7 @@
- type: GhostRole
name: ghost-role-information-disaster-victim-name
description: ghost-role-information-disaster-victim-description
rules: ghost-role-information-disaster-victim-rules
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: default
@ -821,7 +839,7 @@
- type: GhostRole
name: ghost-role-information-syndie-disaster-victim-name
description: ghost-role-information-syndie-disaster-victim-description
rules: ghost-role-information-syndie-disaster-victim-rules
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: Loadout

View file

@ -17,6 +17,7 @@
- type: GhostRole
name: ghost-role-information-skeleton-pirate-name
description: ghost-role-information-skeleton-pirate-description
rules: ghost-role-information-freeagent-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -33,6 +34,7 @@
- type: GhostRole
name: ghost-role-information-skeleton-biker-name
description: ghost-role-information-skeleton-biker-description
rules: ghost-role-information-freeagent-rules
raffle:
settings: default
- type: GhostTakeoverAvailable
@ -48,6 +50,7 @@
- type: GhostRole
name: ghost-role-information-closet-skeleton-name
description: ghost-role-information-closet-skeleton-description
rules: ghost-role-information-freeagent-rules
raffle:
settings: default
- type: GhostTakeoverAvailable

View file

@ -818,7 +818,7 @@
name: ghost-role-information-BreadDog-name
allowMovement: true
description: ghost-role-information-BreadDog-description
rules: ghost-role-information-BreadDog-rules
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: GhostTakeoverAvailable

View file

@ -699,7 +699,7 @@
name: ghost-role-information-Cak-name
allowMovement: true
description: ghost-role-information-Cak-description
rules: ghost-role-information-Cak-rules
rules: ghost-role-information-nonantagonist-rules
raffle:
settings: short
- type: GhostTakeoverAvailable

View file

@ -80,9 +80,9 @@
suffix: NukeOps
components:
- type: GhostRole
name: Syndicate Assault Cyborg
description: Nuclear operatives needs reinforcements. You, a cold silicon killing machine, will help them.
rules: Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them.
name: ghost-role-information-syndie-assaultborg-name
description: ghost-role-information-syndie-assaultborg-description
rules: ghost-role-information-silicon-rules
raffle:
settings: default
- type: GhostRoleMobSpawner

View file

@ -37,6 +37,7 @@
beginSearchingText: pai-system-searching
roleName: pai-system-role-name
roleDescription: pai-system-role-description
roleRules: ghost-role-information-familiar-rules
wipeVerbText: pai-system-wipe-device-verb-text
wipeVerbPopup: pai-system-wiped-device
stopSearchVerbText: pai-system-stop-searching-verb-text
@ -91,6 +92,7 @@
- type: ToggleableGhostRole
roleName: pai-system-role-name-syndicate
roleDescription: pai-system-role-description-syndicate
roleRules: ghost-role-information-familiar-rules
- type: IntrinsicRadioTransmitter
channels:
- Syndicate
@ -122,6 +124,7 @@
- type: ToggleableGhostRole
roleName: pai-system-role-name-potato
roleDescription: pai-system-role-description-potato
roleRules: ghost-role-information-familiar-rules
- type: Appearance
- type: GenericVisualizer
visuals:

View file

@ -86,6 +86,7 @@
beginSearchingText: positronic-brain-searching
roleName: positronic-brain-role-name
roleDescription: positronic-brain-role-description
roleRules: ghost-role-information-silicon-rules
wipeVerbText: positronic-brain-wipe-device-verb-text
wipeVerbPopup: positronic-brain-wiped-device
stopSearchVerbText: positronic-brain-stop-searching-verb-text

View file

@ -408,6 +408,7 @@
maxInitialInfectedGrace: 450
- type: ZombifyOnDeath
- type: IncurableZombie
- type: InitialInfected
mindComponents:
- type: InitialInfectedRole
prototype: InitialInfected

View file

@ -244,6 +244,7 @@
- type: PendingZombie
- type: ZombifyOnDeath
- type: IncurableZombie
- type: InitialInfected
mindComponents:
- type: InitialInfectedRole
prototype: InitialInfected

View file

@ -199,6 +199,7 @@
makeSentient: true
name: ghost-role-information-artifact-name
description: ghost-role-information-artifact-description
rules: ghost-role-information-freeagent-rules
- type: GhostTakeoverAvailable
- type: MovementSpeedModifier
baseWalkSpeed: 0.25