Files
2016-03-06 20:52:14 +01:00

1050 lines
28 KiB
Plaintext

/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 = "<b>Thinktronic BIOS V2.1</b><br>"
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 = {"<title>Computer Terminal</title>
<style type="text/css">
body
{
background-color:#999876;
}
img
{
border-style: none;
}
#consolelog
{
border: 1px grey solid;
height: 280px;
width: 410px;
overflow-y: scroll;
word-wrap: break-word;
word-break: break-all;
background-color:[src.setup_bg_color];
color:[src.setup_font_color];
font-family: "Consolas", monospace;
font-size:10pt;
}
#consoleshell
{
border: 1px grey solid;
height: 280px;
width: 410px;
overflow-x: hidden;
overflow-y: hidden;
word-wrap: break-word;
word-break: break-all;
background-color:#1B1E1B;
color:#19A319;
font-family: "Consolas", monospace;
font-size:10pt;
}
</style>
<body scroll=no>
<div id=\"consolelog\">[src.temp]</div>
<script language="JavaScript">
var objDiv = document.getElementById("consolelog");
objDiv.scrollTop = objDiv.scrollHeight;
var lastVals = new Array();
var lastValsOffset = 0;
function keydownfunc (event)
{
var theKey = (event.which) ? event.which : event.keyCode;
if (theKey == 38)
{
if (lastVals.length > lastValsOffset)
{
document.getElementById("consoleinput_text").value = lastVals\[lastVals.length - lastValsOffset - 1];
lastValsOffset++;
if (lastValsOffset >= lastVals.length)
{
lastValsOffset = 0;
}
}
}
else if (theKey == 40)
{
if (lastValsOffset > 0)
{
lastValsOffset--;
document.getElementById("consoleinput_text").value = lastVals\[lastVals.length - lastValsOffset - 1];
}
}
}
function lineEnter ()
{
if (document.getElementById("consoleinput_text").value != null)
{
lastVals.push(document.getElementById("consoleinput_text").value);
if (lastVals.length > 10)
{
lastVals.shift();
}
}
}
</script>
<br>
<form name="consoleinput" action="byond://?src=\ref[src]" method="get" onsubmit="javascript:return lineEnter()">
<input type="hidden" name="src" value="\ref[src]">
<input id = "consoleinput_text" type="text" name="command" maxlength="120" size="55" onKeyDown="javascript:return keydownfunc(event)">
<input type="submit" value="Enter">
</form>
<table cellspacing=5><tr>"}
if(setup_has_internal_disk)
dat += "<td id=\"internaldisk\">Disk: <a href='byond://?src=\ref[src];disk=1'>[src.diskette ? "Eject" : "-----"]</a></td>"
else
dat += "<td id = \"internaldisk\" style=\"display: none;\"></td>"
//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 += "<td id=\"badge[count]\">[C.return_badge()]</td>"
count++
if(!count)
dat += "<td></td><td></td>"
dat += {"<script language="JavaScript">
document.consoleinput.command.focus();
var printing = "";
var t_count = 0;
var last_output;
function input_clear()
{
document.getElementById("consoleinput_text").value = '';
}
function setInternalDisk(t)
{
document.getElementById("internaldisk").innerHTML = t;
}
function setBadge0(t)
{
document.getElementById("badge0").innerHTML = t;
}
function setBadge1(t)
{
document.getElementById("badge1").innerHTML = t;
}
function setBadge2(t)
{
document.getElementById("badge2").innerHTML = t;
}
function con_output(t)
{
if (printing.length > 0)
{
var toadd = t.split("<br>");
if (t.substr(t.length - 4,4) == "<br>")
{
toadd.pop();
}
printing = printing.concat(toadd);
}
else
{
printing = t.split("<br>");
if (t.substr(t.length - 4,4) == "<br>")
{
printing.pop();
}
last_output = window.setInterval((function () {real_con_output();}), 10);
}
}
function real_con_output()
{
if (printing.length > 0)
{
var t_bit = printing.shift();
if (t_bit != undefined)
{
objDiv.innerHTML += t_bit + "<br>";
}
objDiv.scrollTop = objDiv.scrollHeight;
return;
}
window.clearTimeout(last_output);
return;
}
function con_clear()
{
printing.length = 0;
objDiv.innerHTML = "";
}
</script>"}
dat += {"<td><a href='byond://?src=\ref[src];restart=1'>Restart</a></td>
</body>"}
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, "<span style=\"color:red\">You cannot press the ejection button.</span>")
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: <a href='byond://?src=\ref[src];disk=1'>-----</a>"),"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: <a href='byond://?src=\ref[src];disk=1'>Eject</a>"),"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: <a href='byond://?src=\ref[src];eject=1'>Eject</a>"),"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, "<span style=\"color:blue\">The broken glass falls out.</span>")
new /obj/item/raw_material/shard/glass( src.loc )
A.state = 3
A.icon_state = "3"
else
boutput(user, "<span style=\"color:blue\">You disconnect the monitor.</span>")
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...<br>"
src.updateUsrDialog()
spawn(20)
src.restarting = 0
src.post_system()
return
post_system()
src.temp_add += "Initializing system...<br>"
if(!src.hd)
src.temp_add += "<font color=red>1701 - NO FIXED DISK</font><br>"
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...<br>"
src.run_program(newos)
else
src.temp_add += "<font color=red>Non-system disk or disk error.</font><br>"
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...<br>"
src.run_program(newos)
else
src.temp_add += "<font color=red>Unable to boot from fixed disk.</font><br>"
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...<br>"
success = 1
src.run_program(newos)
break
if(!success)
src.temp_add += "<font color=red>ERR - BOOT FAILURE</font><br>"
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, "<span style=\"color:red\">You can't seem to get the latch open!</span>")
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("<b>[user]</b> 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("<span style=\"color:red\">[usr] folds [src] back up!</span>")
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, "<span style=\"color:red\">There is no energy cell inserted!</span>")
return
playsound(src.loc, "sound/items/Crowbar.ogg", 50, 1)
src.cell.set_loc(get_turf(src))
src.cell = null
user.visible_message("<span style=\"color:red\">[user] removes the power cell from [src]!.</span>","<span style=\"color:red\">You remove the power cell from [src]!</span>")
src.power_change()
return
else if (istype(W, /obj/item/cell))
if(src.cell)
boutput(user, "<span style=\"color:red\">There is already an energy cell inserted!</span>")
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