//CONTENTS //format_net_id proc //Base peripheral card //radio card //powernet communication card //combo powernet comm/printer terminal card //printer card //prize vending card //ID scanning card //Sound card //Floppy drive //Rom cart reader //Electrical scanner interface. //Portables battery monitor card. /obj/item/peripheral name = "Peripheral card" desc = "A computer circuit board." icon = 'icons/obj/module.dmi' inhand_image_icon = 'icons/mob/inhand/hand_tools.dmi' icon_state = "id_mod" item_state = "electronic" w_class = 2 var/obj/machinery/computer3/host var/id = null var/func_tag = "GENERIC" //What kind of peripheral is this, huh?? var/setup_has_badge = 0 //IF this is set, present return_badge() in the host's browse window mats = 8 New(location) ..() if(istype(location,/obj/machinery/computer3)) host = location if (!host.peripherals) host.peripherals = list() host.peripherals.Add(src) src.id = "\ref[src]" /* new disposing() pattern should handle this. -singh Del() if(host) host.peripherals.Remove(src) ..() */ disposing() if (host) host.peripherals.Remove(src) host = null ..() proc receive_command(obj/source, command, datum/signal/signal) if((source != host) || !(src in host)) return 1 if(!command || (signal && signal.encryption && signal.encryption != src.id)) return 1 return 0 send_command(command, datum/signal/signal) if(!command || !host) return if(!istype(host) || (host.stat & (NOPOWER|BROKEN))) return src.host.receive_command(src, command, signal) return return_status_text() return "OK" installed(var/obj/machinery/computer3/newhost) if(!newhost) return 1 if(newhost != src.host) src.host = newhost if(!(src in src.host.peripherals)) src.host.peripherals.Add(src) return 0 uninstalled() //Called when removed from computer3frame/computer3 is taken apart return 0 //If setup_has_badge is set, the text returned here will be available in the computer3 browse window return_badge() return Topic(href, href_list) if(!src.host || !(src in src.host.contents)) return 1 if(usr.stat || usr.restrained()) return 1 if ((!usr.contents.Find(src.host) && (!in_range(src.host, usr) || !istype(src.host.loc, /turf))) && (!istype(usr, /mob/living/silicon))) return 1 if(src.host.stat & (NOPOWER|BROKEN)) return 1 return 0 /obj/item/peripheral/network var/code = null //Signal encryption code var/net_id = null //What is our ID on the network? var/last_ping = 0 /obj/item/peripheral/network/radio name = "wireless card" desc = "A wireless computer card. It has a bit of a limited range." icon_state = "radio_mod" func_tag = "RAD_ADAPTER" var/frequency = 1419 var/datum/radio_frequency/radio_connection var/range = 8 //How far can our signal travel?? HOW FAR var/setup_freq_locked = 0 //If set, frequency cannot be adjusted. var/setup_netmode_norange = 1 //If set, there is no range limit in network mode. var/net_mode = 0 //If 1, act like a powernet card (ignore tranmissions not addressed to us.) //var/logstring = null //Log incoming transmissions. With a string. locked //Locked wireless card name = "Limited Wireless card" desc = "A wireless computer card, capable of transmitting only at a single frequency." //range = 0 //Infinite range!! Infinite range!! setup_freq_locked = 1 pda frequency = 1149 //Standard PDA comm frequency. net_mode = 1 func_tag = "NET_ADAPTER" status //This one is for status display control. frequency = 1435 setup_netmode_norange = 0 New() ..() if(radio_controller) initialize() src.net_id = format_net_id("\ref[src]") initialize() set_frequency(frequency) disposing() if (radio_controller) radio_controller.remove_object(src, "[frequency]") radio_connection = null ..() proc set_frequency(new_frequency) radio_controller.remove_object(src, "[frequency]") frequency = new_frequency radio_connection = radio_controller.add_object(src, "[frequency]") receive_command(obj/source, command, datum/signal/signal) if(..()) return 1 if(!radio_connection) return 1 var/broadcast_range = src.range //No range in network mode!! if(setup_netmode_norange && src.net_mode) broadcast_range = 0 switch(command) if("transmit") if (!signal) return var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() if(signal.data_file) //Gonna transfer so many files. newsignal.data_file = signal.data_file.copy_file() newsignal.encryption = src.code newsignal.transmission_method = TRANSMISSION_RADIO if(src.net_mode) if(!newsignal.data["address_1"]) //Net_mode demands an address_1 value! //qdel(newsignal) return 1 newsignal.data["sender"] = src.net_id src.radio_connection.post_signal(src, newsignal, broadcast_range) return 0 if("mode_net") src.net_mode = 1 func_tag = "NET_ADAPTER" //Pretend to be that fukken wired card. return 0 if("mode_free") src.net_mode = 0 func_tag = "RAD_ADAPTER" return 0 if ("ping") if(!src.net_mode) return 1 if( (last_ping && ((last_ping + 10) >= world.time) ) || !src.net_id) return 1 last_ping = world.time var/datum/signal/newsignal = get_free_signal() newsignal.data["address_1"] = "ping" newsignal.data["sender"] = src.net_id newsignal.transmission_method = TRANSMISSION_RADIO src.radio_connection.post_signal(src, newsignal, broadcast_range) return 0 if ("help") return "Valid commands: transmit, mode_net, mode_free, ping, or 1000-1500 to set frequency." else if(!src.setup_freq_locked) var/new_freq = round(text2num(command)) if(new_freq && (new_freq >= 1000 && new_freq <= 1500)) src.set_frequency(new_freq) return 0 return 1 receive_signal(datum/signal/signal) if(!src.host || host.stat & (NOPOWER|BROKEN)) return if(!signal || (signal.encryption && signal.encryption != code)) return //src.logstring += "R@[src.frequency]:[src.code];" //It better be for us. Or a ping request. if(src.net_mode) if(signal.data["address_1"] != src.net_id) if((signal.data["address_1"] == "ping") && signal.data["sender"]) var/datum/signal/pingsignal = get_free_signal() pingsignal.source = host pingsignal.data["device"] = "WNET_ADAPTER" pingsignal.data["netid"] = src.net_id pingsignal.data["address_1"] = signal.data["sender"] pingsignal.data["command"] = "ping_reply" pingsignal.data["data"] = host.name pingsignal.transmission_method = TRANSMISSION_RADIO var/broadcast_range = src.range if(src.setup_netmode_norange) broadcast_range = 0 spawn(5) //Send a reply for those curious jerks src.radio_connection.post_signal(src, pingsignal, broadcast_range) return var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() //if(src.code) //newsignal.encryption = src.code if(signal.data_file) newsignal.data_file = signal.data_file.copy_file() send_command("receive",newsignal) return return_status_text() . = "FREQ: [src.frequency]" if(src.net_mode) //We are in powernet card emulation mode. . += " | NETID: [src.net_id ? src.net_id : "NONE"]" else //We are in free radio mode. . += " | RANGE: [src.range ? "[src.range]" : "FULL"]" /obj/item/peripheral/network/powernet_card name = "wired network card" desc = "A computer networking card designed to transmit information over power lines." icon_state = "power_mod" func_tag = "NET_ADAPTER" var/net_number = null var/obj/machinery/power/data_terminal/link = null //For communicating with the powernet. New() ..() spawn(10) if(src.host && !src.link) //Wait for the map to load and hook up if installed() hasn't done it. src.check_connection() //Let's blindy attempt to generate a unique network ID! src.net_id = format_net_id("\ref[src]") installed(var/obj/machinery/computer3/newhost) if(..()) return 1 src.link = null src.check_connection() return 0 uninstalled() //Clear our status as the link's master, then null out that link. //boutput(world, "uninstalling") if((src.link) && (src.link.master == src)) //boutput(world, "clearing link of [src]") src.link.master = null src.link = null return 0 disposing() uninstalled() ..() receive_command(obj/source, command, datum/signal/signal) if(..()) return 1 if(!src.check_connection()) return 1 if (command == "transmit") //Transmit a copy of the command signal if(!signal) return 1 var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() if(signal.data_file) //Gonna transfer so many files. newsignal.data_file = signal.data_file.copy_file() newsignal.data["sender"] = src.net_id //Override whatever jerk info they put here. newsignal.encryption = src.code newsignal.transmission_method = TRANSMISSION_WIRE src.link.post_signal(src, newsignal) return 0 else if(dd_hasprefix(command, "ping")) //Just a shortcut for pinging the network. if( (last_ping && ((last_ping + 10) >= world.time) ) || !src.net_id) return 1 last_ping = world.time var/datum/signal/newsignal = get_free_signal() newsignal.data["address_1"] = "ping" newsignal.data["sender"] = src.net_id if (length(command) > 4) var/new_net_number = text2num( copytext(command, 5) ) if (new_net_number != null && new_net_number >= 0 && new_net_number <= 16) newsignal.data["net"] = "[new_net_number]" else if (src.net_number) newsignal.data["net"] = "[net_number]" else if (src.net_number) newsignal.data["net"] = "[net_number]" newsignal.transmission_method = TRANSMISSION_WIRE src.link.post_signal(src, newsignal) return 0 else if (dd_hasprefix(command, "subnet")) if (length(command) > 6) var/new_net_number = text2num( copytext(command, 7) ) if (new_net_number != null && new_net_number >= 0 && new_net_number <= 16) src.net_number = new_net_number else src.net_number = null return 0 else if (command == "help") return "Valid commands: transmit, ping, or subnet# to set subnet" return 1 receive_signal(datum/signal/signal) if(!src.host || host.stat & (NOPOWER|BROKEN)) return if(!signal || !src.net_id || (signal.encryption && signal.encryption != code)) return if(signal.transmission_method != TRANSMISSION_WIRE) //No radio for us thanks return if(!src.link || !src.check_connection()) return //They don't need to target us specifically to ping us. //Otherwise, ff they aren't addressing us, ignore them if(signal.data["address_1"] != src.net_id) if((signal.data["address_1"] == "ping") && ((signal.data["net"] == null) || ("[signal.data["net"]]" == "[src.net_number]")) && signal.data["sender"]) var/datum/signal/pingsignal = get_free_signal() pingsignal.data["device"] = "PNET_ADAPTER" pingsignal.data["netid"] = src.net_id pingsignal.data["address_1"] = signal.data["sender"] pingsignal.data["command"] = "ping_reply" pingsignal.transmission_method = TRANSMISSION_WIRE spawn(5) //Send a reply for those curious jerks src.link.post_signal(src, pingsignal) return //Just toss out the rest of the signal then I guess var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() if(signal.data_file) //Gonna transfer so many files. newsignal.data_file = signal.data_file.copy_file() send_command("receive",newsignal) return return_status_text() . = "LINK: [src.link ? "ACTIVE" : "!NONE!"]" . += " | NETID: [src.net_id ? src.net_id : "NONE"]" proc check_connection() //if there is a link, it has a master, and the master is valid.. if(src.link && istype(src.link) && (src.link.master) && src.link.is_valid_master(src.link.master)) if(src.link.master == src) return 1 //If it's already us, the connection is fine! else//Otherwise welp no this thing is taken. src.link = null return 0 src.link = null var/turf/T = get_turf(src) var/obj/machinery/power/data_terminal/test_link = locate() in T if(test_link && !test_link.is_valid_master(test_link.master)) src.link = test_link src.link.master = src return 1 else //boutput(world, "couldn't link") return 0 return 0 /obj/item/peripheral/network/powernet_card/terminal name = "Terminal card" desc = "A networking/printing combo card designed to fit into a computer casing." icon_state = "card_mod" var/printing = 0 receive_command(obj/source, command, datum/signal/signal) if((source != host) || !(src in host)) return 1 if(!command || (signal && signal.encryption && signal.encryption != src.id)) return 1 if(!src.check_connection()) return 1 switch(command) if("transmit") //Transmit a copy of the command signal if(!signal) return 1 var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() if(signal.data_file) //Gonna transfer so many files. newsignal.data_file = signal.data_file.copy_file() newsignal.data["sender"] = src.net_id //Override whatever jerk info they put here. newsignal.encryption = src.code newsignal.transmission_method = TRANSMISSION_WIRE src.link.post_signal(src, newsignal) //src.logstring += "T@[time2text(world.realtime, "hh:mm:ss")]|[src.code]|[strip_html(command)];" /* if("ping") if( (last_ping && ((last_ping + 10) >= world.time) ) || !src.net_id) return last_ping = world.time var/datum/signal/newsignal = get_free_signal() newsignal.data["address_1"] = "ping" newsignal.data["sender"] = src.net_id newsignal.transmission_method = TRANSMISSION_WIRE src.link.post_signal(src, newsignal) */ if("print") if(src.printing) return 1 src.printing = 1 var/print_data = signal.data["data"] var/print_title = signal.data["title"] if(!print_data) src.printing = 0 return 1 spawn(50) var/obj/item/paper/thermal/P = new /obj/item/paper/thermal( src.host.loc ) playsound(src.host.loc, "sound/machines/printer_thermal.ogg", 50, 1) P.info = "[print_data]" if(print_title) P.name = "paper- '[print_title]'" src.printing = 0 return 0 if("help") return "Valid commands: transmit, print, or subnet# to set subnet." else if(dd_hasprefix(command, "ping")) if( (last_ping && ((last_ping + 10) >= world.time) ) || !src.net_id) return 1 last_ping = world.time var/datum/signal/newsignal = get_free_signal() newsignal.data["address_1"] = "ping" newsignal.data["sender"] = src.net_id if (length(command) > 4) var/new_net_number = text2num( copytext(command, 5) ) if (new_net_number != null && new_net_number >= 0 && new_net_number <= 16) newsignal.data["net"] = "[new_net_number]" else if (src.net_number) newsignal.data["net"] = "[net_number]" else if (src.net_number) newsignal.data["net"] = "[net_number]" newsignal.transmission_method = TRANSMISSION_WIRE src.link.post_signal(src, newsignal) else if (dd_hasprefix(command, "subnet")) if (length(command) > 6) var/new_net_number = text2num( copytext(command, 7) ) if (new_net_number != null && new_net_number >= 0 && new_net_number <= 16) src.net_number = new_net_number else src.net_number = null return 0 /obj/item/peripheral/network/omni name = "omni network card" desc = "A computer networking card designed to transmit information over either power lines or wirelessly. It has a mode_wire mode in addition to the typical mode_net and mode_free options." icon_state = "radio_mod" func_tag = "RAD_ADAPTER" var/mode = 2 //0: is free radio, 1 is network radio, 2 is wired network var/printing = 0 var/obj/machinery/power/data_terminal/wired_link = null var/subnet = null var/datum/radio_frequency/wireless_link = null var/frequency = 1419 var/wireless_range = 8 New() ..() if(radio_controller) initialize() spawn(10) if(src.host && !src.wired_link) //Wait for the map to load and hook up if installed() hasn't done it. src.check_wired_connection() //Let's blindy attempt to generate a unique network ID! src.net_id = format_net_id("\ref[src]") src.set_frequency(frequency) receive_command(obj/source, command, datum/signal/signal) if((source != host) || !(src in host)) return 1 if(!command || (signal && signal.encryption && signal.encryption != src.id)) return 1 command = lowertext(command) switch(command) if ("transmit") if (src.mode < 2) if (!wireless_link) return 1 var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() if(signal.data_file) //Gonna transfer so many files. newsignal.data_file = signal.data_file.copy_file() if (src.mode == 1) newsignal.data["sender"] = src.net_id newsignal.transmission_method = TRANSMISSION_RADIO src.wireless_link.post_signal(src, newsignal, (src.mode == 1 ? 0 : src.wireless_range)) return 0 else if (!wired_link && !check_wired_connection()) return 1 var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() if(signal.data_file) //Gonna transfer so many files. newsignal.data_file = signal.data_file.copy_file() newsignal.data["sender"] = src.net_id newsignal.transmission_method = TRANSMISSION_WIRE src.wired_link.post_signal(src, newsignal) return 0 return 1 if ("mode_free") src.mode = 0 func_tag = "RAD_ADAPTER" return 0 if ("mode_net") src.mode = 1 func_tag = "NET_ADAPTER" return 0 if ("mode_wire") src.mode = 2 func_tag = "NET_ADAPTER" return 0 if("print") if(src.printing) return 1 src.printing = 1 var/print_data = signal.data["data"] var/print_title = signal.data["title"] if(!print_data) src.printing = 0 return 1 spawn(50) var/obj/item/paper/thermal/P = new /obj/item/paper/thermal( src.host.loc ) playsound(src.host.loc, "sound/machines/printer_thermal.ogg", 50, 1) P.info = "[print_data]" if(print_title) P.name = "paper- '[print_title]'" src.printing = 0 return 0 if("help") return "Valid commands: transmit, mode_net, mode_free, mode_wire, print, ping, subnet# to set subnet, or 1000-1500 to set frequency in wireless modes." else if (copytext(command, 1, 5) == "ping") if (src.mode == 1) if (!wireless_link) return 1 if( (last_ping && ((last_ping + 10) >= world.time) ) || !src.net_id) return 1 last_ping = world.time var/datum/signal/newsignal = get_free_signal() newsignal.data["address_1"] = "ping" newsignal.data["sender"] = src.net_id newsignal.transmission_method = TRANSMISSION_RADIO src.wireless_link.post_signal(src, newsignal) return 0 else if (src.mode == 2) if (!wired_link) return 1 if( (last_ping && ((last_ping + 10) >= world.time) ) || !src.net_id) return 1 last_ping = world.time var/datum/signal/newsignal = get_free_signal() newsignal.data["address_1"] = "ping" newsignal.data["sender"] = src.net_id if (src.subnet) newsignal.data["net"] = "[subnet]" newsignal.transmission_method = TRANSMISSION_WIRE src.wired_link.post_signal(src, newsignal) return 0 return 1 else if (copytext(command, 1, 7) == "subnet") . = text2num( copytext(command, 7) ) if (. != null && . >= 0 && . <= 16) src.subnet = . else src.subnet = null return 0 else if (mode < 2) . = text2num(command) if (isnum(.)) . = round( max(1000, min(., 1500)) ) set_frequency(.) return 0 return 1 receive_signal(datum/signal/signal) if(!src.host || host.stat & (NOPOWER|BROKEN)) return if(!signal || !src.net_id || signal.encryption) return if((src.mode < 2 && !src.wireless_link) || (src.mode == 2 && (!src.wired_link || !src.check_wired_connection()))) return if(signal.data["address_1"] != src.net_id) if((signal.data["address_1"] == "ping") && ((signal.data["net"] == null) || ("[signal.data["net"]]" == "[src.subnet]")) && signal.data["sender"]) var/datum/signal/pingsignal = get_free_signal() pingsignal.data["device"] = "[src.mode == 2 ? "P" : null]NET_ADAPTER" pingsignal.data["netid"] = src.net_id pingsignal.data["address_1"] = signal.data["sender"] pingsignal.data["command"] = "ping_reply" pingsignal.transmission_method = src.mode == 2 ? TRANSMISSION_WIRE : TRANSMISSION_RADIO spawn(5) //Send a reply for those curious jerks if (src.mode == 2 && src.wired_link) src.wired_link.post_signal(src, pingsignal) else if (src.wireless_link) src.wireless_link.post_signal(src, pingsignal) return //Just toss out the rest of the signal then I guess var/datum/signal/newsignal = get_free_signal() newsignal.data = signal.data:Copy() if(signal.data_file) //Gonna transfer so many files. newsignal.data_file = signal.data_file.copy_file() send_command("receive",newsignal) return installed(var/obj/machinery/computer3/newhost) if(..()) return 1 if (!src.wireless_link) src.wireless_link = radio_controller.add_object(src, "[frequency]") //src.wired_link = null src.check_wired_connection() return 0 uninstalled() //Unsubscribe from any wireless link we might have if (src.wireless_link) radio_controller.remove_object(src, "[frequency]") src.wireless_link = null //Clear our status as the wired link's master, then null out that link. if((src.wired_link) && (src.wired_link.master == src)) src.wired_link.master = null src.wired_link = null return 0 return_status_text() if (src.mode < 2) . = "FREQ: [src.frequency]" if(src.mode == 1) //We are in powernet card emulation mode. . += " | NETID: [src.net_id ? src.net_id : "NONE"]" else //We are in free radio mode. . += " | RANGE: [src.wireless_range ? "[src.wireless_range]" : "FULL"]" else . = "LINK: [src.wired_link ? "ACTIVE" : "!NONE!"]" . += " | NETID: [src.net_id ? src.net_id : "NONE"]" disposing() uninstalled() ..() proc/set_frequency(new_frequency) radio_controller.remove_object(src, "[frequency]") frequency = new_frequency wireless_link = radio_controller.add_object(src, "[frequency]") proc/check_wired_connection() //if there is a link, it has a master, and the master is valid.. if(istype(src.wired_link) && (src.wired_link.master) && src.wired_link.is_valid_master(src.wired_link.master)) if(src.wired_link.master == src) return 1 //If it's already us, the connection is fine! else//Otherwise welp no this thing is taken. src.wired_link = null return 0 src.wired_link = null var/turf/T = get_turf(src) var/obj/machinery/power/data_terminal/test_link = locate() in T if(test_link && !test_link.is_valid_master(test_link.master)) src.wired_link = test_link src.wired_link.master = src return 1 else return 0 return 0 /obj/item/peripheral/printer name = "Printer module" desc = "A small printer designed to fit into a computer casing." icon_state = "card_mod" func_tag = "LAR_PRINTER" var/printing = 0 receive_command(obj/source,command, datum/signal/signal) if(..()) return 1 if(!signal) return 1 if((command == "print") && !src.printing) src.printing = 1 var/print_data = signal.data["data"] var/print_title = signal.data["title"] if(!print_data) src.printing = 0 return spawn(50) var/obj/item/paper/thermal/P = new /obj/item/paper/thermal( src.host.loc ) playsound(src.host.loc, "sound/machines/printer_thermal.ogg", 50, 1) P.info = "[print_data]" if(print_title) P.name = "paper- '[print_title]'" src.printing = 0 return 0 else if (command == "help") return "Valid command: print, accompanied by a file to print." return 1 return_status_text() var/status = "PRINTING?: [src.printing ? "YES" : "NO"]" return status /obj/item/peripheral/prize_vendor name = "Prize vending module" desc = "An arcade prize dispenser designed to fit inside a computer casing." icon_state = "id_mod" func_tag = "LAR_VENDOR" var/last_vend = 0 //Delay between vends so it can't be spammed (ie a dude is holding it and shaking stuff out) return_status_text() var/status_text = "RECHARGING" if((last_vend + 400) < world.time) status_text = "READY" return status_text receive_command(obj/source,command, datum/signal/signal) if(..()) return 1 if((command == "vend") && ((last_vend + 400) < world.time)) src.vend_prize() src.last_vend = world.time return 0 else return "Valid command: \"vend\" to vend prize." return 1 attack_self(mob/user as mob) if( (last_vend + 400) < world.time) boutput(user, "You shake something out of [src]!") src.vend_prize() src.last_vend = world.time else boutput(user, "[src] isn't ready to dispense a prize yet.") return proc/vend_prize() var/obj/item/prize var/prizeselect = rand(1,4) var/turf/prize_location = null if(src.host) prize_location = src.host.loc else prize_location = get_turf(src) switch(prizeselect) if(1) prize = new /obj/item/spacecash( prize_location ) prize.name = "space ticket" prize.desc = "It's almost like actual currency!" if(2) prize = new /obj/item/device/radio/beacon( prize_location ) prize.name = "electronic blink toy game" prize.desc = "Blink. Blink. Blink." if(3) prize = new /obj/item/zippo( prize_location ) prize.name = "Burno Lighter" prize.desc = "Almost like a decent lighter!" if(4) prize = new /obj/item/toy/sword( prize_location ) if(5) prize = new /obj/item/harmonica( prize_location ) prize.name = "reverse harmonica" prize.desc = "To the untrained eye it is like any other harmonica, but the professional will notice that it is BACKWARDS." if(6) prize = new /obj/item/wrench( prize_location ) prize.name = "golden wrench" prize.desc = "A generic wrench, but now with gold plating!" prize.icon_state = "gold_wrench" if(7) prize = new /obj/item/firework( prize_location ) prize.icon = 'icons/obj/device.dmi' prize.icon_state = "shield0" prize.name = "decloaking device" prize.desc = "A device for removing cloaks. Made in Space-Taiwan." prize:det_time = 5 /obj/item/peripheral/card_scanner name = "ID scanner module" desc = "A peripheral board for scanning ID cards." icon_state = "card_mod" setup_has_badge = 1 func_tag = "ID_SCANNER" var/obj/item/card/id/authid = null var/can_manage_access = 0 //Can it change a card's accesses? var/can_manage_money = 0 //Can it adjust a card's money balance? editor name = "ID modifier module" desc = "A peripheral board for editing ID cards." can_manage_access = 1 register //A card scanner...that manages money?? name = "ATM card module" desc = "A peripheral board for managing an ID card's credit balance." func_tag = "ATM_SCANNER" can_manage_money = 1 return_status_text() var/status_text = "No card loaded" if(src.authid) status_text = "Balance: [authid.money]" return status_text return_status_text() var/status_text = "No card loaded" if(src.authid) status_text = "Card: [authid.registered]" return status_text return_badge() var/dat = "Card: [src.authid ? "Eject" : "-----"]" return dat proc/eject_card() if(src.authid) src.authid.set_loc(get_turf(src)) src.authid = null return attack_self(mob/user as mob) if(authid) boutput(user, "The card falls out.") src.eject_card() return receive_command(obj/source,command, datum/signal/signal) if(..()) return 1 switch(command) if("eject") src.eject_card() return 0 if("scan_card") if(!src.authid) return "nocard" if (!src.authid.registered) return "noreg" else if (!src.authid.assignment) return "noassign" var/datum/signal/newsignal = get_free_signal() newsignal.data["registered"] = src.authid.registered newsignal.data["assignment"] = src.authid.assignment newsignal.data["access"] = jointext(src.authid.access, ";") newsignal.data["balance"] = src.authid.money spawn(4) send_command("card_authed", newsignal) return newsignal if("checkaccess") if(!src.authid) return "nocard" var/new_access = 0 if(signal) new_access = text2num(signal.data["access"]) if(!new_access || (new_access in src.authid.access)) var/datum/signal/newsignal = get_free_signal() newsignal.data["registered"] = src.authid.registered newsignal.data["assignment"] = src.authid.assignment newsignal.data["balance"] = src.authid.money spawn(4) send_command("card_authed", newsignal) return newsignal if("charge") if(!src.authid || !src.can_manage_money || !signal) return "nocard" /* //We need correct PIN numbers you jerks. if(text2num(signal.data["pin"]) != src.authid.pin) spawn(4) send_command("card_bad_pin") return */ var/charge_amount = text2num(signal.data["data"]) if(!charge_amount || (charge_amount <= 0) || charge_amount > src.authid.money) spawn(4) send_command("card_bad_charge") return 1 src.authid.money = max(src.authid.money - charge_amount, 0) //to-do: new balance reply. return "[src.authid.money]" if("grantaccess") if(!src.authid || !src.can_manage_access || !signal) return "nocard" var/new_access = text2num(signal.data["access"]) if(!new_access || (new_access <= 0)) return if(!(new_access in src.authid.access)) src.authid.access += new_access //Send a reply to confirm the granting of this access. var/datum/signal/newsignal = get_free_signal() newsignal.data["access"] = new_access spawn(4) send_command("card_add") return 0 if("removeaccess") if(!src.authid || !src.can_manage_access || !signal) return "nocard" var/rem_access = text2num(signal.data["access"]) if(!rem_access || (rem_access <= 0)) return 1 if(rem_access in src.authid.access) src.authid.access -= rem_access //Send a reply to confirm the granting of this access. var/datum/signal/newsignal = get_free_signal() newsignal.data["access"] = rem_access spawn(4) send_command("card_remove") return 0 else return "Valid commands: eject, scan_card, checkaccess[src.can_manage_access ? ", grantaccess or removeaccess with signal with access=X" : null]" return Topic(href, href_list) if(..()) return if(istype(usr,/mob/living/silicon) && get_dist(src, usr) > 1) boutput(usr, "You cannot press the ejection button.") return if(src.host) usr.machine = src.host if(href_list["card"]) if(!isnull(src.authid)) src.eject_card() else var/obj/item/I = usr.equipped() if (istype(I, /obj/item/card/id)) usr.drop_item() I.set_loc(src) src.authid = I src.host.updateUsrDialog() return /obj/item/peripheral/sound_card name = "Sound synthesizer module" desc = "A computer module designed to synthesize voice and sound." icon_state = "std_mod" func_tag = "LAR_SOUND" receive_command(obj/source,command, datum/signal/signal) if(..()) return 1 switch(command) if("beep") playsound(src.host.loc, "sound/machines/twobeep.ogg", 50, 1) for (var/mob/O in hearers(3, src.host.loc)) O.show_message(text("[bicon(src.host)] *beep*")) if("speak") if(!signal) return 1 var/speak_name = signal.data["name"] var/speak_data = signal.data["data"] if(!speak_data) return 1 if(!speak_name) speak_name = src.host.name for(var/mob/O in hearers(src.host, null)) O.show_message("[speak_name] [bicon(src.host)] beeps, \"[speak_data]\"",2) else return "Valid commands: beep, speak with signal containing name=X, data=Y" return 0 /obj/item/peripheral/drive name = "Floppy drive module" desc = "A peripheral board containing a floppy diskette interface." setup_has_badge = 1 icon_state = "card_mod" func_tag = "SHU_FLOPPY" var/obj/item/disk/data/disk = null var/setup_disk_type = /obj/item/disk/data/floppy //Inserted disks need to be a child type of this. disposing() disk = null ..() installed(var/obj/machinery/computer3/newhost) if(..()) return 1 if(src.disk) newhost.contents += src.disk return 0 return_badge() var/dat = "Disk: [src.disk ? "Eject" : "-----"]" return dat uninstalled() if(src.disk) src.disk.set_loc(src) return 0 return_status_text() var/status_text = "No disk loaded" if(src.disk) status_text = "Disk loaded" return status_text proc/eject_disk() if(src.disk) if(src.host) //Let the host programs know the disk is going out. for(var/datum/computer/file/terminal_program/P in src.host.processing_programs) P.disk_ejected(src.disk) src.disk.set_loc(src.host.loc) else src.disk.set_loc(get_turf(src)) src.disk = null return Topic(href, href_list) if(..()) return if(istype(usr,/mob/living/silicon) && get_dist(src, usr) > 1) boutput(usr, "You cannot press the ejection button.") return if(src.host) usr.machine = src.host if(href_list["disk"]) if(!isnull(src.disk)) src.eject_disk() else var/obj/item/I = usr.equipped() if (istype(I, src.setup_disk_type)) usr.drop_item() if(src.host) I.set_loc(src.host) else I.set_loc(src) src.disk = I src.host.updateUsrDialog() return attack_self(mob/user as mob) if(src.disk) boutput(user, "The disk pops out.") src.eject_disk() return /obj/item/peripheral/drive/cart_reader name = "ROM cart reader module" desc = "A peripheral board for reading ROM carts." setup_disk_type = /obj/item/disk/data/cartridge func_tag = "SHU_ROM" return_badge() var/dat = "Cart: [src.disk ? "Eject" : "-----"]" return dat return_status_text() var/status_text = "No cart loaded" if(src.disk) status_text = "Cart loaded" return status_text attack_self(mob/user as mob) if(src.disk) boutput(user, "The cart pops out.") src.eject_disk() return /obj/item/peripheral/drive/tape_reader name = "Tape drive module" desc = "A peripheral board designed for reading magnetic data tape." setup_disk_type = /obj/item/disk/data/tape func_tag = "SHU_TAPE" return_badge() var/dat = "Tape: [src.disk ? "Eject" : "-----"]" return dat return_status_text() var/status_text = "No tape loaded" if(src.disk) status_text = "Tape loaded" return status_text attack_self(mob/user as mob) if(src.disk) boutput(user, "The reel pops out.") src.eject_disk() return /obj/item/peripheral/cell_monitor name = "cell monitor module" desc = "A peripheral board for monitoring charges in power applications." icon_state = "elec_mod" setup_has_badge = 1 func_tag = "PWR_MONITOR" return_status_text() var/obj/machinery/computer3/luggable/checkhost = src.host var/status_text = "CELL: No cell!" if(istype(checkhost) && checkhost.cell) var/obj/item/cell/cell = checkhost.cell var/charge_percentage = round((cell.charge/cell.maxcharge)*100) status_text = "CELL: [charge_percentage]%" return status_text return_badge() var/obj/machinery/computer3/luggable/checkhost = src.host if(!istype(checkhost)) return null var/obj/item/cell/cell = checkhost.cell var/readout_color = "#000000" var/readout = "NONE" if(cell) var/charge_percentage = round((cell.charge/cell.maxcharge)*100) switch(charge_percentage) if(0 to 10) readout_color = "#F80000" if(11 to 25) readout_color = "#FFCC00" if(26 to 50) readout_color = "#CCFF00" if(51 to 75) readout_color = "#33CC00" if(76 to 100) readout_color = "#33FF00" readout = charge_percentage var/dat = {"Cell: [readout]%"} return dat /obj/item/peripheral/videocard name = "fancy video card" desc = "A G0KU FACTORY-OC eXeter 4950XL. You have no clue what any of that means." icon_state = "gpu_mod" func_tag = "VGA_ADAPTER" throwforce = 10 installed(var/obj/machinery/computer3/newhost) if(..()) return 1 spawn(rand(50,100)) if(host) for(var/mob/M in hearers(host, null)) if(M.client) M.show_message(text("You hear a loud whirring noise coming from the [src.host.name]."), 2) // add a sound effect maybe sleep(rand(50,100)) if(host) if(prob(50)) for(var/mob/M in AIviewers(host, null)) if(M.client) M.show_message("The [src.host.name] explodes!", 1) var/turf/T = get_turf(src.host.loc) if(T) T.hotspot_expose(700,125) explosion(src, T, -1, -1, 2, 3) //dispose() src.dispose() return for(var/mob/M in AIviewers(host, null)) if(M.client) M.show_message("The [src.host.name] catches on fire!", 1) fireflash(src.host.loc, 0) playsound(src.host.loc, "sound/items/Welder2.ogg", 50, 1) src.host.set_broken() //dispose() src.dispose() return return 0