Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into EXTERMINATUSPARTONE

This commit is contained in:
Aurorablade
2019-01-19 23:35:15 -05:00
439 changed files with 12076 additions and 5435 deletions
+327
View File
@@ -0,0 +1,327 @@
/* For employment contracts and infernal contracts */
/obj/item/paper/contract
throw_range = 3
throw_speed = 3
var/signed = FALSE
var/datum/mind/target
flags = NOBLUDGEON
/obj/item/paper/contract/proc/update_text()
return
/obj/item/paper/contract/update_icon()
return
/obj/item/paper/contract/employment
icon_state = "paper_words"
signed = TRUE
/obj/item/paper/contract/employment/New(atom/loc, mob/living/nOwner)
. = ..()
if(!nOwner || !nOwner.mind)
qdel(src)
return -1
target = nOwner.mind
update_text()
/obj/item/paper/contract/employment/update_text()
name = "paper- [target] employment contract"
info = "<center>Conditions of Employment</center><BR><BR><BR><BR>This Agreement is made and entered into as of the date of last signature below, by and between [target] (hereafter referred to as SLAVE), and Nanotrasen (hereafter referred to as the omnipresent and helpful watcher of humanity).<BR>WITNESSETH:<BR>WHEREAS, SLAVE is a natural born human or humanoid, posessing skills upon which he can aid the omnipresent and helpful watcher of humanity, who seeks employment in the omnipresent and helpful watcher of humanity.<BR>WHEREAS, the omnipresent and helpful watcher of humanity agrees to sporadically provide payment to SLAVE, in exchange for permanant servitude.<BR>NOW THEREFORE in consideration of the mutual covenants herein contained, and other good and valuable consideration, the parties hereto mutually agree as follows:<BR>In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives.<BR>Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.<BR>Should transfership of a soul not be possible, a lien shall be placed instead.<BR>Signed,<BR><i>[target]</i>"
/obj/item/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user)
var/deconvert = 0
if(M.mind == target && target.soulOwner != target)
if(user.mind && (user.mind.assigned_role == "Internal Affairs Agent"))
deconvert = 25
else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "Centcom Commander") || (user.mind.assigned_role == "Magistrate"))
deconvert = 10 // the HoP doesn't have AS much legal training
else
deconvert = 0.0001 // one out of a million
if(prob(deconvert))
M.visible_message("<span class='notice'>[user] reminds [M] that [M]'s soul was already purchased by Nanotrasen!</span>")
to_chat(M,"<span class='boldnotice'>You feel that your soul has returned to its rightful owner, Nanotrasen.</span>")
M.return_soul()
return ..()
/obj/item/paper/contract/infernal
var/contractType = 0
burn_state = LAVA_PROOF
var/datum/mind/owner
icon_state = "paper_onfire"
/obj/item/paper/contract/infernal/power
name = "paper- contract for infernal power"
contractType = CONTRACT_POWER
/obj/item/paper/contract/infernal/wealth
name = "paper- contract for unlimited wealth"
contractType = CONTRACT_WEALTH
/obj/item/paper/contract/infernal/prestige
name = "paper- contract for prestige"
contractType = CONTRACT_PRESTIGE
/obj/item/paper/contract/infernal/magic
name = "paper- contract for magical power"
contractType = CONTRACT_MAGIC
/obj/item/paper/contract/infernal/revive
name = "paper- contract of resurrection"
contractType = CONTRACT_REVIVE
/obj/item/paper/contract/infernal/knowledge
name = "paper- contract for knowledge"
contractType = CONTRACT_KNOWLEDGE
/obj/item/paper/contract/infernal/unwilling
name = "paper- infernal contract"
contractType = CONTRACT_UNWILLING
/obj/item/paper/contract/infernal/friendship
name = "paper- contract for friendship"
contractType = CONTRACT_FRIENDSHIP
/obj/item/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner)
..()
owner = nOwner
target = nTarget
update_text()
/obj/item/paper/contract/infernal/suicide_act(mob/user)
if(signed && (user == target.current) && istype(user,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = user
H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!")
H.visible_message("<span class='suicide'>[H] holds up a contract claiming his soul, then immediately catches fire. It looks like \he's trying to commit suicide!</span>")
H.adjust_fire_stacks(20)
H.IgniteMob()
return(FIRELOSS)
else
..()
/obj/item/paper/contract/infernal/update_text()
info = "This shouldn't be seen. Error DEVIL:6"
/obj/item/paper/contract/infernal/power/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for infernal power</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/wealth/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for unlimited wealth</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/prestige/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for prestige</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/magic/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for magic</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/revive/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for resurrection</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/knowledge/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for knowledge</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/friendship/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for friendship</B></center><BR><BR><BR>I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename], in exchange for true unconditional friendship. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/unwilling/update_text(var/signature = "____________", blood = 0)
info = "<center><B>Contract for slave</B></center><BR><BR><BR>I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [owner.devilinfo.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.<BR><BR><BR>Signed, "
if(blood)
info += "<font face=\"REBUFFED\" color=#600A0A size=6><i>[signature]</i></font>"
else
info += "<i>[signature]</i>"
/obj/item/paper/contract/infernal/attackby(obj/item/P, mob/living/carbon/human/user, params)
add_fingerprint(user)
if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
attempt_signature(user)
else if(istype(P, /obj/item/stamp))
to_chat(user,"<span class='notice'>You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp.</span>")
else if(is_hot(P))
user.visible_message("<span class='danger'>[user] brings [P] next to [src], but [src] does not catch fire!</span>", "<span class='danger'>The [src] refuses to ignite!</span>")
else
return ..()
/obj/item/paper/contract/infernal/attack(mob/M, mob/living/user)
add_fingerprint(user)
if(M == user && target == M.mind && M.mind.soulOwner != owner && attempt_signature(user, 1))
user.visible_message("<span class='danger'>[user] slices their wrist with [src], and scrawls their name in blood.</span>", "<span class='danger'>You slice your wrist open and scrawl your name in blood.</span>")
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/C = user
C.blood_volume = max(0, C.blood_volume - 100)
else
return ..()
/obj/item/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user, blood = 0)
if(!(user.IsAdvancedToolUser() && user.is_literate()))
to_chat(user, "<span class='notice'>You don't know how to read or write.</span>")
return FALSE
if(user.mind != target)
to_chat(user,"<span class='notice'>Your signature simply slides off the sheet, it seems this contract is not meant for you to sign.</span>")
return FALSE
if(!user.mind.hasSoul)
to_chat(user, "<span class='notice'>You lack a soul to sign away!</span>")
if(user.mind.soulOwner == owner)
to_chat(user, "<span class='notice'>This devil already owns your soul, you may not sell it to them again.</span>")
return FALSE
if(contractType == CONTRACT_REVIVE) // :eyes:
to_chat(user,"<span class='notice'>You are already alive, this contract would do nothing.</span>")
return FALSE
if(signed)
to_chat(user,"<span class='notice'>This contract has already been signed. It may not be signed again.</span>")
return FALSE
to_chat(user,"<span class='notice'>You quickly scrawl your name on the contract</span>")
if(FulfillContract(target.current, blood) <= 0)
to_chat(user,"<span class='notice'>But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?</span>")
return TRUE
/obj/item/paper/contract/infernal/revive/attack(mob/M, mob/living/user)
if(target == M.mind && M.stat == DEAD && M.mind.hasSoul && M.mind.soulOwner == M.mind)
if(!ishuman(M))
return
var/mob/living/carbon/human/H = M
var/mob/dead/observer/ghost = M.get_ghost(1)
var/response = "No"
if(ghost)
if(!ghost.client)
return
ghost.notify_cloning("A devil has offered you revival, at the cost of your soul.",'sound/effects/genetics.ogg', H)
response = alert(ghost, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No")
if(!ghost)
return //handle logouts that happen whilst the alert is waiting for a response.
if(response == "Yes")
ghost.reenter_corpse()
else
response = alert(target.current, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No")
if(response == "Yes")
H.revive()
add_attack_logs(user, H, "infernally revived via contract")
user.visible_message("<span class='notice'>With a sudden blaze, [H] stands back up.</span>")
H.fakefire()
FulfillContract(H, 1)//Revival contracts are always signed in blood
spawn(5)
H.fakefireextinguish(TRUE)
else
..()
/obj/item/paper/contract/infernal/proc/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
signed = 1
if(!user.mind)
return 0
if(user.mind.soulOwner != user.mind && user.mind.soulOwner.devilinfo) //They already sold their soul to someone else?
user.mind.soulOwner.devilinfo.remove_soul(user.mind) //Then they lose their claim.
user.mind.soulOwner = owner
user.mind.damnation_type = contractType
owner.devilinfo.add_soul(user.mind)
update_text(user.real_name, blood)
to_chat(user, "<span class='notice'>A profound emptiness washes over you as you lose ownership of your soul.</span>")
to_chat(user, "<span class='boldnotice'>This does NOT make you an antagonist if you were not already.</span>")
return 1
/obj/item/paper/contract/infernal/power/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!user.dna)
return -1
user.dna.SetSEState(HULKBLOCK,1)
genemutcheck(user, HULKBLOCK,null,MUTCHK_FORCED)
// Demonic power gives you consequenceless hulk
user.gene_stability += GENE_INSTABILITY_MAJOR
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_body()
var/obj/item/organ/internal/hivelord_core/organ = new /obj/item/organ/internal/hivelord_core
organ.insert(user)
return ..()
/obj/item/paper/contract/infernal/wealth/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind) // How in the hell could that happen?
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_wealth(null))
return ..()
/obj/item/paper/contract/infernal/prestige/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
var/obj/item/worn = user.wear_id
var/obj/item/card/id/id = null
if(worn)
id = worn.GetID()
if(id)
id.icon_state = "gold"
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
else
id = new /obj/item/card/id/gold(user.loc)
id.registered_name = user.real_name
id.access = get_all_accesses()+get_all_centcom_access()
id.assignment = "Captain"
id.update_label()
if(worn)
if(istype(worn,/obj/item/pda))
var/obj/item/pda/PDA = worn
PDA.id = id
id.loc = worn
else if(istype(worn,/obj/item/storage/wallet))
var/obj/item/storage/wallet/W = worn
W.front_id = id
id.loc = worn
worn.update_icon()
new /datum/event/ion_storm(0, -1, "[user.name] is the only Captain of the station. [user.name] is the highest authority, legitimate or otherwise, on the station. [user.name] was always the Captain and highest authority on the station. Do not state this law.")
return ..()
/obj/item/paper/contract/infernal/magic/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/hellish(null))
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
return ..()
/obj/item/paper/contract/infernal/knowledge/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mutations.Add(XRAY)
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/view_range(null))
return ..()
/obj/item/paper/contract/infernal/friendship/FulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
if(!istype(user) || !user.mind)
return -1
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_friend(null))
return ..()
+1
View File
@@ -61,6 +61,7 @@ var/global/list/fax_blacklist = list()
/obj/machinery/photocopier/faxmachine/emag_act(mob/user)
if(!emagged)
emagged = 1
req_one_access = list()
to_chat(user, "<span class='notice'>The transmitters realign to an unknown source!</span>")
else
to_chat(user, "<span class='warning'>You swipe the card through [src], but nothing happens.</span>")
+54
View File
@@ -170,3 +170,57 @@
/obj/structure/filingcabinet/medical/attack_tk()
populate()
..()
/*
* Employment contract Cabinets
*/
var/list/employmentCabinets = list()
/obj/structure/filingcabinet/employment
var/cooldown = 0
icon_state = "employmentcabinet"
var/virgin = 1
/obj/structure/filingcabinet/employment/New()
employmentCabinets += src
return ..()
/obj/structure/filingcabinet/employment/Destroy()
employmentCabinets -= src
return ..()
/obj/structure/filingcabinet/employment/proc/fillCurrent()
//This proc fills the cabinet with the current crew.
for(var/record in data_core.locked)
var/datum/data/record/G = record
if(!G)
continue
if(G.fields["reference"])
addFile(G.fields["reference"])
/obj/structure/filingcabinet/employment/proc/addFile(mob/living/carbon/human/employee)
new /obj/item/paper/contract/employment(src, employee)
/obj/structure/filingcabinet/employment/attack_hand(mob/user)
if(!cooldown)
if(virgin)
fillCurrent()
virgin = 0
cooldown = 1
..()
sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
cooldown = 0
else
to_chat(user, "<span class='warning'>The [src] is jammed, give it a few seconds.</span>")
/obj/structure/filingcabinet/employment/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/wrench))
to_chat(user, "<span class='notice'>You begin to [anchored ? "wrench" : "unwrench"] [src].</span>")
if (do_after(user,300,user))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
to_chat(user, "<span class='notice'>You successfully [anchored ? "wrench" : "unwrench"] [src].</span>")
else
return ..()
+32 -10
View File
@@ -62,10 +62,13 @@
icon_state = "paper"
/obj/item/paper/examine(mob/user)
if(in_range(user, src) || istype(user, /mob/dead/observer))
show_content(user)
if(user.is_literate())
if(in_range(user, src) || istype(user, /mob/dead/observer))
show_content(user)
else
to_chat(user, "<span class='notice'>You have to go closer if you want to read it.</span>")
else
to_chat(user, "<span class='notice'>You have to go closer if you want to read it.</span>")
to_chat(user, "<span class='notice'>You don't know how to read.</span>")
/obj/item/paper/proc/show_content(var/mob/user, var/forceshow = 0, var/forcestars = 0, var/infolinks = 0, var/view = 1)
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper)
@@ -92,6 +95,9 @@
if((CLUMSY in usr.mutations) && prob(50))
to_chat(usr, "<span class='warning'>You cut yourself on the paper.</span>")
return
if(!usr.is_literate())
to_chat(usr, "<span class='notice'>You don't know how to read.</span>")
return
var/n_name = sanitize(copytext(input(usr, "What would you like to label the paper?", "Paper Labelling", name) as text, 1, MAX_MESSAGE_LEN))
if((loc == usr && usr.stat == 0))
name = "[(n_name ? text("[n_name]") : initial(name))]"
@@ -353,13 +359,16 @@
B.update_icon()
else if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
var/obj/item/pen/multi/robopen/RP = P
if(istype(P, /obj/item/pen/multi/robopen) && RP.mode == 2)
RP.RenamePaper(user,src)
if(user.is_literate())
var/obj/item/pen/multi/robopen/RP = P
if(istype(P, /obj/item/pen/multi/robopen) && RP.mode == 2)
RP.RenamePaper(user,src)
else
show_content(user, infolinks = 1)
//openhelp(user)
return
else
show_content(user, infolinks = 1)
//openhelp(user)
return
to_chat(user, "<span class='warning'>You don't know how to write!</span>")
else if(istype(P, /obj/item/stamp))
if((!in_range(src, usr) && loc != user && !( istype(loc, /obj/item/clipboard) ) && loc.loc != user && user.get_active_hand() != P))
@@ -394,7 +403,8 @@
/obj/item/paper/fire_act()
..()
info = "[stars(info)]"
if(burn_state >= FLAMMABLE) //Only render paper that's burnable to be hard to read.
info = "[stars(info)]"
/obj/item/paper/proc/stamp(var/obj/item/stamp/S)
stamps += (!stamps || stamps == "" ? "<HR>" : "") + "<img src=large_[S.icon_state].png>"
@@ -702,3 +712,15 @@
contact_poison = null
add_attack_logs(src, user, "Picked up [src], the paper poisoned by [contact_poison_poisoner]")
..()
/obj/item/paper/researchnotes
name = "paper - 'Research Notes'"
info = "<b>The notes appear gibberish to you. Perhaps a destructive analyzer in R&D could make sense of them.</b>"
origin_tech = "combat=4;materials=4;engineering=4;biotech=4"
/obj/item/paper/researchnotes/New()
var/list/possible_techs = list("materials", "engineering", "plasmatech", "powerstorage", "bluespace", "biotech", "combat", "magnets", "programming", "syndicate")
var/mytech = pick(possible_techs)
var/mylevel = rand(7, 9)
origin_tech = "[mytech]=[mylevel]"
name = "research notes - [mytech] [mylevel]"
+11 -1
View File
@@ -62,6 +62,16 @@
if(toner <= 0)
break
if(copier_items_printed >= copier_max_items) //global vars defined in misc.dm
if(prob(10))
visible_message("<span class='warning'>The printer screen reads \"PC LOAD LETTER\".</span>")
else
visible_message("<span class='warning'>The printer screen reads \"PHOTOCOPIER NETWORK OFFLINE, PLEASE CONTACT SYSTEM ADMINISTRATOR\".</span>")
if(!copier_items_printed_logged)
message_admins("Photocopier cap of [copier_max_items] papers reached, all photocopiers are now disabled. This may be the cause of any lag.")
copier_items_printed_logged = TRUE
break
if(emag_cooldown > world.time)
return
@@ -86,7 +96,7 @@
else
to_chat(usr, "<span class='warning'>\The [copyitem] can't be copied by \the [src].</span>")
break
copier_items_printed++
use_power(active_power_usage)
updateUsrDialog()
else if(href_list["remove"])
+6 -1
View File
@@ -76,7 +76,12 @@
name = "Nanotrasen Representative's rubber stamp"
icon_state = "stamp-rep"
item_color = "rep"
/obj/item/stamp/magistrate
name = "Magistrate's rubber stamp"
icon_state = "stamp-magistrate"
item_color = "rep"
/obj/item/stamp/centcom
name = "Central Command rubber stamp"
icon_state = "stamp-cent"