Undetermined thieving satchel (#36201)

* yippee!

* no toolboxes allowed

* sprite, descriptions
This commit is contained in:
ScarKy0
2025-04-01 00:32:31 +02:00
committed by GitHub
parent 2688a867df
commit 115313dded
13 changed files with 125 additions and 93 deletions

View File

@@ -22,11 +22,18 @@ public sealed partial class ThiefUndeterminedBackpackComponent : Component
public List<int> SelectedSets = new();
[DataField]
public SoundSpecifier ApproveSound = new SoundPathSpecifier("/Audio/Effects/rustle1.ogg");
public SoundCollectionSpecifier ApproveSound = new SoundCollectionSpecifier("storageRustle");
/// <summary>
/// Max number of sets you can select.
/// </summary>
[DataField]
public int MaxSelectedSets = 2;
/// <summary>
/// What entity all the spawned items will appear inside of
/// If null, will instead drop on the ground.
/// </summary>
[DataField]
public EntProtoId? SpawnedStoragePrototype;
}

View File

@@ -1,5 +1,7 @@
using Content.Server.Thief.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Item;
using Content.Shared.Storage.EntitySystems;
using Content.Shared.Thief;
using Robust.Server.GameObjects;
using Robust.Server.Audio;
@@ -17,6 +19,8 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly SharedStorageSystem _storage = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
public override void Initialize()
{
@@ -37,6 +41,10 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem
if (backpack.Comp.SelectedSets.Count != backpack.Comp.MaxSelectedSets)
return;
EntityUid? spawnedStorage = null;
if (backpack.Comp.SpawnedStoragePrototype != null)
spawnedStorage = Spawn(backpack.Comp.SpawnedStoragePrototype, _transform.GetMapCoordinates(backpack.Owner));
foreach (var i in backpack.Comp.SelectedSets)
{
var set = _proto.Index(backpack.Comp.PossibleSets[i]);
@@ -44,10 +52,20 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem
{
var ent = Spawn(item, _transform.GetMapCoordinates(backpack.Owner));
if (TryComp<ItemComponent>(ent, out var itemComponent))
_transform.DropNextTo(ent, backpack.Owner);
{
if (spawnedStorage != null)
_storage.Insert(spawnedStorage.Value, ent, out _, playSound: false);
else
_transform.DropNextTo(ent, backpack.Owner);
}
}
}
_audio.PlayPvs(backpack.Comp.ApproveSound, backpack.Owner);
if (spawnedStorage != null)
_hands.TryPickupAnyHand(args.Actor, spawnedStorage.Value);
// Play the sound on coordinates of the backpack/toolbox. The reason being, since we immediately delete it, the sound gets deleted alongside it.
_audio.PlayPvs(backpack.Comp.ApproveSound, Transform(backpack.Owner).Coordinates);
QueueDel(backpack);
}
private void OnChangeSet(Entity<ThiefUndeterminedBackpackComponent> backpack, ref ThiefBackpackChangeSetMessage args)

View File

@@ -10,7 +10,7 @@ thief-role-greeting-animal =
Steal things that you like.
thief-role-greeting-equipment =
You have a toolbox of thieves'
You have a satchel of thieves'
tools and chameleon thieves' gloves.
Choose your starting equipment,
and do your work stealthily.

View File

@@ -1,4 +1,4 @@
thief-backpack-window-title = thief toolbox
thief-backpack-window-title = thieving kit
thief-backpack-window-description =
Inside are your tools of the trade, which will dissolve when you're ready.

View File

@@ -6,16 +6,7 @@
sprite: /Textures/Clothing/OuterClothing/Misc/black_hoodie.rsi
state: icon
content:
- ChameleonPDA
- ClothingUniformJumpsuitChameleon
- ClothingOuterChameleon
- ClothingNeckChameleon
- ClothingMaskGasChameleon
- ClothingHeadHatChameleon
- ClothingEyesChameleon
- ClothingHeadsetChameleon
- ClothingShoesChameleon
- BarberScissors
- ClothingBackpackChameleonFill
- ChameleonProjector
- FakeMindShieldImplanter
- AgentIDCard

View File

@@ -37,7 +37,7 @@
id: ClothingBackpackSatchelSmuggler
name: smuggler's satchel
suffix: Empty
description: A dingy, suspicious looking satchel.
description: A handy, suspicious looking satchel. Just flat enough to fit underneath floor tiles.
components:
- type: Sprite
sprite: Clothing/Back/Satchels/smuggler.rsi
@@ -48,7 +48,7 @@
id: ClothingBackpackSatchelSmugglerUnanchored
name: smuggler's satchel
suffix: Empty, Unanchored
description: A dingy, suspicious looking satchel.
description: A handy, suspicious looking satchel. Just flat enough to fit underneath floor tiles.
components:
- type: Sprite
sprite: Clothing/Back/Satchels/smuggler.rsi

View File

@@ -0,0 +1,80 @@
- type: entity
parent: BaseMinorContraband
id: ThiefBeacon
name: thieving beacon
description: A device that will teleport everything around it to the thief's vault at the end of the shift.
components:
- type: ThiefBeacon
- type: StealArea
range: 2 # Slightly larger than fulton beacon's random offset
- type: Item
size: Normal
- type: Physics
bodyType: Dynamic
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.25,-0.4,0.25,0.1"
density: 20
mask:
- Impassable
- type: Foldable
folded: true
- type: Clickable
- type: InteractionOutline
- type: Appearance
- type: GenericVisualizer
visuals:
enum.FoldedVisuals.State:
foldedLayer:
True: { state: folded_extraction }
False: { state: extraction_point }
- type: Sprite
sprite: Objects/Tools/thief_beacon.rsi
drawdepth: SmallObjects
noRot: true
layers:
- state: extraction_point
map: [ "foldedLayer" ]
- type: entity
id: ToolboxThief
name: undetermined thieving toolbox
description: This is where your favorite thief's supplies lie. Try to remember which ones.
parent: [ BaseItem, BaseMinorContraband ]
components:
- type: Sprite
sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi
state: icon
- type: ThiefUndeterminedBackpack
possibleSets:
# TODO Thief pinpointer needed
- ChemistrySet
- ToolsSet
- ChameleonSet # TODO Chameleon stump PR needed
- SyndieSet
- SleeperSet
- CommunicatorSet
- SmugglerSet
- type: ActivatableUI
key: enum.ThiefBackpackUIKey.Key
- type: UserInterface
interfaces:
enum.ThiefBackpackUIKey.Key:
type: ThiefBackpackBoundUserInterface
- type: entity
id: SatchelThief
name: undetermined thieving satchel
description: This is where your favorite thief's supplies lie. Folded for your convenience.
parent: ToolboxThief
components:
- type: Sprite
sprite: Clothing/Back/Satchels/smuggler.rsi
state: folded
- type: Item
storedRotation: 90
- type: ThiefUndeterminedBackpack
spawnedStoragePrototype: ClothingBackpackSatchelSmugglerUnanchored

View File

@@ -1,40 +0,0 @@
- type: entity
parent: BaseMinorContraband
id: ThiefBeacon
name: thieving beacon
description: A device that will teleport everything around it to the thief's vault at the end of the shift.
components:
- type: ThiefBeacon
- type: StealArea
range: 2 # Slightly larger than fulton beacon's random offset
- type: Item
size: Normal
- type: Physics
bodyType: Dynamic
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.25,-0.4,0.25,0.1"
density: 20
mask:
- Impassable
- type: Foldable
folded: true
- type: Clickable
- type: InteractionOutline
- type: Appearance
- type: GenericVisualizer
visuals:
enum.FoldedVisuals.State:
foldedLayer:
True: { state: folded_extraction }
False: { state: extraction_point }
- type: Sprite
sprite: Objects/Tools/thief_beacon.rsi
drawdepth: SmallObjects
noRot: true
layers:
- state: extraction_point
map: [ "foldedLayer" ]

View File

@@ -143,29 +143,3 @@
state: icon
- type: Item
sprite: Objects/Tools/Toolboxes/toolbox_gold.rsi
- type: entity
id: ToolboxThief
name: thief undetermined toolbox
description: This is where your favorite thief's supplies lie. Try to remember which ones.
parent: [ BaseItem, BaseMinorContraband ]
components:
- type: Sprite
sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi
state: icon
- type: ThiefUndeterminedBackpack
possibleSets:
# TODO Thief pinpointer needed
- ChemistrySet
- ToolsSet
- ChameleonSet # TODO Chameleon stump PR needed
- SyndieSet
- SleeperSet
- CommunicatorSet
- SmugglerSet
- type: ActivatableUI
key: enum.ThiefBackpackUIKey.Key
- type: UserInterface
interfaces:
enum.ThiefBackpackUIKey.Key:
type: ThiefBackpackBoundUserInterface

View File

@@ -11,5 +11,5 @@
storage:
back:
- ThiefBeacon
- ToolboxThief
- SatchelThief
- ClothingHandsChameleonThief

View File

@@ -1,6 +1,6 @@
<Document>
# Thieves
<Box>
[color=#999999][italic]"Yoink! I'll be taking that! And that! Ooh, don't mind if I do!"[/italic][/color]
</Box>
@@ -25,7 +25,7 @@
</Box>
## Tools of the Trade
You've got two more aces up your stolen sleeves: your [color=cyan]beacon[/color] and your [color=cyan]toolbox.[/color]
You've got two more aces up your stolen sleeves: your [color=cyan]beacon[/color] and your [color=cyan]satchel.[/color]
Your [color=cyan]beacon[/color] provides safe passage home for trinkets that may not be easy to carry with you on the evac shuttle. Simply find a secluded part of the station to unfold the beacon, then set its coordinates to your hideout.
Any shinies near it will be [bold]teleported to your vault when the shift ends,[/bold] fulfilling your objectives.
@@ -36,11 +36,10 @@
<GuideEntityEmbed Entity="ThiefBeacon"/>
</Box>
Your [color=cyan]toolbox[/color] contains... well, whatever you remembered to pack. [bold]You can select two pre-made kits[/bold] to help you complete grander heists.
Approve your choices in a safe place, as the toolbox will dissolve and the gear will drop at your feet.
Your [color=cyan]satchel[/color] contains... well, whatever you remembered to pack. [bold]You can select two pre-made kits[/bold] to help you complete grander heists.
<Box>
<GuideEntityEmbed Entity="ToolboxThief"/>
<GuideEntityEmbed Entity="SatchelThief"/>
</Box>
<Box>
<GuideEntityEmbed Entity="StorageImplanter" Caption="Anatomy"/>
@@ -56,7 +55,7 @@
## Centerpiece of the Collection
Your kleptomania will take you places. One day, you'll feel like stealing a few figurines. Another day, you'll feel like stealing an industrial machine.
No matter. They'll all be a part of your collection within a matter of time.
You can steal items by [bold]having them on your person[/bold] when you get to CentComm. Failing this, you can steal larger items by [bold]leaving them by your beacon.[/bold]
@@ -64,12 +63,12 @@
Some of the more [italic]animate[/italic] objectives may not cooperate with you. Make sure they're alive and with you or your beacon when the shift ends.
Things that you may desire include but are not limited to:
<Box>
<GuideEntityEmbed Entity="ToyFigurineGreytider" Caption="Figurines"/>
<GuideEntityEmbed Entity="PassengerIDCard" Caption="ID cards"/>
<GuideEntityEmbed Entity="ChemDispenser" Caption="Structures"/>
<GuideEntityEmbed Entity="MobCorgiIan" Caption="Animals/Pets"/>
</Box>
</Document>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/a8056c6ba7f5367934ef829116e57d743226e1f0",
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/a8056c6ba7f5367934ef829116e57d743226e1f0, folded by princesscheeseballs (Discord)(https://github.com/Pronana).",
"size": {
"x": 32,
"y": 32
@@ -10,6 +10,9 @@
{
"name": "icon"
},
{
"name": "folded"
},
{
"name": "equipped-BACKPACK",
"directions": 4