/* * Crayons */ #define CRAYON_MESSAGE_MAX_LENGTH 16 /obj/item/toy/crayon name = "crayon" desc = "A colourful crayon. Looks tasty. Mmmm..." icon = 'icons/obj/crayons.dmi' icon_state = "crayonred" w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_FLAG_BELT | SLOT_FLAG_EARS attack_verb = list("attacked", "coloured") toolspeed = 1 var/colour = COLOR_RED var/drawtype = "rune" var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid","arrowleft","arrowright","arrowup","arrowdown","chicken","hailcrab","brokenheart","peace","scribble","scribble2","scribble3","skrek","squish","tunnelsnake","yip","youaredead") var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") var/uses = 30 //0 for unlimited uses var/instant = 0 var/colourName = "red" //for updateIcon purposes var/dat var/busy = FALSE var/list/validSurfaces = list(/turf/simulated/floor) /// How many times this crayon has been gnawed on var/times_eaten = 0 /// How many times a crayon can be bitten before being depleted. You eated it var/max_bites = 4 /// The stored message in the crayon. var/preset_message /// The index of the character in the message that will be drawn next. var/preset_message_index = 0 /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming the [name] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS|OXYLOSS /obj/item/toy/crayon/New() ..() drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1, 8)]") /obj/item/toy/crayon/attack_self(mob/living/user as mob) update_window(user) /obj/item/toy/crayon/proc/update_window(mob/living/user as mob) var/current_drawtype = drawtype if(preset_message_index > 0) current_drawtype = copytext(preset_message, 1, preset_message_index) current_drawtype += "[preset_message[preset_message_index]]" current_drawtype += copytext(preset_message, preset_message_index + 1) current_drawtype = uppertext(current_drawtype) dat += "

Currently selected: [current_drawtype]


" dat += "Random letterPick letter
" dat += "Message" dat += "
" dat += "

Runes:


" dat += "Random rune" for(var/i = 1; i <= 8; i++) dat += "Rune [i]" if(!((i + 1) % 3)) //3 buttons in a row dat += "
" dat += "
" graffiti.Find() dat += "

Graffiti:


" dat += "Random graffiti" var/c = 1 for(var/T in graffiti) dat += "[T]" if(!((c + 1) % 3)) //3 buttons in a row dat += "
" c++ dat += "
" var/datum/browser/popup = new(user, "crayon", name, 300, 500) popup.set_content(dat) popup.open() dat = "" /obj/item/toy/crayon/Topic(href, href_list, hsrc) var/temp = "a" preset_message_index = 0 switch(href_list["type"]) if("random_letter") temp = pick(letters) if("letter") temp = input("Choose the letter.", "Scribbles") in letters if("random_rune") temp = "rune[rand(1, 8)]" if("random_graffiti") temp = pick(graffiti) if("message") var/regex/graffiti_chars = regex("\[^a-zA-Z0-9+\\-!?=%&,.#\\/\]", "g") var/new_preset = input(usr, "Set the message. Max length [CRAYON_MESSAGE_MAX_LENGTH] characters.") new_preset = copytext(new_preset, 1, CRAYON_MESSAGE_MAX_LENGTH) preset_message = lowertext(graffiti_chars.Replace(new_preset, "")) if(preset_message != "") log_admin("[key_name(usr)] has set the message of [src] to \"[preset_message]\".") preset_message_index = 1 else temp = href_list["type"] if((usr.restrained() || usr.stat || !usr.is_in_active_hand(src))) return drawtype = temp update_window(usr) /obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity) if(!proximity) return if(busy) return if(is_type_in_list(target,validSurfaces)) var/temp = "rune" if(preset_message_index > 0) temp = "letter" drawtype = preset_message[preset_message_index] else if(letters.Find(drawtype)) temp = "letter" else if(graffiti.Find(drawtype)) temp = "graffiti" to_chat(user, "You start drawing a [temp] on the [target.name].") busy = TRUE if(instant || do_after(user, 50 * toolspeed, target = target)) var/obj/effect/decal/cleanable/crayon/C = new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp) C.add_hiddenprint(user) to_chat(user, "You finish drawing [temp].") if(preset_message_index > 0) preset_message_index++ if(preset_message_index > length(preset_message)) preset_message_index = 1 update_window(usr) if(uses) uses-- if(!uses) to_chat(user, "You used up your [name]!") qdel(src) busy = FALSE /obj/item/toy/crayon/attack(mob/M, mob/user) if(M == user) if(ishuman(user)) var/mob/living/carbon/human/H = user if(!H.check_has_mouth()) to_chat(user, "You do not have a mouth!") return times_eaten++ playsound(loc, 'sound/items/eatfood.ogg', 50, 0) user.adjust_nutrition(5) if(times_eaten < max_bites) to_chat(user, "You take a bite of the [name]. Delicious!") else to_chat(user, "There is no more of [name] left!") qdel(src) else ..() /obj/item/toy/crayon/examine(mob/user) . = ..() if(!user.Adjacent(src) || !times_eaten) return if(times_eaten == 1) . += "[src] was bitten by someone!" else . += "[src] was bitten multiple times!" /obj/item/toy/crayon/red name = "red crayon" icon_state = "crayonred" colour = COLOR_RED colourName = "red" /obj/item/toy/crayon/orange name = "orange crayon" icon_state = "crayonorange" colour = COLOR_ORANGE colourName = "orange" /obj/item/toy/crayon/yellow name = "yellow crayon" icon_state = "crayonyellow" colour = COLOR_YELLOW colourName = "yellow" /obj/item/toy/crayon/green name = "green crayon" icon_state = "crayongreen" colour = COLOR_GREEN colourName = "green" /obj/item/toy/crayon/blue name = "blue crayon" icon_state = "crayonblue" colour = COLOR_BLUE colourName = "blue" /obj/item/toy/crayon/purple name = "purple crayon" icon_state = "crayonpurple" colour = COLOR_PURPLE colourName = "purple" /obj/item/toy/crayon/random/New() icon_state = pick("crayonred", "crayonorange", "crayonyellow", "crayongreen", "crayonblue", "crayonpurple") switch(icon_state) if("crayonred") name = "red crayon" colour = COLOR_RED colourName = "red" if("crayonorange") name = "orange crayon" colour = COLOR_ORANGE colourName = "orange" if("crayonyellow") name = "yellow crayon" colour = COLOR_YELLOW colourName = "yellow" if("crayongreen") name = "green crayon" colour =COLOR_GREEN colourName = "green" if("crayonblue") name = "blue crayon" colour = COLOR_BLUE colourName = "blue" if("crayonpurple") name = "purple crayon" colour = COLOR_PURPLE colourName = "purple" ..() /obj/item/toy/crayon/black name = "black crayon" icon_state = "crayonblack" colour = "#000000" colourName = "black" /obj/item/toy/crayon/white name = "white crayon" icon_state = "crayonwhite" colour = "#FFFFFF" colourName = "white" /obj/item/toy/crayon/white/chalk name = "detective's chalk" desc = "A stick of white chalk for marking crime scenes." gender = PLURAL toolspeed = 0.25 /obj/item/toy/crayon/mime name = "mime crayon" desc = "A very sad-looking crayon." icon_state = "crayonmime" colour = "#FFFFFF" colourName = "mime" uses = 0 /obj/item/toy/crayon/mime/attack_self(mob/living/user as mob) update_window(user) /obj/item/toy/crayon/mime/update_window(mob/living/user as mob) dat += "
   Change color
" ..() /obj/item/toy/crayon/mime/Topic(href,href_list) if(!Adjacent(usr) || usr.incapacitated()) return if(href_list["color"]) if(colour != COLOR_WHITE) colour = COLOR_WHITE else colour = COLOR_BLACK update_window(usr) else ..() /obj/item/toy/crayon/rainbow name = "rainbow crayon" icon_state = "crayonrainbow" colour = "#FFF000" colourName = "rainbow" uses = 0 /obj/item/toy/crayon/rainbow/attack_self(mob/living/user as mob) update_window(user) /obj/item/toy/crayon/rainbow/update_window(mob/living/user as mob) dat += "
   Change color
" ..() /obj/item/toy/crayon/rainbow/Topic(href,href_list[]) if(!Adjacent(usr) || usr.incapacitated()) return if(href_list["color"]) var/temp = input(usr, "Please select colour.", "Crayon colour") as color colour = temp update_window(usr) else ..() //Spraycan stuff /obj/item/toy/crayon/spraycan name = "\improper Nanotrasen-brand Rapid Paint Applicator" desc = "A metallic container containing spray paint." icon_state = "spraycan_cap" var/capped = TRUE instant = TRUE validSurfaces = list(/turf/simulated/floor,/turf/simulated/wall) /obj/item/toy/crayon/spraycan/New() ..() update_icon() /obj/item/toy/crayon/spraycan/attack(mob/M, mob/user) return // To stop you from eating spraycans. It's TOO SILLY! /obj/item/toy/crayon/spraycan/attack_self(mob/living/user) var/choice = tgui_input_list(user, "Do you want to...", "Spraycan Options", list("Toggle Cap","Change Drawing", "Change Color")) switch(choice) if("Toggle Cap") to_chat(user, "You [capped ? "remove" : "replace"] the cap of [src].") capped = !capped update_icon() if("Change Drawing") ..() if("Change Color") colour = input(user,"Choose Color") as color update_icon() /obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user as mob, proximity) if(!proximity) return if(capped) to_chat(user, "You cannot spray [target] while the cap is still on!") return if(iscarbon(target)) if(uses - 10 > 0) uses = uses - 10 var/mob/living/carbon/C = target user.visible_message(" [user] sprays [src] into the face of [target]!") if(C.client) C.EyeBlurry(6 SECONDS) C.EyeBlind(2 SECONDS) if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. H.Confused(6 SECONDS) H.KnockDown(6 SECONDS) H.lip_style = "spray_face" H.lip_color = colour H.update_body() playsound(user, 'sound/effects/spray.ogg', 5, TRUE, 5) ..() /obj/item/toy/crayon/spraycan/update_icon_state() icon_state = "spraycan[capped ? "_cap" : ""]" /obj/item/toy/crayon/spraycan/update_overlays() . = ..() var/image/I = image('icons/obj/crayons.dmi',icon_state = "[capped ? "spraycan_cap_colors" : "spraycan_colors"]") I.color = colour . += I #undef CRAYON_MESSAGE_MAX_LENGTH