mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-07-12 01:22:43 +01:00
Initial Commit
This commit is contained in:
@@ -0,0 +1,279 @@
|
||||
//CONTENTS:
|
||||
//Base computerx program datum
|
||||
//Compx_icon object (Used for GUI system)
|
||||
//Compxwindow datum (Used for GUI system)
|
||||
|
||||
|
||||
/datum/computer/file/terminalx_program
|
||||
name = "program"
|
||||
extension = "TPROG"
|
||||
var/obj/machinery/computerx/master = null
|
||||
var/list/req_access = list()
|
||||
var/executable = 1
|
||||
var/gui_app = 0
|
||||
var/datum/compx_window/temp = null
|
||||
var/initialized = 0
|
||||
var/list/gui_icons = list()
|
||||
var/meta_params = null
|
||||
|
||||
|
||||
os
|
||||
name = "system program"
|
||||
extension = "TSYS"
|
||||
executable = 0
|
||||
var/tmp/setup_string = null
|
||||
|
||||
os_call(var/call_params, var/datum/computer/file/terminal_program/caller, var/datum/computer/file/file)
|
||||
if(!master || master.stat & (NOPOWER|BROKEN))
|
||||
return 1
|
||||
if(!caller || !call_params)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
New(obj/holding as obj)
|
||||
..()
|
||||
if(holding)
|
||||
src.holder = holding
|
||||
|
||||
if(istype(src.holder.loc,/obj/machinery/computerx))
|
||||
src.master = src.holder.loc
|
||||
|
||||
if(meta_params)
|
||||
src.metadata += params2list(meta_params)
|
||||
|
||||
Del()
|
||||
if(master)
|
||||
master.processing_programs.Remove(src)
|
||||
..()
|
||||
|
||||
Topic(href, href_list)
|
||||
if((!src.holder) || (!src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(master.stat & (NOPOWER|BROKEN))
|
||||
return 1
|
||||
|
||||
if ((!usr.contents.Find(src.master) && (!in_range(src.master, usr) || !istype(src.master.loc, /turf))) && (!istype(usr, /mob/living/silicon)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents) && !(holder.loc in src.master.contents))
|
||||
return 1
|
||||
|
||||
usr.machine = src.master
|
||||
|
||||
return 0
|
||||
|
||||
proc
|
||||
os_call(var/call_params, var/datum/computer/file/file)
|
||||
if (!master || !master.host_program)
|
||||
return 0
|
||||
|
||||
master.host_program.os_call(call_params, src, file)
|
||||
return 1
|
||||
|
||||
initialize() //Called when a program starts running.
|
||||
if(src.initialized || !master)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
quit()
|
||||
if(src.master)
|
||||
src.master.unload_program(src)
|
||||
return
|
||||
|
||||
input_text(var/text, source=0)
|
||||
if((!src.holder) || (!src.master) || !text)
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(master.stat & (NOPOWER|BROKEN))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents) && !(holder.loc in src.master.contents))
|
||||
return 1
|
||||
|
||||
if(!src.holder.root)
|
||||
src.holder.root = new /datum/computer/folder
|
||||
src.holder.root.holder = src
|
||||
src.holder.root.name = "root"
|
||||
|
||||
//boutput(world, text)
|
||||
return 0
|
||||
|
||||
process()
|
||||
if((!src.holder) || (!src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents) && !(holder.loc in src.master.contents))
|
||||
if(master.host_program == src)
|
||||
master.host_program = null
|
||||
master.processing_programs.Remove(src)
|
||||
return 1
|
||||
|
||||
if(!src.holder.root)
|
||||
src.holder.root = new /datum/computer/folder
|
||||
src.holder.root.holder = src
|
||||
src.holder.root.name = "root"
|
||||
|
||||
return 0
|
||||
|
||||
receive_command(obj/source, command, datum/computer/file/pfile)
|
||||
if((!src.holder) || (!src.master) || (!source) || (source != src.master))
|
||||
return 1
|
||||
|
||||
if((!istype(holder)) || (!istype(master)))
|
||||
return 1
|
||||
|
||||
if(master.stat & (NOPOWER|BROKEN))
|
||||
return 1
|
||||
|
||||
if(!(holder in src.master.contents) && !(holder.loc in src.master.contents))
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
peripheral_command(command, datum/computer/file/pfile, target_ref)
|
||||
if(master)
|
||||
return master.send_command(command, pfile, target_ref)
|
||||
else
|
||||
qdel(pfile)
|
||||
|
||||
return null
|
||||
|
||||
transfer_holder(obj/item/disk/data/newholder,datum/computer/folder/newfolder)
|
||||
|
||||
if((newholder.file_used + src.size) > newholder.file_amount)
|
||||
return 0
|
||||
|
||||
if(!newholder.root)
|
||||
newholder.root = new /datum/computer/folder
|
||||
newholder.root.holder = newholder
|
||||
newholder.root.name = "root"
|
||||
|
||||
if(!newfolder)
|
||||
newfolder = newholder.root
|
||||
|
||||
if((src.holder && src.holder.read_only) || newholder.read_only)
|
||||
return 0
|
||||
|
||||
if((src.holder) && (src.holder.root))
|
||||
src.holder.root.remove_file(src)
|
||||
|
||||
newfolder.add_file(src)
|
||||
|
||||
if(istype(newholder.loc,/obj/machinery/computerx))
|
||||
src.master = newholder.loc
|
||||
else if (istype(newholder.loc, /obj/item/peripheralx/drive))
|
||||
var/obj/item/peripheralx/dx = newholder.loc
|
||||
if(dx.host)
|
||||
src.master = dx.host
|
||||
|
||||
//boutput(world, "Setting [src.holder] to [newholder]")
|
||||
src.holder = newholder
|
||||
return 1
|
||||
|
||||
disk_inserted(var/obj/item/disk/data/inserted)
|
||||
return
|
||||
|
||||
disk_ejected(var/obj/item/disk/data/ejected)
|
||||
if(src.holder == ejected)
|
||||
src.quit()
|
||||
|
||||
return
|
||||
|
||||
get_temp()
|
||||
return src.temp
|
||||
|
||||
|
||||
|
||||
//This should be used for fancy grid GUI magics!!
|
||||
/obj/compx_icon
|
||||
name = "Icon"
|
||||
icon = 'icons/misc/compgui.dmi'
|
||||
icon_state = "x"
|
||||
var/action_tag = "none" //When clicked, send actiontag = actionarg to our owning program's Topic().
|
||||
var/action_arg = 1
|
||||
var/datum/computer/file/terminalx_program/owner = null
|
||||
var/icon_id = null
|
||||
var/grid_x = 0
|
||||
var/grid_y = 0
|
||||
var/no_drag = 0
|
||||
|
||||
debug
|
||||
name = "Finder"
|
||||
icon_state = "folder"
|
||||
action_tag = "boop"
|
||||
action_arg = "beep"
|
||||
|
||||
spacer
|
||||
name = ""
|
||||
icon_state = null
|
||||
|
||||
New(var/datum/computer/file/terminalx_program/new_owner)
|
||||
..()
|
||||
if(istype(new_owner))
|
||||
src.owner = new_owner
|
||||
icon_id = "G[generate_net_id(src)]"
|
||||
return
|
||||
|
||||
Click()
|
||||
if(!istype(owner) || !usr)
|
||||
return
|
||||
|
||||
usr.Topic("[action_tag]=[action_arg];gid=[src.icon_id]", list("[action_tag]"="[action_arg]","gid"=src.icon_id), src.owner) // Topic redirection time!
|
||||
return
|
||||
|
||||
MouseDrop(obj/O, null, var/src_location, var/control_orig, var/control_new, var/params)
|
||||
if(!istype(owner) || !usr || src.no_drag)
|
||||
return
|
||||
|
||||
if(control_orig != control_new) //Dragging icons into the real world/another computer desktop would be weird.
|
||||
return
|
||||
|
||||
//boutput(world, "loc: [src_location]<br>co: [control_orig]<br>cn: [control_new]<br>usr: [usr]")
|
||||
usr.Topic("drag=[src_location];gid=[src.icon_id]", list("drag"=src_location,"gid"=src.icon_id), src.owner) // More Topic redirection.
|
||||
return
|
||||
|
||||
/datum/compx_window
|
||||
var/skinbase = "cxwind_console"
|
||||
var/datum/computer/file/terminalx_program/owner = null
|
||||
|
||||
New(var/datum/computer/file/terminalx_program/newOwner)
|
||||
..()
|
||||
|
||||
if (istype(newOwner))
|
||||
src.owner = newOwner
|
||||
|
||||
|
||||
grid
|
||||
skinbase = "cxwind_grid"
|
||||
|
||||
var/list/gridList = list()
|
||||
|
||||
update(mob/user as mob)
|
||||
if (..())
|
||||
return
|
||||
|
||||
for(var/gridy = 1, gridy <= compx_gridy_max, gridy++)
|
||||
for(var/gridx = 1, gridx <= compx_gridx_max, gridx++)
|
||||
if(isnull(gridList[gridx][gridy]))
|
||||
user << output(compx_grid_spacer, "compxwindow_\ref[src].grid:[gridx],[gridy]")
|
||||
else
|
||||
user << output(gridList[gridx][gridy], "compxwindow_\ref[src].grid:[gridx],[gridy]")
|
||||
|
||||
return
|
||||
|
||||
proc/update(mob/user as mob)
|
||||
if (!istype(user) || !user.client || !owner)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
@@ -0,0 +1,392 @@
|
||||
//CONTENTS:
|
||||
//Computerx-related globals
|
||||
//Computerx machine object
|
||||
//Computerx input client verb
|
||||
|
||||
|
||||
var/obj/compx_icon/spacer/compx_grid_spacer = null
|
||||
var/compx_gridy_max = 8
|
||||
var/compx_gridx_max = 5
|
||||
|
||||
/obj/machinery/computerx
|
||||
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/datum/computer/file/terminalx_program/os/host_program //Our best pal, the operating system!
|
||||
var/list/processing_programs = list()
|
||||
var/list/peripherals = list()
|
||||
var/restarting = 0 //Are we currently restarting the system?
|
||||
var/obj/item/disk/data/fixed_disk/hd = null
|
||||
var/setup_bg_color = "#1B1E1B"
|
||||
var/graphic_mode = 0 //0: Default browser 1: the window specified by the program.
|
||||
var/override_temp = null
|
||||
|
||||
var/setup_starting_os = /datum/computer/file/terminalx_program/os/main_os
|
||||
var/setup_starting_drive = /obj/item/peripheralx/drive //Do we spawn with a disk?
|
||||
var/setup_drive_size = 64
|
||||
var/setup_drive_type = /obj/item/disk/data/fixed_disk/computer3 //Use this path for the hd
|
||||
var/setup_os_string = null
|
||||
var/setup_starting_peripheral0 = /obj/item/peripheralx/card_scanner //It is advised that this be a card scanner.
|
||||
var/setup_starting_peripheral1 = /obj/item/peripheralx/drive
|
||||
var/setup_starting_peripheral2 = /obj/item/peripheralx/drive
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
if(!compx_grid_spacer)
|
||||
compx_grid_spacer = new
|
||||
|
||||
spawn(4)
|
||||
if(ispath(src.setup_starting_drive))
|
||||
new src.setup_starting_drive(src)
|
||||
|
||||
if(ispath(src.setup_starting_peripheral0))
|
||||
new src.setup_starting_peripheral0(src)
|
||||
|
||||
if(ispath(src.setup_starting_peripheral1))
|
||||
new src.setup_starting_peripheral1(src) //Peripherals add themselves automatically if spawned inside a computer.
|
||||
|
||||
if(ispath(src.setup_starting_peripheral2))
|
||||
new src.setup_starting_peripheral2(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_os) && src.hd)
|
||||
var/datum/computer/file/terminalx_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
|
||||
|
||||
src.hd.root.add_file(os)
|
||||
|
||||
src.base_icon_state = src.icon_state
|
||||
|
||||
src.post_system()
|
||||
return
|
||||
|
||||
|
||||
process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
use_power(250)
|
||||
|
||||
for(var/datum/computer/file/terminalx_program/P in src.processing_programs)
|
||||
P.process()
|
||||
|
||||
return
|
||||
|
||||
attack_hand(mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
user.machine = src
|
||||
src.current_user = user
|
||||
|
||||
var/wincheck = winexists(user, "compx_\ref[src]")
|
||||
//boutput(world, wincheck)
|
||||
if(wincheck != "MAIN")
|
||||
winclone(user, "compx", "compx_\ref[src]")
|
||||
winset(user, "compx_\ref[src].restart","command=\".compcommand \\\"\ref[src]%restart\"")
|
||||
winset(user, "compx_\ref[src].conin","command=\".compconsole \\\"\ref[src]\\\" \\\"")
|
||||
|
||||
var/display_mode = src.graphic_mode
|
||||
var/workingTemp = null
|
||||
if(!src.host_program)
|
||||
display_mode = 0
|
||||
else
|
||||
workingTemp = src.host_program.get_temp()
|
||||
|
||||
set_graphic_mode(src.graphic_mode, user)
|
||||
var/display_text = "DISPLAY ERROR -- 0xF8"
|
||||
|
||||
if(display_mode)
|
||||
if(istype(workingTemp, /datum/compx_window))
|
||||
/*
|
||||
for(var/gridy = 1, gridy <= src.host_program.gridy_max, gridy++)
|
||||
for(var/gridx = 1, gridx <= src.host_program.gridx_max, gridx++)
|
||||
if(isnull(workingTemp[gridx][gridy]))
|
||||
user << output(compx_grid_spacer, "compx_\ref[src].grid:[gridx],[gridy]")
|
||||
else
|
||||
user << output(workingTemp[gridx][gridy], "compx_\ref[src].grid:[gridx],[gridy]")
|
||||
*/
|
||||
var/datum/compx_window/windowControl = workingTemp
|
||||
if (!winexists(user, "compxwindow_\ref[windowControl]"))
|
||||
winclone(user, windowControl.skinbase, "compxwindow_\ref[windowControl]")
|
||||
winset(user, "compxwindow_\ref[windowControl]", "is-visible=true")
|
||||
winset(user, "compx_\ref[src].screenholder","left=compxwindow_\ref[windowControl]")
|
||||
windowControl.update(user)
|
||||
else
|
||||
user << output(user, "compx_\ref[src].grid")
|
||||
|
||||
else
|
||||
if(src.host_program && istext(workingTemp))
|
||||
display_text = workingTemp
|
||||
if(src.override_temp)
|
||||
display_text = src.override_temp
|
||||
user << output("<body bgcolor=[src.setup_bg_color] scroll=no><font color=#19A319><tt>[display_text]</tt></font>", "compx_\ref[src].screen")
|
||||
|
||||
//Now for the peripheral interfaces.
|
||||
var/pcount = 1
|
||||
for(var/obj/item/peripheralx/px in src.peripherals)
|
||||
if(pcount > 4)
|
||||
break
|
||||
if(px.setup_has_badge) //Only put it up if it actually has something to present.
|
||||
user << output(px.return_badge(), "compx_\ref[src].periphs:[pcount],1")
|
||||
pcount++
|
||||
|
||||
winshow(user,"compx_\ref[src]",1)
|
||||
|
||||
onclose(user,"compx_\ref[src]")
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
usr.machine = src
|
||||
|
||||
if((href_list["conin"]) && src.host_program)
|
||||
src.host_program.input_text(href_list["conin"])
|
||||
|
||||
else if(href_list["restart"] && !src.restarting)
|
||||
src.restart()
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
|
||||
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
|
||||
|
||||
meteorhit(var/obj/O as obj)
|
||||
if(stat & BROKEN) qdel(src)
|
||||
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
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
set_broken()
|
||||
if(3.0)
|
||||
if (prob(25))
|
||||
set_broken()
|
||||
else
|
||||
return
|
||||
|
||||
blob_act(var/power)
|
||||
if (prob(power * 2.5))
|
||||
set_broken()
|
||||
src.density = 0
|
||||
|
||||
proc
|
||||
set_broken()
|
||||
icon_state = src.base_icon_state
|
||||
icon_state += "b"
|
||||
stat |= BROKEN
|
||||
|
||||
set_graphic_mode(var/new_mode = 0, mob/user as mob)
|
||||
if(!user || !user.client)
|
||||
return
|
||||
//boutput(world, "The new mode is: [new_mode].")
|
||||
if (src.graphic_mode)
|
||||
winset(user, "compx_\ref[src].screen","is-visible=false")
|
||||
//winset(user, "compx_\ref[src].conin","is-visible=true")
|
||||
//winset(user, "compx_\ref[src].grid","is-visible=false")
|
||||
else
|
||||
winset(user, "compx_\ref[src].screen","is-visible=true")
|
||||
//winset(user, "compx_\ref[src].conin","is-visible=false")
|
||||
//winset(user, "compx_\ref[src].grid","is-visible=true")
|
||||
|
||||
src.graphic_mode = new_mode
|
||||
return
|
||||
|
||||
run_program(datum/computer/file/terminalx_program/program)
|
||||
if((!program) || (!program.holder))
|
||||
return 0
|
||||
|
||||
if(!(program.holder in src) && !(program.holder.loc in src) && src.hd)
|
||||
// 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/terminalx_program/os))
|
||||
src.host_program = program
|
||||
|
||||
if(!(program in src.processing_programs))
|
||||
src.processing_programs += program
|
||||
|
||||
program.initialize()
|
||||
return 1
|
||||
|
||||
//Stop processing a program (Unless it's the OS!!)
|
||||
unload_program(datum/computer/file/terminalx_program/program)
|
||||
if(!program)
|
||||
return 0
|
||||
|
||||
if(program == src.host_program)
|
||||
return 0
|
||||
|
||||
src.processing_programs -= program
|
||||
return 1
|
||||
|
||||
delete_file(datum/computer/file/file)
|
||||
if((!file) || (!file.holder) || (file.holder.read_only))
|
||||
return 0
|
||||
|
||||
//Don't delete the OS you jerk
|
||||
if(src.host_program == file)
|
||||
return 0
|
||||
|
||||
qdel(file)
|
||||
return 1
|
||||
|
||||
send_command(command, datum/computer/file/pfile, target_ref)
|
||||
var/result
|
||||
var/obj/item/peripheralx/P = locate(target_ref) in src.peripherals
|
||||
if(istype(P))
|
||||
result = P.receive_command(src, command, pfile)
|
||||
|
||||
qdel(pfile)
|
||||
return result
|
||||
|
||||
receive_command(obj/source, command, datum/computer/file/pfile)
|
||||
if(source in src.contents)
|
||||
|
||||
for(var/datum/computer/file/terminalx_program/P in src.processing_programs)
|
||||
P.receive_command(src, command, pfile)
|
||||
qdel(pfile)
|
||||
|
||||
return
|
||||
|
||||
restart()
|
||||
if(src.restarting)
|
||||
return
|
||||
src.restarting = 1
|
||||
src.graphic_mode = 0
|
||||
src.override_temp = "Restarting..."
|
||||
src.updateUsrDialog()
|
||||
src.host_program = null
|
||||
|
||||
spawn(20)
|
||||
//src.restarting = 0
|
||||
src.post_system()
|
||||
|
||||
return
|
||||
|
||||
post_system()
|
||||
src.override_temp = "Initializing system...<br>"
|
||||
|
||||
if(!src.hd)
|
||||
src.override_temp += "<font color=red>1701 - NO FIXED DISK</font><br>"
|
||||
|
||||
var/datum/computer/file/terminalx_program/to_run = null
|
||||
|
||||
if(src.host_program) //Let the starting programs set up vars or whatever
|
||||
src.host_program.initialize()
|
||||
|
||||
else
|
||||
|
||||
for(var/obj/item/peripheralx/drive/DR in src.peripherals)
|
||||
if(!DR.disk)
|
||||
continue
|
||||
|
||||
var/datum/computer/file/terminalx_program/os/newos = locate() in DR.disk.root.contents
|
||||
|
||||
if(istype(newos))
|
||||
src.override_temp += "Booting from disk \[[DR.label]]...<br>"
|
||||
to_run = newos
|
||||
break
|
||||
|
||||
if(!to_run && src.hd && src.hd.root)
|
||||
var/datum/computer/file/terminalx_program/os/newos = locate(/datum/computer/file/terminalx_program/os) in src.hd.root.contents
|
||||
|
||||
if(newos && istype(newos))
|
||||
src.override_temp += "Booting from fixed disk...<br>"
|
||||
to_run = newos
|
||||
else
|
||||
src.override_temp += "<font color=red>Unable to boot from fixed disk.</font><br>"
|
||||
|
||||
if(to_run)
|
||||
src.host_program = to_run
|
||||
else
|
||||
src.override_temp += "<font color=red>ERR - BOOT FAILURE</font><br>"
|
||||
|
||||
src.updateUsrDialog()
|
||||
sleep(20)
|
||||
|
||||
src.restarting = 0
|
||||
if(to_run)
|
||||
src.run_program(to_run)
|
||||
|
||||
if(src.host_program)
|
||||
src.override_temp = null
|
||||
|
||||
src.updateUsrDialog()
|
||||
|
||||
return
|
||||
|
||||
|
||||
/client/verb/compx_command(var/commandstring as text)
|
||||
set hidden = 1 // Hidden + no autocomplete
|
||||
set name = ".compcommand"
|
||||
|
||||
//boutput(world, "compx command: \"[commandstring]\"")
|
||||
var/list/commands = dd_text2list(commandstring,"%")
|
||||
if(commands.len < 2)
|
||||
return
|
||||
var/command = commands[2]
|
||||
var/obj/machinery/computerx/compx = locate(commands[1])
|
||||
if(istype(compx) && src.mob)
|
||||
usr = src.mob
|
||||
src.Topic(command, list("[command]"=1), compx) // Topic redirection time!
|
||||
|
||||
return
|
||||
|
||||
/client/verb/compx_console(var/compref as text, var/commandstring as text)
|
||||
set hidden = 1
|
||||
set name = ".compconsole"
|
||||
|
||||
//boutput(world, "compx: \"[compref]\" command: \"[commandstring]\"")
|
||||
|
||||
var/obj/machinery/computerx/compx = locate(compref)
|
||||
if(istype(compx) && src.mob)
|
||||
usr = src.mob
|
||||
|
||||
src.Topic("conin", list("conin"=commandstring), compx)
|
||||
return
|
||||
@@ -0,0 +1,328 @@
|
||||
//CONTENTS:
|
||||
//Primary OS for Computerx
|
||||
|
||||
|
||||
/datum/computer/file/terminalx_program/os/main_os
|
||||
name = "System"
|
||||
gui_app = 1
|
||||
|
||||
var/tmp/mode = 1
|
||||
var/list/known_drives = list()
|
||||
var/tmp/datum/computer/file/terminalx_program/application = null
|
||||
var/tmp/datum/computer/folder/current_folder = null
|
||||
|
||||
var/const
|
||||
setup_taskbar_y = 1
|
||||
setup_titlestring_x = 3
|
||||
|
||||
Del()
|
||||
src.clear_icons()
|
||||
..()
|
||||
return
|
||||
/*
|
||||
get_temp()
|
||||
if (istype(application))
|
||||
return application.get_temp()
|
||||
|
||||
return src.temp
|
||||
*/
|
||||
proc
|
||||
|
||||
add_compicon(var/obj/compx_icon/new_compicon, gx=1, gy=1)
|
||||
if(!istype(new_compicon) || !istype(src.temp, /datum/compx_window/grid))
|
||||
return
|
||||
|
||||
var/datum/compx_window/grid/gridwind = src.temp
|
||||
|
||||
if(gx <= 0 || gy <= 0)
|
||||
return
|
||||
|
||||
gridwind.gridList[gx][gy] = new_compicon
|
||||
src.gui_icons[new_compicon.icon_id] = new_compicon
|
||||
new_compicon.grid_x = gx
|
||||
new_compicon.grid_y = gy
|
||||
return
|
||||
|
||||
clear_icons()
|
||||
for(var/i in src.gui_icons)
|
||||
var/obj/compx_icon/killme = src.gui_icons[i]
|
||||
qdel(killme)
|
||||
|
||||
src.gui_icons.len = 0
|
||||
return
|
||||
|
||||
set_mode(var/new_mode=0)
|
||||
src.mode = new_mode
|
||||
if(new_mode > 0)
|
||||
|
||||
if (!istype(src.temp, /datum/compx_window/grid))
|
||||
src.temp = new /datum/compx_window/grid(src)
|
||||
qdel(src.temp:gridList)
|
||||
src.temp:gridList = new /list(compx_gridx_max, compx_gridy_max)
|
||||
|
||||
|
||||
//src.temp = new /list(gridx_max, gridy_max)
|
||||
src.clear_icons()
|
||||
|
||||
var/obj/compx_icon/temp_icon = new /obj/compx_icon(src)
|
||||
temp_icon.action_tag = "menu"
|
||||
temp_icon.action_arg = "main"
|
||||
temp_icon.icon_state = "menu-main"
|
||||
temp_icon.name = ""
|
||||
temp_icon.no_drag = 1
|
||||
|
||||
src.add_compicon(temp_icon, 1, setup_taskbar_y)
|
||||
|
||||
//src.temp = new /datum/compx_window/grid(src)
|
||||
src.master.graphic_mode = 1
|
||||
|
||||
switch(new_mode)
|
||||
if(0) //Text console mode.
|
||||
//TO-DO
|
||||
src.master.graphic_mode = 0
|
||||
if (istype(src.temp))
|
||||
qdel(src.temp)
|
||||
|
||||
|
||||
|
||||
return
|
||||
|
||||
if(1) //Desktop display mode.
|
||||
if (!istype(src.temp, /datum/compx_window/grid))
|
||||
return
|
||||
|
||||
var/datum/compx_window/grid/gridTemp = temp
|
||||
//Let's go back up a folder!
|
||||
var/obj/compx_icon/temp_icon
|
||||
if(src.current_folder != src.current_folder.holder.root)
|
||||
temp_icon = new /obj/compx_icon(src)
|
||||
temp_icon.action_tag = "system"
|
||||
temp_icon.action_arg = "root"
|
||||
temp_icon.icon_state = "arrow"
|
||||
temp_icon.dir = 1
|
||||
temp_icon.name = ""
|
||||
temp_icon.no_drag = 1
|
||||
|
||||
src.add_compicon(temp_icon, compx_gridx_max-1, setup_taskbar_y)
|
||||
|
||||
//Drive switching button
|
||||
temp_icon = new /obj/compx_icon(src)
|
||||
temp_icon.action_tag = "system"
|
||||
temp_icon.action_arg = "drive"
|
||||
if(!src.current_folder)
|
||||
src.current_folder = src.holding_folder
|
||||
temp_icon.icon_state = "disk-[istype(src.current_folder.holder, /obj/item/disk/data/fixed_disk) ? "hd" : "fd"]"
|
||||
temp_icon.name = ""
|
||||
temp_icon.no_drag = 1
|
||||
|
||||
src.add_compicon(temp_icon, compx_gridx_max, setup_taskbar_y)
|
||||
|
||||
gridTemp.gridList[setup_titlestring_x][setup_taskbar_y] = "<b>[src.current_folder.holder.title]</b>"
|
||||
|
||||
var/i = ( (compx_gridy_max - 1) * (compx_gridx_max) )
|
||||
var/ix = 0
|
||||
var/iy = setup_taskbar_y + 1
|
||||
for(var/datum/computer/C in src.current_folder.contents)
|
||||
i--
|
||||
if(i <= 0)
|
||||
break
|
||||
|
||||
ix++
|
||||
if(ix > compx_gridx_max)
|
||||
ix = 0
|
||||
iy++
|
||||
|
||||
var/obj/compx_icon/file_icon = new /obj/compx_icon(src)
|
||||
file_icon.name = copytext(C.name, 1, 10)
|
||||
if(istype(C, /datum/computer/folder))
|
||||
file_icon.icon_state = "folder"
|
||||
else
|
||||
if(C.metadata["ico"])
|
||||
file_icon.icon_state = C.metadata["ico"]
|
||||
else
|
||||
file_icon.icon_state = "file-generic"
|
||||
file_icon.action_tag = "file"
|
||||
file_icon.action_arg = "\ref[C]"
|
||||
|
||||
src.add_compicon(file_icon, ix, iy)
|
||||
|
||||
src.master.updateUsrDialog()
|
||||
return
|
||||
|
||||
detect_drives()
|
||||
if(!src.master)
|
||||
return
|
||||
src.known_drives.len = 0
|
||||
if(src.master.hd)
|
||||
src.known_drives += src.master.hd
|
||||
|
||||
for(var/obj/item/peripheralx/drive/DR in src.master.peripherals)
|
||||
if(DR.disk)
|
||||
src.known_drives += DR.disk
|
||||
|
||||
return
|
||||
|
||||
run_program(datum/computer/file/terminalx_program/program)
|
||||
if (!master.run_program(program))
|
||||
return 0
|
||||
|
||||
if (!program.gui_app)
|
||||
set_mode(0)
|
||||
|
||||
src.application = program
|
||||
return 1
|
||||
|
||||
|
||||
initialize()
|
||||
if(..())
|
||||
return
|
||||
|
||||
src.detect_drives()
|
||||
src.current_folder = src.holder.root
|
||||
|
||||
src.set_mode(1)
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["drag"])
|
||||
if(!istype(src.temp, /datum/compx_window/grid))
|
||||
return
|
||||
|
||||
var/datum/compx_window/grid/window = src.temp
|
||||
//If everything works out here, coords[1] should be x and coords[2] should be y of the new grid location.
|
||||
var/list/coords = dd_text2list(href_list["drag"], ",")
|
||||
if(coords.len != 2)
|
||||
return
|
||||
|
||||
var/new_x = text2num(coords[1])
|
||||
var/new_y = text2num(coords[2])
|
||||
if(!isnum(new_x) || !isnum(new_y))
|
||||
return
|
||||
|
||||
//boutput(world, "New-X: [new_x]<br>New-Y: [new_y]")
|
||||
if(new_x <= 0 || new_x > compx_gridx_max || new_y <= 1 || new_y > compx_gridy_max)
|
||||
//boutput(world, "new coords out of bounds")
|
||||
return
|
||||
|
||||
var/obj/compx_icon/calling_icon = gui_icons[href_list["gid"]]
|
||||
if(!istype(calling_icon))
|
||||
return
|
||||
|
||||
var/new_loc_check = window.gridList[new_x][new_y]
|
||||
if(!isnull(new_loc_check))
|
||||
return
|
||||
|
||||
window.gridList[new_x][new_y] = calling_icon
|
||||
window.gridList[calling_icon.grid_x][calling_icon.grid_y] = null
|
||||
calling_icon.grid_x = new_x
|
||||
calling_icon.grid_y = new_y
|
||||
|
||||
src.master.updateUsrDialog()
|
||||
return
|
||||
|
||||
else if (href_list["system"])
|
||||
switch(href_list["system"])
|
||||
if("root")
|
||||
if(istype(src.current_folder.holding_folder))
|
||||
src.current_folder = src.current_folder.holding_folder
|
||||
else
|
||||
src.current_folder = src.current_folder.holder.root
|
||||
src.set_mode(1)
|
||||
if("drive")
|
||||
var/pick_next = 0
|
||||
var/loop_around = 1
|
||||
for(var/obj/item/disk/data/D in src.known_drives)
|
||||
if(D == src.current_folder.holder)
|
||||
pick_next = 1
|
||||
continue
|
||||
|
||||
if(pick_next)
|
||||
src.current_folder = D.root
|
||||
loop_around = 0
|
||||
break
|
||||
|
||||
if(loop_around && src.known_drives.len > 1)
|
||||
var/obj/item/disk/data/tempD = src.known_drives[1]
|
||||
if(istype(tempD))
|
||||
src.current_folder = tempD.root
|
||||
|
||||
src.set_mode(1)
|
||||
|
||||
else if (href_list["menu"])
|
||||
switch(href_list["menu"])
|
||||
if("main")
|
||||
if(src.mode != 2)
|
||||
src.set_mode(2)
|
||||
else
|
||||
src.set_mode(1)
|
||||
return
|
||||
|
||||
else if (href_list["file"])
|
||||
var/datum/computer/C = locate(href_list["file"]) in src.current_folder.contents
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
//To-Do
|
||||
//boutput(world, "[istype(C, /datum/computer/file) ? "<b>File</b> Folder" : "File <b>Folder</b>"]: <b>Name:</b> \"[C.name]\"")
|
||||
if(istype(C, /datum/computer/folder))
|
||||
src.current_folder = C
|
||||
src.set_mode(1)
|
||||
|
||||
if(istype(C, /datum/computer/file/terminalx_program) && C:executable && !(C in master.processing_programs))
|
||||
src.run_program(C)
|
||||
|
||||
return
|
||||
|
||||
//boutput(world, "Topic Input: \"[href]\"")
|
||||
return
|
||||
|
||||
disk_inserted(var/obj/item/disk/data/inserted)
|
||||
if(!(inserted in src.known_drives))
|
||||
src.known_drives += inserted
|
||||
|
||||
return
|
||||
|
||||
disk_ejected(var/obj/item/disk/data/ejected)
|
||||
if(src.holder == ejected)
|
||||
src.clear_icons()
|
||||
|
||||
src.master.override_temp = "<font color=red><b>Fatal Error:</b> Unable to read system file.</font>"
|
||||
src.master.graphic_mode = 0
|
||||
src.master.updateUsrDialog()
|
||||
|
||||
src.quit()
|
||||
return
|
||||
|
||||
if(src.current_folder && src.current_folder.holder == ejected)
|
||||
src.current_folder = src.holder.root
|
||||
|
||||
src.detect_drives()
|
||||
if(src.mode > 0)
|
||||
src.set_mode(src.mode)
|
||||
return
|
||||
|
||||
input_text(var/text, source=0)
|
||||
if(..())
|
||||
return
|
||||
|
||||
src.master.visible_message("<b>[src.master]</b> <i>beeps</i>, \"[text]\"")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/disk/data/floppy/computerxboot
|
||||
name = "data disk-'ThinkOS/2'"
|
||||
|
||||
New()
|
||||
..()
|
||||
src.root.add_file( new /datum/computer/file/terminalx_program/os/main_os(src))
|
||||
var/datum/computer/folder/newfolder = new /datum/computer/folder( )
|
||||
newfolder.name = "logs"
|
||||
src.root.add_file( newfolder )
|
||||
newfolder.add_file( new /datum/computer/file/record/c3help(src))
|
||||
newfolder = new /datum/computer/folder
|
||||
newfolder.name = "bin"
|
||||
src.root.add_file( newfolder )
|
||||
//newfolder.add_file( new /datum/computer/file/terminal_program/writewizard(src))
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user