/* * Paper * also scraps of paper */ /obj/item/weapon/paper name = "sheet of paper" gender = NEUTER icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper" item_state = "paper" throwforce = 0 w_class = ITEMSIZE_TINY throw_range = 1 throw_speed = 1 plane = MOB_PLANE layer = MOB_LAYER pressure_resistance = 1 slot_flags = SLOT_HEAD body_parts_covered = HEAD attack_verb = list("bapped") drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' 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/free_space = MAX_PAPER_MESSAGE_LEN var/list/stamped var/list/ico[0] //Icons and var/list/offset_x[0] //offsets stored for later var/list/offset_y[0] //usage by the photocopier var/rigged = 0 var/spam_flag = 0 var/age = 0 var/last_modified_ckey var/was_maploaded = FALSE // This tracks if the paper was created on mapload. var/const/deffont = "Verdana" var/const/signfont = "Times New Roman" var/const/crayonfont = "Comic Sans MS" /obj/item/weapon/paper/card name = "blank card" desc = "A gift card with space to write on the cover." icon_state = "greetingcard" slot_flags = null //no fun allowed!!!! /obj/item/weapon/paper/card/AltClick() //No fun allowed return /obj/item/weapon/paper/card/update_icon() return /obj/item/weapon/paper/card/smile name = "happy card" desc = "A gift card with a smiley face on the cover." icon_state = "greetingcard_smile" /obj/item/weapon/paper/card/cat name = "cat card" desc = "A gift card with a cat on the cover." icon_state = "greetingcard_cat" /obj/item/weapon/paper/card/flower name = "flower card" desc = "A gift card with a flower on the cover." icon_state = "greetingcard_flower" /obj/item/weapon/paper/card/heart name = "heart card" desc = "A gift card with a heart on the cover." icon_state = "greetingcard_heart" /obj/item/weapon/paper/card/New() ..() pixel_y = rand(-8, 8) pixel_x = rand(-9, 9) stamps = null if(info != initial(info)) info = html_encode(info) info = replacetext(info, "\n", "
") info = parsepencode(info) return /obj/item/weapon/paper/alien name = "alien tablet" desc = "It looks highly advanced" icon = 'icons/obj/abductor.dmi' icon_state = "alienpaper" /obj/item/weapon/paper/alien/update_icon() if(info) icon_state = "alienpaper_words" else icon_state = "alienpaper" /obj/item/weapon/paper/alien/burnpaper() return /obj/item/weapon/paper/alien/AltClick() // No airplanes for me. return /obj/item/weapon/paper/Initialize(mapload, var/text, var/title) . = ..() if(istext(title)) name = title if(istext(text)) info = text if(mapload) // Jank, but we do this to prevent maploaded papers from somehow stacking across rounds if re-added to the board by a player. was_maploaded = TRUE /obj/item/weapon/paper/New(var/newloc, var/text, var/title) ..() pixel_y = rand(-8, 8) pixel_x = rand(-9, 9) stamps = "" if(!isnull(title)) name = title if(name != "paper") desc = "This is a paper titled '" + name + "'." if(!isnull(text)) info = text if(info != initial(info)) info = html_encode(info) info = replacetext(info, "\n", "
") info = parsepencode(info) spawn(2) update_icon() update_space(info) updateinfolinks() return /obj/item/weapon/paper/update_icon() if(icon_state == "paper_talisman") return if(info) icon_state = "paper_words" return icon_state = "paper" /obj/item/weapon/paper/proc/update_space(var/new_text) if(!new_text) return free_space -= length(strip_html_properly(new_text)) /obj/item/weapon/paper/examine(mob/user) . = ..() if(in_range(user, src) || istype(user, /mob/observer/dead)) show_content(usr) else . += "You have to go closer if you want to read it." /obj/item/weapon/paper/proc/show_content(var/mob/user, var/forceshow=0) if(!(forceshow || (istype(user, /mob/living/carbon/human) || istype(user, /mob/observer/dead) || istype(user, /mob/living/silicon) || (istype(user) && user.universal_understand)))) user << browse("[name][stars(info)][stamps]", "window=[name]") onclose(user, "[name]") else user << browse("[name][info][stamps]", "window=[name]") onclose(user, "[name]") /obj/item/weapon/paper/verb/rename() set name = "Rename paper" set category = "Object" set src in usr if((CLUMSY in usr.mutations) && prob(50)) to_chat(usr, "You cut yourself on the paper.") return var/n_name = sanitizeSafe(tgui_input_text(usr, "What would you like to label the paper?", "Paper Labelling", null, MAX_NAME_LEN), MAX_NAME_LEN) // We check loc one level up, so we can rename in clipboards and such. See also: /obj/item/weapon/photo/rename() if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0 && n_name) name = n_name if(n_name != "paper") desc = "This is a paper titled '" + name + "'." add_fingerprint(usr) return /obj/item/weapon/paper/attack_self(mob/living/user as mob) if(user.a_intent == I_HURT) if(icon_state == "scrap") user.show_message("\The [src] is already crumpled.") return //crumple dat paper info = stars(info,85) user.visible_message("\The [user] crumples \the [src] into a ball!") playsound(src, 'sound/bureaucracy/papercrumple.ogg', 50, 1) icon_state = "scrap" return user.examinate(src) if(rigged && (Holiday == "April Fool's Day")) if(spam_flag == 0) spam_flag = 1 playsound(src, 'sound/items/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.camera) //is AI dist = get_dist(src, user.camera) 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/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(user.zone_sel.selecting == O_EYES) user.visible_message("You show the paper to [M]. ", \ " [user] holds up a paper and shows it to [M]. ") M.examinate(src) else if(user.zone_sel.selecting == O_MOUTH) // lipstick wiping and paper eating if(ishuman(M)) var/mob/living/carbon/human/H = M if(H == user) if(icon_state == "scrap" && H.check_has_mouth()) //YW Edit Start user << "You begin to stuff \the [src] into your mouth!" if(do_after(user, 30)) user << "You stuff \the [src] into your mouth!" H.ingested.add_reagent("paper", 10) H.adjustOxyLoss(10) qdel(src) else user << "You wipe off the lipstick with [src]." H.lip_style = null H.update_icons_body() else if(icon_state == "scrap" && H.check_has_mouth()) user.visible_message("[user] begins to stuff \the [src] into [H]'s mouth!", \ "You begin to stuff \the [src] into [H]'s mouth!",) if(do_after(user, 30, H)) user.visible_message("[user] stuffs \the [src] into [H]'s mouth!",\ "You stuff \the [src] into [H]'s mouth!") H.ingested.add_reagent("paper", 10) H.adjustOxyLoss(10) qdel(src) else user.visible_message("[user] begins to wipe [H]'s lipstick off with \the [src].", \ "You begin to wipe off [H]'s lipstick.") if(do_after(user, 10, H)) user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ "You wipe off [H]'s lipstick.") H.lip_style = null H.update_icons_body() //YW Edit End /obj/item/weapon/paper/proc/set_content(text,title) if(title) name = title info = html_encode(text) info = parsepencode(text) update_icon() update_space(info) updateinfolinks() /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/clearpaper() info = null stamps = null free_space = MAX_PAPER_MESSAGE_LEN stamped = list() cut_overlays() updateinfolinks() update_icon() /obj/item/weapon/paper/proc/get_signature(var/obj/item/weapon/pen/P, mob/user as mob) if(P && istype(P, /obj/item/weapon/pen)) return P.get_signature(user) return (user && user.real_name) ? user.real_name : "Anonymous" /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 = replacetext(t, "\[center\]", "
") t = replacetext(t, "\[/center\]", "
") t = replacetext(t, "\[br\]", "
") t = replacetext(t, "\[b\]", "") t = replacetext(t, "\[/b\]", "") t = replacetext(t, "\[i\]", "") t = replacetext(t, "\[/i\]", "") t = replacetext(t, "\[u\]", "") t = replacetext(t, "\[/u\]", "") t = replacetext(t, "\[time\]", "[stationtime2text()]") t = replacetext(t, "\[date\]", "[stationdate2text()]") t = replacetext(t, "\[station\]", "[station_name()]") t = replacetext(t, "\[large\]", "") t = replacetext(t, "\[/large\]", "") if(findtext(t, "\[sign\]")) t = replacetext(t, "\[sign\]", "[get_signature(P, user)]") t = replacetext(t, "\[field\]", "") t = replacetext(t, "\[h1\]", "

") t = replacetext(t, "\[/h1\]", "

") t = replacetext(t, "\[h2\]", "

") t = replacetext(t, "\[/h2\]", "

") t = replacetext(t, "\[h3\]", "

") t = replacetext(t, "\[/h3\]", "

") t = replacetext(t, "\[tab\]", "      ") if(!iscrayon) t = replacetext(t, "\[*\]", "
  • ") t = replacetext(t, "\[hr\]", "
    ") t = replacetext(t, "\[small\]", "") t = replacetext(t, "\[/small\]", "") t = replacetext(t, "\[list\]", "") t = replacetext(t, "\[table\]", "") t = replacetext(t, "\[/table\]", "
    ") t = replacetext(t, "\[grid\]", "") t = replacetext(t, "\[/grid\]", "
    ") t = replacetext(t, "\[row\]", "") t = replacetext(t, "\[cell\]", "") t = replacetext(t, "\[logo\]", "") //CHOMPEdit t = replacetext(t, "\[sglogo\]", "") //CHOMPEdit t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! t = replacetext(t, "\[*\]", "") t = replacetext(t, "\[hr\]", "") t = replacetext(t, "\[small\]", "") t = replacetext(t, "\[/small\]", "") t = replacetext(t, "\[list\]", "") t = replacetext(t, "\[/list\]", "") t = replacetext(t, "\[table\]", "") t = replacetext(t, "\[/table\]", "") t = replacetext(t, "\[row\]", "") t = replacetext(t, "\[cell\]", "") t = replacetext(t, "\[logo\]", "") t = replacetext(t, "\[sglogo\]", "") t = "[t]" // t = replacetext(t, "#", "") // Junk converted to nothing! //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/burnpaper(obj/item/weapon/flame/P, mob/user) var/class = "warning" var/datum/gender/TU = gender_datums[user.get_visible_gender()] if(P.lit && !user.restrained()) if(istype(P, /obj/item/weapon/flame/lighter/zippo)) class = "rose" user.visible_message("[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!", \ "You hold \the [P] up to \the [src], burning it slowly.") playsound(src, 'sound/bureaucracy/paperburn.ogg', 50, 1) spawn(20) if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit) user.visible_message("[user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") if(user.get_inactive_hand() == src) user.drop_from_inventory(src) new /obj/effect/decal/cleanable/ash(src.loc) qdel(src) else to_chat(user, "You must hold \the [P] steady to burn \the [src].") /obj/item/weapon/paper/Topic(href, href_list) ..() if(!usr || (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 message if(free_space <= 0) to_chat(usr, "There isn't enough space left on \the [src] to write anything.") return var/raw = tgui_input_text(usr, "Enter what you want to write:", "Write", multiline = TRUE, prevent_enter = TRUE) if(!raw) return var/t = sanitize(raw, MAX_PAPER_MESSAGE_LEN, extra = 0) if(!t) return var/obj/item/i = usr.get_active_hand() // 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)) tgui_alert(usr, "You aren't holding a pen anymore! If you want to keep your work, grab one.", "No Pen!") // Should remain tgui_alert() (blocking) i = usr.get_active_hand() if(!istype(i, /obj/item/weapon/pen)) var/mob/living/M = usr if(istype(M) && M.back && istype(M.back,/obj/item/weapon/rig)) var/obj/item/weapon/rig/r = M.back var/obj/item/rig_module/device/pen/m = locate(/obj/item/rig_module/device/pen) in r.installed_modules if(!r.offline && m) i = m.device else return else return if(istype(i, /obj/item/weapon/pen/crayon)) iscrayon = 1 // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr if(istype(loc, /obj/item/weapon/clipboard) || istype(loc, /obj/structure/noticeboard) || istype(loc, /obj/item/weapon/folder)) if(loc.loc != usr && !in_range(loc, usr)) return else if(loc != usr && !Adjacent(usr)) return /* t = checkhtml(t) // check for exploits for(var/bad in paper_blacklist) if(findtext(t,bad)) to_chat(usr, "You think to yourself, \"Hm.. this is only paper...\"") log_admin("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].") message_admins("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].") return */ var last_fields_value = fields //t = html_encode(t) t = replacetext(t, "\n", "
    ") t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html was_maploaded = FALSE // Set this to FALSE because a user has written on us. This is for persistence purposes. if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield() to_chat(usr, "Too many fields. Sorry, you can't do this.") fields = last_fields_value return 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() last_modified_ckey = usr.ckey update_space(t) usr << browse("[name][info_links][stamps]", "window=[name]") // Update the window playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 10) update_icon() /obj/item/weapon/paper/get_worn_icon_state(var/slot_name) if(slot_name == slot_head_str) return "paper" //Gross, but required for now. return ..() /obj/item/weapon/paper/attackby(obj/item/weapon/P as obj, mob/user as mob) ..() var/clown = 0 if(user.mind && ((user.mind.role_alt_title == "Clown") || (user.mind.role_alt_title == "Jester") || (user.mind.role_alt_title == "Fool"))) // CHOMPStation Edit - Let clows/fools/jesters use clown stamps clown = 1 if(istype(P, /obj/item/weapon/tape_roll)) var/obj/item/weapon/tape_roll/tape = P tape.stick(src, user) return if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) if (istype(P, /obj/item/weapon/paper/carbon)) var/obj/item/weapon/paper/carbon/C = P if (!C.iscopy && !C.copied) to_chat(user, "Take off the carbon copy first.") add_fingerprint(user) return var/obj/item/weapon/paper_bundle/B = new(src.loc) if (name != "paper") B.name = name else if (P.name != "paper" && P.name != "photo") B.name = P.name user.drop_from_inventory(P) if (istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/h_user = user if (h_user.r_hand == src) h_user.drop_from_inventory(src) h_user.put_in_r_hand(B) else if (h_user.l_hand == src) h_user.drop_from_inventory(src) h_user.put_in_l_hand(B) else if (h_user.l_store == src) h_user.drop_from_inventory(src) B.loc = h_user B.hud_layerise() h_user.l_store = B //h_user.update_inv_pockets() //Doesn't do anything else if (h_user.r_store == src) h_user.drop_from_inventory(src) B.loc = h_user B.hud_layerise() h_user.r_store = B //h_user.update_inv_pockets() //Doesn't do anything else if (h_user.head == src) h_user.u_equip(src) h_user.put_in_hands(B) else if (!istype(src.loc, /turf)) src.loc = get_turf(h_user) if(h_user.client) h_user.client.screen -= src h_user.put_in_hands(B) to_chat(user, "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name].") src.loc = B P.loc = B B.pages.Add(src) B.pages.Add(P) B.update_icon() else if(istype(P, /obj/item/weapon/pen)) if(icon_state == "scrap") to_chat(usr, "\The [src] is too crumpled to write on.") return var/obj/item/weapon/pen/robopen/RP = P if ( istype(RP) && RP.mode == 2 ) RP.RenamePaper(user,src) else user << browse("[name][info_links][stamps]", "window=[name]") return else if(istype(P, /obj/item/weapon/stamp) || istype(P, /obj/item/clothing/gloves/ring/seal)) if(istype(P, /obj/item/weapon/stamp)) var/obj/item/weapon/stamp/the_stamp = P if(the_stamp.stamptext) stamps += (stamps=="" ? "
    " : "
    ") + "[the_stamp.stamptext]" else stamps += (stamps=="" ? "
    " : "
    ") + "This paper has been stamped with the [the_stamp.name]." else var/obj/item/clothing/gloves/ring/seal/the_stamp = P if(the_stamp.stamptext) stamps += (stamps=="" ? "
    " : "
    ") + "[the_stamp.stamptext]" else stamps += (stamps=="" ? "
    " : "
    ") + "This paper has been stamped with the [the_stamp.name]." if((!in_range(src, usr) && loc != user && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != user && user.get_active_hand() != P)) return var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') var/x, y if(istype(P, /obj/item/weapon/stamp/captain) || istype(P, /obj/item/weapon/stamp/centcomm)) x = rand(-2, 0) y = rand(-1, 2) else x = rand(-2, 2) y = rand(-3, 2) offset_x += x offset_y += y stampoverlay.pixel_x = x stampoverlay.pixel_y = y if(istype(P, /obj/item/weapon/stamp/clown)) if(!clown) to_chat(user, "You are totally unable to use the stamp. HONK!") return if(!ico) ico = new ico += "paper_[P.icon_state]" stampoverlay.icon_state = "paper_[P.icon_state]" if(!stamped) stamped = new stamped += P.type add_overlay(stampoverlay) playsound(src, 'sound/bureaucracy/stamp.ogg', 50, 1) to_chat(user, "You stamp the paper with your rubber stamp.") else if(istype(P, /obj/item/weapon/flame)) burnpaper(P, user) add_fingerprint(user) return /* * Premade paper */ /obj/item/weapon/paper/Court name = "Judgement" info = "For crimes against the station, the offender is sentenced to:
    \n
    \n" /obj/item/weapon/paper/Toxin name = "Chemical Information" info = "Known Onboard Toxins:
    \n\tGrade A Semi-Liquid Phoron:
    \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units.
    \n\t\tA gas mask fails to filter phoron after 50 units.
    \n\t\tWill attempt to diffuse like a gas.
    \n\t\tFiltered by scrubbers.
    \n\t\tThere is a bottled version which is very different
    \n\t\t\tfrom the version found in canisters!
    \n
    \n\t\tWARNING: Highly Flammable. Keep away from heat sources
    \n\t\texcept in a enclosed fire area!
    \n\t\tWARNING: It is a crime to use this without authorization.
    \nKnown Onboard Anti-Toxin:
    \n\tAnti-Toxin Type 01P: Works against Grade A Phoron.
    \n\t\tBest if injected directly into bloodstream.
    \n\t\tA full injection is in every regular Med-Kit.
    \n\t\tSpecial toxin Kits hold around 7.
    \n
    \nKnown Onboard Chemicals (other):
    \n\tRejuvenation T#001:
    \n\t\tEven 1 unit injected directly into the bloodstream
    \n\t\t\twill cure paralysis and sleep phoron.
    \n\t\tIf administered to a dying patient it will prevent
    \n\t\t\tfurther damage for about units*3 seconds.
    \n\t\t\tit will not cure them or allow them to be cured.
    \n\t\tIt can be administeredd to a non-dying patient
    \n\t\t\tbut the chemicals disappear just as fast.
    \n\tSoporific T#054:
    \n\t\t5 units wilkl induce precisely 1 minute of sleep.
    \n\t\t\tThe effect are cumulative.
    \n\t\tWARNING: It is a crime to use this without authorization" /obj/item/weapon/paper/courtroom name = "A Crash Course in Legal SOP on SS13" info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Site Manager/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" /obj/item/weapon/paper/hydroponics name = "Greetings from Billy Bob" info = "Hey fellow botanist!
    \n
    \nI didn't trust the station folk so I left
    \na couple of weeks ago. But here's some
    \ninstructions on how to operate things here.
    \nYou can grow plants and each iteration they become
    \nstronger, more potent and have better yield, if you
    \nknow which ones to pick. Use your botanist's analyzer
    \nfor that. You can turn harvested plants into seeds
    \nat the seed extractor, and replant them for better stuff!
    \nSometimes if the weed level gets high in the tray
    \nmutations into different mushroom or weed species have
    \nbeen witnessed. On the rare occassion even weeds mutate!
    \n
    \nEither way, have fun!
    \n
    \nBest regards,
    \nBilly Bob Johnson.
    \n
    \nPS.
    \nHere's a few tips:
    \nIn nettles, potency = damage
    \nIn amanitas, potency = deadliness + side effect
    \nIn Liberty caps, potency = drug power + effect
    \nIn chilis, potency = heat
    \nNutrients keep mushrooms alive!
    \nWater keeps weeds such as nettles alive!
    \nAll other plants need both." /obj/item/weapon/paper/djstation name = "DJ Listening Outpost" info = "Welcome new owner!

    You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio fequencies. Here is a step by step guide to start listening in on those saucy radio channels:
    1. Equip yourself with a multi-tool
    2. Use the multitool on each machine, that is the broadcaster, receiver and the relay.
    3. Turn all the machines on, it has already been configured for you to listen on.
    Simple as that. Now to listen to the private channels, you'll have to configure the intercoms, located on the front desk. Here is a list of frequencies for you to listen on.