/** * Paper * also scraps of paper * * lipstick wiping is in code/game/objects/items/weapons/cosmetics.dm! */ #define MAX_PAPER_LENGTH 5000 #define MAX_PAPER_STAMPS 30 // Too low? #define MAX_PAPER_STAMPS_OVERLAYS 4 #define MODE_READING 0 #define MODE_WRITING 1 #define MODE_STAMPING 2 /** * Paper is now using markdown (like in github pull notes) for ALL rendering * so we do loose a bit of functionality but we gain in easy of use of * paper and getting rid of that crashing bug */ /obj/item/paper name = "paper" gender = NEUTER icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper" item_state = "paper" // worn_icon_state = "paper" // custom_fire_overlay = "paper_onfire_overlay" throwforce = 0 w_class = WEIGHT_CLASS_TINY throw_range = 1 throw_speed = 1 pressure_resistance = 0 slot_flags = ITEM_SLOT_HEAD body_parts_covered = HEAD resistance_flags = FLAMMABLE max_integrity = 50 dog_fashion = /datum/dog_fashion/head // drop_sound = 'sound/items/handling/paper_drop.ogg' // pickup_sound = 'sound/items/handling/paper_pickup.ogg' grind_results = list(/datum/reagent/cellulose = 3) color = "white" /// What's actually written on the paper. var/info = "" var/show_written_words = TRUE /// The (text for the) stamps on the paper. var/list/stamps /// Positioning for the stamp in tgui var/list/stamped /// Overlay info var/contact_poison // Reagent ID to transfer on contact var/contact_poison_volume = 0 /// When the sheet can be "filled out" /// This is an associated list var/list/form_fields = list() var/field_counter = 1 /obj/item/paper/Destroy() stamps = null stamped = null form_fields = null stamped = null . = ..() /** * This proc copies this sheet of paper to a new * sheet. Used by carbon papers and the photocopier machine. */ /obj/item/paper/proc/copy(paper_type = /obj/item/paper, atom/location = loc, colored = TRUE) var/obj/item/paper/new_paper = new paper_type (location) if(colored) new_paper.color = color new_paper.info = info else //This basically just breaks the existing color tag, which we need to do because the innermost tag takes priority. var/static/greyscale_info = regex("= MAX_PAPER_LENGTH) // Sheet must have less than 1000 charaters to_chat(user, span_warning("This sheet of paper is full!")) return ui_interact(user) return else if(istype(P, /obj/item/stamp)) to_chat(user, span_notice("You ready your stamp over the paper! ")) ui_interact(user) return /// Normaly you just stamp, you don't need to read the thing else // cut paper? the sky is the limit! ui_interact(user) // The other ui will be created with just read mode outside of this return ..() /obj/item/paper/fire_act(exposed_temperature, exposed_volume) . = ..() if(.) info = "[stars(info)]" /obj/item/paper/ui_assets(mob/user) return list( get_asset_datum(/datum/asset/spritesheet/simple/paper), ) /obj/item/paper/ui_interact(mob/user, datum/tgui/ui) // Update the UI ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "PaperSheet", name) ui.open() /obj/item/paper/ui_static_data(mob/user) . = list() .["text"] = info .["max_length"] = MAX_PAPER_LENGTH .["paper_color"] = !color || color == "white" ? "#FFFFFF" : color // color might not be set .["paper_state"] = icon_state /// TODO: show the sheet will bloodied or crinkling? .["stamps"] = stamps /obj/item/paper/ui_data(mob/user) var/list/data = list() data["edit_usr"] = "[user]" var/obj/holding = user.get_active_held_item() // Use a clipboard's pen, if applicable if(istype(loc, /obj/item/clipboard)) var/obj/item/clipboard/clipboard = loc // This is just so you can still use a stamp if you're holding one. Otherwise, it'll // use the clipboard's pen, if applicable. if(!istype(holding, /obj/item/stamp) && clipboard.pen) holding = clipboard.pen if(istype(holding, /obj/item/toy/crayon)) var/obj/item/toy/crayon/PEN = holding data["pen_font"] = CRAYON_FONT data["pen_color"] = PEN.paint_color data["edit_mode"] = MODE_WRITING data["is_crayon"] = TRUE data["stamp_class"] = "FAKE" data["stamp_icon_state"] = "FAKE" else if(istype(holding, /obj/item/pen)) var/obj/item/pen/PEN = holding data["pen_font"] = PEN.font data["pen_color"] = PEN.colour data["edit_mode"] = MODE_WRITING data["is_crayon"] = FALSE data["stamp_class"] = "FAKE" data["stamp_icon_state"] = "FAKE" else if(istype(holding, /obj/item/stamp)) var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper) data["stamp_icon_state"] = holding.icon_state data["stamp_class"] = sheet.icon_class_name(holding.icon_state) data["edit_mode"] = MODE_STAMPING data["pen_font"] = "FAKE" data["pen_color"] = "FAKE" data["is_crayon"] = FALSE else data["edit_mode"] = MODE_READING data["pen_font"] = "FAKE" data["pen_color"] = "FAKE" data["is_crayon"] = FALSE data["stamp_icon_state"] = "FAKE" data["stamp_class"] = "FAKE" if(istype(loc, /obj/structure/noticeboard)) var/obj/structure/noticeboard/noticeboard = loc if(!noticeboard.allowed(user)) data["edit_mode"] = MODE_READING data["field_counter"] = field_counter data["form_fields"] = form_fields return data /obj/item/paper/ui_act(action, params,datum/tgui/ui) . = ..() if(.) return switch(action) if("stamp") var/stamp_x = text2num(params["x"]) var/stamp_y = text2num(params["y"]) var/stamp_r = text2num(params["r"]) // rotation in degrees var/stamp_icon_state = params["stamp_icon_state"] var/stamp_class = params["stamp_class"] if (isnull(stamps)) stamps = list() if(stamps.len < MAX_PAPER_STAMPS) // I hate byond when dealing with freaking lists stamps[++stamps.len] = list(stamp_class, stamp_x, stamp_y, stamp_r) /// WHHHHY /// This does the overlay stuff if (isnull(stamped)) stamped = list() if(stamped.len < MAX_PAPER_STAMPS_OVERLAYS) var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[stamp_icon_state]") stampoverlay.pixel_x = rand(-2, 2) stampoverlay.pixel_y = rand(-3, 2) add_overlay(stampoverlay) LAZYADD(stamped, stamp_icon_state) update_icon() update_static_data(usr,ui) var/obj/O = ui.user.get_active_held_item() ui.user.visible_message(span_notice("[ui.user] stamps [src] with \the [O.name]!"), span_notice("You stamp [src] with \the [O.name]!")) else to_chat(usr, pick("You try to stamp but you miss!", "There is no where else you can stamp!")) . = TRUE if("save") var/in_paper = params["text"] var/paper_len = length(in_paper) field_counter = params["field_counter"] ? text2num(params["field_counter"]) : field_counter if(paper_len > MAX_PAPER_LENGTH) // Side note, the only way we should get here is if // the javascript was modified, somehow, outside of // byond. but right now we are logging it as // the generated html might get beyond this limit log_paper("[key_name(ui.user)] writing to paper [name], and overwrote it by [paper_len-MAX_PAPER_LENGTH]") if(paper_len == 0) to_chat(ui.user, pick("Writing block strikes again!", "You forgot to write anthing!")) else log_paper("[key_name(ui.user)] writing to paper [name]") if(info != in_paper) to_chat(ui.user, "You have added to your paper masterpiece!"); info = in_paper update_static_data(usr,ui) update_appearance() . = TRUE /obj/item/paper/ui_host(mob/user) if(istype(loc, /obj/structure/noticeboard)) return loc return ..() /** * Construction paper */ /obj/item/paper/construction /obj/item/paper/construction/Initialize() . = ..() color = pick("FF0000", "#33cc33", "#ffb366", "#551A8B", "#ff80d5", "#4d94ff") /** * Natural paper */ /obj/item/paper/natural/Initialize() . = ..() color = "#FFF5ED" /obj/item/paper/crumpled name = "paper scrap" icon_state = "scrap" slot_flags = null show_written_words = FALSE /obj/item/paper/crumpled/bloody icon_state = "scrap_bloodied" /obj/item/paper/crumpled/muddy icon_state = "scrap_mud" #undef MAX_PAPER_LENGTH #undef MAX_PAPER_STAMPS #undef MAX_PAPER_STAMPS_OVERLAYS #undef MODE_READING #undef MODE_WRITING #undef MODE_STAMPING