/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)