mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-05-18 06:29:01 +01:00
dc4217b498
this is all very alpha please don't hate me too much if i fucked it up
1397 lines
38 KiB
Plaintext
1397 lines
38 KiB
Plaintext
//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 = "<tt>[print_data]</tt>"
|
|
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 = "<tt>[print_data]</tt>"
|
|
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 = "<tt>[print_data]</tt>"
|
|
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, "<span style=\"color:red\">[src] isn't ready to dispense a prize yet.</span>")
|
|
|
|
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: <a href='?src=\ref[src];card=1'>[src.authid ? "Eject" : "-----"]</a>"
|
|
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, "<span style=\"color:red\">You cannot press the ejection button.</span>")
|
|
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("<span class='game say'><span class='name'>[speak_name]</span> [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: <a href='?src=\ref[src];disk=1'>[src.disk ? "Eject" : "-----"]</a>"
|
|
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, "<span style=\"color:red\">You cannot press the ejection button.</span>")
|
|
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: <a href='?src=\ref[src];disk=1'>[src.disk ? "Eject" : "-----"]</a>"
|
|
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: <a href='?src=\ref[src];disk=1'>[src.disk ? "Eject" : "-----"]</a>"
|
|
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: <font color=[readout_color]>[readout]%</font>"}
|
|
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("<span style=\"color:red\">You hear a loud whirring noise coming from the [src.host.name].</span>"), 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("<span style=\"color:red\"><B>The [src.host.name] explodes!</B></span>", 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("<span style=\"color:red\"><B>The [src.host.name] catches on fire!</B></span>", 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 |