diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 5fd802bbf23..b79f0d11b37 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -28262,10 +28262,10 @@
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/mob/living/simple_animal/sloth/citrus,
/obj/structure/disposalpipe/segment{
dir = 9
},
+/mob/living/simple_animal/sloth/citrus,
/turf/open/floor/iron,
/area/cargo/qm)
"dEb" = (
@@ -38671,8 +38671,8 @@
dir = 4
},
/obj/machinery/airalarm/directional/west,
-/mob/living/simple_animal/pet/cat/runtime,
/obj/structure/disposalpipe/segment,
+/mob/living/simple_animal/pet/cat/runtime,
/turf/open/floor/iron,
/area/command/heads_quarters/cmo)
"fCE" = (
@@ -49945,10 +49945,10 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/mob/living/basic/cockroach,
/obj/structure/disposalpipe/segment{
dir = 4
},
+/mob/living/basic/cockroach,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"iRw" = (
@@ -73191,8 +73191,8 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/mob/living/simple_animal/pet/fox/renault,
/obj/machinery/newscaster/directional/south,
+/mob/living/simple_animal/pet/fox/renault,
/turf/open/floor/iron/dark,
/area/command/heads_quarters/captain)
"pGD" = (
@@ -86972,6 +86972,12 @@
},
/turf/open/floor/iron,
/area/cargo/miningoffice)
+"tIm" = (
+/obj/structure/sign/picture_frame/portrait/bar{
+ pixel_x = -32
+ },
+/turf/open/floor/iron/dark,
+/area/service/bar)
"tIE" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/decal/cleanable/dirt,
@@ -138800,7 +138806,7 @@ bAY
alf
heA
cgp
-heA
+aXI
aXI
aXI
aXI
@@ -139057,7 +139063,7 @@ iXT
alf
hFM
gMU
-unM
+tIm
guN
stu
pqt
diff --git a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm
index 4061f90d1c5..c8464823e68 100644
--- a/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm
+++ b/_maps/map_files/IceBoxStation/IcemoonUnderground_Above.dmm
@@ -2455,6 +2455,7 @@
/obj/item/vending_refill/cigarette,
/obj/machinery/light/small/directional/east,
/obj/structure/table/wood,
+/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron,
/area/service/bar)
"mC" = (
@@ -5850,8 +5851,10 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
},
-/obj/machinery/status_display/evac/directional/south,
/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/picture_frame/portrait/bar{
+ pixel_y = -32
+ },
/turf/open/floor/iron,
/area/service/bar)
"Cx" = (
@@ -7836,8 +7839,8 @@
/obj/effect/turf_decal/siding/wood{
dir = 8
},
-/mob/living/carbon/human/species/monkey/punpun,
/obj/structure/table/wood,
+/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/iron,
/area/service/bar)
"Ls" = (
@@ -9142,12 +9145,12 @@
/obj/effect/turf_decal/tile/red{
dir = 1
},
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/mob/living/simple_animal/bot/secbot/beepsky{
desc = "Powered by the tears and sweat of laborers.";
name = "Prison Ofitser"
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/mine/laborcamp/security)
"Rx" = (
@@ -9508,6 +9511,7 @@
dir = 1
},
/obj/machinery/light/small/directional/east,
+/obj/machinery/status_display/evac/directional/east,
/turf/open/floor/stone,
/area/service/bar/atrium)
"Te" = (
@@ -10001,7 +10005,6 @@
},
/obj/machinery/duct,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron,
/area/service/bar)
"Vs" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 75428e3c84a..f6dbe723b68 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -22285,11 +22285,11 @@
/area/security/warden)
"coG" = (
/obj/structure/bed/dogbed/renault,
-/mob/living/simple_animal/pet/fox/renault,
/obj/machinery/button/door/directional/south{
id = "captain_escape";
name = "Tactical Relocation Toggle"
},
+/mob/living/simple_animal/pet/fox/renault,
/turf/open/floor/wood,
/area/command/heads_quarters/captain)
"coH" = (
@@ -28523,11 +28523,6 @@
/obj/effect/turf_decal/tile/blue,
/obj/machinery/light/directional/south,
/obj/effect/turf_decal/stripes/corner,
-/mob/living/simple_animal/bot/cleanbot{
- auto_patrol = 1;
- icon_state = "cleanbot1";
- name = "Mopficcer Sweepsky"
- },
/obj/machinery/button/door/directional/south{
id = "custodialwagon";
name = "Custodial Bay Toggle";
@@ -28536,6 +28531,11 @@
/obj/structure/disposalpipe/segment{
dir = 5
},
+/mob/living/simple_animal/bot/cleanbot{
+ auto_patrol = 1;
+ icon_state = "cleanbot1";
+ name = "Mopficcer Sweepsky"
+ },
/turf/open/floor/iron,
/area/hallway/primary/starboard)
"dAD" = (
@@ -50912,8 +50912,8 @@
/obj/structure/reagent_dispensers/beerkeg{
pixel_y = 5
},
-/obj/structure/sign/poster/contraband/red_rum{
- pixel_y = -30
+/obj/structure/sign/picture_frame/portrait/bar{
+ pixel_y = -32
},
/turf/open/floor/iron/dark,
/area/service/bar)
@@ -69344,10 +69344,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/mob/living/simple_animal/bot/cleanbot/medbay,
/obj/structure/disposalpipe/segment{
dir = 10
},
+/mob/living/simple_animal/bot/cleanbot/medbay,
/turf/open/floor/iron/dark,
/area/medical/storage)
"sMk" = (
@@ -83637,8 +83637,8 @@
/obj/structure/water_source/puddle,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/mob/living/carbon/human/species/monkey,
/obj/machinery/light_switch/directional/south,
+/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"yll" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 6ffbb0afc58..5e428824162 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -44131,7 +44131,7 @@
/area/science/storage)
"nFR" = (
/obj/machinery/vending/boozeomat,
-/obj/structure/sign/plaques/deempisi{
+/obj/structure/sign/picture_frame/portrait/bar{
pixel_y = -28
},
/obj/effect/turf_decal/tile/bar{
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index 55fcb2a058f..f26d46c922d 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -67028,7 +67028,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/structure/sign/plaques/deempisi{
+/obj/structure/sign/picture_frame/portrait/bar{
pixel_y = 28
},
/obj/structure/cable,
diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm
index 14fa7c50d07..63bb46763a5 100644
--- a/_maps/shuttles/emergency_monastery.dmm
+++ b/_maps/shuttles/emergency_monastery.dmm
@@ -1222,7 +1222,7 @@
/turf/open/floor/iron/dark,
/area/shuttle/escape)
"oH" = (
-/obj/structure/sign/plaques/deempisi{
+/obj/structure/sign/picture_frame/portrait{
pixel_y = 28
},
/obj/item/kirbyplants{
@@ -2269,7 +2269,7 @@
/area/shuttle/escape)
"zU" = (
/obj/structure/dresser,
-/obj/structure/sign/plaques/deempisi{
+/obj/structure/sign/picture_frame/portrait{
pixel_y = 28
},
/turf/open/floor/iron/grimy,
diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm
index 1870d4dc058..6ebb717cf62 100644
--- a/code/__DEFINES/maps.dm
+++ b/code/__DEFINES/maps.dm
@@ -26,6 +26,9 @@ require only minor tweaks.
#define SPACERUIN_MAP_EDGE_PAD 15
+/// Special map path value for custom adminloaded stations.
+#define CUSTOM_MAP_PATH "custom"
+
// traits
// boolean - marks a level as having that property if present
#define ZTRAIT_CENTCOM "CentCom"
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index 8bd982c30b1..1e0bb974373 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -293,7 +293,7 @@ Used by the AI doomsday and the self-destruct nuke.
#undef INIT_ANNOUNCE
// Custom maps are removed after station loading so the map files does not persist for no reason.
- if(config.map_path == "custom")
+ if(config.map_path == CUSTOM_MAP_PATH)
fdel("_maps/custom/[config.map_file]")
// And as the file is now removed set the next map to default.
next_map_config = load_map_config(default_to_box = TRUE)
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index e5b3bc93aa6..a7d217ce2ef 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -262,6 +262,19 @@ SUBSYSTEM_DEF(persistence)
if(fexists(frame_path))
return json_decode(file2text(frame_path))
+/// Removes the identifier of a persitent photo frame from the json.
+/datum/controller/subsystem/persistence/proc/RemovePhotoFrame(identifier)
+ var/frame_path = file("data/photo_frames.json")
+ if(!fexists(frame_path))
+ return
+
+ var/frame_json = json_decode(file2text(frame_path))
+ frame_json -= identifier
+
+ frame_json = json_encode(frame_json)
+ fdel(frame_path)
+ WRITE_FILE(frame_path, frame_json)
+
/datum/controller/subsystem/persistence/proc/LoadPhotoPersistence()
var/album_path = file("data/photo_albums.json")
var/frame_path = file("data/photo_frames.json")
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 2fe181304e5..152a8bcff78 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -212,8 +212,8 @@
* the Atom subsystem intialization, or if the atom is being loaded from the map template.
* If the item is being created at runtime any time after the Atom subsystem is intialized then
* it's false.
- *
- * The mapload argument occupies the same position as loc when Initialize() is called by New().
+ *
+ * The mapload argument occupies the same position as loc when Initialize() is called by New().
* loc will no longer be needed after it passed New(), and thus it is being overwritten
* with mapload at the end of atom/New() before this proc (atom/Initialize()) is called.
*
@@ -681,8 +681,6 @@
/atom/proc/examine_more(mob/user)
. = list()
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE_MORE, user, .)
- if(!LAZYLEN(.)) // lol ..length
- return list(span_notice("You examine [src] closer, but find nothing of interest..."))
/**
* Updates the appearence of the icon
diff --git a/code/game/objects/structures/plaques/static_plaques.dm b/code/game/objects/structures/plaques/static_plaques.dm
index 54e0a2d37cc..0e497d93f15 100644
--- a/code/game/objects/structures/plaques/static_plaques.dm
+++ b/code/game/objects/structures/plaques/static_plaques.dm
@@ -133,9 +133,3 @@
/obj/structure/sign/plaques/kiddie/perfect_drone
name = "\improper 'Perfect Drone' sign"
desc = "A guide to the drone shell dispenser, detailing the constructive and destructive applications of modern repair drones, as well as the development of the incorruptible cyborg servants of tomorrow, available today."
-
-/obj/structure/sign/plaques/deempisi
- name = "\improper Mr. Deempisi portrait"
- desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"
- icon_state = "monkey_painting"
- custom_materials = list(/datum/material/wood = 2000) //The same as /obj/structure/sign/picture_frame
diff --git a/code/modules/admin/verbs/maprotation.dm b/code/modules/admin/verbs/maprotation.dm
index 9c781af5ed3..57b5c111da6 100644
--- a/code/modules/admin/verbs/maprotation.dm
+++ b/code/modules/admin/verbs/maprotation.dm
@@ -80,7 +80,7 @@
continue
VM.shuttles[s] = shuttle
- VM.map_path = "custom"
+ VM.map_path = CUSTOM_MAP_PATH
VM.map_file = "[map_file]"
VM.config_filename = "data/next_map.json"
var/json_value = list(
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 10d7e1b0235..d1ce833c05a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -470,6 +470,8 @@
handle_eye_contact(examinify)
else
result = examinify.examine_more(src)
+ if(!length(result))
+ result += span_notice("You examine [src] closer, but find nothing of interest...")
else
result = examinify.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist?
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index ffe6c6b58e9..ac1ad6ddf7a 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -67,6 +67,8 @@
custom_materials = list(/datum/material/wood = 2000)
var/obj/item/photo/framed
var/persistence_id
+ var/del_id_on_destroy = FALSE
+ var/art_value = OK_ART
var/can_decon = TRUE
#define FRAME_DEFINE(id) /obj/structure/sign/picture_frame/##id/persistence_id = #id
@@ -77,7 +79,7 @@
/obj/structure/sign/picture_frame/Initialize(mapload, dir, building)
. = ..()
- AddElement(/datum/element/art, OK_ART)
+ AddElement(/datum/element/art, art_value)
LAZYADD(SSpersistence.photo_frames, src)
if(dir)
setDir(dir)
@@ -87,6 +89,8 @@
/obj/structure/sign/picture_frame/Destroy()
LAZYREMOVE(SSpersistence.photo_frames, src)
+ if(persistence_id && del_id_on_destroy)
+ SSpersistence.RemovePhotoFrame(persistence_id)
return ..()
/obj/structure/sign/picture_frame/proc/get_photo_id()
@@ -110,11 +114,9 @@
update_appearance()
/obj/structure/sign/picture_frame/examine(mob/user)
- if(in_range(src, user) && framed)
- framed.show(user)
- return list()
- else
- return ..()
+ . = ..()
+ if(in_range(src, user))
+ framed?.show(user)
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, params)
if(can_decon && (I.tool_behaviour == TOOL_SCREWDRIVER || I.tool_behaviour == TOOL_WRENCH))
@@ -126,8 +128,9 @@
else if(I.tool_behaviour == TOOL_WIRECUTTER && framed)
framed.forceMove(drop_location())
- framed = null
user.visible_message(span_warning("[user] cuts away [framed] from [src]!"))
+ framed = null
+ update_appearance()
return
else if(istype(I, /obj/item/photo))
@@ -172,6 +175,65 @@
desc = "A photo frame to commemorate crewmembers that distinguished themselves in the line of duty. WARNING: unauthorized tampering will be severely punished."
can_decon = FALSE
+/// This used to be a plaque portrait of a monkey. Now it's been revamped into something more.
+/obj/structure/sign/picture_frame/portrait
+ icon_state = "frame-monkey"
+ can_decon = FALSE
+ art_value = GOOD_ART
+ var/portrait_name
+ var/portrait_state
+ var/portrait_desc
+
+/obj/structure/sign/picture_frame/portrait/Initialize()
+ . = ..()
+ switch(rand(1,4))
+ if(1) // Deempisi
+ name = "\improper Mr. Deempisi portrait"
+ icon_state = "frame-monkey"
+ desc = "Under the portrait a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"
+ if(2) // A fruit
+ name = "picture of a fruit"
+ icon_state = "frame-fruit"
+ desc = "Ceci n'est pas une orange."
+ if(3) // Rat
+ name = "\improper Tom portrait"
+ desc = "Jerry the cat is still not amused."
+ icon_state = "frame-rat"
+ if(4) // Ratvar
+ name = "portrait of the imprisoned god"
+ desc = "Under the portrait a plaque reads: 'In loving memory of Ratvar, ancient powerful entity and rival of Nar'Sie, \
+ ultimately struck down by NT bluespace artillery at the hands of Outpost 17 crew. Rust in peace.'" // common core lore.
+ icon_state = "frame-ratvar"
+ portrait_name = name
+ portrait_state = icon_state
+ portrait_desc = desc
+
+/obj/structure/sign/picture_frame/portrait/update_name(updates)
+ if(framed)
+ name = initial(name)
+ else
+ name = portrait_name
+ return ..()
+
+/obj/structure/sign/picture_frame/portrait/update_icon_state(updates)
+ . = ..()
+ if(framed)
+ icon_state = "frame-overlay"
+ else
+ icon_state = portrait_state
+
+/obj/structure/sign/picture_frame/portrait/update_desc(updates)
+ . = ..()
+ if(framed)
+ desc = "Every time you look it makes you laugh."
+ else
+ desc = portrait_desc
+
+/obj/structure/sign/picture_frame/portrait/examine_more(mob/user)
+ . = ..()
+ if(!framed)
+ . += span_notice("The frame and the picture are glued together, but you guess you could slip a photo between the two.")
+
//persistent frames, make sure the same ID doesn't appear more than once per map
/obj/structure/sign/picture_frame/showroom/one
persistence_id = "frame_showroom1"
@@ -184,3 +246,13 @@
/obj/structure/sign/picture_frame/showroom/four
persistence_id = "frame_showroom4"
+
+/obj/structure/sign/picture_frame/portrait/bar
+ persistence_id = "frame_bar"
+ del_id_on_destroy = TRUE
+
+///Generates a persistence id unique to the current map. Every bar should feel a little bit different after all.
+/obj/structure/sign/picture_frame/portrait/bar/Initialize()
+ if(SSmapping.config.map_path != CUSTOM_MAP_PATH) //skip adminloaded custom maps.
+ persistence_id = "frame_bar_[SSmapping.config.map_name]"
+ return ..()
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index c3c2c6a7028..3b1310ed53a 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ