mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 12:01:47 +00:00
140 lines
5.6 KiB
Plaintext
140 lines
5.6 KiB
Plaintext
/**
|
|
* # Printer Component
|
|
*
|
|
* Allows for text strings to be printed on a paper. Requires a shell.
|
|
*/
|
|
/obj/item/circuit_component/printer
|
|
display_name = "Printer"
|
|
desc = "A component that prints a string input on a paper. Requires a shell and paper. \
|
|
Attack with paper to load them in the circuit. Use in hand to dump the bottom-most paper."
|
|
category = "Action"
|
|
circuit_flags = CIRCUIT_FLAG_REFUSE_MODULE
|
|
|
|
/// Prints stuff on the leftmost paper in the loaded_papers list.
|
|
var/datum/port/input/print
|
|
/// The selected font-family used when printing text on paper
|
|
var/datum/port/input/option/typeface
|
|
/// The RGB values of the color used when printing text on paper
|
|
var/datum/port/input/text_color_red
|
|
var/datum/port/input/text_color_green
|
|
var/datum/port/input/text_color_blue
|
|
/// Used to eject the leftmost paper on the loaded_papers list.
|
|
var/datum/port/input/eject
|
|
/// The signature that'll replace any %s and %sign used when printing text on paper.
|
|
var/datum/port/input/signature
|
|
|
|
/// The list of papers currently loaded on the component
|
|
var/list/obj/item/paper/loaded_papers
|
|
/// The maximum paper capacity of the component
|
|
var/max_paper_capacity = 10
|
|
|
|
/obj/item/circuit_component/printer/populate_ports()
|
|
print = add_input_port("Print", PORT_TYPE_STRING, trigger = .proc/print_on_paper)
|
|
text_color_red = add_input_port("Color (Red)", PORT_TYPE_NUMBER, trigger = null, default = 0)
|
|
text_color_green = add_input_port("Color (Green)", PORT_TYPE_NUMBER, trigger = null, default = 0)
|
|
text_color_blue = add_input_port("Color (Blue)", PORT_TYPE_NUMBER, trigger = null, default = 0)
|
|
signature = add_input_port("Signature", PORT_TYPE_STRING, trigger = null, default = "signature")
|
|
eject = add_input_port("Eject", PORT_TYPE_SIGNAL, trigger = .proc/eject_paper, order = 2)
|
|
|
|
/obj/item/circuit_component/printer/populate_options()
|
|
var/static/typeface_options = list(
|
|
PRINTER_FONT,
|
|
PEN_FONT,
|
|
FOUNTAIN_PEN_FONT,
|
|
CRAYON_FONT,
|
|
"Impact",
|
|
"Webdings",
|
|
)
|
|
typeface = add_option_port("Typeface", typeface_options, trigger = null)
|
|
|
|
/obj/item/circuit_component/printer/Destroy()
|
|
QDEL_LIST(loaded_papers)
|
|
return ..()
|
|
|
|
/obj/item/circuit_component/printer/add_to(obj/item/integrated_circuit/add_to)
|
|
. = ..()
|
|
if(HAS_TRAIT(add_to, TRAIT_COMPONENT_PRINTER))
|
|
return FALSE
|
|
ADD_TRAIT(add_to, TRAIT_COMPONENT_PRINTER, src)
|
|
|
|
/obj/item/circuit_component/printer/removed_from(obj/item/integrated_circuit/removed_from)
|
|
REMOVE_TRAIT(removed_from, TRAIT_COMPONENT_PRINTER, src)
|
|
return ..()
|
|
|
|
/obj/item/circuit_component/printer/register_shell(atom/movable/shell)
|
|
RegisterSignal(shell, COMSIG_PARENT_ATTACKBY_SECONDARY, .proc/handle_secondary_attackby)
|
|
RegisterSignal(shell, COMSIG_PARENT_EXAMINE, .proc/on_examine)
|
|
|
|
/obj/item/circuit_component/printer/unregister_shell(atom/movable/shell)
|
|
UnregisterSignal(shell, list(COMSIG_PARENT_ATTACKBY_SECONDARY, COMSIG_PARENT_EXAMINE))
|
|
|
|
/obj/item/circuit_component/printer/get_ui_notices()
|
|
. = ..()
|
|
. += create_ui_notice("Papers Stored: [length(loaded_papers)]/[max_paper_capacity]", "orange", "info")
|
|
|
|
///Allows for paper to be loaded while inside the shell.
|
|
/obj/item/circuit_component/printer/proc/handle_secondary_attackby(atom/movable/shell, obj/item/item, mob/living/attacker)
|
|
SIGNAL_HANDLER
|
|
if(istype(item, /obj/item/paper))
|
|
load_paper(item, attacker)
|
|
return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN
|
|
|
|
/obj/item/circuit_component/printer/proc/on_examine(datum/source, mob/user, list/examine_list)
|
|
SIGNAL_HANDLER
|
|
examine_list += span_notice("It's a printer component installed in. Right-click with paper to reload it.")
|
|
|
|
/obj/item/circuit_component/printer/attackby(obj/item/item, mob/living/user, params)
|
|
if(istype(item, /obj/item/paper))
|
|
load_paper(item, user)
|
|
else
|
|
return ..()
|
|
|
|
/obj/item/circuit_component/printer/proc/load_paper(obj/item/paper/paper, mob/living/user)
|
|
if(length(loaded_papers) >= max_paper_capacity)
|
|
to_chat(user, span_warning("[src] can't hold any more paper."))
|
|
else if(user.transferItemToLoc(paper, src))
|
|
LAZYADD(loaded_papers, paper)
|
|
to_chat(user, span_notice("You load [paper] in [src]."))
|
|
else
|
|
to_chat(user, span_warning("[paper] seems to be stuck to your hand."))
|
|
|
|
/obj/item/circuit_component/printer/attack_self(mob/living/user)
|
|
. = ..()
|
|
var/obj/item/paper/paper = loaded_papers?[1]
|
|
if(paper)
|
|
user.put_in_hands(paper)
|
|
to_chat(user, span_notice("You remove [paper] from [src]."))
|
|
|
|
/obj/item/circuit_component/printer/Exited(atom/movable/movable)
|
|
. = ..()
|
|
if(movable in loaded_papers)
|
|
LAZYREMOVE(loaded_papers, movable)
|
|
|
|
/obj/item/circuit_component/printer/pre_input_received(datum/port/input/port)
|
|
if(port != print)
|
|
return
|
|
text_color_red.set_value(clamp(text_color_red.value, 0, 255))
|
|
text_color_green.set_value(clamp(text_color_green.value, 0, 255))
|
|
text_color_blue.set_value(clamp(text_color_blue.value, 0, 255))
|
|
signature.set_value(reject_bad_text(signature.value, MAX_NAME_LEN, FALSE) || "signature")
|
|
|
|
/obj/item/circuit_component/printer/proc/print_on_paper(datum/port/input/port)
|
|
if(!print.value)
|
|
return
|
|
var/obj/item/paper/paper = loaded_papers?[1]
|
|
if(!paper)
|
|
return
|
|
paper.add_info(print.value, rgb(text_color_red, text_color_green, text_color_blue), typeface.value, signature.value)
|
|
log_paper("Printer component writing to paper [paper.name]. [parent.get_creator()].")
|
|
|
|
/obj/item/circuit_component/printer/proc/eject_paper(datum/port/input/port, list/return_values)
|
|
var/obj/item/paper/paper = loaded_papers?[1]
|
|
if(!paper)
|
|
return
|
|
playsound(src, "sound/machines/dotprinter.ogg", 30, TRUE)
|
|
if(isliving(parent?.shell?.loc))
|
|
var/mob/living/living_loc = parent.shell.loc
|
|
living_loc.put_in_hands(paper)
|
|
else
|
|
paper.forceMove(drop_location())
|