Job contraband rework (#33385)

* contraband system rework to allow restriction by job, not just department

* Fixing detective trenchcoat inheritance

* removing unnecessary using declarations

* trying to fix testing error by re-adding diagnostics using declaration

* removing unecessary dependency, making allowedJobs nullable

* Adding all of slarti's requested changes except for the hacky job icon method fix

* removing accidental whitespace

* choosing to use the non-localized version because we're comparing the string against the AllowedJobs field, and the contraband classes that fill that field are written in english

* removing unneeded using dec, fixing nesting logic problem

* didn't remove the old nesting, doing that now

* using localized job title and localizing the allowed jobs string, removing usages of JobTitle field. Also networked the _jobTitle field instead.

* rewrite some stuff

* fixes

* fix energy pen

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
This commit is contained in:
John
2025-01-21 04:51:27 -05:00
committed by GitHub
parent f092ddcb43
commit 796f599172
16 changed files with 86 additions and 37 deletions

View File

@@ -22,6 +22,8 @@ public sealed partial class IdCardComponent : Component
[Access(typeof(SharedIdCardSystem), typeof(SharedPdaSystem), typeof(SharedAgentIdCardSystem), Other = AccessPermissions.ReadWrite)]
public LocId? JobTitle;
[DataField]
[AutoNetworkedField]
private string? _jobTitle;
[Access(typeof(SharedIdCardSystem), typeof(SharedPdaSystem), typeof(SharedAgentIdCardSystem), Other = AccessPermissions.ReadWriteExecute)]

View File

@@ -24,5 +24,13 @@ public sealed partial class ContrabandComponent : Component
/// </summary>
[DataField]
[AutoNetworkedField]
public HashSet<ProtoId<DepartmentPrototype>>? AllowedDepartments = ["Security"];
public HashSet<ProtoId<DepartmentPrototype>> AllowedDepartments = new();
/// <summary>
/// Which jobs is this item restricted to?
/// If empty, no jobs are allowed to use this beyond the allowed departments.
/// </summary>
[DataField]
[AutoNetworkedField]
public HashSet<ProtoId<JobPrototype>> AllowedJobs = new();
}

View File

@@ -19,8 +19,8 @@ public sealed partial class ContrabandSeverityPrototype : IPrototype
public LocId ExamineText;
/// <summary>
/// When examining the contraband, should this take into account the viewer's departments?
/// When examining the contraband, should this take into account the viewer's departments and job?
/// </summary>
[DataField]
public bool ShowDepartments;
public bool ShowDepartmentsAndJobs;
}

View File

@@ -40,6 +40,7 @@ public sealed class ContrabandSystem : EntitySystem
contraband.Severity = other.Severity;
contraband.AllowedDepartments = other.AllowedDepartments;
contraband.AllowedJobs = other.AllowedJobs;
Dirty(uid, contraband);
}
@@ -54,11 +55,15 @@ public sealed class ContrabandSystem : EntitySystem
using (args.PushGroup(nameof(ContrabandComponent)))
{
// TODO shouldn't department prototypes have a localized name instead of just using the ID for this?
var localizedDepartments = ent.Comp.AllowedDepartments.Select(p => Loc.GetString($"department-{p.Id}"));
var localizedJobs = ent.Comp.AllowedJobs.Select(p => _proto.Index(p).LocalizedName);
var severity = _proto.Index(ent.Comp.Severity);
if (severity.ShowDepartments && ent.Comp is { AllowedDepartments: not null })
if (severity.ShowDepartmentsAndJobs)
{
// TODO shouldn't department prototypes have a localized name instead of just using the ID for this?
var list = ContentLocalizationManager.FormatList(ent.Comp.AllowedDepartments.Select(p => Loc.GetString($"department-{p.Id}")).ToList());
//creating a combined list of jobs and departments for the restricted text
var list = ContentLocalizationManager.FormatList(localizedDepartments.Concat(localizedJobs).ToList());
// department restricted text
args.PushMarkup(Loc.GetString("contraband-examine-text-Restricted-department", ("departments", list)));
@@ -69,23 +74,30 @@ public sealed class ContrabandSystem : EntitySystem
}
// text based on ID card
List<ProtoId<DepartmentPrototype>>? departments = null;
List<ProtoId<DepartmentPrototype>> departments = new();
var jobId = "";
if (_id.TryFindIdCard(args.Examiner, out var id))
{
departments = id.Comp.JobDepartments;
if (id.Comp.LocalizedJobTitle is not null)
{
jobId = id.Comp.LocalizedJobTitle;
}
}
// either its fully restricted, you have no departments, or your departments dont intersect with the restricted departments
if (ent.Comp.AllowedDepartments is null
|| departments is null
|| !departments.Intersect(ent.Comp.AllowedDepartments).Any())
// for the jobs we compare the localized string in case you use an agent ID or custom job name that is not a prototype
if (departments.Intersect(ent.Comp.AllowedDepartments).Any()
|| localizedJobs.Contains(jobId))
{
args.PushMarkup(Loc.GetString("contraband-examine-text-avoid-carrying-around"));
return;
// you are allowed to use this!
args.PushMarkup(Loc.GetString("contraband-examine-text-in-the-clear"));
}
else
{
// straight to jail!
args.PushMarkup(Loc.GetString("contraband-examine-text-avoid-carrying-around"));
}
// otherwise fine to use :tm:
args.PushMarkup(Loc.GetString("contraband-examine-text-in-the-clear"));
}
}
}

View File

@@ -542,7 +542,7 @@
# Belts without visualizers
- type: entity
parent: [ClothingBeltAmmoProviderBase, BaseRestrictedContraband]
parent: [ClothingBeltAmmoProviderBase, BaseSecurityBartenderContraband]
id: ClothingBeltBandolier
name: bandolier
description: A bandolier for holding shotgun ammunition.

View File

@@ -226,7 +226,7 @@
- EncryptionKeyCommon
- type: entity
parent: [ClothingHeadset, BaseRestrictedContraband]
parent: [ClothingHeadset, BaseSecurityLawyerContraband]
id: ClothingHeadsetSecurity
name: security headset
description: This is used by your elite security force.

View File

@@ -1,11 +1,12 @@
# Numbers for armor here largely taken from /tg/.
# NOTE: Half of the kind of armor you're probably thinking of is in vests.yml. These should probably be merged some day.
#Basic armor vest
#Basic armor vest for inheritance
- type: entity
parent: [ClothingOuterBaseMedium, AllowSuitStorageClothing, BaseRestrictedContraband]
id: ClothingOuterArmorBasic
id: ClothingOuterArmorBase
name: armor vest
abstract: true
description: A standard Type I armored vest that provides decent protection against most types of damage.
components:
- type: Sprite
@@ -22,6 +23,11 @@
- type: ExplosionResistance
damageCoefficient: 0.90
#Standard armor vest, allowed for security and bartenders
- type: entity
parent: [ BaseSecurityBartenderContraband, ClothingOuterArmorBase]
id: ClothingOuterArmorBasic
#Alternate / slim basic armor vest
- type: entity
parent: ClothingOuterArmorBasic
@@ -58,7 +64,7 @@
- type: GroupExamine
- type: entity
parent: ClothingOuterArmorBasic
parent: ClothingOuterArmorBase
id: ClothingOuterArmorBulletproof
name: bulletproof vest
description: A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent.
@@ -78,7 +84,7 @@
damageCoefficient: 0.80
- type: entity
parent: ClothingOuterArmorBasic
parent: ClothingOuterArmorBase
id: ClothingOuterArmorReflective
name: reflective vest
description: An armored vest with advanced shielding to protect against energy weapons.

View File

@@ -10,7 +10,7 @@
sprite: Clothing/OuterClothing/Coats/bomber.rsi
- type: entity
parent: [ClothingOuterStorageBase, AllowSuitStorageClothing, ClothingOuterArmorBasic]
parent: [ClothingOuterStorageBase, AllowSuitStorageClothing, ClothingOuterArmorBase]
id: ClothingOuterCoatDetective
name: detective trenchcoat
description: An 18th-century multi-purpose trenchcoat. Someone who wears this means serious business.

View File

@@ -42,7 +42,7 @@
#Detective's vest
- type: entity
parent: [ClothingOuterArmorBasic, BaseRestrictedContraband]
parent: [ClothingOuterArmorBase, BaseRestrictedContraband]
id: ClothingOuterVestDetective
name: detective's vest
description: A hard-boiled private investigator's armored vest.

View File

@@ -104,7 +104,7 @@
sprite: Clothing/Shoes/Specific/cult.rsi
- type: entity
parent: ClothingShoesBase
parent: [ ClothingShoesBase, BaseJanitorContraband ]
id: ClothingShoesGaloshes
name: galoshes
description: Rubber boots.

View File

@@ -170,7 +170,7 @@
- state: robotics_label
- type: entity
parent: [ EncryptionKey, BaseSecurityContraband ]
parent: [ EncryptionKey, BaseSecurityLawyerContraband ]
id: EncryptionKeySecurity
name: security encryption key
description: An encryption key used by security.

View File

@@ -22,7 +22,7 @@
- type: entity
id: ShellShotgunBeanbag
name: shell (.50 beanbag)
parent: BaseShellShotgun
parent: [ BaseShellShotgun, BaseSecurityBartenderContraband ]
components:
- type: Tag
tags:
@@ -55,7 +55,7 @@
- type: entity
id: ShellShotgunFlare
name: shell (.50 flare)
parent: BaseShellShotgun
parent: [ BaseShellShotgun, BaseSecurityBartenderContraband ]
components:
- type: Tag
tags:

View File

@@ -103,7 +103,7 @@
- type: entity
name: double-barreled shotgun
parent: [BaseWeaponShotgun, BaseGunWieldable, BaseMinorContraband]
parent: [BaseWeaponShotgun, BaseGunWieldable, BaseSecurityBartenderContraband]
id: WeaponShotgunDoubleBarreled
description: An immortal classic. Uses .50 shotgun shells.
components:
@@ -181,7 +181,7 @@
- type: entity
name: sawn-off shotgun
parent: BaseWeaponShotgun
parent: [ BaseWeaponShotgun, BaseSecurityBartenderContraband ]
id: WeaponShotgunSawn
description: Groovy! Uses .50 shotgun shells.
components:

View File

@@ -194,7 +194,6 @@
doAfterDuration: 4.0
- type: Contraband
severity: Syndicate
allowedDepartments: null
- type: Sprite
sprite: Objects/Weapons/Melee/e_dagger.rsi
layers:

View File

@@ -5,8 +5,6 @@
components:
- type: Contraband
severity: Syndicate
# no one should be carrying this around visibly!
allowedDepartments: null
# minor contraband not departmentally restricted -- improvised weapons etc
- type: entity
@@ -15,8 +13,6 @@
components:
- type: Contraband
severity: Minor
# according to space law no dept is authorized to have
allowedDepartments: null
# major contraband, for things like guns or weaponry that don't belong to any department and aren't syndicate specific
- type: entity
@@ -25,7 +21,6 @@
components:
- type: Contraband
severity: Major
allowedDepartments: null
# minor contraband by default restricted to security only
- type: entity
@@ -157,6 +152,33 @@
- type: Contraband
allowedDepartments: [ Medical, Science ]
# contraband restricted by job by some degree
- type: entity
id: BaseSecurityBartenderContraband
parent: BaseRestrictedContraband
abstract: true
components:
- type: Contraband
allowedDepartments: [ Security ]
allowedJobs: [ Bartender ]
- type: entity
id: BaseSecurityLawyerContraband
parent: BaseRestrictedContraband
abstract: true
components:
- type: Contraband
allowedDepartments: [ Security ]
allowedJobs: [ Lawyer ]
- type: entity
id: BaseJanitorContraband
parent: BaseRestrictedContraband
abstract: true
components:
- type: Contraband
allowedJobs: [ Janitor ]
# for ~objective items
- type: entity
id: BaseGrandTheftContraband

View File

@@ -14,7 +14,7 @@
- type: contrabandSeverity
id: Restricted
examineText: contraband-examine-text-Restricted
showDepartments: true
showDepartmentsAndJobs: true
# Having this as a regular crew member is considered grand theft. (nuke disk, captain's gear, objective items, etc)
- type: contrabandSeverity