diff --git a/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs b/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs
index fd4d598323..8cb4a6f084 100644
--- a/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs
+++ b/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs
@@ -5,7 +5,6 @@ using Content.Shared._CP14.MagicSpell;
using Content.Shared._CP14.MagicSpell.Components;
using Content.Shared._CP14.MagicSpell.Events;
using Content.Shared._CP14.MagicSpell.Spells;
-using Content.Shared.EntityEffects;
using Content.Shared.Whitelist;
using Robust.Server.GameObjects;
diff --git a/Content.Server/_CP14/Passport/CP14PassportComponent.cs b/Content.Server/_CP14/Passport/CP14PassportComponent.cs
new file mode 100644
index 0000000000..e69083395b
--- /dev/null
+++ b/Content.Server/_CP14/Passport/CP14PassportComponent.cs
@@ -0,0 +1,9 @@
+namespace Content.Server._CP14.Passport;
+
+///
+/// Generates a paper text confirming the identity of the player and stamps it.
+///
+[RegisterComponent]
+public sealed partial class CP14PassportComponent : Component
+{
+}
diff --git a/Content.Server/_CP14/Passport/CP14PassportSystem.cs b/Content.Server/_CP14/Passport/CP14PassportSystem.cs
new file mode 100644
index 0000000000..51d81200af
--- /dev/null
+++ b/Content.Server/_CP14/Passport/CP14PassportSystem.cs
@@ -0,0 +1,63 @@
+using System.Text;
+using Content.Shared.GameTicking;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Paper;
+using Content.Shared.Roles;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
+
+namespace Content.Server._CP14.Passport;
+
+public sealed partial class CP14PassportSystem : EntitySystem
+{
+ [Dependency] private readonly IPrototypeManager _proto = default!;
+ [Dependency] private readonly PaperSystem _paper = default!;
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+
+ public readonly EntProtoId PassportProto = "CP14Passport";
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnPlayerSpawning);
+ }
+
+ private void OnPlayerSpawning(PlayerSpawnCompleteEvent ev)
+ {
+ var passport = Spawn(PassportProto, Transform(ev.Mob).Coordinates);
+
+ if (!TryComp(passport, out var paper))
+ return;
+
+ var text = GeneratePassportText(ev);
+ _paper.SetContent((passport, paper), text);
+ _paper.TryStamp((passport, paper),
+ new StampDisplayInfo
+ {
+ StampedColor = Color.FromHex("#0a332a"),
+ StampedName = Loc.GetString("cp14-passport-stamp")
+ },
+ "");
+ _hands.TryPickupAnyHand(ev.Mob, passport);
+ }
+
+ private string GeneratePassportText(PlayerSpawnCompleteEvent ev)
+ {
+ var sb = new StringBuilder();
+
+ //Name
+ sb.AppendLine(Loc.GetString("cp14-passport-name", ("name", ev.Profile.Name)));
+ //Species
+ if (_proto.TryIndex(ev.Profile.Species, out var indexedSpecies))
+ sb.AppendLine(Loc.GetString("cp14-passport-species", ("species", Loc.GetString(indexedSpecies.Name))));
+ //Birthday
+ var birthday = $"{_random.Next(40)}.{_random.Next(12)}.{225 - ev.Profile.Age}";
+ sb.AppendLine(Loc.GetString("cp14-passport-birth-date", ("birthday", birthday)));
+ //Job
+ if (ev.JobId is not null && _proto.TryIndex(ev.JobId, out var indexedJob))
+ sb.AppendLine(Loc.GetString("cp14-passport-job", ("job", Loc.GetString(indexedJob.Name))));
+
+ return sb.ToString();
+ }
+}
diff --git a/Resources/Locale/en-US/_CP14/passport/passport.ftl b/Resources/Locale/en-US/_CP14/passport/passport.ftl
new file mode 100644
index 0000000000..264f0c69f4
--- /dev/null
+++ b/Resources/Locale/en-US/_CP14/passport/passport.ftl
@@ -0,0 +1,6 @@
+cp14-passport-name = Name: {$name}
+cp14-passport-species = Race: {$species}
+cp14-passport-birth-date = Date of Birth: {$birthday}
+cp14-passport-job = Job: {$job}
+
+cp14-passport-stamp = Passport approved
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/_CP14/passport/passport.ftl b/Resources/Locale/ru-RU/_CP14/passport/passport.ftl
new file mode 100644
index 0000000000..e3c712455e
--- /dev/null
+++ b/Resources/Locale/ru-RU/_CP14/passport/passport.ftl
@@ -0,0 +1,6 @@
+cp14-passport-name = Имя: {$name}
+cp14-passport-species = Раса: {$species}
+cp14-passport-birth-date = Дата рождения: {$birthday}
+cp14-passport-job = Профессия: {$job}
+
+cp14-passport-stamp = Паспорт утвержден
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Bureaucracy/passport.yml b/Resources/Prototypes/_CP14/Entities/Objects/Bureaucracy/passport.yml
new file mode 100644
index 0000000000..4919e88658
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Objects/Bureaucracy/passport.yml
@@ -0,0 +1,37 @@
+- type: entity
+ parent: BaseItem
+ id: CP14Passport
+ categories: [ ForkFiltered ]
+ name: passport
+ description: Identification document.
+ components:
+ - type: Paper
+ - type: PaperLabelType
+ - type: ActivatableUI
+ key: enum.PaperUiKey.Key
+ requiresComplex: false
+ - type: UserInterface
+ interfaces:
+ enum.PaperUiKey.Key:
+ type: PaperBoundUserInterface
+ - type: Item
+ size: Tiny
+ - type: Tag
+ tags:
+ - Document
+ - type: Sprite
+ sprite: _CP14/Objects/Bureaucracy/paper.rsi
+ layers:
+ - state: passport
+ - type: PaperVisuals
+ backgroundImagePath: "/Textures/Interface/Paper/paper_background_book.svg.96dpi.png"
+ headerImagePath: "/Textures/_CP14/Interface/Paper/paper_passport.png"
+ headerMargin: 0.0, 0.0, 0.0, 4.0
+ backgroundImageTile: false
+ backgroundPatchMargin: 23.0, 16.0, 14.0, 15.0
+ contentMargin: 12.0, 0.0, 6.0, 0.0
+ maxWritableArea: 300.0, 246.0
+ backgroundModulate: "#baa580"
+ backgroundScale: 2, 2
+ contentImagePath: "/Textures/Interface/Paper/paper_content_lined.svg.96dpi.png"
+ contentImageModulate: "#998665"
\ No newline at end of file
diff --git a/Resources/Textures/_CP14/Interface/Paper/paper_passport.png b/Resources/Textures/_CP14/Interface/Paper/paper_passport.png
new file mode 100644
index 0000000000..77306e199b
Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Paper/paper_passport.png differ
diff --git a/Resources/Textures/_CP14/Interface/Paper/paper_passport.yml b/Resources/Textures/_CP14/Interface/Paper/paper_passport.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/_CP14/Interface/Paper/paper_passport.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/inhand-left.png b/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/inhand-left.png
deleted file mode 100644
index 9677a81825..0000000000
Binary files a/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/inhand-left.png and /dev/null differ
diff --git a/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/inhand-right.png b/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/inhand-right.png
deleted file mode 100644
index 1df4f5591d..0000000000
Binary files a/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/inhand-right.png and /dev/null differ
diff --git a/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/meta.json b/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/meta.json
index 7436e63dd1..0e3f39b154 100644
--- a/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/meta.json
+++ b/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-4.0",
- "copyright": "Created by Max Gab, folders by TheShuEd, stamps on paper by viator1748",
+ "copyright": "Created by Max Gab, folders and passport by TheShuEd, stamps on paper by viator1748",
"size": {
"x": 32,
"y": 32
@@ -19,14 +19,6 @@
{
"name": "paper_filled"
},
- {
- "name": "inhand-left",
- "directions": 4
- },
- {
- "name": "inhand-right",
- "directions": 4
- },
{
"name": "approved_on_paper"
},
@@ -50,6 +42,9 @@
},
{
"name": "magic"
+ },
+ {
+ "name": "passport"
}
]
}
diff --git a/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/passport.png b/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/passport.png
new file mode 100644
index 0000000000..b5d93701d7
Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Bureaucracy/paper.rsi/passport.png differ