Files
vgstation13/code/unused/computer2/computerII.dm
ComicIronic b35eaa65d8 Replaced loc setting with forceMove. (#11490)
* Replaced loc setting with forceMove.

* Update forceMove to permit moving to null loc.

Also fixed atom locking with offsets not following properly.
2016-08-29 06:40:45 -05:00

414 lines
12 KiB
Plaintext

/obj/machinery/computer2
name = "computer"
desc = "A computer workstation."
icon = 'icons/obj/computer.dmi'
icon_state = "aiupload"
density = 1
anchored = 1.0
req_access = list() //This doesn't determine PROGRAM req access, just the access needed to install/delete programs.
var/base_icon_state = "aiupload" //Assembly creates a new computer2 and not a child typepath, so initial doesn't work!!
var/datum/radio_frequency/radio_connection
var/obj/item/weapon/disk/data/fixed_disk/hd = null
var/datum/computer/file/computer_program/active_program
var/datum/computer/file/computer_program/host_program //active is set to this when the normal active quits, if available
var/list/processing_programs = list()
var/obj/item/weapon/card/id/authid = null //For records computers etc
var/obj/item/weapon/card/id/auxid = null //For computers that need two ids for some reason.
var/obj/item/weapon/disk/data/diskette = null
var/list/peripherals = list()
//Setup for Starting program & peripherals
var/setup_starting_program = null //If set to a program path it will start with this one active.
var/setup_starting_peripheral = null //Spawn with radio card and whatever path is here.
var/setup_drive_size = 64.0 //How big is the drive (set to 0 for no drive)
var/setup_id_tag
var/setup_has_radio = 0 //Does it spawn with a radio peripheral?
var/setup_radio_tag
var/setup_frequency = 1411
/obj/item/weapon/disk/data
var/datum/computer/folder/root = null
var/file_amount = 32.0
var/file_used = 0.0
var/portable = 1
var/title = "Data Disk"
New()
src.root = new /datum/computer/folder
src.root.holder = src
src.root.name = "root"
/obj/item/weapon/disk/data/fixed_disk
name = "Storage Drive"
icon_state = "harddisk"
title = "Storage Drive"
file_amount = 80.0
portable = 0
attack_self(mob/user as mob)
return
/obj/item/weapon/disk/data/computer2test
name = "Programme Diskette"
file_amount = 128.0
New()
..()
src.root.add_file( new /datum/computer/file/computer_program/arcade(src))
src.root.add_file( new /datum/computer/file/computer_program/med_data(src))
src.root.add_file( new /datum/computer/file/computer_program/airlock_control(src))
src.root.add_file( new /datum/computer/file/computer_program/messenger(src))
src.root.add_file( new /datum/computer/file/computer_program/progman(src))
/obj/machinery/computer2/medical
name = "Medical computer"
icon_state = "dna"
setup_has_radio = 1
setup_starting_program = /datum/computer/file/computer_program/med_data
setup_starting_peripheral = /obj/item/weapon/peripheral/printer
/obj/machinery/computer2/arcade
name = "arcade machine"
icon_state = "arcade"
desc = "An arcade machine."
setup_drive_size = 16.0
setup_starting_program = /datum/computer/file/computer_program/arcade
setup_starting_peripheral = /obj/item/weapon/peripheral/prize_vendor
/obj/machinery/computer2/New()
..()
spawn(4)
if(setup_has_radio)
var/obj/item/weapon/peripheral/radio/radio = new /obj/item/weapon/peripheral/radio(src)
radio.frequency = setup_frequency
radio.code = setup_radio_tag
if(!hd && (setup_drive_size > 0))
src.hd = new /obj/item/weapon/disk/data/fixed_disk(src)
src.hd.file_amount = src.setup_drive_size
if(ispath(src.setup_starting_program))
src.active_program = new src.setup_starting_program
src.active_program.id_tag = setup_id_tag
src.hd.file_amount = max(src.hd.file_amount, src.active_program.size)
src.active_program.transfer_holder(src.hd)
if(ispath(src.setup_starting_peripheral))
new src.setup_starting_peripheral(src)
src.base_icon_state = src.icon_state
return
/obj/machinery/computer2/attack_hand(mob/user as mob)
if(..())
return
user.machine = src
var/dat
if((src.active_program) && (src.active_program.master == src) && (src.active_program.holder in src))
dat = src.active_program.return_text()
else
dat = "<TT><b>Thinktronic BIOS V1.4</b><br><br>"
dat += "Current ID: <a href='?src=\ref[src];id=auth'>[src.authid ? "[src.authid.name]" : "----------"]</a><br>"
dat += "Auxiliary ID: <a href='?src=\ref[src];id=aux'>[src.auxid ? "[src.auxid.name]" : "----------"]</a><br><br>"
var/progdat
if((src.hd) && (src.hd.root))
for(var/datum/computer/file/computer_program/P in src.hd.root.contents)
progdat += "<tr><td>[P.name]</td><td>Size: [P.size]</td>"
progdat += "<td><a href='byond://?src=\ref[src];prog=\ref[P];function=run'>Run</a></td>"
if(P in src.processing_programs)
progdat += "<td><a href='byond://?src=\ref[src];prog=\ref[P];function=unload'>Halt</a></td>"
else
progdat += "<td><a href='byond://?src=\ref[src];prog=\ref[P];function=load'>Load</a></td>"
progdat += "<td><a href='byond://?src=\ref[src];file=\ref[P];function=delete'>Del</a></td></tr>"
continue
dat += "Disk Space: \[[src.hd.file_used]/[src.hd.file_amount]\]<br>"
dat += "<b>Programs on Fixed Disk:</b><br>"
if(!progdat)
progdat = "No programs found.<br>"
dat += "<center><table cellspacing=4>[progdat]</table></center>"
else
dat += "<b>Programs on Fixed Disk:</b><br>"
dat += "<center>No fixed disk detected.</center><br>"
dat += "<br>"
progdat = null
if((src.diskette) && (src.diskette.root))
dat += "<font size=1><a href='byond://?src=\ref[src];disk=1'>Eject</a></font><br>"
for(var/datum/computer/file/computer_program/P in src.diskette.root.contents)
progdat += "<tr><td>[P.name]</td><td>Size: [P.size]</td>"
progdat += "<td><a href='byond://?src=\ref[src];prog=\ref[P];function=run'>Run</a></td>"
if(P in src.processing_programs)
progdat += "<td><a href='byond://?src=\ref[src];prog=\ref[P];function=unload'>Halt</a></td>"
else
progdat += "<td><a href='byond://?src=\ref[src];prog=\ref[P];function=load'>Load</a></td>"
progdat += "<td><a href='byond://?src=\ref[src];file=\ref[P];function=install'>Install</a></td></tr>"
continue
dat += "Disk Space: \[[src.diskette.file_used]/[src.diskette.file_amount]\]<br>"
dat += "<b>Programs on Disk:</b><br>"
if(!progdat)
progdat = "No data found.<br>"
dat += "<center><table cellspacing=4>[progdat]</table></center>"
else
dat += "<b>Programs on Disk:</b><br>"
dat += "<center>No diskette loaded.</center><br>"
dat += "</TT>"
user << browse(dat,"window=comp2")
onclose(user,"comp2")
return
/obj/machinery/computer2/Topic(href, href_list)
if(..())
return
if(!src.active_program)
if((href_list["prog"]) && (href_list["function"]))
var/datum/computer/file/computer_program/newprog = locate(href_list["prog"])
if(newprog && istype(newprog))
switch(href_list["function"])
if("run")
src.run_program(newprog)
if("load")
src.load_program(newprog)
if("unload")
src.unload_program(newprog)
if((href_list["file"]) && (href_list["function"]))
var/datum/computer/file/newfile = locate(href_list["file"])
if(!newfile)
return
switch(href_list["function"])
if("install")
if((src.hd) && (src.hd.root) && (src.allowed(usr)))
newfile.copy_file_to_folder(src.hd.root)
if("delete")
if(src.allowed(usr))
src.delete_file(newfile)
//If there is already one loaded eject, or if not and they have one insert it.
if (href_list["id"])
switch(href_list["id"])
if("auth")
if(!isnull(src.authid))
src.authid.forceMove(get_turf(src))
src.authid = null
else
var/obj/item/I = usr.equipped()
if (istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.forceMove(src)
src.authid = I
if("aux")
if(!isnull(src.auxid))
src.auxid.forceMove(get_turf(src))
src.auxid = null
else
var/obj/item/I = usr.equipped()
if (istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.forceMove(src)
src.auxid = I
//Same but for a data disk
else if (href_list["disk"])
if(!isnull(src.diskette))
src.diskette.forceMove(get_turf(src))
src.diskette = null
/* else
var/obj/item/I = usr.equipped()
if (istype(I, /obj/item/weapon/disk/data))
usr.drop_item()
I.forceMove(src)
src.diskette = I
*/
src.add_fingerprint(usr)
src.updateUsrDialog()
return
/obj/machinery/computer2/process()
if(stat & (NOPOWER|BROKEN))
return
use_power(250)
for(var/datum/computer/file/computer_program/P in src.processing_programs)
P.process()
return
/obj/machinery/computer2/power_change()
if(stat & BROKEN)
icon_state = src.base_icon_state
src.icon_state += "b"
else if(powered())
icon_state = src.base_icon_state
stat &= ~NOPOWER
else
spawn(rand(0, 15))
icon_state = src.base_icon_state
src.icon_state += "0"
stat |= NOPOWER
/obj/machinery/computer2/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
if ((!src.diskette) && W:portable)
user.machine = src
user.drop_item()
W.forceMove(src)
src.diskette = W
to_chat(user, "You insert [W].")
src.updateUsrDialog()
return
else if (istype(W, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, src, 20))
var/obj/computer2frame/A = new /obj/computer2frame( src.loc )
A.created_icon_state = src.base_icon_state
if (src.stat & BROKEN)
to_chat(user, "<span class='notice'>The broken glass falls out.</span>")
new /obj/item/weapon/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
to_chat(user, "<span class='notice'>You disconnect the monitor.</span>")
A.state = 4
A.icon_state = "4"
for (var/obj/item/weapon/peripheral/C in src.peripherals)
C.forceMove(A)
A.peripherals.Add(C)
if(src.diskette)
src.diskette.forceMove(src.loc)
//TO-DO: move card reading to peripheral cards instead
if(src.authid)
src.authid.forceMove(src.loc)
if(src.auxid)
src.auxid.forceMove(src.loc)
if(src.hd)
src.hd.forceMove(A)
A.hd = src.hd
A.mainboard = new /obj/item/weapon/motherboard(A)
A.mainboard.created_name = src.name
A.anchored = 1
del(src)
else
src.attack_hand(user)
return
/obj/machinery/computer2/proc/send_command(command, datum/signal/signal)
for(var/obj/item/weapon/peripheral/P in src.peripherals)
P.receive_command(src, command, signal)
del(signal)
/obj/machinery/computer2/proc/receive_command(obj/source, command, datum/signal/signal)
if(source in src.contents)
for(var/datum/computer/file/computer_program/P in src.processing_programs)
P.receive_command(src, command, signal)
del(signal)
return
/obj/machinery/computer2/proc/run_program(datum/computer/file/computer_program/program,datum/computer/file/computer_program/host)
if(!program)
return 0
// src.unload_program(src.active_program)
if(src.load_program(program))
if(host && istype(host))
src.host_program = host
else
src.host_program = null
src.active_program = program
return 1
return 0
/obj/machinery/computer2/proc/load_program(datum/computer/file/computer_program/program)
if((!program) || (!program.holder))
return 0
if(!(program.holder in src))
// to_chat(world, "Not in src")
program = new program.type
program.transfer_holder(src.hd)
if(program.master != src)
program.master = src
if(program in src.processing_programs)
return 1
else
src.processing_programs.Add(program)
return 1
return 0
/obj/machinery/computer2/proc/unload_program(datum/computer/file/computer_program/program)
if((!program) || (!src.hd))
return 0
if(program in src.processing_programs)
src.processing_programs.Remove(program)
return 1
return 0
/obj/machinery/computer2/proc/delete_file(datum/computer/file/file)
// to_chat(world, "Deleting [file]...")
if((!file) || (!file.holder) || (file.holder.read_only))
// to_chat(world, "Cannot delete :(")
return 0
if(file in src.processing_programs)
src.processing_programs.Remove(file)
if(src.active_program == file)
src.active_program = null
// file.holder.root.remove_file(file)
// to_chat(world, "Now calling del on [file]...")
del(file)
return 1