mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Sprites replaced with a black box that could conceivably contain a brain, while obscuring the details. Complete with screen and convenient handle. Usage text modified to make sense for MMIs/posibrains, instead of just drone brains (e.g. downloaded → transferred). Description added to the new intelliCores. Made into normal-sized item, similar to MMIs/posibrains. This is an alternative to either changing lore to allow for brain uploading, or changing code to allow for choosing multiple AI brain types.
330 lines
9.0 KiB
Plaintext
330 lines
9.0 KiB
Plaintext
|
|
/*
|
|
Objects used to construct computers, and objects that can be inserted into them, etc.
|
|
|
|
TODO:
|
|
* Synthesizer part (toybox, injectors, etc)
|
|
*/
|
|
|
|
|
|
|
|
/obj/item/part/computer
|
|
name = "computer part"
|
|
desc = "Holy jesus you donnit now"
|
|
gender = PLURAL
|
|
icon = 'icons/obj/stock_parts.dmi'
|
|
icon_state = "hdd1"
|
|
w_class = ITEMSIZE_SMALL
|
|
|
|
var/emagged = 0
|
|
|
|
// the computer that this device is attached to
|
|
var/obj/machinery/computer3/computer
|
|
|
|
// If the computer is attacked by an item it will reference this to decide which peripheral(s) are affected.
|
|
var/list/attackby_types = list()
|
|
proc/allow_attackby(var/obj/item/I as obj,var/mob/user as mob)
|
|
|
|
for(var/typekey in attackby_types)
|
|
if(istype(I,typekey))
|
|
return 1
|
|
return 0
|
|
|
|
proc/init(var/obj/machinery/computer/target)
|
|
computer = target
|
|
// continue to handle all other type-specific procedures
|
|
|
|
/*
|
|
Below are all the miscellaneous components
|
|
For storage drives, see storage.dm
|
|
For networking parts, see
|
|
*/
|
|
|
|
/obj/item/part/computer/ai_holder
|
|
name = "intelliCore computer module"
|
|
desc = "Contains a specialized nacelle for dealing with highly sensitive equipment without interference."
|
|
|
|
attackby_types = list(/obj/item/device/aicard)
|
|
|
|
var/mob/living/silicon/ai/occupant = null
|
|
var/busy = 0
|
|
|
|
attackby(obj/I as obj,mob/user as mob)
|
|
if(computer && !computer.stat)
|
|
|
|
if(istype(I, /obj/item/device/aicard))
|
|
|
|
var/obj/item/device/aicard/card = I
|
|
var/mob/living/silicon/ai/comp_ai = locate() in src
|
|
var/mob/living/silicon/ai/card_ai = locate() in card
|
|
|
|
if(istype(comp_ai))
|
|
if(busy)
|
|
user << "<span class='danger'>ERROR:</span> Reconstruction in progress."
|
|
return
|
|
card.grab_ai(comp_ai, user)
|
|
if(!(locate(/mob/living/silicon/ai) in src)) occupant = null
|
|
else if(istype(card_ai))
|
|
load_ai(card_ai,card,user)
|
|
occupant = locate(/mob/living/silicon/ai) in src
|
|
|
|
if(computer.program)
|
|
computer.program.update_icon()
|
|
computer.update_icon()
|
|
computer.occupant = occupant
|
|
..()
|
|
return
|
|
|
|
/obj/item/part/computer/ai_holder/proc/load_ai(var/mob/living/silicon/ai/transfer, var/obj/item/device/aicard/card, var/mob/user)
|
|
|
|
if(!transfer)
|
|
return
|
|
|
|
// Transfer over the AI.
|
|
transfer << "You have been transferred into a mobile terminal. Sadly, there is no remote access from here."
|
|
user << "<span class='notice'>Transfer successful:</span> [transfer.name] placed within mobile terminal."
|
|
|
|
transfer.loc = src
|
|
transfer.cancel_camera()
|
|
transfer.control_disabled = 1
|
|
occupant = transfer
|
|
|
|
if(card)
|
|
card.clear()
|
|
|
|
|
|
/*
|
|
ID computer cardslot - reading and writing slots
|
|
*/
|
|
|
|
/obj/item/part/computer/cardslot
|
|
name = "magnetic card slot"
|
|
desc = "Contains a slot for reading magnetic swipe cards."
|
|
|
|
var/obj/item/weapon/card/reader = null
|
|
var/obj/item/weapon/card/writer = null // so that you don't need to typecast dual cardslots, but pretend it's not here
|
|
// alternately pretend they did it to save money on manufacturing somehow
|
|
var/dualslot = 0 // faster than typechecking
|
|
attackby_types = list(/obj/item/weapon/card)
|
|
|
|
attackby(var/obj/item/I as obj, var/mob/user as mob)
|
|
if(istype(I,/obj/item/weapon/card))
|
|
insert(I)
|
|
return
|
|
..(I,user)
|
|
|
|
// cardslot.insert(card, slot)
|
|
// card: The card obj you want to insert (usually your ID)
|
|
// slot: Which slot to insert into (1: reader, 2: writer, 3: auto), 3 default
|
|
proc/insert(var/obj/item/weapon/card/card, var/slot = 3)
|
|
if(!computer)
|
|
return 0
|
|
// This shouldn't happen, just in case..
|
|
if(slot == 2 && !dualslot)
|
|
usr << "This device has only one card slot"
|
|
return 0
|
|
|
|
if(istype(card,/obj/item/weapon/card/emag)) // emag reader slot
|
|
if(!writer)
|
|
usr << "You insert \the [card], and the computer grinds, sparks, and beeps. After a moment, the card ejects itself."
|
|
computer.emagged = 1
|
|
return 1
|
|
else
|
|
usr << "You are unable to insert \the [card], as the reader slot is occupied"
|
|
|
|
var/mob/living/L = usr
|
|
switch(slot)
|
|
if(1)
|
|
if(equip_to_reader(card, L))
|
|
usr << "You insert the card into reader slot"
|
|
else
|
|
usr << "There is already something in the reader slot."
|
|
if(2)
|
|
if(equip_to_writer(card, L))
|
|
usr << "You insert the card into writer slot"
|
|
else
|
|
usr << "There is already something in the reader slot."
|
|
if(3)
|
|
if(equip_to_reader(card, L))
|
|
usr << "You insert the card into reader slot"
|
|
else if (equip_to_writer(card, L) && dualslot)
|
|
usr << "You insert the card into writer slot"
|
|
else if (dualslot)
|
|
usr << "There is already something in both slots."
|
|
else
|
|
usr << "There is already something in the reader slot."
|
|
|
|
|
|
// Usage of insert() preferred, as it also tells result to the user.
|
|
proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L)
|
|
if(!reader)
|
|
L.drop_item()
|
|
card.loc = src
|
|
reader = card
|
|
return 1
|
|
return 0
|
|
|
|
proc/equip_to_writer(var/obj/item/weapon/card/card, var/mob/living/L)
|
|
if(!writer && dualslot)
|
|
L.drop_item()
|
|
card.loc = src
|
|
writer = card
|
|
return 1
|
|
return 0
|
|
|
|
// cardslot.remove(slot)
|
|
// slot: Which slot to remove card(s) from (1: reader only, 2: writer only, 3: both [works even with one card], 4: reader and if empty then writer ), 3 default
|
|
proc/remove(var/slot = 3)
|
|
var/mob/living/L = usr
|
|
switch(slot)
|
|
if(1)
|
|
if (remove_reader(L))
|
|
L << "You remove the card from reader slot"
|
|
else
|
|
L << "There is no card in the reader slot"
|
|
if(2)
|
|
if (remove_writer(L))
|
|
L << "You remove the card from writer slot"
|
|
else
|
|
L << "There is no card in the writer slot"
|
|
if(3)
|
|
if (remove_reader(L))
|
|
if (remove_writer(L))
|
|
L << "You remove cards from both slots"
|
|
else
|
|
L << "You remove the card from reader slot"
|
|
else
|
|
if(remove_writer(L))
|
|
L << "You remove the card from writer slot"
|
|
else
|
|
L << "There are no cards in both slots"
|
|
if(4)
|
|
if (!remove_reader(L))
|
|
if (remove_writer(L))
|
|
L << "You remove the card from writer slot"
|
|
else if (!dualslot)
|
|
L << "There is no card in the reader slot"
|
|
else
|
|
L << "There are no cards in both slots"
|
|
else
|
|
L << "You remove the card from reader slot"
|
|
|
|
|
|
proc/remove_reader(var/mob/living/L)
|
|
if(reader)
|
|
reader.loc = loc
|
|
if(istype(L) && !L.get_active_hand())
|
|
if(istype(L,/mob/living/carbon/human))
|
|
L.put_in_hands(reader)
|
|
else
|
|
reader.loc = get_turf(computer)
|
|
else
|
|
reader.loc = get_turf(computer)
|
|
reader = null
|
|
return 1
|
|
return 0
|
|
|
|
proc/remove_writer(var/mob/living/L)
|
|
if(writer && dualslot)
|
|
writer.loc = loc
|
|
if(istype(L) && !L.get_active_hand())
|
|
if(istype(L,/mob/living/carbon/human))
|
|
L.put_in_hands(writer)
|
|
else
|
|
writer.loc = get_turf(computer)
|
|
else
|
|
writer.loc = get_turf(computer)
|
|
writer = null
|
|
return 1
|
|
return 0
|
|
|
|
// Authorizes the user based on the computer's requirements
|
|
proc/authenticate()
|
|
return computer.check_access(reader)
|
|
|
|
proc/addfile(var/datum/file/F)
|
|
if(!dualslot || !istype(writer,/obj/item/weapon/card/data))
|
|
return 0
|
|
var/obj/item/weapon/card/data/D = writer
|
|
if(D.files.len > 3)
|
|
return 0
|
|
D.files += F
|
|
return 1
|
|
|
|
/obj/item/part/computer/cardslot/dual
|
|
name = "magnetic card reader"
|
|
desc = "Contains slots for inserting magnetic swipe cards for reading and writing."
|
|
dualslot = 1
|
|
|
|
|
|
/*
|
|
// Atlantis: Reworked card manipulation a bit.
|
|
// No need for separated code for dual and single readers.
|
|
// Both is handled in single-slot reader code now, thanks to the "dualslot" var.
|
|
// Leaving this code here if someone wants to somehow use it, just uncomment.
|
|
|
|
insert(var/obj/item/weapon/card/card,var/slot = 0)
|
|
if(!computer)
|
|
return 0
|
|
|
|
if(istype(card,/obj/item/weapon/card/emag) && !reader) // emag reader slot
|
|
usr.visible_message("[computer]'s screen flickers for a moment.","You insert \the [card]. After a moment, the card ejects itself, and [computer] beeps.","[computer] beeps.")
|
|
computer.emagged = 1
|
|
return 1
|
|
|
|
if(slot == 1) // 1: writer
|
|
if(writer != null)
|
|
usr << "There's already a card in that slot!"
|
|
return 0
|
|
var/mob/living/L = usr
|
|
L.drop_item()
|
|
card.loc = src
|
|
writer = card
|
|
return 1
|
|
else if(slot == 2) // 2: reader
|
|
if(reader != null)
|
|
usr << "There's already a card in that slot!"
|
|
return 0
|
|
var/mob/living/L = usr
|
|
L.drop_item()
|
|
card.loc = src
|
|
reader = card
|
|
return 1
|
|
else // 0: auto
|
|
if(reader && writer)
|
|
usr << "Both slots are full!"
|
|
return 0
|
|
var/mob/living/L = usr
|
|
L.drop_item()
|
|
card.loc = src
|
|
if(reader)
|
|
writer = card
|
|
computer.updateUsrDialog()
|
|
return 1
|
|
if(istype(card,/obj/item/weapon/card/id) && !(access_change_ids in card:access) && !writer) // not authorized
|
|
writer = card
|
|
computer.updateUsrDialog()
|
|
return 1
|
|
if(!reader)
|
|
reader = card
|
|
computer.updateUsrDialog()
|
|
return 1
|
|
return 0
|
|
|
|
remove(var/obj/item/weapon/card/card)
|
|
if(card != reader && card != writer)
|
|
return
|
|
|
|
if(card == reader) reader = null
|
|
if(card == writer) writer = null
|
|
card.loc = loc
|
|
|
|
var/mob/living/carbon/human/user = usr
|
|
if(ishuman(user) && !user.get_active_hand())
|
|
user.put_in_hands(card)
|
|
else
|
|
card.loc = computer.loc
|
|
*/
|
|
|
|
|