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)