/obj/item/weapon/paper name = "paper" gender = PLURAL icon = 'bureaucracy.dmi' icon_state = "paper" throwforce = 0 w_class = 1.0 throw_speed = 3 throw_range = 15 layer = 4 pressure_resistance = 1 slot_flags = SLOT_HEAD see_face = 1 body_parts_covered = HEAD protective_temperature = 0 var/info //What's actually written on the paper. var/info_links //A different version of the paper which includes html links at fields and EOF var/stamps //The (text for the) stamps on the paper. var/fields //Amount of user created fields var/list/stamped var/rigged = 0 var/spam_flag = 0 var/const/deffont = "Verdana" var/const/signfont = "Times New Roman" var/const/crayonfont = "Comic Sans MS" /obj/item/weapon/paper/New() ..() src.pixel_y = rand(-8, 8) src.pixel_x = rand(-9, 9) spawn(2) if(src.info) src.overlays += "paper_words" updateinfolinks() return /obj/item/weapon/paper/update_icon() if(src.info) src.overlays += "paper_words" return /obj/item/weapon/paper/examine() set src in oview(1) // ..() //We don't want them to see the dumb "this is a paper" thing every time. if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon))) usr << browse("[name][stars(info)][stamps]", "window=[name]") onclose(usr, "[name]") else usr << browse("[name][info][stamps]", "window=[name]") onclose(usr, "[name]") return /obj/item/weapon/paper/verb/rename() set name = "Rename paper" set category = "Object" set src in usr if ((CLUMSY in usr.mutations) && prob(50)) usr << "\red You cut yourself on the paper." return var/n_name = input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text n_name = copytext(n_name, 1, 32) if ((loc == usr && usr.stat == 0)) name = "paper[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) return /obj/item/weapon/paper/attack_self(mob/living/user as mob) examine() if(rigged && (Holiday == "April Fool's Day")) if(spam_flag == 0) spam_flag = 1 playsound(src.loc, 'bikehorn.ogg', 50, 1) spawn(20) spam_flag = 0 return /obj/item/weapon/paper/attack_ai(var/mob/living/silicon/ai/user as mob) var/dist if (istype(user) && user.current) //is AI dist = get_dist(src, user.current) else //cyborg or AI not seeing through a camera dist = get_dist(src, user) if (dist < 2) usr << browse("[name][info][stamps]", "window=[name]") onclose(usr, "[name]") else usr << browse("[name][stars(info)][stamps]", "window=[name]") onclose(usr, "[name]") return /obj/item/weapon/paper/proc/addtofield(var/id, var/text, var/links = 0) var/locid = 0 var/laststart = 1 var/textindex = 1 while(1) // I know this can cause infinite loops and fuck up the whole server, but the if(istart==0) should be safe as fuck var/istart = 0 if(links) istart = findtext(info_links, "", laststart) else istart = findtext(info, "", laststart) if(istart==0) return // No field found with matching id laststart = istart+1 locid++ if(locid == id) var/iend = 1 if(links) iend = findtext(info_links, "", istart) else iend = findtext(info, "", istart) //textindex = istart+26 textindex = iend break if(links) var/before = copytext(info_links, 1, textindex) var/after = copytext(info_links, textindex) info_links = before + text + after else var/before = copytext(info, 1, textindex) var/after = copytext(info, textindex) info = before + text + after updateinfolinks() /obj/item/weapon/paper/proc/updateinfolinks() info_links = info var/i = 0 for(i=1,i<=fields,i++) addtofield(i, "write", 1) info_links = info_links + "write" /obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob, var/iscrayon = 0) t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) t = dd_replacetext(t, "\[center\]", "
") t = dd_replacetext(t, "\[/center\]", "
") t = dd_replacetext(t, "\[br\]", "
") t = dd_replacetext(t, "\[b\]", "") t = dd_replacetext(t, "\[/b\]", "") t = dd_replacetext(t, "\[i\]", "") t = dd_replacetext(t, "\[/i\]", "") t = dd_replacetext(t, "\[u\]", "") t = dd_replacetext(t, "\[/u\]", "") t = dd_replacetext(t, "\[large\]", "") t = dd_replacetext(t, "\[/large\]", "") t = dd_replacetext(t, "\[sign\]", "[user.real_name]") t = dd_replacetext(t, "\[field\]", "") if(!iscrayon) t = dd_replacetext(t, "\[*\]", "
  • ") t = dd_replacetext(t, "\[hr\]", "
    ") t = dd_replacetext(t, "\[small\]", "") t = dd_replacetext(t, "\[/small\]", "") t = dd_replacetext(t, "\[list\]", "") t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! t = dd_replacetext(t, "\[*\]", "") t = dd_replacetext(t, "\[hr\]", "") t = dd_replacetext(t, "\[small\]", "") t = dd_replacetext(t, "\[/small\]", "") t = dd_replacetext(t, "\[list\]", "") t = dd_replacetext(t, "\[/list\]", "") t = "[t]" //Count the fields var/laststart = 1 while(1) var/i = findtext(t, "", laststart) if(i==0) break laststart = i+1 fields++ return t /obj/item/weapon/paper/proc/openhelp(mob/user as mob) user << browse({"Pen Help
    Crayon&Pen commands


    \[br\] : Creates a linebreak.
    \[center\] - \[/center\] : Centers the text.
    \[b\] - \[/b\] : Makes the text bold.
    \[i\] - \[/i\] : Makes the text italic.
    \[u\] - \[/u\] : Makes the text underlined.
    \[large\] - \[/large\] : Increases the size of the text.
    \[sign\] : Inserts a signature of your name in a foolproof way.
    \[field\] : Inserts an invisible field which lets you start type from there. Useful for forms.

    Pen exclusive commands

    \[small\] - \[/small\] : Decreases the size of the text.
    \[list\] - \[/list\] : A list.
    \[*\] : A dot used for lists.
    \[hr\] : Adds a horizontal rule. "}, "window=paper_help") /obj/item/weapon/paper/Topic(href, href_list) ..() if ((usr.stat || usr.restrained())) return if(href_list["write"]) var/id = href_list["write"] var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as text var/obj/item/i = usr.equipped() // Check to see if he still got that darn pen, also check if he's using a crayon or pen. var/iscrayon = 0 if(!istype(i, /obj/item/weapon/pen)) if(!istype(i, /obj/item/toy/crayon)) return iscrayon = 1 if ((!in_range(src, usr) && src.loc != usr && !( istype(src.loc, /obj/item/weapon/clipboard) ) && src.loc.loc != usr && usr.equipped() != i)) // Some check to see if he's allowed to write return t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html if(id!="end") addtofield(text2num(id), t) // He wants to edit a field, let him. else info += t // Oh, he wants to edit to the end of the file, let him. updateinfolinks() usr << browse("[name][info_links][stamps]", "window=[name]") // Update the window if(!overlays.Find("paper_words")) overlays += "paper_words" /obj/item/weapon/paper/attackby(obj/item/weapon/P as obj, mob/user as mob) ..() var/clown = 0 if(user.mind && (user.mind.assigned_role == "Clown")) clown = 1 if (istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon)) usr << browse("[name][info_links][stamps]", "window=[name]") //openhelp(user) return else if(istype(P, /obj/item/weapon/stamp)) if ((!in_range(src, usr) && src.loc != user && !( istype(src.loc, /obj/item/weapon/clipboard) ) && src.loc.loc != user && user.equipped() != P)) return stamps += (stamps=="" ? "
    " : "
    ") + "This paper has been stamped with the [P.name]." switch(P.type) if(/obj/item/weapon/stamp/captain) overlays += "paper_stamped_cap" if(/obj/item/weapon/stamp/hop) overlays += "paper_stamped_hop" if(/obj/item/weapon/stamp/hos) overlays += "paper_stamped_hos" if(/obj/item/weapon/stamp/ce) overlays += "paper_stamped_ce" if(/obj/item/weapon/stamp/rd) overlays += "paper_stamped_rd" if(/obj/item/weapon/stamp/cmo) overlays += "paper_stamped_cmo" if(/obj/item/weapon/stamp/denied) overlays += "paper_stamped_denied" if(/obj/item/weapon/stamp/clown) if (!clown) usr << "\red You are totally unable to use the stamp. HONK!" return else overlays += "paper_stamped_clown" else overlays += "paper_stamped" if(!stamped) stamped = new stamped += P.type user << "\blue You stamp the paper with your rubber stamp." add_fingerprint(user) return