/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 = {"Computer Terminal
[src.temp]

"} if(setup_has_internal_disk) dat += "" 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 += "" count++ if(!count) dat += "" dat += {""} dat += {""} 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...
" src.updateUsrDialog() spawn(20) src.restarting = 0 src.post_system() return post_system() src.temp_add += "Initializing system...
" if(!src.hd) src.temp_add += "1701 - NO FIXED DISK
" if(src.host_program) //Let the starting programs set up vars or whatever src.host_program.initialize() if(src.active_program && src.active_program != src.host_program) //Don't init one twice! src.active_program.initialize() else if(src.diskette && src.diskette.root) var/datum/computer/file/terminal_program/os/newos = locate(/datum/computer/file/terminal_program/os) in src.diskette.root.contents if(newos && istype(newos)) src.temp_add += "Booting from diskette...
" src.run_program(newos) else src.temp_add += "Non-system disk or disk error.
" if(!src.host_program && src.hd && src.hd.root) var/datum/computer/file/terminal_program/os/newos = locate(/datum/computer/file/terminal_program/os) in src.hd.root.contents if(newos && istype(newos)) src.temp_add += "Booting from fixed disk...
" src.run_program(newos) else src.temp_add += "Unable to boot from fixed disk.
" if(!src.host_program) var/success = 0 for(var/obj/item/disk/data/D in src) if(D == src.hd || D == src.diskette) continue var/datum/computer/file/terminal_program/os/newos = locate() in D.root.contents if(istype(newos)) src.temp_add += "Booting from peripheral disk...
" success = 1 src.run_program(newos) break if(!success) src.temp_add += "ERR - BOOT FAILURE
" src.updateUsrDialog() return /obj/machinery/computer3/clone() var/obj/machinery/computer3/cloneComp = ..() if (!cloneComp) return if (src.hd) cloneComp.hd = src.hd.clone() if (src.diskette) cloneComp.diskette = src.diskette.clone() cloneComp.setup_starting_peripheral1 = src.setup_starting_peripheral1 cloneComp.setup_starting_peripheral2 = src.setup_starting_peripheral2 cloneComp.setup_starting_os = null cloneComp.setup_idscan_path = src.setup_idscan_path cloneComp.setup_has_internal_disk = src.setup_has_internal_disk cloneComp.setup_font_color = src.setup_font_color cloneComp.setup_bg_color = src.setup_bg_color return cloneComp //Special overrides and what-not for luggables. /obj/item/luggable_computer name = "briefcase" icon = 'icons/obj/computer.dmi' icon_state = "briefcase" desc = "A common item to find in an office. Is that an antenna?" flags = FPRINT | TABLEPASS| CONDUCT | NOSPLASH force = 8.0 throw_speed = 1 throw_range = 4 w_class = 4.0 var/obj/machinery/computer3/luggable/luggable = null var/luggable_type = /obj/machinery/computer3/luggable New() ..() spawn(10) if(!luggable) src.luggable = new luggable_type (src) src.luggable.case = src src.luggable.deployed = 0 return attack_self(mob/user as mob) return deploy(user) disposing() if (luggable && luggable.loc == src) luggable.dispose() luggable = null ..() verb/unfold() set src in view(1) if (usr.stat) return src.deploy(usr) return proc/deploy(mob/user as mob) var/turf/T = get_turf(src) if(!T || !luggable) boutput(user, "You can't seem to get the latch open!") return if (src.loc == user) user.drop_item() src.luggable.set_loc(T) src.luggable.case = src src.luggable.deployed = 1 src.set_loc(src.luggable) for (var/obj/item/peripheral/P in src.luggable) P.installed(src.luggable) user.visible_message("[user] deploys [src.luggable]!","You deploy [src.luggable]!") /obj/machinery/computer3/luggable New() ..() src.cell = new /obj/item/cell(src) src.cell.maxcharge = setup_charge_maximum src.cell.charge = src.cell.maxcharge return disposing() if (src.cell) src.cell.dispose() src.cell = null if (case && case.loc == src) case.dispose() case = null ..() verb/fold_up() set src in view(1) if(usr.stat) return src.visible_message("[usr] folds [src] back up!") src.undeploy() return proc/undeploy() if(!src.case) src.case = new /obj/item/luggable_computer(src) src.case.luggable = src for (var/obj/item/peripheral/peripheral in peripherals) peripheral.uninstalled() src.case.set_loc(get_turf(src)) src.set_loc(src.case) src.deployed = 0 return 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() return else if (istype(W, /obj/item/crowbar)) if(!src.cell) boutput(user, "There is no energy cell inserted!") return playsound(src.loc, "sound/items/Crowbar.ogg", 50, 1) src.cell.set_loc(get_turf(src)) src.cell = null user.visible_message("[user] removes the power cell from [src]!.","You remove the power cell from [src]!") src.power_change() return else if (istype(W, /obj/item/cell)) if(src.cell) boutput(user, "There is already an energy cell inserted!") else user.drop_item() W.set_loc(src) src.cell = W boutput(user, "You insert [W].") src.power_change() src.updateUsrDialog() return else src.attack_hand(user) return powered() if(!src.cell || src.cell.charge <= 0) return 0 return 1 use_power(var/amount, var/chan=EQUIP) if(!src.cell || !src.deployed) return cell.use(amount / 100) src.power_change() return //A personal version! /obj/item/luggable_computer/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 = "oldlapshut" luggable_type = /obj/machinery/computer3/luggable/personal /obj/machinery/computer3/luggable/personal undeploy() if(!src.case) src.case = new /obj/item/luggable_computer/personal(src) src.case.luggable = src for (var/obj/item/peripheral/peripheral in peripherals) peripheral.uninstalled() src.case.set_loc(get_turf(src)) src.set_loc(src.case) src.deployed = 0 return
Disk: [src.diskette ? "Eject" : "-----"][C.return_badge()]Restart