diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 8bde73c238..c0fa2370ef 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -26,7 +26,7 @@ var/global/list/language_keys[0] //table of say codes for all languages
var/global/list/whitelisted_species = list("Human")
// Posters
-var/global/list/datum/poster/poster_designs = typesof(/datum/poster) - /datum/poster
+var/global/list/poster_designs = list()
// Uplinks
var/list/obj/item/device/uplink/world_uplinks = list()
@@ -121,6 +121,12 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
if(S.flags & IS_WHITELISTED)
whitelisted_species += S.name
+ //Posters
+ paths = typesof(/datum/poster) - /datum/poster
+ for(var/T in paths)
+ var/datum/poster/P = new T
+ poster_designs += P
+
return 1
/* // Uncomment to debug chemical reaction list.
diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm
index 57d4b86555..3e26d117b2 100644
--- a/code/__HELPERS/turfs.dm
+++ b/code/__HELPERS/turfs.dm
@@ -5,3 +5,6 @@
while(mloc && mloc.loc && !istype(mloc.loc, /turf/))
mloc = mloc.loc
return mloc
+
+/proc/iswall(turf/T)
+ return (istype(T, /turf/simulated/wall) || istype(T, /turf/unsimulated/wall) || istype(T, /turf/simulated/shuttle/wall))
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index 68f60816fa..121c4d1667 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -23,9 +23,63 @@
name += " - No. [serial_number]"
..(loc)
+//Places the poster on a wall
+/obj/item/weapon/contraband/poster/afterattack(var/atom/A, var/mob/user, var/adjacent, var/clickparams)
+ if (!adjacent)
+ return
+
+ //must place on a wall and user must not be inside a closet/mecha/whatever
+ var/turf/W = A
+ if (!iswall(W) || !isturf(user.loc))
+ user << "\red You can't place this here!"
+ return
+
+ var/placement_dir = get_dir(user, W)
+ if (!(placement_dir in cardinal))
+ user << "You must stand directly in front of the wall you wish to place that on."
+ return
+
+ //just check if there is a poster on or adjacent to the wall
+ var/stuff_on_wall = 0
+ if (locate(/obj/structure/sign/poster) in W)
+ stuff_on_wall = 1
+
+ //crude, but will cover most cases. We could do stuff like check pixel_x/y but it's not really worth it.
+ for (var/dir in cardinal)
+ var/turf/T = get_step(W, dir)
+ if (locate(/obj/structure/sign/poster) in T)
+ stuff_on_wall = 1
+ break
+
+ if (stuff_on_wall)
+ user << "There is already a poster there!"
+ return
+
+ user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster.
+
+ var/obj/structure/sign/poster/P = new(user.loc, placement_dir=get_dir(user, W), serial=serial_number)
+
+ flick("poster_being_set", P)
+ //playsound(W, 'sound/items/poster_being_created.ogg', 100, 1) //why the hell does placing a poster make printer sounds?
+
+ var/oldsrc = src //get a reference to src so we can delete it after detaching ourselves
+ src = null
+ spawn(17)
+ if(!P) return
+
+ if(iswall(W) && user && P.loc == user.loc) //Let's check if everything is still there
+ user << "You place the poster!"
+ else
+ P.roll_and_drop(P.loc)
+
+ del(oldsrc) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway
+
+//I'm
+/obj/structure/sign/poster/proc/placement_check()
+
//############################## THE ACTUAL DECALS ###########################
-obj/structure/sign/poster
+/obj/structure/sign/poster
name = "poster"
desc = "A large piece of space-resistant printed paper. "
icon = 'icons/obj/contraband.dmi'
@@ -34,22 +88,42 @@ obj/structure/sign/poster
var/poster_type //So mappers can specify a desired poster
var/ruined = 0
-obj/structure/sign/poster/New(var/serial)
- var/designtype
- if (poster_type)
- designtype = text2path(poster_type)
- else
- if(serial_number == loc)
- serial_number = rand(1, poster_designs.len) //This is for the mappers that want individual posters without having to use rolled posters.
- designtype = poster_designs[serial_number]
-
- var/datum/poster/design=new designtype()
- name += " - [design.name]"
- desc += " [design.desc]"
- icon_state = design.icon_state // poster[serial_number]
- ..()
+/obj/structure/sign/poster/New(var/newloc, var/placement_dir=null, var/serial=null)
+ ..(newloc)
-obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(!serial)
+ serial = rand(1, poster_designs.len) //use a random serial if none is given
+
+ serial_number = serial
+ var/datum/poster/design = poster_designs[serial_number]
+ set_poster(design)
+
+ switch (placement_dir)
+ if (NORTH)
+ pixel_x = 0
+ pixel_y = 32
+ if (SOUTH)
+ pixel_x = 0
+ pixel_y = -32
+ if (EAST)
+ pixel_x = 32
+ pixel_y = 0
+ if (WEST)
+ pixel_x = -32
+ pixel_y = 0
+
+/obj/structure/sign/poster/initialize()
+ if (poster_type)
+ var/path = text2path(poster_type)
+ var/datum/poster/design = new path
+ set_poster(design)
+
+/obj/structure/sign/poster/proc/set_poster(var/datum/poster/design)
+ name = "[initial(name)] - [design.name]"
+ desc = "[initial(desc)] [design.desc]"
+ icon_state = design.icon_state // poster[serial_number]
+
+/obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wirecutters))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
if(ruined)
diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/game/objects/effects/decals/posters/bs12.dm
index 7370047233..eef2b2e3bf 100644
--- a/code/game/objects/effects/decals/posters/bs12.dm
+++ b/code/game/objects/effects/decals/posters/bs12.dm
@@ -234,12 +234,12 @@
name = "Security pinup"
desc = "This is a pin-up poster. A dark skinned white haired girl poses in the sunlight wearing a tank top with her stomach exposed. The text on the poster states \"M, Succubus of Security.\" and a lipstick mark stains the top right corner, as if kissed by the model herself."
- /datum/poster/bay_48
+/datum/poster/bay_48
icon_state="bsposter48"
name = "Borg pinup?"
desc = "This is a.. pin-up poster? It is a diagram on an old model of cyborg with a note scribbled in marker on the bottom, on the top there is a large XO written in red marker."
- /datum/poster/bay_49
+/datum/poster/bay_49
icon_state="bsposter49"
name = "Engineering recruitment"
desc = "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\""
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index 292d13f23f..0efa7bebc3 100644
--- a/maps/exodus-2.dmm
+++ b/maps/exodus-2.dmm
@@ -758,7 +758,7 @@
"oD" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"oE" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"oF" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
-"oG" = (/obj/structure/sign{desc = "This is a pinup poster."; icon = 'icons/obj/contraband.dmi'; icon_state = "bsposter50"; name = "pinup poster"; pixel_x = -32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
+"oG" = (/obj/structure/sign/poster{poster_type = "/datum/poster/bay_50"; pixel_x = -32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"oH" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 0; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"oI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space)
"oJ" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)