Files
Aurora.3/code/modules/paperwork/photocopier.dm
T
KarolisandErki 4065e29e86 Vue.js UI implementation (#4868)
This UI is going to be more integrated with BYOND host objects. It's update principal is very different from nanoui's. It is based around state that is being synchronized with server and client (browser). Such synchronization has it's problems, like it can't handle rapid changes, what could cause client and server to become out of sync and client state to be discard.
2018-08-04 20:19:29 +03:00

238 lines
8.4 KiB
Plaintext

/obj/machinery/photocopier
name = "photocopier"
icon = 'icons/obj/library.dmi'
icon_state = "bigscanner"
var/insert_anim = "bigscanner1"
anchored = 1
density = 1
use_power = 1
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
var/obj/item/copyitem = null //what's in the copier!
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!
/obj/machinery/photocopier/attack_ai(mob/user as mob)
return attack_hand(user)
VUEUI_MONITOR_VARS(/obj/machinery/photocopier, photocopiermonitor)
watch_var("toner", "toner")
watch_var("maxcopies", "maxcopies")
watch_var("copyitem", "gotitem", CALLBACK(null, .proc/transform_to_boolean, FALSE))
/obj/machinery/photocopier/vueui_data_change(var/list/data, var/mob/user, var/vueui/ui)
. = ..()
data = . || data
if(data && data["isAI"] != istype(user, /mob/living/silicon))
data["isAI"] = istype(user, /mob/living/silicon)
. = data
if(data && !isnum(data["copies"]))
data["copies"] = 1
. = data
/obj/machinery/photocopier/attack_hand(mob/user)
user.set_machine(src)
ui_interact(user)
/obj/machinery/photocopier/ui_interact(mob/user)
var/datum/vueui/ui = SSvueui.get_open_ui(user, src)
if (!ui)
ui = new(user, src, "paperwork-photocopier", 300, 200, capitalize(src.name))
ui.open()
/obj/machinery/photocopier/Topic(href, href_list)
if(href_list["copy"])
if(stat & (BROKEN|NOPOWER))
return
var/datum/vueui/ui = href_list["vueui"]
if(!istype(ui))
return
var/copies = between(0, ui.data["copies"], maxcopies)
for(var/i = 0, i < copies, i++)
if(toner <= 0)
break
if (istype(copyitem, /obj/item/weapon/paper))
copy(copyitem)
sleep(20)
else if (istype(copyitem, /obj/item/weapon/photo))
photocopy(copyitem)
sleep(15)
else if (istype(copyitem, /obj/item/weapon/paper_bundle))
var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem)
sleep(15*B.pages.len)
else
usr << "<span class='warning'>\The [copyitem] can't be copied by \the [src].</span>"
break
use_power(active_power_usage)
SSvueui.check_uis_for_change(src)
else if(href_list["remove"])
if(copyitem)
copyitem.forceMove(usr.loc)
usr.put_in_hands(copyitem)
usr << "<span class='notice'>You take \the [copyitem] out of \the [src].</span>"
copyitem = null
SSvueui.check_uis_for_change(src)
else if(href_list["aipic"])
if(!istype(usr,/mob/living/silicon)) return
if(stat & (BROKEN|NOPOWER)) return
if(toner >= 5)
var/mob/living/silicon/tempAI = usr
var/obj/item/device/camera/siliconcam/camera = tempAI.aiCamera
if(!camera)
return
var/obj/item/weapon/photo/selection = camera.selectpicture()
if (!selection)
return
var/obj/item/weapon/photo/p = photocopy(selection)
if (p.desc == "")
p.desc += "Copied by [tempAI.name]"
else
p.desc += " - Copied by [tempAI.name]"
toner -= 5
sleep(15)
SSvueui.check_uis_for_change(src)
/obj/machinery/photocopier/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) || istype(O, /obj/item/weapon/paper_bundle))
if(!copyitem)
user.drop_from_inventory(O,src)
copyitem = O
user << "<span class='notice'>You insert \the [O] into \the [src].</span>"
flick(insert_anim, src)
SSvueui.check_uis_for_change(src)
else
user << "<span class='notice'>There is already something in \the [src].</span>"
else if(istype(O, /obj/item/device/toner))
if(toner <= 10) //allow replacing when low toner is affecting the print darkness
user << "<span class='notice'>You insert \the [O] into \the [src].</span>"
var/obj/item/device/toner/T = O
toner += T.toner_amount
user.drop_from_inventory(O,get_turf(src))
qdel(O)
SSvueui.check_uis_for_change(src)
else
user << "<span class='notice'>This cartridge is not yet ready for replacement! Use up the rest of the toner.</span>"
else if(iswrench(O))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
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/weapon/paper/copy, var/print = 1, var/use_sound = 1, var/delay = 20)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper()
var/info
var/pname
if (toner > 10) //lots of toner, make it dark
info = "<font color = #101010>"
else //no toner? shitty copies for you!
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.
info += copied
info += "</font>"//</font>
pname = 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], "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)
toner--
if(toner == 0)
visible_message("<span class='notice'>A red light on \the [src] flashes, indicating that it is out of toner.</span>")
return
c.set_content_unsafe(pname, info)
if (print)
src.print(c, use_sound, 'sound/items/poster_being_created.ogg', delay)
return c
/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy)
var/obj/item/weapon/photo/p = photocopy.copy()
p.forceMove(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
toner -= 5 //photos use a lot of ink!
if(toner < 0)
toner = 0
visible_message("<span class='notice'>A red light on \the [src] flashes, indicating that it is out of toner.</span>")
return p
//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/weapon/paper_bundle/bundle, var/need_toner=1)
var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src)
for(var/obj/item/weapon/W in bundle.pages)
if(toner <= 0 && need_toner)
toner = 0
visible_message("<span class='notice'>A red light on \the [src] flashes, indicating that it is out of toner.</span>")
break
if(istype(W, /obj/item/weapon/paper))
W = copy(W)
else if(istype(W, /obj/item/weapon/photo))
W = photocopy(W)
W.forceMove(p)
p.pages += W
p.forceMove(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
/obj/item/device/toner
name = "toner cartridge"
icon_state = "tonercartridge"
var/toner_amount = 30