/obj/machinery/computer3
name = "computer"
desc = "A computer workstation."
icon = 'icons/obj/computer.dmi'
icon_state = "computer_generic"
density = 1
anchored = 1.0
var/base_icon_state = "computer_generic"
var/temp = "Thinktronic BIOS V2.1
"
var/temp_add = null
var/obj/item/disk/data/fixed_disk/hd = null
var/datum/computer/file/terminal_program/active_program
var/datum/computer/file/terminal_program/host_program //active is set to this when the normal active quits, if available
var/datum/computer/file/terminal_shell/os_shell
var/list/processing_programs = list()
var/obj/item/disk/data/floppy/diskette = null
var/list/peripherals = list()
var/restarting = 0 //Are we currently restarting the system?
var/datum/light/light
//Does it spawn with a card scanner? (It should, the main os needs one of these now.)
var/setup_idscan_path = null
var/setup_has_internal_disk = 0 //Do we use that magic disk drive that has no peripheral attached?
var/setup_drive_size = 64
var/setup_drive_type = null //Use this path for the hd
var/setup_frame_type = /obj/computer3frame //What kind of frame does it spawn while disassembled. This better be a type of /obj/compute3frame !!
var/setup_starting_program = null //This program will start out installed on the drive
var/setup_starting_os = null //This program will start out installed AND AS ACTIVE PROGRAM
var/setup_starting_peripheral1 = null //Please note that the user cannot install more than 3.
var/setup_starting_peripheral2 = null //And the os tends to need that third one for the card reader
var/setup_os_string = null
var/setup_font_color = "#19A319"
var/setup_bg_color = "#1B1E1B"
power_usage = 250
generic //Generic computer, standard os and card scanner
setup_drive_type = /obj/item/disk/data/fixed_disk/computer3
setup_starting_os = /datum/computer/file/terminal_program/os/main_os
setup_idscan_path = /obj/item/peripheral/card_scanner
setup_has_internal_disk = 1
personal
name = "Personal Computer"
icon_state = "old"
base_icon_state = "old"
setup_frame_type = /obj/computer3frame/desktop
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card/terminal
setup_starting_peripheral2 = /obj/item/peripheral/sound_card
setup_starting_program = /datum/computer/file/terminal_program/email
med_data
name = "Medical computer"
icon_state = "datamed"
base_icon_state = "datamed"
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card
setup_starting_peripheral2 = /obj/item/peripheral/printer
setup_starting_program = /datum/computer/file/terminal_program/medical_records
secure_data
name = "Security computer"
icon_state = "datasec"
base_icon_state = "datasec"
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card
setup_starting_peripheral2 = /obj/item/peripheral/network/radio/locked/pda
setup_starting_program = /datum/computer/file/terminal_program/secure_records
communications
name = "Communications Console"
icon_state = "comm"
setup_starting_program = /datum/computer/file/terminal_program/communications
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card
setup_starting_peripheral2 = /obj/item/peripheral/network/radio/locked/status
setup_drive_size = 80
disease_research
name = "Disease Database"
icon_state = "resdis"
setup_starting_program = /datum/computer/file/terminal_program/disease_research
setup_drive_size = 48
artifact_research
name = "Artifact Database"
icon_state = "resart"
setup_starting_program = /datum/computer/file/terminal_program/artifact_research
setup_drive_size = 48
hangar_control
name = "Hangar Control"
icon_state = "comm"
//setup_starting_program = /datum/computer/file/terminal_program/hangar_control
setup_drive_size = 48
hangar_research
name = "Hangar Research"
icon_state = "resrob"
//setup_starting_program = /datum/computer/file/terminal_program/hangar_research
setup_drive_size = 48
robotics_research
name = "Robotics Database"
icon_state = "resrob"
setup_starting_program = /datum/computer/file/terminal_program/robotics_research
setup_drive_size = 48
/*
dna_scan
name = "DNA Modifier Access Console"
icon_state = "scanner"
setup_starting_peripheral1 = /obj/item/peripheral/dnascanner_control
*/
engine
name = "Engine Control Console"
icon_state = "engine"
base_icon_state = "engine"
#ifdef SINGULARITY_TIME
setup_starting_program = /datum/computer/file/terminal_program/engine_control
#endif
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card
setup_starting_peripheral2 = /obj/item/peripheral/network/radio/locked/pda
setup_drive_size = 48
radio
name = "wireless computer"
setup_starting_peripheral1 = /obj/item/peripheral/network/radio
basic_test
name = "personal computer"
//setup_starting_program = /datum/computer/file/terminal_program/basic
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card
setup_starting_peripheral2 = /obj/item/peripheral/drive/cart_reader
supply
name = "Supply Ordering Computer"
setup_idscan_path = /obj/item/peripheral/card_scanner/register
terminal //Terminal computer, stripped down with less cards.
name = "Terminal"
icon_state = "dterm"
base_icon_state = "dterm"
setup_drive_size = 24
setup_frame_type = /obj/computer3frame/terminal
setup_starting_os = /datum/computer/file/terminal_program/os/terminal_os
network
name = "Network Terminal"
//Terminal frames can only hold two cards please don't add more here
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card/terminal
zeta
name = "DWAINE Terminal"
setup_idscan_path = /obj/item/peripheral/card_scanner
setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card/terminal
luggable //A portable(!!) computer 3. Cards cannot be exchanged.
name = "portable computer"
desc = "A much smaller computer workstation, designed to be hoisted around by 80s business executives."
density = 0
icon_state = "bcase"
base_icon_state = "bcase"
setup_drive_type = /obj/item/disk/data/fixed_disk/computer3
setup_starting_os = /datum/computer/file/terminal_program/os/main_os
setup_idscan_path = /obj/item/peripheral/card_scanner
setup_has_internal_disk = 1
setup_starting_peripheral1 = /obj/item/peripheral/network/omni
setup_starting_peripheral2 = /obj/item/peripheral/cell_monitor
setup_drive_size = 32
var/obj/item/cell/cell //We have limited power! Immersion!!
var/setup_charge_maximum = 15000
var/obj/item/luggable_computer/personal/case //The object that holds us when we're all closed up.
var/deployed = 1
personal
name = "Personal Laptop"
desc = "This fine piece of hardware sports an incredible 2 kilobytes of RAM, all for a price slightly higher than the whole economy of greece."
icon_state = "oldlap"
base_icon_state = "oldlap"
setup_starting_peripheral1 = /obj/item/peripheral/network/omni
setup_starting_peripheral2 = /obj/item/peripheral/sound_card
/obj/machinery/computer3/New()
..()
light = new/datum/light/point
light.set_brightness(0.4)
light.attach(src)
spawn(4)
if(ispath(src.setup_starting_peripheral1))
new src.setup_starting_peripheral1(src) //Peripherals add themselves automatically if spawned inside a computer3
if(ispath(src.setup_starting_peripheral2))
new src.setup_starting_peripheral2(src)
if(src.setup_idscan_path)
new src.setup_idscan_path(src)
if(!hd && (setup_drive_size > 0))
if(src.setup_drive_type)
src.hd = new src.setup_drive_type
src.hd.set_loc(src)
else
src.hd = new /obj/item/disk/data/fixed_disk(src)
src.hd.file_amount = src.setup_drive_size
if(ispath(src.setup_starting_program))
var/datum/computer/file/terminal_program/starting = new src.setup_starting_program
src.hd.file_amount = max(src.hd.file_amount, starting.size)
starting.transfer_holder(src.hd)
//src.processing_programs += src.active_program
if(ispath(src.setup_starting_os) && src.hd)
var/datum/computer/file/terminal_program/os/os = new src.setup_starting_os
if((src.hd.root.size + os.size) >= src.hd.file_amount)
src.hd.file_amount += os.size
os.setup_string = src.setup_os_string
src.host_program = os
src.host_program.master = src
src.processing_programs += src.host_program
if(!src.active_program)
src.active_program = os
src.hd.root.add_file(os)
src.tag = null
src.base_icon_state = src.icon_state
src.post_system()
switch(rand(1,3))
if(1)
setup_font_color = "#E79C01"
if(2)
setup_font_color = "#A5A5FF"
setup_bg_color = "#4242E7"
return
/obj/machinery/computer3/attack_hand(mob/user as mob)
if(..())
return
if ((user.machine == src) && (src.current_user == user))
if (!src.temp)
user << output(null, "comp3.browser:con_clear")
if (src.temp_add)
user << output(url_encode(src.temp_add), "comp3.browser:con_output")
/*
if (src.current_user == user)
src.temp += temp_add
src.temp_add = null
*/
update_peripheral_menu(user)
src.current_user = user
else
user.machine = src
src.current_user = user
if (src.temp_add)
src.temp += temp_add
temp_add = null
var/dat = {"
| Disk: [src.diskette ? "Eject" : "-----"] | " else dat += "" //Show up to two card "badges," so ID scanners can present a slot, etc var/count = 0 for(var/obj/item/peripheral/C in src.peripherals) if(C.setup_has_badge) //If it has an interface to present here, let it dat += " | [C.return_badge()] | " count++ if(!count) dat += "" dat += {""} dat += {" | Restart | "} user << browse(dat,"window=comp3;size=455x405") onclose(user,"comp3") return /obj/machinery/computer3/proc/update_peripheral_menu(mob/user as mob) var/count = 0 for (var/obj/item/peripheral/pCard in src.peripherals) if (pCard.setup_has_badge) user << output(url_encode(pCard.return_badge()),"comp3.browser:setBadge[count]") count++ return /obj/machinery/computer3/Topic(href, href_list) if(..()) return usr.machine = src if((href_list["command"]) && src.active_program) usr << output(null, "comp3.browser:input_clear") src.active_program.input_text(href_list["command"]) else if(href_list["disk"]) if (src.diskette) //Ai/cyborgs cannot press a physical button from a room away. if(istype(usr,/mob/living/silicon) && get_dist(src, usr) > 1) boutput(usr, "You cannot press the ejection button.") return for(var/datum/computer/file/terminal_program/P in src.processing_programs) P.disk_ejected(src.diskette) src.diskette.set_loc(get_turf(src)) src.diskette = null usr << output(url_encode("Disk: -----"),"comp3.browser:setInternalDisk") else var/obj/item/I = usr.equipped() if (istype(I, /obj/item/disk/data/floppy)) usr.drop_item() I.set_loc(src) src.diskette = I usr << output(url_encode("Disk: Eject"),"comp3.browser:setInternalDisk") else if(href_list["restart"] && !src.restarting) src.restart() src.add_fingerprint(usr) src.updateUsrDialog() return /obj/machinery/computer3/updateUsrDialog() ..() if (src.temp_add) src.temp += src.temp_add src.temp_add = null /obj/machinery/computer3/process() if(stat & BROKEN) return ..() if(stat & NOPOWER) return use_power(250) for(var/datum/computer/file/terminal_program/P in src.processing_programs) P.process() return /obj/machinery/computer3/power_change() if(stat & BROKEN) icon_state = src.base_icon_state src.icon_state += "b" light.disable() else if(powered()) icon_state = src.base_icon_state stat &= ~NOPOWER light.enable() else spawn(rand(0, 15)) icon_state = src.base_icon_state src.icon_state += "0" stat |= NOPOWER light.disable() /obj/machinery/computer3/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/disk/data/floppy)) //INSERT SOME DISKETTES if ((!src.diskette) && src.setup_has_internal_disk) user.machine = src user.drop_item() W.set_loc(src) src.diskette = W boutput(user, "You insert [W].") src.updateUsrDialog() user << output(url_encode("Disk: Eject"),"comp3.browser:setInternalDisk") return else if (istype(W, /obj/item/screwdriver)) playsound(src.loc, "sound/items/Screwdriver.ogg", 50, 1) if(do_after(user, 20)) if(!ispath(setup_frame_type, /obj/computer3frame)) src.setup_frame_type = /obj/computer3frame var/obj/computer3frame/A = new setup_frame_type( src.loc ) if(src.material) A.setMaterial(src.material) A.created_icon_state = src.base_icon_state if (src.stat & BROKEN) boutput(user, "The broken glass falls out.") new /obj/item/raw_material/shard/glass( src.loc ) A.state = 3 A.icon_state = "3" else boutput(user, "You disconnect the monitor.") A.state = 4 A.icon_state = "4" for (var/obj/item/peripheral/C in src.peripherals) C.set_loc(A) A.peripherals.Add(C) C.uninstalled() if(src.diskette) src.diskette.set_loc(src.loc) src.diskette = null if(src.hd) src.hd.set_loc(A) A.hd = src.hd src.hd = null A.mainboard = new /obj/item/motherboard(A) A.mainboard.created_name = src.name A.mainboard.integrated_floppy = src.setup_has_internal_disk A.anchored = 1 //dispose() src.dispose() else src.attack_hand(user) return /obj/machinery/computer3/meteorhit(var/obj/O as obj) if(stat & BROKEN) //dispose() src.dispose() set_broken() var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread() smoke.set_up(5, 0, src) smoke.start() return /obj/machinery/computer3/ex_act(severity) switch(severity) if(1.0) //dispose() src.dispose() return if(2.0) if (prob(50)) set_broken() if(3.0) if (prob(25)) set_broken() else return /obj/machinery/computer3/emp_act() ..() if(prob(20)) src.set_broken() return /obj/machinery/computer3/blob_act(var/power) if (prob(power * 2.5)) set_broken() src.density = 0 /obj/machinery/computer3/disposing() if (hd) if (hd.loc == src) hd.dispose() hd = null if (diskette) if (diskette.loc == src) diskette.dispose() diskette = null if (peripherals) for (var/obj/P in peripherals) if (P.loc == src) P.dispose() peripherals.len = 0 peripherals = null if (processing_programs) src.processing_programs.len = 0 src.processing_programs = null active_program = null host_program = null ..() /obj/machinery/computer3/proc run_program(datum/computer/file/terminal_program/program) if((!program) || (!program.holder)) return 0 if(!(program.holder in src)) // boutput(world, "Not in src") program = new program.type program.transfer_holder(src.hd) if(program.master != src) program.master = src if(!src.host_program && istype(program, /datum/computer/file/terminal_program/os)) src.host_program = program if(!(program in src.processing_programs)) src.processing_programs += program src.active_program = program src.active_program.initialize() return 1 //Stop processing the current active program and make the host active again unload_program(datum/computer/file/terminal_program/program) if(!program) return 0 if(program == src.host_program) return 0 src.processing_programs -= program if(src.active_program == program) src.active_program = src.host_program return 1 delete_file(datum/computer/file/theFile) //boutput(world, "Deleting [file]...") if((!theFile) || (!theFile.holder) || (theFile.holder.read_only)) //boutput(world, "Cannot delete :(") return 0 //Don't delete the running program you jerk if(src.active_program == theFile || src.host_program == theFile) src.active_program = null //boutput(world, "Now calling del on [file]...") //qdel(file) theFile.dispose() return 1 send_command(command, datum/signal/signal, target_ref) //for(var/obj/item/peripheral/P in src.peripherals) // P.receive_command(src, command, signal) . = 1 var/obj/item/peripheral/P = locate(target_ref) in src.peripherals if(istype(P)) . = P.receive_command(src, command, signal) //qdel(signal) if (signal) if (reusable_signals && reusable_signals.len < 11) if (!(signal in reusable_signals)) reusable_signals += signal signal.wipe() else signal.dispose() return receive_command(obj/source, command, datum/signal/signal) if(source in src.contents) for(var/datum/computer/file/terminal_program/P in src.processing_programs) P.receive_command(src, command, signal) // if(src.host_program) // src.host_program.receive_command(src, command, signal) //qdel(signal) if (signal) if (reusable_signals && reusable_signals.len < 11) if (!(signal in reusable_signals)) reusable_signals += signal signal.wipe() else signal.dispose() return set_broken() icon_state = src.base_icon_state icon_state += "b" stat |= BROKEN light.disable() restart() if(src.restarting) return src.restarting = 1 src.active_program = null if(src.host_program) src.host_program.restart() src.host_program = null src.processing_programs = new src.temp = null src.temp_add = "Restarting system...