From f9564cbe5e003d17f7bc5ab43e4e6eab47639edd Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 7 Dec 2014 22:14:49 -0500 Subject: [PATCH] Poster fixes Fixes #7261 Fixes placed posters being visible on both sides of the wall. Fixes the poster_type var used to specify certain poster designs on the map not working correctly, and makes the nuke op shuttle poster an actual poster. Poster placement now belongs to the poster object instead of turf/simulated/ Posters can now be placed on unsimulated and shuttle walls. --- code/__HELPERS/global_lists.dm | 8 +- code/__HELPERS/turfs.dm | 3 + .../game/objects/effects/decals/contraband.dm | 106 +++++++++++++++--- .../objects/effects/decals/posters/bs12.dm | 4 +- maps/exodus-2.dmm | 2 +- 5 files changed, 103 insertions(+), 20 deletions(-) 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)