///////////////// // NEW DEFINES // ///////////////// /client var/viewingCanvas = 0 //If this is 1, as soon as client /TRIES/ to move the view resets. /////////// // EASEL // /////////// /obj/structure/easel name = "easel" desc = "only for the finest of art!" icon = 'icons/obj/artstuff.dmi' icon_state = "easel" density = 1 var/obj/item/weapon/canvas/painting = null //Adding canvases /obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params) if(istype(I, /obj/item/weapon/canvas)) var/obj/item/weapon/canvas/C = I user.unEquip(C) painting = C C.loc = get_turf(src) C.layer = layer+0.1 user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].") return ..() //Stick to the easel like glue /obj/structure/easel/Move() var/turf/T = get_turf(src) ..() if(painting && painting.loc == T) //Only move if it's near us. painting.loc = get_turf(src) else painting = null ////////////// // CANVASES // ////////////// #define AMT_OF_CANVASES 4 //Keep this up to date or shit will break. //To safe memory on making /icons we cache the blanks.. var/global/list/globalBlankCanvases[AMT_OF_CANVASES] /obj/item/weapon/canvas name = "11px by 11px canvas" desc = "Draw out your soul on this canvas! Only crayons can draw on it. Examine it to focus on the canvas." icon = 'icons/obj/artstuff.dmi' icon_state = "11x11" var/whichGlobalBackup = 1 //List index /obj/item/weapon/canvas/nineteenXnineteen name = "19px by 19px canvas" icon_state = "19x19" whichGlobalBackup = 2 /obj/item/weapon/canvas/twentythreeXnineteen name = "23px by 19px canvas" icon_state = "23x19" whichGlobalBackup = 3 /obj/item/weapon/canvas/twentythreeXtwentythree name = "23px by 23px canvas" icon_state = "23x23" whichGlobalBackup = 4 //Find the right size blank canvas /obj/item/weapon/canvas/proc/getGlobalBackup() . = null if(globalBlankCanvases[whichGlobalBackup]) . = globalBlankCanvases[whichGlobalBackup] else var/icon/I = icon(initial(icon),initial(icon_state)) globalBlankCanvases[whichGlobalBackup] = I . = I //One pixel increments /obj/item/weapon/canvas/attackby(var/obj/item/I, var/mob/user, params) //Click info var/list/click_params = params2list(params) var/pixX = text2num(click_params["icon-x"]) var/pixY = text2num(click_params["icon-y"]) //Should always be true, otherwise you didn't click the object, but let's check because SS13~ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return var/icon/masterpiece = icon(icon,icon_state) //Cleaning one pixel with a soap or rag if(istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag)) //Pixel info created only when needed var/thePix = masterpiece.GetPixel(pixX,pixY) var/icon/Ico = getGlobalBackup() if(!Ico) qdel(masterpiece) return var/theOriginalPix = Ico.GetPixel(pixX,pixY) if(thePix != theOriginalPix) //colour changed DrawPixelOn(theOriginalPix,pixX,pixY) qdel(masterpiece) return 1 //Drawing one pixel with a crayon if(istype(I, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = I var/pix = masterpiece.GetPixel(pixX, pixY) if(pix && pix != C.colour) // if the located pixel isn't blank (null)) DrawPixelOn(C.colour, pixX, pixY) qdel(masterpiece) return 1 ..() //Clean the whole canvas /obj/item/weapon/canvas/attack_self(var/mob/user) if(!user) return var/icon/blank = getGlobalBackup() if(blank) //it's basically a giant etch-a-sketch icon = blank user.visible_message("[user] cleans the canvas.","You clean the canvas.") //Examine to enlarge /obj/item/weapon/canvas/examine(mob/user) ..(user) if(in_range(user, src) && get_turf(src) && user.client && ishuman(user)) //Let only humans be the robust zoominators. I'm too spooked other mobs trying to use it may get broken huds. if(src.loc == user || get_turf(src) == get_turf(user)) to_chat(user, "[src] has to be on the ground to focus on it!") return to_chat(user, "You focus on \the [src].") user.client.screen = list() //This is because screen objects go way past the view bounds we set, therefore not allowing stretch to fit to zoom in properly. user.client.reset_stretch = winget(user.client, "mapwindow.map", "icon-size") //Remember previous icon-size user.client.view = 3 //Decrease view winset(user.client, "mapwindow.map", "icon-size=0") //Enable stretch-to-fit user.client.viewingCanvas = 1 //Reset everything we just changed as soon as client tries to move else to_chat(user, "It is too far away.") #undef AMT_OF_CANVASES