/obj/item/weapon/picture_frame name = "picture frame" desc = "Its patented design allows it to be folded larger or smaller to accommodate standard paper, photo, and poster, and canvas sizes." icon = 'icons/obj/bureaucracy.dmi' var/icon_base var/obj/displayed var/list/wide_posters = list( "poster22_legit", "poster23", "poster23_legit", "poster24", "poster24_legit", "poster25", "poster27_legit", "poster28", "poster29") /obj/item/weapon/picture_frame/New(loc, obj/item/weapon/D) ..() if(D) insert(D) update_icon() /obj/item/weapon/picture_frame/Destroy() if(displayed) displayed = null for(var/A in contents) qdel(A) return ..() /obj/item/weapon/picture_frame/update_icon() overlays.Cut() if(displayed) overlays |= getFlatIcon(displayed) if(istype(displayed, /obj/item/weapon/photo)) icon_state = "[icon_base]-photo" else if(istype(displayed, /obj/structure/sign/poster)) icon_state = "[icon_base]-[(displayed.icon_state in wide_posters) ? "wposter" : "poster"]" else if(istype(displayed, /obj/item/weapon/canvas)) icon_state = "[icon_base]-canvas-[displayed.icon_state]" else icon_state = "[icon_base]-paper" overlays |= icon_state /obj/item/weapon/picture_frame/proc/insert(obj/D) if(istype(D, /obj/item/weapon/contraband/poster)) var/obj/item/weapon/contraband/poster/P = D displayed = P.resulting_poster P.resulting_poster = null else displayed = D name = displayed.name displayed.pixel_x = 0 displayed.pixel_y = 0 displayed.forceMove(src) if(istype(D, /obj/item/weapon/contraband/poster)) qdel(D) /obj/item/weapon/picture_frame/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/screwdriver)) if(displayed) playsound(src, 'sound/items/Screwdriver.ogg', 100, 1) user.visible_message("[user] unfastens \the [displayed] out of \the [src].", "You unfasten \the [displayed] out of \the [src].") if(istype(displayed, /obj/structure/sign/poster)) var/obj/structure/sign/poster/P = displayed P.roll_and_drop(user.loc) else displayed.forceMove(user.loc) displayed = null name = initial(name) update_icon() else to_chat(user, "There is nothing to remove from \the [src].") else if(istype(I, /obj/item/weapon/crowbar)) playsound(src, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] breaks down \the [src].", "You break down \the [src].") for(var/A in contents) if(istype(A, /obj/structure/sign/poster)) var/obj/structure/sign/poster/P = A P.roll_and_drop(user.loc) else var/obj/O = A O.forceMove(user.loc) displayed = null qdel(src) else if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/contraband/poster)) if(!displayed) user.unEquip(I) insert(I) update_icon() else to_chat(user, "\The [src] already contains \a [displayed].") else return ..() /obj/item/weapon/picture_frame/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag && istype(target, /turf/simulated/wall)) place(target, user) else ..() /obj/item/weapon/picture_frame/proc/place(turf/T, mob/user) var/stuff_on_wall = 0 for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff if(istype(O, /obj/structure/sign)) to_chat(user, "\The [T] is far too cluttered to place \a [src]!") return stuff_on_wall++ if(stuff_on_wall >= 4) to_chat(user, "\The [T] is far too cluttered to place \a [src]!") return to_chat(user, "You start place \the [src] on \the [T].") var/px = 0 var/py = 0 var/newdir = getRelativeDirection(user, T) switch(newdir) if(NORTH) py = 32 if(EAST) px = 32 if(SOUTH) py = -32 if(WEST) px = -32 else to_chat(user, "You cannot reach \the [T] from here!") return user.unEquip(src) var/obj/structure/sign/picture_frame/PF = new(user.loc, src) PF.dir = newdir PF.pixel_x = px PF.pixel_y = py playsound(PF.loc, 'sound/items/Deconstruct.ogg', 100, 1) /obj/item/weapon/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "") ..() if(displayed) displayed.examine(user, distance, infix, suffix) /obj/item/weapon/picture_frame/attack_self(mob/user) if(displayed) if(istype(displayed, /obj/item)) var/obj/item/I = displayed I.attack_self(user) else ..() /obj/item/weapon/picture_frame/glass icon_base = "glass" icon_state = "glass-poster" materials = list(MAT_METAL = 25, MAT_GLASS = 75) /obj/item/weapon/picture_frame/wooden icon_base = "wood" icon_state = "wood-poster" /obj/item/weapon/picture_frame/wooden/New() ..() new /obj/item/stack/sheet/wood(src, 1) /obj/structure/sign/picture_frame icon = 'icons/obj/bureaucracy.dmi' icon_state = "glass-poster" var/obj/item/weapon/picture_frame/frame var/obj/item/weapon/explosive var/tilted = 0 var/tilt_transform = null /obj/structure/sign/picture_frame/New(loc, F) ..() frame = F frame.pixel_x = 0 frame.pixel_y = 0 frame.forceMove(src) name = frame.name update_icon() if(!tilt_transform) tilt_transform = turn(matrix(), -10) if(tilted) transform = tilt_transform verbs |= /obj/structure/sign/picture_frame/proc/untilt else verbs |= /obj/structure/sign/picture_frame/proc/tilt /obj/structure/sign/picture_frame/Destroy() if(frame) qdel(frame) frame = null return ..() /obj/structure/sign/picture_frame/update_icon() overlays.Cut() if(frame) icon = null icon_state = null overlays |= getFlatIcon(frame) else icon = initial(icon) icon_state = initial(icon_state) /obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/screwdriver)) playsound(src, 'sound/items/Screwdriver.ogg', 100, 1) user.visible_message("[user] begins to unfasten \the [src] from the wall.", "You begin to unfasten \the [src] from the wall.") if(do_after(user, 100, target = src)) playsound(src, 'sound/items/Deconstruct.ogg', 100, 1) user.visible_message("[user] unfastens \the [src] from the wall.", "You unfasten \the [src] from the wall.") frame.forceMove(user.loc) frame = null if(explosive) explosive.forceMove(user.loc) explosive = null qdel(src) if(istype(I, /obj/item/weapon/grenade) || istype(I, /obj/item/weapon/grenade/plastic/c4)) if(explosive) to_chat(user, "There is already a device attached behind \the [src], remove it first.") return 1 if(!tilted) to_chat(user, "\The [src] needs to be already tilted before being rigged with \the [I].") return 1 user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].") if(do_after(user, 150, target = src)) if(explosive || !tilted) return playsound(src, 'sound/weapons/handcuffs.ogg', 50, 1) user.unEquip(I) explosive = I I.forceMove(src) user.visible_message("[user] fiddles with the back of \the [src].", "You secure \the [I] behind \the [src].") message_admins("[key_name_admin(user)] attached [I] to a picture frame.") log_game("[key_name_admin(user)] attached [I] to a picture frame.") return 1 else return ..() /obj/structure/sign/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "") if(frame) frame.examine(user, distance, infix, suffix) else ..() /obj/structure/sign/picture_frame/attack_hand(mob/user) if(frame) frame.attack_self(user) else ..() /obj/structure/sign/picture_frame/ex_act(severity) explode() ..(severity) /obj/structure/sign/picture_frame/proc/explode() if(istype(explosive, /obj/item/weapon/grenade)) var/obj/item/weapon/grenade/G = explosive explosive = null G.prime() /obj/structure/sign/picture_frame/proc/toggle_tilt(mob/user) if(!isliving(usr) || usr.stat) return tilted = !tilted if(tilted) animate(src, transform = tilt_transform, time = 10, easing = BOUNCE_EASING) verbs -= /obj/structure/sign/picture_frame/proc/tilt verbs |= /obj/structure/sign/picture_frame/proc/untilt else animate(src, transform = matrix(), time = 10, easing = CUBIC_EASING | EASE_IN) verbs -= /obj/structure/sign/picture_frame/proc/untilt verbs |= /obj/structure/sign/picture_frame/proc/tilt explode() /obj/structure/sign/picture_frame/proc/tilt() set name = "Tilt Picture" set category = "Object" set src in oview(1) toggle_tilt(usr) /obj/structure/sign/picture_frame/proc/untilt() set name = "Straighten Picture" set category = "Object" set src in oview(1) toggle_tilt(usr) /obj/structure/sign/picture_frame/hear_talk(mob/living/M as mob, msg) ..() for(var/obj/O in contents) O.hear_talk(M, msg) /obj/structure/sign/picture_frame/hear_message(mob/living/M as mob, msg) ..() for(var/obj/O in contents) O.hear_message(M, msg)