From 5e0866aa820b2e6ae9f690d000cd4b1706fd983f Mon Sep 17 00:00:00 2001
From: Greenjoe12345 <33647525+Greenjoe12345@users.noreply.github.com>
Date: Sat, 6 Sep 2025 11:36:14 +0100
Subject: [PATCH] Chest pouch bag and new storage belts. (#21233)
Adds a new type of bag and two new storage belts. Also fixes being
unable to flip belts.
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
Sprites are by RatFromTheJungle, from this PR
https://github.com/NovaSector/NovaSector/pull/4651
---------
Signed-off-by: Greenjoe12345 <33647525+Greenjoe12345@users.noreply.github.com>
---
code/__DEFINES/outfit.dm | 1 +
code/__HELPERS/global_lists.dm | 2 +-
code/datums/outfits/outfit.dm | 10 +++
.../objects/items/weapons/storage/backpack.dm | 14 +++++
.../objects/items/weapons/storage/belt.dm | 26 +++++---
.../preference_setup/loadout/items/belt.dm | 12 ++++
code/modules/client/preferences.dm | 2 +-
html/changelogs/greenjoe - newbag.yml | 59 ++++++++++++++++++
icons/obj/item/clothing/belts/fannypacks.dmi | Bin 771 -> 1553 bytes
icons/obj/storage/chestpouch.dmi | Bin 0 -> 1030 bytes
10 files changed, 116 insertions(+), 10 deletions(-)
create mode 100644 html/changelogs/greenjoe - newbag.yml
create mode 100644 icons/obj/storage/chestpouch.dmi
diff --git a/code/__DEFINES/outfit.dm b/code/__DEFINES/outfit.dm
index 9c72fb04c61..db6c6ede070 100644
--- a/code/__DEFINES/outfit.dm
+++ b/code/__DEFINES/outfit.dm
@@ -7,6 +7,7 @@
#define OUTFIT_MESSENGERBAG 6
#define OUTFIT_RUCKSACK 7 // the bay one
#define OUTFIT_POCKETBOOK 8 // the leather bag but smaller
+#define OUTFIT_CHESTPOUCH 9
#define OUTFIT_JOBSPECIFIC 1
#define OUTFIT_GENERIC 2
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 9595522cb74..f4108f0d662 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -92,7 +92,7 @@ GLOBAL_LIST_EMPTY(chargen_disabilities_list)
GLOBAL_LIST_INIT(valid_player_genders, list(MALE, FEMALE, NEUTER, PLURAL))
/// List of possible backpack shapes for the loadout.
-GLOBAL_LIST_INIT(backbaglist, list("Nothing", "Backpack", "Satchel", "Leather Satchel", "Duffel Bag", "Messenger Bag", "Rucksack", "Pocketbook"))
+GLOBAL_LIST_INIT(backbaglist, list("Nothing", "Backpack", "Satchel", "Leather Satchel", "Duffel Bag", "Messenger Bag", "Rucksack", "Pocketbook", "Chest Pouch"))
/// List of possible backpack styles for the loadout.
GLOBAL_LIST_INIT(backbagstyles, list("Job-specific", "Generic", "Faction-specific"))
/// List of possible backpack colors for the loadout.
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
index 5cbf940c292..0473e923cbb 100644
--- a/code/datums/outfits/outfit.dm
+++ b/code/datums/outfits/outfit.dm
@@ -75,6 +75,8 @@
var/rucksack_faction
var/pocketbook = /obj/item/storage/backpack/satchel/pocketbook
var/pocketbook_faction
+ var/chestpouch = /obj/item/storage/backpack/chestpouch
+ var/chestpouch_faction
var/allow_pda_choice = FALSE
var/tab_pda = /obj/item/modular_computer/handheld/pda/civilian
@@ -235,6 +237,14 @@
back = /obj/item/storage/backpack/satchel/pocketbook
if (OUTFIT_FACTIONSPECIFIC)
back = pocketbook_faction ? pocketbook_faction : pocketbook
+ if (OUTFIT_CHESTPOUCH)
+ switch(H.backbag_style)
+ if (OUTFIT_JOBSPECIFIC)
+ back = chestpouch
+ if (OUTFIT_GENERIC)
+ back = /obj/item/storage/backpack/chestpouch
+ if (OUTFIT_FACTIONSPECIFIC)
+ back = chestpouch_faction ? chestpouch_faction : chestpouch
else
// Department backpack
back = backpack
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 6ff2f9662f8..0c9db847537 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -907,6 +907,20 @@
icon_state = "rucksack_tan"
item_state = "rucksack_tan"
+/*
+ * Chest pouch
+ */
+
+/obj/item/storage/backpack/chestpouch
+ name = "chest pouch"
+ desc = "A small pouch that straps across your chest."
+ icon = 'icons/obj/storage/chestpouch.dmi'
+ icon_state = "chestpouch"
+ item_state = "chestpouch"
+ w_class = WEIGHT_CLASS_HUGE // to avoid recursive backpacks
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_storage_space = DEFAULT_LARGEBOX_STORAGE
+
// Vaurca stuff.
/obj/item/storage/backpack/typec
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 1cfe487e80c..eaa696961b0 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -70,22 +70,18 @@
if(("[initial(icon_state)]_flip") in icon_states(icon)) // Check for whether it has a flipped icon. Prevents invisible sprites.
verbs += /obj/item/storage/belt/proc/flipbelt
-/obj/item/storage/belt/proc/flipbelt(mob/user, var/self = TRUE)
+/obj/item/storage/belt/proc/flipbelt()
set category = "Object.Equipped"
set name = "Flip Belt"
set src in usr
- if(self)
- if(use_check_and_message(user))
- return
- else
- if(use_check_and_message(user, self ? USE_ALLOW_NON_ADJACENT : 0))
- return
+ if(use_check_and_message(usr))
+ return
flipped = !flipped
icon_state = "[initial(icon_state)][flipped ? "_flip" : ""]"
item_state = "[initial(item_state)][flipped ? "_flip" : ""]"
- to_chat(usr, SPAN_NOTICE("You change \the [src] to be [src.flipped ? "behind" : "in front of"] you."))
+ to_chat(usr, SPAN_NOTICE("You adjust \the [src] [src.flipped ? "to the other side" : "back"]."))
update_clothing_icon()
/obj/item/storage/belt/utility
@@ -664,10 +660,24 @@
icon_state = "fannypack"
item_state = "fannypack"
max_w_class = WEIGHT_CLASS_SMALL
+ w_class = WEIGHT_CLASS_HUGE
contained_sprite = TRUE
storage_slots = null
max_storage_space = 8
+/obj/item/storage/belt/fannypack/waistpack
+ name = "waist pack"
+ desc = "A small, waist-mounted pack for... well, storing stuff!"
+ icon_state = "waistpack"
+ item_state = "waistpack"
+
+/obj/item/storage/belt/fannypack/pouchbelt
+ name = "belt with pouches"
+ desc = "A belt coated from front to back in pouches."
+ icon_state = "pouchbelt"
+ item_state = "pouchbelt"
+ max_storage_space = 10
+
/obj/item/storage/belt/fannypack/recolorable
icon_state = "fannypack_colorable"
item_state = "fannypack_colorable"
diff --git a/code/modules/client/preference_setup/loadout/items/belt.dm b/code/modules/client/preference_setup/loadout/items/belt.dm
index 360e4dc5092..438cc564bb0 100644
--- a/code/modules/client/preference_setup/loadout/items/belt.dm
+++ b/code/modules/client/preference_setup/loadout/items/belt.dm
@@ -40,3 +40,15 @@
path = /obj/item/storage/belt/security/vestbelt
allowed_roles = list("Security Officer", "Head of Security", "Warden", "Security Cadet", "Investigator", "Security Personnel")
flags = null
+
+/datum/gear/belt/waistpack
+ display_name = "waist pack"
+ description = "A small, waist-mounted pack for... well, storing stuff!"
+ cost = 2
+ path = /obj/item/storage/belt/fannypack/waistpack
+
+/datum/gear/belt/pouchbelt
+ display_name = "belt with pouches"
+ description = "A belt coated from front to back in pouches."
+ cost = 2
+ path = /obj/item/storage/belt/fannypack/pouchbelt
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index d62cb434e1b..161c8d47a8f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -495,7 +495,7 @@ GLOBAL_LIST_EMPTY_TYPED(preferences_datums, /datum/preferences)
else
all_underwear -= underwear_category_name
- if(backbag > OUTFIT_POCKETBOOK || backbag < OUTFIT_NOTHING)
+ if(backbag > OUTFIT_CHESTPOUCH || backbag < OUTFIT_NOTHING)
backbag = OUTFIT_NOTHING //Same as above
character.backbag = backbag
character.backbag_style = backbag_style
diff --git a/html/changelogs/greenjoe - newbag.yml b/html/changelogs/greenjoe - newbag.yml
new file mode 100644
index 00000000000..af6cf1b018d
--- /dev/null
+++ b/html/changelogs/greenjoe - newbag.yml
@@ -0,0 +1,59 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# - (fixes bugs)
+# wip
+# - (work in progress)
+# qol
+# - (quality of life)
+# soundadd
+# - (adds a sound)
+# sounddel
+# - (removes a sound)
+# rscadd
+# - (adds a feature)
+# rscdel
+# - (removes a feature)
+# imageadd
+# - (adds an image or sprite)
+# imagedel
+# - (removes an image or sprite)
+# spellcheck
+# - (fixes spelling or grammar)
+# experiment
+# - (experimental change)
+# balance
+# - (balance changes)
+# code_imp
+# - (misc internal code change)
+# refactor
+# - (refactors code)
+# config
+# - (makes a change to the config files)
+# admin
+# - (makes changes to administrator tools)
+# server
+# - (miscellaneous changes to server)
+#################################
+
+# Your name.
+author: Greenjoe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added a new chest pouch bag and two new varaitions of storage belt. Can be selected in character setup and the loadout."
+ - bugfix: "Fixed being unable to flip belts."
diff --git a/icons/obj/item/clothing/belts/fannypacks.dmi b/icons/obj/item/clothing/belts/fannypacks.dmi
index 64735d8bad5a5e830a887088be9ee3bf5f79d4e8..d088a4c7259a6cf848ceec14c63e9ff31ccbc105 100644
GIT binary patch
delta 1542
zcmV+h2Ko7e29XRUiBL{Q4GJ0x0000DNk~Le0002M0002M2m=5B0A&K4H2?qrGm#}9
ze+9>n!O6hDz|8pgGynhq0d!JMQvg8b*k%9#0K$4ySad{X
zb7OL8aCB*JZU6vyoSl+O4uUWchS%*W8rT~jY~2`$VIfx_1qM5@w4|*PZ!b!Mx)2My
znauylmrTeG$uZ4Xd`jsJj76>3o<*xQebv)Lf~1%gak%
zYN-t`Bm|UHXl#GoP*NM-z%WmF^5Vl5`P*uV?V`S?aiWwM=ulNZa%MEn;+jdbgrVbT
zofpHX^kI05y%@gbJ_W75mZAXZ{$`KLiP(@OS^WC<2h~XD$o-3xK>z>*zDYzue^hv!
z?VF2ssxS~mK}0$sz5V~cy)y|9t4u<~HcZ#qT@{fS&X5p~U-_g5~-;85}anc4`OewD%Uk7eT2)KeA6BU)ng!wz|l!
zJ3Kf#b%N;9S0}G;ou-b8OrljMA)000000JHQ9f3=mo0?WQF
z7>uEhvL|GxwxTln+hYqDi=e*^x7)D5eXU!SdH#4&lRA00T$RuPxBC{vrRaGr?Wv
z_Aw6u4(4V|zqA1hpWspaL;8O(KOh0Dv#1h4W|hnO`?>tUTuJf-jpF}v1Ve0qLDA1+
zgOB#Zf!0aq2fFLNT9honf6xzMDd3GJkqaE`TuEy<sWl*ZFhf%|DQSk@%%ujh82_^iHGz4fA-vm^8>LGEr4|Ge|!A@?8)C@U8|Mk
zYKQ+100000U;}bgTfz~D+-Nxha*n*oHXtXDE@=00#}vf!Z
zz_{uk75&lzy8}>Kz*GEJ$@u$osptHFTZXJGW6JyX4*^xBe;?DgCp(Sr=VD8>`@6}x
z;M)f0;@w1TDKEnF#wd3`_Lkq7@JYm=A!0-T&bKn?gSBKKTE&B^5&M(f_Zls1%y~
z|F3_O|6f~Be<`v8-1-0J-2dR&-uwRsBk-qHEe#K>O{(^
z-vD33V->9#U}r898Hx81&e{Ex91;Pex%;_$D10)jf2{%l000000001Z56(5ycRpp~
z%$c`N+-EUxo3P1z!}NT(=?lY>foYdt&Vu#Rayqk!7wKWytMZAw!
zew=oSE1~e)6ZPja(F#kZMy7+Wm}XJ4mprhK0cV!Z
delta 739
zcmV<90v!F341)$GiBL{Q4GJ0x0000DNk~Le0001>0001h1Oos70Det>C;$Ke8<8a+
z6_UYr0{{R30d!JMQvg8b*k%9#0H2X@6Ms`yaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM
z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+Eio^zvLG=zJ3cu-C%-5$DJNBli!&v&
zs2C_~$iOSDM(pB>E4JfxfJ6eR_+NB#uMcu?qV7SJ~pqPZt=b
zX<|gAeFvoI5vs_VuCS$nXH1t=sWS=;%M%1a5blEb;pjl|!|~j}4{ZkeqJQg$wh!9A
zh<->D@SXkWhwhTbsCsdyJkS$x{m{nrMaKs%UmWa*t`FKviXRGsAp8^j9C+i)%Zmyq
zbFMrevVfxEs!(|16c9-%I+=^FQN;2F~;b>obhdn5>gApBLt4@U=zACBh+erPk$7hONJ
zebDknA8m*xG@wrO7CV0EE@_PFPj||rA)JmM+L*rR_@L#BgZ)=
z9XfQfvwNGe3`kp<+&OSV2+g_b+eA=-%0Fth#xH#FFlA=h73NmLO**ug8;xJPj=NX*7#mwX_J;
z*52`JX9KesgVpb}`+GIrUNA5)-SBjA45^s&cE;ODj}!!4Hz$;Ekmy5#gc7SEZn
zoIz&4g;YweiN?%(yEZA*@np*9S*EP1#ii?0t#`BEZ(JbC5d|ft*2i!7Z6eU3z@o@;
zFs$iZ`Zw(td#q)C?c4c~za_)*{jcUT8~!gySouEAUC!eE_v5b4&t;w;?^*pdt+G$L$1dS5)%NiGFZ!qG@7)QZC+hxOefJ^qU}m@c?l+d~^{akfZ1ZKUo?pK6
z`<%pm{91KS^tKD_k$x6?&OmD3e#ZUUEKOF=(+}=xyE!4+@ucymwZ~qVTYGL&+}*z^
z{l^~zqhGf3k3L;+{=OR|rafPnU-4+G$eeSXITn^?COKLWeVa~R_}G7F
zE$iv+v)YazgsUP{5q=E_Emb(1q0vuXKG$fd2?I#?(_;3mQ`&1V9k>F
zSwc8;W%eTF9>cl8GObM|OV@SweKt6z*mpQGWbO;ESfILIO<(<+?de*jz9lh-WFt+3
zf$ATB`Vt?PpR?%UqHN!At=TVj+{+8EEbIoQZ7_(N@Gl|n!|7RX176EMQponZe${Bd
zWe!_JDTilT#roOj6>7`d&NIBc*Pm@UOZaD?Vw{Jj+e!uNP*VjS)mg$N>dt#?v_y4y
zGuopZB-$k056YBuOm|=U{eg+Ej7NKxgM^pK_B-?VKAu_;u)!puY@?Wf*W#V-9p#ns
zqFiBWi>m9DdH21L@E4uE@#xo%fYcvhYYf&*xn_LmwXYfD+{d1a_g1lW^lUJ#XZU@}
V)p+vp6{|pw_H^}gS?83{1OQi<#9aUY
literal 0
HcmV?d00001