mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-26 10:04:12 +00:00
Protolathe and CI build procs moved to them from RD console. Protolathe and CI now have a build queue. Designs take varying time to build. P and CI material storage is now a list instead of a set of vars. origin_tech is now a list. All sheets now contain exactly 2000 units of matter. In design datum, chemicals and materials are two separate lists. Designs are now sorted. The method is kinda hacky but flexible. They have a var, sort_string. Designs are sorted alphabetically using it. Circuits how show whether they build a machine or a computer in CI menu. Adds item construction, for now protolathe is used.
185 lines
4.2 KiB
Plaintext
185 lines
4.2 KiB
Plaintext
/*
|
|
Computer devices that can store programs, files, etc.
|
|
*/
|
|
|
|
/obj/item/part/computer/storage
|
|
name = "Storage Device"
|
|
desc = "A device used for storing and retrieving digital information."
|
|
|
|
// storage capacity, kb
|
|
var/volume = 0
|
|
var/max_volume = 64 // should be enough for anyone
|
|
|
|
var/driveletter = null // drive letter according to the computer
|
|
|
|
var/list/files = list() // a list of files in the memory (ALL files)
|
|
var/removeable = 0 // determinse if the storage device is a removable hard drive (ie floppy)
|
|
|
|
|
|
var/writeprotect = 0 // determines if the drive forbids writing.
|
|
// note that write-protect is hardware and does not respect emagging.
|
|
|
|
var/list/spawnfiles = list()// For mappers, special drives, and data disks
|
|
|
|
New()
|
|
..()
|
|
if(islist(spawnfiles))
|
|
if(removeable && spawnfiles.len)
|
|
var/obj/item/part/computer/storage/removable/R = src
|
|
R.inserted = new(src)
|
|
if(writeprotect)
|
|
R.inserted.writeprotect = 1
|
|
for(var/typekey in spawnfiles)
|
|
addfile(new typekey(),1)
|
|
|
|
// Add a file to the hard drive, returns 0 if failed
|
|
// forced is used when spawning files on a write-protect drive
|
|
proc/addfile(var/datum/file/F,var/forced = 0)
|
|
if(!F || (F in files))
|
|
return 1
|
|
if(writeprotect && !forced)
|
|
return 0
|
|
if(volume + F.volume > max_volume)
|
|
if(!forced)
|
|
return 0
|
|
max_volume = volume + F.volume
|
|
|
|
files.Add(F)
|
|
volume += F.volume
|
|
F.computer = computer
|
|
F.device = src
|
|
return 1
|
|
proc/removefile(var/datum/file/F,var/forced = 0)
|
|
if(!F || !(F in files))
|
|
return 1
|
|
if(writeprotect && !forced)
|
|
return 0
|
|
|
|
files -= F
|
|
volume -= F.volume
|
|
if(F.device == src)
|
|
F.device = null
|
|
F.computer = null
|
|
return 1
|
|
|
|
init(var/obj/machinery/computer/target)
|
|
computer = target
|
|
for(var/datum/file/F in files)
|
|
F.computer = computer
|
|
|
|
/*
|
|
Standard hard drives for computers. Used in computer construction
|
|
*/
|
|
|
|
/obj/item/part/computer/storage/hdd
|
|
name = "Hard Drive"
|
|
max_volume = 25000
|
|
icon_state = "hdd1"
|
|
|
|
|
|
/obj/item/part/computer/storage/hdd/big
|
|
name = "Big Hard Drive"
|
|
max_volume = 50000
|
|
icon_state = "hdd2"
|
|
|
|
/obj/item/part/computer/storage/hdd/gigantic
|
|
name = "Gigantic Hard Drive"
|
|
max_volume = 75000
|
|
icon_state = "hdd3"
|
|
|
|
/*
|
|
Removeable hard drives for portable storage
|
|
*/
|
|
|
|
/obj/item/part/computer/storage/removable
|
|
name = "Disk Drive"
|
|
max_volume = 3000
|
|
removeable = 1
|
|
|
|
attackby_types = list(/obj/item/weapon/disk/file, /obj/item/weapon/pen)
|
|
var/obj/item/weapon/disk/file/inserted = null
|
|
|
|
proc/eject_disk(var/forced = 0)
|
|
if(!forced)
|
|
return
|
|
files = list()
|
|
inserted.loc = computer.loc
|
|
if(usr)
|
|
if(!usr.get_active_hand())
|
|
usr.put_in_active_hand(inserted)
|
|
else if(forced && !usr.get_inactive_hand())
|
|
usr.put_in_inactive_hand(inserted)
|
|
for(var/datum/file/F in inserted.files)
|
|
F.computer = null
|
|
inserted = null
|
|
|
|
|
|
attackby(obj/O as obj, mob/user as mob)
|
|
if(inserted && istype(O,/obj/item/weapon/pen))
|
|
usr << "You use [O] to carefully pry [inserted] out of [src]."
|
|
eject_disk(forced = 1)
|
|
return
|
|
|
|
if(istype(O,/obj/item/weapon/disk/file))
|
|
if(inserted)
|
|
usr << "There's already a disk in [src]!"
|
|
return
|
|
|
|
usr << "You insert [O] into [src]."
|
|
usr.drop_item()
|
|
O.loc = src
|
|
inserted = O
|
|
writeprotect = inserted.writeprotect
|
|
|
|
files = inserted.files
|
|
for(var/datum/file/F in inserted.files)
|
|
F.computer = computer
|
|
|
|
return
|
|
|
|
..()
|
|
|
|
addfile(var/datum/file/F)
|
|
if(!F || !inserted)
|
|
return 0
|
|
|
|
if(F in inserted.files)
|
|
return 1
|
|
|
|
if(inserted.volume + F.volume > inserted.max_volume)
|
|
return 0
|
|
|
|
inserted.files.Add(F)
|
|
F.computer = computer
|
|
F.device = inserted
|
|
return 1
|
|
|
|
/*
|
|
Removable hard drive presents...
|
|
removeable disk!
|
|
*/
|
|
|
|
/obj/item/weapon/disk/file
|
|
//parent_type = /obj/item/part/computer/storage // todon't: do this
|
|
name = "Data Disk"
|
|
desc = "A device that can be inserted and removed into computers easily as a form of portable data storage. This one stores 1 Megabyte"
|
|
var/list/files
|
|
var/list/spawn_files = list()
|
|
var/writeprotect = 0
|
|
var/volume = 0
|
|
var/max_volume = 1028
|
|
|
|
|
|
New()
|
|
..()
|
|
icon_state = "datadisk[rand(0,6)]"
|
|
src.pixel_x = rand(-5, 5)
|
|
src.pixel_y = rand(-5, 5)
|
|
files = list()
|
|
if(istype(spawn_files))
|
|
for(var/typekey in spawn_files)
|
|
var/datum/file/F = new typekey()
|
|
F.device = src
|
|
files += F
|
|
volume += F.volume
|