Files
VOREStation/code/modules/paperwork/photocopier.dm
T
Azzy e0aabe5914 Talon update: Porting uniforms, updating map and equipment (#19220)
* talon uniform

* Talon update

* Update talon_v2.dmm

Playing

* Talon fix and a new Slogan!

* talon fax

* For admins set up talon company fax

+ paperworks can use [talogo]

* Add FAX word

* Talon seal addation

* Fix and Updating the Talon map

Regarding the Talon map, I brought it to the appearance of the Rogue Star. So that players on both servers feel as little strange as possible when playing on the same ship, even on different servers.

* Update talon_v2.dmm

bluespace

* Fixup maps in TGM format

a89e3f1f87: maps/offmap_vr/talon/talon_v2.dmm

Automatically commited by: tools\mapmerge2\fixup.py

* Update talon_v2.dm

* Update talon_v2.dm

* sprite fix

* Forgot to add a fix

Fix for stamp and logo for correct work

* Delete custom_items.txt

accidentally add that in PR, now rempve that
2026-03-04 05:14:20 -08:00

397 lines
16 KiB
Plaintext

/obj/machinery/photocopier
name = "photocopier"
desc = "Copy all your important papers here!"
icon = 'icons/obj/library.dmi'
icon_state = "photocopier"
var/insert_anim = "photocopier_scan"
anchored = TRUE
density = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
circuit = /obj/item/circuitboard/photocopier
can_buckle = TRUE
var/obj/item/copyitem = null //what's in the copier!
var/copies = 1 //how many copies to print!
var/toner = 30 //how much toner is left! woooooo~
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
var/copying = FALSE // Is the printer busy with something? Sanity check variable.
/obj/machinery/photocopier/Initialize(mapload)
. = ..()
default_apply_parts()
/obj/machinery/photocopier/examine(mob/user as mob)
. = ..()
if(Adjacent(user))
. += "The screen shows there's [toner ? "[toner]" : "no"] toner left in the printer."
/obj/machinery/photocopier/attack_ai(mob/user as mob)
return attack_hand(user)
/obj/machinery/photocopier/attack_hand(mob/user as mob)
tgui_interact(user)
/obj/machinery/photocopier/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Photocopier", name)
ui.open()
/obj/machinery/photocopier/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["has_item"] = copyitem || has_buckled_mobs() // VOREStation Edit: Ass copying
data["isAI"] = issilicon(user)
data["can_AI_print"] = (toner >= 5)
data["has_toner"] = !!toner
data["current_toner"] = toner
data["max_toner"] = 40
data["num_copies"] = copies
data["max_copies"] = maxcopies
return data
/obj/machinery/photocopier/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(..())
return TRUE
switch(action)
if("make_copy")
addtimer(CALLBACK(src, PROC_REF(copy_operation), ui.user), 0)
. = TRUE
if("remove")
if(copyitem)
copyitem.loc = ui.user.loc
ui.user.put_in_hands(copyitem)
to_chat(ui.user, span_notice("You take \the [copyitem] out of \the [src]."))
copyitem = null
else if(has_buckled_mobs())
to_chat(buckled_mobs[1], span_notice("You feel a slight pressure on your ass.")) // It can't eject your asscheeks, but it'll try.
. = TRUE
if("set_copies")
copies = clamp(text2num(params["num_copies"]), 1, maxcopies)
. = TRUE
if("ai_photo")
if(!issilicon(ui.user))
return
if(stat & (BROKEN|NOPOWER))
return
if(toner >= 5)
var/mob/living/silicon/tempAI = ui.user
var/obj/item/camera/siliconcam/camera = tempAI.aiCamera
if(!camera)
return
var/obj/item/photo/selection = camera.selectpicture(ui.user)
if (!selection)
return
var/obj/item/photo/p = photocopy(selection)
if (p.desc == "")
p.desc += "Copied by [tempAI.name]"
else
p.desc += " - Copied by [tempAI.name]"
toner -= 5
. = TRUE
/obj/machinery/photocopier/proc/copy_operation(var/mob/user)
if(copying)
return FALSE
copying = TRUE
for(var/i = 0, i < copies, i++)
if(toner <= 0)
break
if (istype(copyitem, /obj/item/paper))
playsound(src, "sound/machines/copier.ogg", 100, 1)
sleep(11)
copy(copyitem)
audible_message(span_notice("You can hear [src] whirring as it finishes printing."), runemessage = "whirr")
playsound(src, "sound/machines/buzzbeep.ogg", 30)
else if (istype(copyitem, /obj/item/photo))
playsound(src, "sound/machines/copier.ogg", 100, 1)
sleep(11)
photocopy(copyitem)
audible_message(span_notice("You can hear [src] whirring as it finishes printing."), runemessage = "whirr")
playsound(src, "sound/machines/buzzbeep.ogg", 30)
else if (istype(copyitem, /obj/item/paper_bundle))
sleep(11)
playsound(src, "sound/machines/copier.ogg", 100, 1)
var/obj/item/paper_bundle/B = bundlecopy(copyitem)
sleep(11*B.pages.len)
audible_message(span_notice("You can hear [src] whirring as it finishes printing."), runemessage = "whirr")
playsound(src, "sound/machines/buzzbeep.ogg", 30)
else if (has_buckled_mobs()) // VOREStation EDIT: For ass-copying.
playsound(src, "sound/machines/copier.ogg", 100, 1)
audible_message(span_notice("You can hear [src] whirring as it attempts to scan."), runemessage = "whirr")
sleep(rand(20,45)) // Sit with your bare ass on the copier for a random time, feel like a fool, get stared at.
copyass(user)
sleep(15)
audible_message(span_notice("You can hear [src] whirring as it finishes printing."), runemessage = "whirr")
playsound(src, "sound/machines/buzzbeep.ogg", 30)
else
to_chat(user, span_warning("\The [copyitem] can't be copied by [src]."))
playsound(src, "sound/machines/buzz-two.ogg", 100)
break
use_power(active_power_usage)
copying = FALSE
/obj/machinery/photocopier/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/paper) || istype(O, /obj/item/photo) || istype(O, /obj/item/paper_bundle))
if(!copyitem)
user.drop_item()
copyitem = O
O.loc = src
to_chat(user, span_notice("You insert \the [O] into \the [src]."))
playsound(src, "sound/machines/click.ogg", 100, 1)
flick(insert_anim, src)
else
to_chat(user, span_notice("There is already something in \the [src]."))
else if(istype(O, /obj/item/toner))
if(toner <= 10) //allow replacing when low toner is affecting the print darkness
user.drop_item()
to_chat(user, span_notice("You insert the toner cartridge into \the [src]."))
flick("photocopier_toner", src)
playsound(loc, 'sound/machines/click.ogg', 50, 1)
var/obj/item/toner/T = O
toner += T.toner_amount
qdel(O)
else
to_chat(user, span_notice("This cartridge is not yet ready for replacement! Use up the rest of the toner."))
flick("photocopier_notoner", src)
playsound(loc, 'sound/machines/buzz-two.ogg', 75, 1)
else if(O.has_tool_quality(TOOL_WRENCH))
playsound(src, O.usesound, 50, 1)
anchored = !anchored
to_chat(user, span_notice("You [anchored ? "wrench" : "unwrench"] \the [src]."))
else if(default_deconstruction_screwdriver(user, O))
return
else if(default_deconstruction_crowbar(user, O))
return
return
/obj/machinery/photocopier/ex_act(severity)
switch(severity)
if(1.0)
qdel(src)
if(2.0)
if(prob(50))
qdel(src)
else
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
else
if(prob(50))
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
return
/obj/machinery/photocopier/proc/copy(var/obj/item/paper/copy, var/need_toner=1)
var/obj/item/paper/c = new /obj/item/paper (loc)
if(toner > 10) //lots of toner, make it dark
c.info = "<font color = #101010>"
else //no toner? shitty copies for you!
c.info = "<font color = #808080>"
var/copied = html_decode(copy.info)
copied = replacetext(copied, "<font face=\"[c.deffont]\" color=", "<font face=\"[c.deffont]\" nocolor=") //state of the art techniques in action
copied = replacetext(copied, "<font face=\"[c.crayonfont]\" color=", "<font face=\"[c.crayonfont]\" nocolor=") //This basically just breaks the existing color tag, which we need to do because the innermost tag takes priority.
c.info += copied
c.info += "</font>"//</font>
c.name = copy.name // -- Doohl
c.fields = copy.fields
c.stamps = copy.stamps
c.stamped = copy.stamped
c.ico = copy.ico
c.offset_x = copy.offset_x
c.offset_y = copy.offset_y
var/list/temp_overlays = copy.overlays //Iterates through stamps
var/image/img //and puts a matching
for (var/j = 1, j <= min(temp_overlays.len, copy.ico.len), j++) //gray overlay onto the copy
if (findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent"))
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-circle")
else if (findtext(copy.ico[j], "tal"))
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-square")
else if (findtext(copy.ico[j], "deny"))
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-x")
else
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-dots")
img.pixel_x = copy.offset_x[j]
img.pixel_y = copy.offset_y[j]
c.add_overlay(img)
c.updateinfolinks()
if(need_toner)
toner--
if(toner == 0)
playsound(src, "sound/machines/buzz-sigh.ogg", 100)
visible_message(span_notice("A [span_red("red")] light on \the [src] flashes, indicating that it is out of toner."))
return c
/obj/machinery/photocopier/proc/photocopy(var/obj/item/photo/photocopy, var/need_toner=1)
var/obj/item/photo/p = photocopy.copy()
p.loc = src.loc
var/icon/I = icon(photocopy.icon, photocopy.icon_state)
if(toner > 10) //plenty of toner, go straight greyscale
I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) //I'm not sure how expensive this is, but given the many limitations of photocopying, it shouldn't be an issue.
p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
else //not much toner left, lighten the photo
I.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
p.icon = I
if(need_toner)
toner -= 5 //photos use a lot of ink!
if(toner < 0)
toner = 0
playsound(src, "sound/machines/buzz-sigh.ogg", 100)
visible_message(span_notice("A red light on \the [src] flashes, indicating that it is out of toner."))
return p
// VOREStation Edit Start
/obj/machinery/photocopier/proc/copyass(mob/user)
var/icon/temp_img
if(!has_buckled_mobs()) // Are there no mobs buckled to the photocopier?
return
var/mob/sitter = buckled_mobs[1] // You have to be sitting on the copier/buckled to it and either be a xeno or a human without clothes on that cover your ass.
if(ishuman(sitter)) // Suit checks are in can_buckle_mobs at the bottom of the file.
var/mob/living/carbon/human/H = sitter // All human subtypes.
var/species_to_check = H.get_species()
if(species_to_check == SPECIES_CUSTOM || species_to_check == SPECIES_XENOCHIMERA) // Are we a custom species, or Xenochimera? If so, what is the base icon sprite for our species?
species_to_check = H.species.base_species // Grab the base species and use that as the 'species' for the purpose of printing off your asscheeks.
switch(species_to_check)
if(SPECIES_HUMAN)
temp_img = icon('icons/obj/butts_vr.dmi', "human")
if(SPECIES_TAJARAN)
temp_img = icon('icons/obj/butts_vr.dmi', "tajaran")
if(SPECIES_UNATHI)
temp_img = icon('icons/obj/butts_vr.dmi', "unathi")
if(SPECIES_SKRELL)
temp_img = icon('icons/obj/butts_vr.dmi', "skrell")
if(SPECIES_VOX)
temp_img = icon('icons/obj/butts_vr.dmi', "vox")
if(SPECIES_DIONA)
temp_img = icon('icons/obj/butts_vr.dmi', "diona")
if(SPECIES_PROMETHEAN)
temp_img = icon('icons/obj/butts_vr.dmi', "slime")
if(SPECIES_VULPKANIN)
temp_img = icon('icons/obj/butts_vr.dmi', "vulp")
if(SPECIES_PROTEAN)
temp_img = icon('icons/obj/butts_vr.dmi', "machine")
if(SPECIES_WEREBEAST)
temp_img = icon('icons/obj/butts_vr.dmi', "vulp") // Give Werewolves their own thicc'er than a boal of oatmeal ass sprite someday?
if(SPECIES_XENOHYBRID, SPECIES_XENO, SPECIES_XENO_DRONE, SPECIES_XENO_HUNTER, SPECIES_XENO_QUEEN, SPECIES_XENO_SENTINEL) // Xenos + Xenohybrids have their own asses, thanks to Pybro.
temp_img = icon('icons/obj/butts_vr.dmi', "xeno")
if(SPECIES_ZORREN_HIGH)
temp_img = icon('icons/obj/butts_vr.dmi', "vulp") // placeholder until we get zorren butts.
if(SPECIES_FENNEC)
temp_img = icon('icons/obj/butts_vr.dmi', "vulp") // placeholder until we get fennec butts.
if(SPECIES_AKULA)
temp_img = icon('icons/obj/butts_vr.dmi', "xeno") // placeholder until we get proper sharkbutt. AKULA BE THICC ASS SHARKS MMMMMMMMMMMMMMKAY?
// Butts by Meek the stoat!
if(SPECIES_TESHARI)
temp_img = icon('icons/obj/butts_vr.dmi', "tesh")
if(SPECIES_SERGAL)
temp_img = icon('icons/obj/butts_vr.dmi', "sergal")
if(SPECIES_NEVREAN)
temp_img = icon('icons/obj/butts_vr.dmi', "tesh") // kinda close! but should have it's own someday
if(SPECIES_ALTEVIAN)
temp_img = icon('icons/obj/butts_vr.dmi', "altevian")
/* // Commented out because no icons exist, BUT if someone wants to sprite some more ASSCHEEKS, then just uncomment these and you have asses for each species. - Rykka.
if(SPECIES_SHADEKIN || SPECIES_SHADEKIN_CREW)
temp_img = icon('icons/obj/butts_vr.dmi', "shadekin")
if(SPECIES_ALRAUNE)
temp_img = icon('icons/obj/butts_vr.dmi', "alraune")
if(SPECIES_RAPALA)
temp_img = icon('icons/obj/butts_vr.dmi', "rapala")
if(SPECIES_ZADDAT)
temp_img = icon('icons/obj/butts_vr.dmi', "zaddat")
if(SPECIES_XENOCHIMERA)
temp_img = icon('icons/obj/butts_vr.dmi', "xenochimera")
*/
else // Sanity/Safety check - does their species not show up or not work, or did something fail, but they're DEFINITELY a /human/ subtype? Print the 'default' ass.
temp_img = icon('icons/obj/butts_vr.dmi', "human")
else if(istype(sitter,/mob/living/silicon/robot/drone)) // Are we a drone?
temp_img = icon('icons/obj/butts_vr.dmi', "drone")
else if(istype(sitter,/mob/living/carbon/alien/diona)) // Are we a nymph, instead of a full-grown Diona?
temp_img = icon('icons/obj/butts_vr.dmi', "nymph")
else
return
var/obj/item/photo/p = new /obj/item/photo (loc)
p.desc = "You see [sitter]'s ass on the photo."
p.pixel_x = rand(-10, 10)
p.pixel_y = rand(-10, 10)
p.img = temp_img
p.drop_sound = 'sound/items/drop/paper.ogg'
var/icon/small_img = icon(temp_img) // Icon() is needed or else temp_img will be rescaled too >.>
var/icon/ic = icon('icons/obj/items.dmi',"photo")
small_img.Scale(8, 8)
ic.Blend(small_img,ICON_OVERLAY, 10, 13)
p.icon = ic
toner -= 10 // PHOTOCOPYING YOUR ASS IS EXPENSIVE (And so you can't just spam it a bunch).
if(toner < 0)
toner = 0
playsound(src, "sound/machines/buzz-sigh.ogg", 100)
visible_message(span_notice("A red light on \the [src] flashes, indicating that it is out of toner."))
return p
// VOREStation Edit Stop
//If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner
/obj/machinery/photocopier/proc/bundlecopy(var/obj/item/paper_bundle/bundle, var/need_toner=1)
var/obj/item/paper_bundle/p = new /obj/item/paper_bundle (src)
for(var/obj/item/W in bundle.pages)
if(toner <= 0 && need_toner)
toner = 0
playsound(src, "sound/machines/buzz-sigh.ogg", 100)
visible_message(span_notice("A red light on \the [src] flashes, indicating that it is out of toner."))
break
if(istype(W, /obj/item/paper))
W = copy(W)
else if(istype(W, /obj/item/photo))
W = photocopy(W)
W.loc = p
p.pages += W
p.loc = src.loc
p.update_icon()
p.icon_state = "paper_words"
p.name = bundle.name
p.pixel_y = rand(-8, 8)
p.pixel_x = rand(-9, 9)
return p
// VOREStation Edit Start - Rykka
/obj/machinery/photocopier/can_buckle_check(mob/living/M, forced = FALSE)
if(!..())
return FALSE
for(var/obj/item/clothing/C in M)
if(M.item_is_in_hands(C))
continue
if((C.body_parts_covered & LOWER_TORSO) && !istype(C,/obj/item/clothing/under/permit))
to_chat(M, span_warning("One needs to not be wearing pants to photocopy one's ass..."))
return FALSE
return TRUE
// VOREStation Edit Stop - Rykka
/obj/item/toner
name = "toner cartridge"
icon = 'icons/obj/device.dmi'
icon_state = "tonercartridge"
var/toner_amount = 30
pickup_sound = 'sound/items/pickup/device.ogg'
drop_sound = 'sound/items/drop/device.ogg'