diff --git a/.vscode/settings.json b/.vscode/settings.json
index 849a5165e1..bfce9bda7c 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -12,12 +12,9 @@
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
- "workbench.editorAssociations": [
- {
- "filenamePattern": "*.dmi",
- "viewType": "imagePreview.previewEditor"
- }
- ],
+ "workbench.editorAssociations": {
+ "*.dmi": "imagePreview.previewEditor"
+ },
"files.eol": "\n",
"gitlens.advanced.blame.customArguments": ["-w"],
"tgstationTestExplorer.project.resultsType": "json",
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 2e84b729e7..92e0f7a5b9 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -14064,6 +14064,25 @@
},
/turf/open/space,
/area/space/nearstation)
+"bbJ" = (
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/aisat/exterior)
"bbQ" = (
/obj/structure/sign/poster/random,
/turf/closed/wall,
@@ -20284,6 +20303,29 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"bFm" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/aisat/exterior)
"bFD" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -23429,9 +23471,6 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
/obj/structure/cable/white{
icon_state = "1-4"
},
@@ -30106,9 +30145,6 @@
/turf/open/floor/plasteel,
/area/security/brig)
"cgW" = (
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
/obj/structure/cable/white{
icon_state = "4-8"
},
@@ -30125,6 +30161,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/cable/white{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"cgX" = (
@@ -32693,9 +32732,6 @@
/obj/structure/cable/white{
icon_state = "1-4"
},
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
/obj/structure/cable/white{
icon_state = "1-8"
},
@@ -36366,6 +36402,10 @@
},
/turf/open/floor/plating,
/area/maintenance/port)
+"cEA" = (
+/obj/effect/turf_decal/vg_decals/atmos/carbon_dioxide,
+/turf/open/floor/engine/co2,
+/area/engineering/atmos)
"cFF" = (
/turf/open/floor/engine{
name = "Holodeck Projector Floor"
@@ -46132,8 +46172,8 @@
},
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/components/binary/valve/digital{
- icon_state = "dvalve_map-2";
- dir = 8
+ dir = 8;
+ icon_state = "dvalve_map-2"
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
@@ -72111,6 +72151,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/light/small,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/aisat/exterior)
"ewA" = (
@@ -74589,8 +74630,10 @@
/turf/open/floor/wood,
/area/service/library)
"fsx" = (
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/engine/air,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
/area/engineering/atmos)
"fsP" = (
/obj/structure/table/wood,
@@ -77511,8 +77554,8 @@
/area/engineering/main)
"grf" = (
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- icon_state = "pipe11-2";
- dir = 5
+ dir = 5;
+ icon_state = "pipe11-2"
},
/turf/closed/wall/r_wall,
/area/science/xenobiology)
@@ -77848,8 +77891,8 @@
dir = 8
},
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- icon_state = "inje_map-2";
- dir = 4
+ dir = 4;
+ icon_state = "inje_map-2"
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
@@ -83374,6 +83417,28 @@
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/command/storage/eva)
+"ipc" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/aisat/exterior)
"ipl" = (
/obj/structure/rack,
/obj/item/book/manual/wiki/engineering_hacking{
@@ -92073,7 +92138,6 @@
/turf/closed/wall,
/area/commons/storage/primary)
"lkg" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
/obj/machinery/atmospherics/miner/toxins,
/turf/open/floor/engine/plasma,
/area/engineering/atmos)
@@ -93634,7 +93698,6 @@
/turf/open/floor/plasteel,
/area/engineering/main)
"lNq" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
/obj/machinery/atmospherics/miner/nitrogen,
/turf/open/floor/engine/n2,
/area/engineering/atmos)
@@ -94989,6 +95052,10 @@
},
/turf/open/floor/plasteel/dark,
/area/engineering/atmos)
+"mmq" = (
+/obj/effect/turf_decal/vg_decals/atmos/nitrogen,
+/turf/open/floor/engine/n2,
+/area/engineering/atmos)
"mmC" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -100471,7 +100538,6 @@
/turf/open/floor/plasteel/dark,
/area/service/library)
"ohX" = (
-/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
/obj/machinery/atmospherics/miner/carbon_dioxide,
/turf/open/floor/engine/co2,
/area/engineering/atmos)
@@ -102237,6 +102303,27 @@
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/aisat/exterior)
+"oOQ" = (
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/aisat/exterior)
"oOV" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -102476,9 +102563,6 @@
/turf/open/floor/plasteel,
/area/engineering/break_room)
"oTt" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide{
- valve_open = 1
- },
/obj/machinery/atmospherics/miner/n2o,
/turf/open/floor/engine/n2o,
/area/engineering/atmos)
@@ -103357,6 +103441,28 @@
},
/turf/open/floor/plating,
/area/cargo/qm)
+"pkY" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/aisat/exterior)
"plb" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -105873,6 +105979,7 @@
dir = 1;
name = "atmospherics camera"
},
+/obj/effect/turf_decal/vg_decals/atmos/mix,
/turf/open/floor/engine/vacuum,
/area/engineering/atmos)
"qbJ" = (
@@ -105921,6 +106028,10 @@
},
/turf/open/floor/plating,
/area/engineering/atmos)
+"qcm" = (
+/obj/effect/turf_decal/vg_decals/atmos/plasma,
+/turf/open/floor/engine/plasma,
+/area/engineering/atmos)
"qcW" = (
/obj/machinery/firealarm{
pixel_y = 26
@@ -108117,6 +108228,10 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmospherics_engine)
+"qYy" = (
+/obj/effect/turf_decal/vg_decals/atmos/oxygen,
+/turf/open/floor/engine/o2,
+/area/engineering/atmos)
"qYD" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 9
@@ -109796,6 +109911,10 @@
dir = 6
},
/area/science/circuit)
+"rCx" = (
+/obj/effect/turf_decal/vg_decals/atmos/nitrous_oxide,
+/turf/open/floor/engine/n2o,
+/area/engineering/atmos)
"rCK" = (
/obj/machinery/button/door{
id = "teleporterhubshutters";
@@ -115966,6 +116085,10 @@
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/aisat/exterior)
+"tBF" = (
+/obj/effect/turf_decal/vg_decals/atmos/air,
+/turf/open/floor/engine/air,
+/area/engineering/atmos)
"tBH" = (
/obj/machinery/door/airlock/atmos/glass/critical{
heat_proof = 1;
@@ -116977,7 +117100,6 @@
/turf/open/floor/plasteel,
/area/cargo/storage)
"tWb" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/machinery/atmospherics/miner/oxygen,
/turf/open/floor/engine/o2,
/area/engineering/atmos)
@@ -122614,6 +122736,29 @@
},
/turf/open/floor/plasteel/dark,
/area/service/chapel/office)
+"wcM" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/aisat/exterior)
"wei" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -124381,6 +124526,29 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
+"wIV" = (
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ai_monitored/aisat/exterior)
"wJE" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood/old,
@@ -134718,7 +134886,7 @@ bkF
pQq
hzs
hzs
-hzs
+ipc
hzs
uSd
fWX
@@ -134726,7 +134894,7 @@ gxc
gxc
gxc
gxc
-gxc
+bFm
gxc
kdA
brN
@@ -135253,12 +135421,12 @@ cab
bPC
bRO
ivC
-gxc
+bFm
gxc
eCQ
hzs
oMz
-hzs
+ipc
hzs
rew
brN
@@ -136000,7 +136168,7 @@ ajr
ajr
ajr
bkF
-tBB
+bbJ
brO
aad
btH
@@ -136031,7 +136199,7 @@ cdt
cdt
aad
bkE
-tBB
+oOQ
brM
ajr
ajr
@@ -138056,7 +138224,7 @@ ajr
ajr
ajr
bkF
-tBB
+bbJ
brO
aad
btH
@@ -138087,7 +138255,7 @@ cdt
cdt
aad
bkE
-tBB
+oOQ
brM
ajr
ajr
@@ -138851,12 +139019,12 @@ cam
bPC
bRO
ygA
-gxc
+wcM
gxc
eCQ
hzs
xaW
-hzs
+pkY
hzs
elb
brN
@@ -139344,7 +139512,7 @@ bkF
mdI
hzs
hzs
-hzs
+pkY
hzs
uhb
fWX
@@ -139352,7 +139520,7 @@ gxc
gxc
gxc
tzE
-gxc
+wcM
gxc
xic
brN
@@ -141414,7 +141582,7 @@ aad
bNF
aad
bRP
-swP
+wIV
stE
evL
aJD
@@ -149868,15 +150036,15 @@ aSQ
iio
iMu
ohX
-hFW
+cEA
iio
sEM
lkg
-kRS
+qcm
iio
rUo
oTt
-lbI
+rCx
iio
kcG
kcG
@@ -152950,13 +153118,13 @@ fcn
lfN
oUP
hlN
-lXg
+fsx
rmJ
lXg
lXg
lXg
xQQ
-lXg
+fsx
lXg
lXg
mhk
@@ -157318,16 +157486,16 @@ aaa
aad
iio
wTN
-fsx
lEq
+tBF
iio
wjw
tWb
-sCm
+qYy
iio
eFu
lNq
-skw
+mmq
iio
aMN
emZ
diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm
index f73826d899..92ee9be7d2 100644
--- a/code/datums/elements/mob_holder.dm
+++ b/code/datums/elements/mob_holder.dm
@@ -7,8 +7,9 @@
var/left_hand
var/inv_slots
var/proctype //if present, will be invoked on headwear generation.
+ var/escape_on_find = FALSE //if present, will be released upon the item being 'found' (i.e. opening a container or pocket with it present)
-/datum/element/mob_holder/Attach(datum/target, worn_state, alt_worn, right_hand, left_hand, inv_slots = NONE, proctype)
+/datum/element/mob_holder/Attach(datum/target, worn_state, alt_worn, right_hand, left_hand, inv_slots = NONE, proctype, escape_on_find)
. = ..()
if(!isliving(target))
@@ -20,6 +21,7 @@
src.left_hand = left_hand
src.inv_slots = inv_slots
src.proctype = proctype
+ src.escape_on_find = escape_on_find
RegisterSignal(target, COMSIG_CLICK_ALT, .proc/mob_try_pickup)
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine)
@@ -55,6 +57,8 @@
to_chat(user, "You pick [source] up.")
source.drop_all_held_items()
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, inv_slots)
+ holder.escape_on_find = escape_on_find
+
if(proctype)
INVOKE_ASYNC(src, proctype, source, holder, user)
user.put_in_hands(holder)
@@ -78,6 +82,7 @@
w_class = WEIGHT_CLASS_BULKY
dynamic_hair_suffix = ""
var/mob/living/held_mob
+ var/escape_on_find
/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, slots = NONE)
. = ..()
@@ -189,3 +194,9 @@
if(ismob(location))
return location.loc.remove_air(amount)
return location.remove_air(amount)
+
+// escape when found if applicable
+/obj/item/clothing/head/mob_holder/on_found(mob/living/finder)
+ if(escape_on_find)
+ finder.visible_message("[finder] accidentally releases the [held_mob]!")
+ release()
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 64b950a417..9953b593d9 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -18,8 +18,6 @@ GLOBAL_LIST_INIT(meteorsB, list(/obj/effect/meteor/meaty=5, /obj/effect/meteor/m
GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
-GLOBAL_LIST_INIT(meteorsCat, list(/obj/effect/meteor/cat)) //for cat meteors
-
///////////////////////////////
//Meteor spawning global procs
@@ -347,17 +345,6 @@ GLOBAL_LIST_INIT(meteorsCat, list(/obj/effect/meteor/cat)) //for cat meteors
..()
if(prob(20))
explosion(src.loc,2,4,6,8)
-
-/obj/effect/meteor/cat
- name = "space cat"
- icon_state = "catmeteor"
- desc = "Meow."
- hits = 1
- heavy = FALSE
- meteorsound = 'sound/effects/meow1.ogg'
- meteordrop = list(/mob/living/simple_animal/pet/cat/space)
- threat = 0
- dropamt = 1
//////////////////////////
//Spookoween meteors
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 882d0b989c..79fff2a76a 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -1,7 +1,10 @@
/obj/machinery/computer/bank_machine
name = "bank machine"
desc = "A machine used to deposit and withdraw station funds."
- icon = 'goon/icons/obj/goon_terminals.dmi'
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ icon_screen = "vault"
+ icon_keyboard = "security_key"
idle_power_usage = 100
var/siphoning = FALSE
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index 3cfd8fdfc4..869d583037 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -3,7 +3,7 @@
desc = "A culinary marvel that uses matter-to-energy conversion to store dishes and shards. Convenient! \
Additional features include a vacuum function to suck in nearby dishes, and an automatic transfer beam that empties its contents into nearby disposal bins every now and then. \
Or you can just drop your plates on the floor, like civilized folk."
- icon = 'goon/icons/obj/kitchen.dmi'
+ icon = 'icons/obj/kitchen.dmi'
icon_state = "synthesizer"
idle_power_usage = 8 //5 with default parts
active_power_usage = 13 //10 with default parts
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index 7a6c159160..e58dbc23ce 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -1,7 +1,7 @@
/obj/item/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
- icon_state = "mjollnir0"
+ icon_state = "singularity_hammer0"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
@@ -25,7 +25,7 @@
/obj/item/singularityhammer/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/two_handed, force_multiplier=4, icon_wielded="mjollnir1")
+ AddComponent(/datum/component/two_handed, force_multiplier=4, icon_wielded="singularity_hammer1")
/// triggered on wield of two handed item
/obj/item/singularityhammer/proc/on_wield(obj/item/source, mob/user)
@@ -36,7 +36,7 @@
wielded = FALSE
/obj/item/singularityhammer/update_icon_state()
- icon_state = "mjollnir0"
+ icon_state = "singularity_hammer0"
/obj/item/singularityhammer/Destroy()
STOP_PROCESSING(SSobj, src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 5b78ca323c..4266f006ec 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -13,15 +13,16 @@
return 0
. = ..()
-// Exists to work around the minimum 700 cr price for goodies / small items
-/obj/structure/closet/secure_closet/goodies
+// Exists to work around the minimum 700 cr price for goodies / small items / materials
+/obj/structure/closet/secure_closet/cargo
+ name = "cargo locker"
icon_state = "goodies"
desc = "A sturdier card-locked storage unit used for bulky shipments."
max_integrity = 500 // Same as crates.
melee_min_damage = 25 // Idem.
-/obj/structure/closet/secure_closet/goodies/owned
- name = "private locker"
+/obj/structure/closet/secure_closet/cargo/owned
+ name = "private cargo locker"
desc = "A locker designed to only open for who purchased its contents."
///Account of the person buying the crate if private purchasing.
var/datum/bank_account/buyer_account
@@ -32,18 +33,18 @@
///Is the crate being bought by a person, or a budget card?
var/department_purchase = FALSE
-/obj/structure/closet/secure_closet/goodies/owned/examine(mob/user)
+/obj/structure/closet/secure_closet/cargo/owned/examine(mob/user)
. = ..()
. += "It's locked with a privacy lock, and can only be unlocked by the buyer's ID."
-/obj/structure/closet/secure_closet/goodies/owned/Initialize(mapload, datum/bank_account/_buyer_account)
+/obj/structure/closet/secure_closet/cargo/owned/Initialize(mapload, datum/bank_account/_buyer_account)
. = ..()
buyer_account = _buyer_account
if(istype(buyer_account, /datum/bank_account/department))
department_purchase = TRUE
department_account = buyer_account
-/obj/structure/closet/secure_closet/goodies/owned/togglelock(mob/living/user, silent)
+/obj/structure/closet/secure_closet/cargo/owned/togglelock(mob/living/user, silent)
if(privacy_lock)
if(!broken)
var/obj/item/card/id/id_card = user.get_idcard(TRUE)
diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm
index ad9fa2018e..c2c7897f0f 100644
--- a/code/modules/cargo/order.dm
+++ b/code/modules/cargo/order.dm
@@ -96,7 +96,7 @@
var/static/list/blacklisted_error = typecacheof(list(
/obj/structure/closet/crate/secure,
/obj/structure/closet/crate/large,
- /obj/structure/closet/secure_closet/goodies
+ /obj/structure/closet/secure_closet/cargo
))
if(is_type_in_list(container, blacklisted_error))
P.errors &= ~MANIFEST_ERROR_ITEM
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 3e3aeff592..13f1e77441 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -22,8 +22,8 @@
/datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account)
var/obj/structure/closet/crate/C
if(paying_account)
- if(ispath(crate_type, /obj/structure/closet/secure_closet/goodies)) // lets ensure private orders don't come in crates when the original one comes in lockers
- C = new /obj/structure/closet/secure_closet/goodies/owned(A, paying_account) // that would lead to infinite money exploits
+ if(ispath(crate_type, /obj/structure/closet/secure_closet/cargo)) // lets ensure private orders don't come in crates when the original one comes in lockers
+ C = new /obj/structure/closet/secure_closet/cargo/owned(A, paying_account) // that would lead to infinite money exploits
else
C = new /obj/structure/closet/crate/secure/owned(A, paying_account)
C.name = "[crate_name] - Purchased by [paying_account.account_holder]"
diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm
index 94f14fb503..90629706b5 100644
--- a/code/modules/cargo/packs/materials.dm
+++ b/code/modules/cargo/packs/materials.dm
@@ -14,56 +14,56 @@
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/materials/cardboard50
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "50 Cardboard Sheets"
desc = "Create a bunch of boxes."
cost = 300 //thrice their export value
contains = list(/obj/item/stack/sheet/cardboard/fifty)
/datum/supply_pack/materials/glass50
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "50 Glass Sheets"
desc = "Let some nice light in with fifty glass sheets!"
cost = 300 //double their export value
contains = list(/obj/item/stack/sheet/glass/fifty)
/datum/supply_pack/materials/metal50
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "50 Metal Sheets"
desc = "Any construction project begins with a good stack of fifty metal sheets!"
cost = 300 //double their export value
contains = list(/obj/item/stack/sheet/metal/fifty)
/datum/supply_pack/materials/plasteel20
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "20 Plasteel Sheets"
desc = "Reinforce the station's integrity with twenty plasteel sheets!"
cost = 4000
contains = list(/obj/item/stack/sheet/plasteel/twenty)
-/datum/supply_pack/materials/plastic50
- crate_type = /obj/structure/closet/secure_closet/goodies
- name = "50 Plastic Sheets"
+/datum/supply_pack/materials/plastic20
+ crate_type = /obj/structure/closet/secure_closet/cargo
+ name = "20 Plastic Sheets"
desc = "Build a limitless amount of toys with fifty plastic sheets!"
cost = 200 // double their export
contains = list(/obj/item/stack/sheet/plastic/twenty)
/datum/supply_pack/materials/sandstone30
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "30 Sandstone Blocks"
desc = "Neither sandy nor stoney, these thirty blocks will still get the job done."
cost = 150 // five times their export
contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty)
/datum/supply_pack/materials/wood20
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "20 Wood Planks"
desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with twenty wooden planks!"
cost = 400 // 6-7 planks shy from having equal import/export prices
contains = list(/obj/item/stack/sheet/mineral/wood/twenty)
/datum/supply_pack/materials/rcdammo
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "Large RCD ammo Single-Pack"
desc = "A single large compressed RCD matter pack, to help with any holes or projects people might be working on."
cost = 600
diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm
index d72ee231a8..91663dbe0f 100644
--- a/code/modules/cargo/packs/misc.dm
+++ b/code/modules/cargo/packs/misc.dm
@@ -370,7 +370,7 @@
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/misc/carpet
- crate_type = /obj/structure/closet/secure_closet/goodies
+ crate_type = /obj/structure/closet/secure_closet/cargo
name = "Classic Carpet Single-Pack"
desc = "Plasteel floor tiles getting on your nerves? This 50 units stack of extra soft carpet will tie any room together."
cost = 200
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index d7ee4de62c..58d5d26e86 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -56,7 +56,7 @@
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool"
item_state = "bl_suit"
- has_sensor = TRUE
+ has_sensor = HAS_SENSORS
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
/obj/item/clothing/under/syndicate/cosmetic/skirt
@@ -64,6 +64,7 @@
icon_state = "tactifool_skirt"
fitted = FEMALE_UNIFORM_TOP
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+ can_adjust = FALSE
/obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit"
diff --git a/code/modules/events/cat_wave.dm b/code/modules/events/cat_wave.dm
deleted file mode 100644
index 155da8ca08..0000000000
--- a/code/modules/events/cat_wave.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/datum/round_event_control/meteor_wave/cat
- name = "Meteor Wave: CATastrophic"
- typepath = /datum/round_event/meteor_wave/cat
- weight = 10
- max_occurrences = 1
-
-/datum/round_event/meteor_wave/cat
- wave_name = "cat"
-
-/datum/round_event/meteor_wave/cat/announce(fake)
- priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert", "meteors")
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 9aa9cac258..e69af1df13 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -56,8 +56,6 @@
wave_type = GLOB.meteorsC
if("halloween")
wave_type = GLOB.meteorsSPOOKY
- if("cat")
- wave_type = GLOB.meteorsCat
else
WARNING("Wave name of [wave_name] not recognised.")
kill()
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index 769bf1dc19..edd30ab1a9 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -213,7 +213,7 @@
)
result = /obj/item/reagent_containers/food/snacks/salad/gumbo
subcategory = CAT_MEAT
-
+
/datum/crafting_recipe/food/goliathcalamari
name = "Goliath Calamari"
reqs = list(
@@ -221,4 +221,4 @@
/datum/reagent/consumable/cooking_oil = 10
)
result = /obj/item/reagent_containers/food/snacks/goliathcalamari
-
+ subcategory = CAT_MEAT
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 0a3cde3ef8..399a403ce7 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -58,12 +58,17 @@
var/icon_base = "bee"
var/static/beehometypecache = typecacheof(/obj/structure/beebox)
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
+ var/held_icon = "" // bees are small and have no held icon (aka the coder doesn't know how to sprite it)
/mob/living/simple_animal/hostile/poison/bees/Initialize()
. = ..()
generate_bee_visuals()
AddComponent(/datum/component/swarming)
+/mob/living/simple_animal/hostile/poison/bees/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/mob_holder, held_icon, escape_on_find = TRUE)
+
/mob/living/simple_animal/hostile/poison/bees/Destroy()
if(beehome)
beehome.bees -= src
diff --git a/code/modules/modular_computers/computers/_modular_computer_shared.dm b/code/modules/modular_computers/computers/_modular_computer_shared.dm
index 77888fdf01..0aca92f9d8 100644
--- a/code/modules/modular_computers/computers/_modular_computer_shared.dm
+++ b/code/modules/modular_computers/computers/_modular_computer_shared.dm
@@ -63,4 +63,4 @@
if(printer_slot)
. += "It has a printer installed."
if(user_is_adjacent)
- . += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper].]"
+ . += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper]."
diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm
index a9f353bca4..d9d9e5c876 100644
--- a/code/modules/modular_computers/computers/item/computer_ui.dm
+++ b/code/modules/modular_computers/computers/item/computer_ui.dm
@@ -114,6 +114,12 @@
update_icon()
if(user && istype(user))
ui_interact(user) // Re-open the UI on this computer. It should show the main screen now.
+ if("eject_pen")
+ if(istype(src, /obj/item/modular_computer/tablet))
+ var/obj/item/modular_computer/tablet/self = src
+ if(self.can_have_pen)
+ self.remove_pen()
+ return
if("PC_killprogram")
var/prog = params["name"]
diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm
index 72e1283553..d4d3ef52c2 100644
--- a/code/modules/modular_computers/computers/item/tablet.dm
+++ b/code/modules/modular_computers/computers/item/tablet.dm
@@ -18,6 +18,69 @@
var/has_variants = TRUE
var/finish_color = null
+ //Pen stuff
+ var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, /obj/item/clothing/mask/cigarette)
+ var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above.
+ var/can_have_pen = TRUE
+
+/obj/item/modular_computer/tablet/examine(mob/user)
+ . = ..()
+ if(inserted_item && (!isturf(loc)))
+ . += "Ctrl-click to remove [inserted_item]."
+
+/obj/item/modular_computer/tablet/Initialize()
+ . = ..()
+ if(can_have_pen)
+ if(inserted_item)
+ inserted_item = new inserted_item(src)
+ else
+ inserted_item = new /obj/item/pen(src)
+
+/obj/item/modular_computer/tablet/proc/insert_pen(obj/item/pen)
+ if(!usr.transferItemToLoc(pen, src))
+ return
+ to_chat(usr, "You slide \the [pen] into \the [src]'s pen slot.")
+ inserted_item = pen
+ playsound(src, 'sound/machines/button.ogg', 50, 1)
+
+/obj/item/modular_computer/tablet/proc/remove_pen()
+ if(hasSiliconAccessInArea(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+
+ if(inserted_item)
+ usr.put_in_hands(inserted_item)
+ to_chat(usr, "You remove [inserted_item] from \the [src]'s pen slot.")
+ inserted_item = null
+ else
+ to_chat(usr, "\The [src] does not have a pen in it!")
+
+/obj/item/modular_computer/tablet/CtrlClick(mob/user)
+ . = ..()
+ if(isturf(loc))
+ return
+
+ if(can_have_pen)
+ remove_pen(user)
+
+/obj/item/modular_computer/tablet/attackby(obj/item/W, mob/user)
+ if(can_have_pen && is_type_in_list(W, contained_item))
+ if(inserted_item)
+ to_chat(user, "There is \a [inserted_item] blocking \the [src]'s pen slot!")
+ return
+ else
+ insert_pen(W)
+ return
+ . = ..()
+
+/obj/item/modular_computer/tablet/Destroy()
+ if(istype(inserted_item))
+ QDEL_NULL(inserted_item)
+ return ..()
+
+/obj/item/modular_computer/tablet/ui_data(mob/user)
+ . = ..()
+ .["PC_showpeneject"] = inserted_item ? 1 : 0
+
/obj/item/modular_computer/tablet/update_icon_state()
if(has_variants)
if(!finish_color)
@@ -64,6 +127,7 @@
var/datum/computer_file/program/robotact/robotact
///IC log that borgs can view in their personal management app
var/list/borglog = list()
+ can_have_pen = FALSE
/obj/item/modular_computer/tablet/integrated/Initialize(mapload)
. = ..()
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 6044e8131d..bfda6c453c 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -126,7 +126,8 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
var/value = 0
var/purchases = 0
var/list/goodies_by_buyer = list() // if someone orders more than GOODY_FREE_SHIPPING_MAX goodies, we upcharge to a normal crate so they can't carry around 20 combat shotties
- // var/list/lockers_by_buyer = list() // TODO, combine orders that come in lockers into a single locker to not crowd the shuttle
+ var/list/lockers_by_buyer = list() // used to combine orders that come in lockers into a single locker to not crowd the shuttle
+
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
if(!empty_turfs.len)
break
@@ -147,11 +148,15 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
D.bank_card_talk("Goody order size exceeds free shipping limit: Assessing [CRATE_TAX] credit S&H fee.")
else
D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+
if(D)
if(!D.adjust_money(-price))
if(SO.paying_account)
D.bank_card_talk("Cargo order #[SO.id] rejected due to lack of funds. Credits required: [price]")
continue
+ else if(ispath(SO.pack.crate_type, /obj/structure/closet/secure_closet/cargo))
+ LAZYADD(lockers_by_buyer[D], SO)
+
if(SO.paying_account)
if(SO.pack.goody)
@@ -164,7 +169,7 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
SSshuttle.orderhistory += SO
QDEL_NULL(SO.applied_coupon)
- if(!SO.pack.goody) //we handle goody crates below
+ if(!SO.pack.goody && !ispath(SO.pack.crate_type, /obj/structure/closet/secure_closet/cargo)) //we handle goody crates and material closets below
SO.generate(pick_n_take(empty_turfs))
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
@@ -198,6 +203,33 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
misc_contents[buyer] += item
misc_order_num[buyer] = "[misc_order_num[buyer]]#[our_order.id] "
+
+ // handling locker bundles
+ for(var/D in lockers_by_buyer)
+ var/list/buying_account_orders = lockers_by_buyer[D]
+
+ var/buyer
+
+ if(!istype(D, /datum/bank_account/department)) // department accounts break the secure closet for some reason
+ var/obj/structure/closet/secure_closet/cargo/owned/our_closet = new /obj/structure/closet/secure_closet/cargo/owned(pick_n_take(empty_turfs))
+ var/datum/bank_account/buying_account = D
+ buyer = buying_account.account_holder
+ our_closet.buyer_account = buying_account
+ our_closet.name = "private cargo locker - purchased by [buyer]"
+ miscboxes[buyer] = our_closet
+ else
+ var/obj/structure/closet/secure_closet/cargo/our_closet = new /obj/structure/closet/secure_closet/cargo(pick_n_take(empty_turfs))
+ buyer = "Cargo"
+ miscboxes[buyer] = our_closet
+
+ misc_contents[buyer] = list()
+ for(var/O in buying_account_orders)
+ var/datum/supply_order/our_order = O
+ for(var/item in our_order.pack.contains)
+ misc_contents[buyer] += item
+ misc_order_num[buyer] = "[misc_order_num[buyer]]#[our_order.id] "
+
+
for(var/I in miscboxes)
var/datum/supply_order/SO = new/datum/supply_order()
SO.id = misc_order_num[I]
diff --git a/code/modules/unit_tests/crafting_recipes.dm b/code/modules/unit_tests/crafting_recipes.dm
new file mode 100644
index 0000000000..33803bd111
--- /dev/null
+++ b/code/modules/unit_tests/crafting_recipes.dm
@@ -0,0 +1,7 @@
+/datum/unit_test/crafting_recipes/Run()
+ for(var/i in GLOB.crafting_recipes)
+ var/datum/crafting_recipe/R = i
+ if(!R.subcategory)
+ Fail("Invalid subcategory on [R] ([R.type]).")
+ if(!R.category && (R.cateogry != CAT_NONE))
+ Fail("Invalid category on [R] ([R.type])")
diff --git a/goon/icons/obj/closet.dmi b/goon/icons/obj/closet.dmi
deleted file mode 100644
index 6083923033..0000000000
Binary files a/goon/icons/obj/closet.dmi and /dev/null differ
diff --git a/goon/icons/obj/goon_terminals.dmi b/goon/icons/obj/goon_terminals.dmi
deleted file mode 100644
index 6452c9fc09..0000000000
Binary files a/goon/icons/obj/goon_terminals.dmi and /dev/null differ
diff --git a/goon/icons/obj/kitchen.dmi b/goon/icons/obj/kitchen.dmi
deleted file mode 100644
index b45307a647..0000000000
Binary files a/goon/icons/obj/kitchen.dmi and /dev/null differ
diff --git a/html/changelog.html b/html/changelog.html
index fe3a0fe1b5..5537637776 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,12 @@
-->
+
12 June 2021
+
silicons updated:
+
+
xenos are now truly immune to stamina damage.
+
+
10 June 2021
Arturlang updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index cb669eb064..ae8f4c1e74 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -29443,3 +29443,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
zeroisthebiggay:
- bugfix: Fixed an exploit allowing you to grab people from anywhere with a clowncar.
- balance: revenant essence objective reduced
+2021-06-12:
+ silicons:
+ - bugfix: xenos are now truly immune to stamina damage.
diff --git a/html/changelogs/AutoChangeLog-pr-14768.yml b/html/changelogs/AutoChangeLog-pr-14768.yml
deleted file mode 100644
index 007ecd6f58..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14768.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - bugfix: "xenos are now truly immune to stamina damage."
diff --git a/html/changelogs/AutoChangeLog-pr-14813.yml b/html/changelogs/AutoChangeLog-pr-14813.yml
new file mode 100644
index 0000000000..1f2f6c3895
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14813.yml
@@ -0,0 +1,4 @@
+author: "SandPoot"
+delete-after: True
+changes:
+ - bugfix: "The cosmetic turtleneck and skirtleneck no longer start with broken sensors."
diff --git a/html/changelogs/AutoChangeLog-pr-14814.yml b/html/changelogs/AutoChangeLog-pr-14814.yml
new file mode 100644
index 0000000000..801405afe4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14814.yml
@@ -0,0 +1,8 @@
+author: "TripleShades"
+delete-after: True
+changes:
+ - rscadd: "Lights to AI Sat Walkways"
+ - rscadd: "Lights to Atmospherics"
+ - rscadd: "Floor labels to Atmospherics Gas Miner containment units"
+ - rscdel: "Gas canisters from Gas Miner containment units"
+ - rscdel: "Excessive wiring in Security and Detective's Office"
diff --git a/html/changelogs/AutoChangeLog-pr-14816.yml b/html/changelogs/AutoChangeLog-pr-14816.yml
new file mode 100644
index 0000000000..4f79ec4fb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14816.yml
@@ -0,0 +1,5 @@
+author: "SandPoot"
+delete-after: True
+changes:
+ - rscadd: "Tablet computers now have a pen slot, they can almost replace your pda!"
+ - spellcheck: "Removed a bracket from printer's examine."
diff --git a/html/changelogs/AutoChangeLog-pr-14820.yml b/html/changelogs/AutoChangeLog-pr-14820.yml
new file mode 100644
index 0000000000..359db8db04
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14820.yml
@@ -0,0 +1,5 @@
+author: "qweq12yt"
+delete-after: True
+changes:
+ - bugfix: "Locker orders now properly bundle together in a single locker (still separated by buyer)."
+ - bugfix: "Changed some package names to be more accurate."
diff --git a/html/changelogs/AutoChangeLog-pr-14824.yml b/html/changelogs/AutoChangeLog-pr-14824.yml
new file mode 100644
index 0000000000..73fe842fcd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14824.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "bees can go in containers and are released upon opening the container"
diff --git a/html/changelogs/AutoChangeLog-pr-14825.yml b/html/changelogs/AutoChangeLog-pr-14825.yml
new file mode 100644
index 0000000000..9610a7061d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14825.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - imageadd: "new water cooler sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-14826.yml b/html/changelogs/AutoChangeLog-pr-14826.yml
new file mode 100644
index 0000000000..2b3d4e0b86
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14826.yml
@@ -0,0 +1,5 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - imageadd: "new bank machine sprite"
+ - imagedel: "unused goon coffin sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-14829.yml b/html/changelogs/AutoChangeLog-pr-14829.yml
new file mode 100644
index 0000000000..e6e95c36fd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14829.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - imageadd: "new singularity hammer sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-14830.yml b/html/changelogs/AutoChangeLog-pr-14830.yml
new file mode 100644
index 0000000000..e6e95c36fd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14830.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - imageadd: "new singularity hammer sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-14836.yml b/html/changelogs/AutoChangeLog-pr-14836.yml
new file mode 100644
index 0000000000..80385cecce
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14836.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "7 more round tips have been added"
diff --git a/html/changelogs/AutoChangeLog-pr-14841.yml b/html/changelogs/AutoChangeLog-pr-14841.yml
new file mode 100644
index 0000000000..51697c7a37
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14841.yml
@@ -0,0 +1,4 @@
+author: "MrJWhit"
+delete-after: True
+changes:
+ - balance: "Removes cat meteors."
diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi
index 2027ee4205..612066728a 100644
Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi
index 7871911d4e..9341cc8e4c 100644
Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 74ca148039..33cd46d15f 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 6a224a419a..67d34a05a7 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 7ada41dbcf..36efd97189 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi
index 7c91a74004..84faabcc18 100644
Binary files a/icons/obj/meteor.dmi and b/icons/obj/meteor.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 68055d766d..5f45b9b168 100644
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/strings/tips.txt b/strings/tips.txt
index ead853263b..d4373b3606 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -303,3 +303,11 @@ You do not regenerate as much stamina while in combat mode. Resting (being on th
Keybinds can be reassigned in character setup on the keybindings tab. This is extremely useful, especially if you know how to use independent binds.
If your suit sensors have been shorted out, you can use cable coil to fix them by using the coil on your suit. Your suit needs to be in proper condition, however.
Most clothing when damaged can be repaired using cloth, but there may be some clothes out there that will require different stacks of materials.
+You should under no circumstances, teleport bread.
+Food made from upgraded machines has a higher quality. Food with a high enough quality can give good moodlets even if your species dislikes the kind of food!
+Frying something makes it edible, while still maintaining its original functionality.
+Slimepeople are damaged by most things that heal toxin damage, and healed by most things that deal it. You can recognise people with this functionality through them having a cyan coloured species name when examined!
+EMPs can be created by mixing uranium and iron. The power of the pulse is determined by the distance from its epicentre, and the maximum distance is determined by the volume of the reaction!
+Lizards start with a disabled mutation that allows them to breath fire. This can be unlocked through the usage of genetics!
+Several loadout items can be unlocked through progress in parts of the game. The progress for these can be tracked in the loadout menu.
+
diff --git a/tgui/packages/tgui/layouts/NtosWindow.js b/tgui/packages/tgui/layouts/NtosWindow.js
index 325f89a4a4..4078648928 100644
--- a/tgui/packages/tgui/layouts/NtosWindow.js
+++ b/tgui/packages/tgui/layouts/NtosWindow.js
@@ -28,6 +28,7 @@ export const NtosWindow = (props, context) => {
PC_stationtime,
PC_programheaders = [],
PC_showexitprogram,
+ PC_showpeneject,
} = data;
return (
{
src={resolveAsset(PC_apclinkicon)} />
)}
+ {!!PC_showpeneject && (
+