diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm
index d1f95d8309c..48ed72a95bd 100644
--- a/code/WorkInProgress/Chemistry-Reagents.dm
+++ b/code/WorkInProgress/Chemistry-Reagents.dm
@@ -253,6 +253,8 @@ datum
holder.remove_reagent("chloralhydrate", 5)
if(holder.has_reagent("carpotoxin"))
holder.remove_reagent("carpotoxin", 1)
+ if(holder.has_reagent("zombiepowder"))
+ holder.remove_reagent("zombiepowder", 0.5)
M:toxloss = max(M:toxloss-2,0)
..()
return
diff --git a/code/WorkInProgress/computer2/buildandrepair.dm b/code/WorkInProgress/computer2/buildandrepair.dm
index 85790260f62..24edd52b15e 100644
--- a/code/WorkInProgress/computer2/buildandrepair.dm
+++ b/code/WorkInProgress/computer2/buildandrepair.dm
@@ -12,7 +12,7 @@
density = 1
anchored = 0
name = "Computer-frame"
- icon = 'computer_frame.dmi'
+ icon = 'stock_parts.dmi'
icon_state = "0"
var/state = 0
var/obj/item/weapon/motherboard/mainboard = null
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index efb55e7d80f..e875542c66d 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -1640,6 +1640,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
name = "stock part"
desc = "What?"
icon = 'stock_parts.dmi'
+ var/rating = 1
New()
src.pixel_x = rand(-5.0, 5)
src.pixel_y = rand(-5.0, 5)
@@ -1655,7 +1656,6 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
name = "Capacitor"
desc = "A basic capacitor used in the construction of a variety of devices."
icon_state = "capacitor"
- var/max_charge = 100
origin_tech = list("energystorage" = 2)
m_amt = 50
g_amt = 50
@@ -1664,15 +1664,28 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
name = "Scanning Module"
desc = "A compact, high resolution scanning module used in the construction of certain devices."
icon_state = "scan_module"
- var/rating = 1
origin_tech = list("magnets" = 2)
m_amt = 50
g_amt = 20
/obj/item/weapon/stock_parts/micro_manipulator
- name = "Micro Manipulator"
+ name = "Micro-Manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "micro_mani"
- var/rating = 1
origin_tech = list("robotics" = 1)
- m_amt = 30
\ No newline at end of file
+ m_amt = 30
+
+/obj/item/weapon/stock_parts/micro_laser
+ name = "Micro-laser"
+ desc = "A tiny laser used in certain devices."
+ icon_state = "micro_laser"
+ origin_tech = list("magnets" = 2)
+ m_amt = 10
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/matter_bin
+ name = "Matter Bin"
+ desc = "A container for hold compressed matter awaiting re-construction."
+ icon_state = "matter_bin"
+ origin_tech = list("materials" = 2)
+ m_amt = 80
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 1c69447c7d3..0ffa2009903 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -2,7 +2,7 @@
density = 1
anchored = 0
name = "Computer-frame"
- icon = 'computer_frame.dmi'
+ icon = 'stock_parts.dmi'
icon_state = "0"
var/state = 0
var/obj/item/weapon/circuitboard/circuit = null
@@ -16,95 +16,98 @@
icon = 'module.dmi'
icon_state = "id_mod"
item_state = "electronic"
- var/id = null
- var/frequency = null
- var/computertype = null
- var/powernet = null
- var/list/records = null
+ var
+ id = null
+ frequency = null
+ build_path = null
+ board_type = "computer"
+ list/req_components = null
+ powernet = null
+ list/records = null
/obj/item/weapon/circuitboard/security
name = "Circuit board (Security)"
- computertype = "/obj/machinery/computer/security"
+ build_path = "/obj/machinery/computer/security"
/obj/item/weapon/circuitboard/aicore
name = "Circuit board (AI core)"
/obj/item/weapon/circuitboard/aiupload
name = "Circuit board (AI Upload)"
- computertype = "/obj/machinery/computer/aiupload"
+ build_path = "/obj/machinery/computer/aiupload"
/obj/item/weapon/circuitboard/med_data
name = "Circuit board (Medical Records)"
- computertype = "/obj/machinery/computer/med_data"
+ build_path = "/obj/machinery/computer/med_data"
/obj/item/weapon/circuitboard/pandemic
name = "Circuit board (PanD.E.M.I.C. 2200)"
- computertype = "/obj/machinery/computer/pandemic"
+ build_path = "/obj/machinery/computer/pandemic"
/obj/item/weapon/circuitboard/scan_consolenew
name = "Circuit board (DNA Machine)"
- computertype = "/obj/machinery/scan_consolenew"
+ build_path = "/obj/machinery/scan_consolenew"
/obj/item/weapon/circuitboard/communications
name = "Circuit board (Communications)"
- computertype = "/obj/machinery/computer/communications"
+ build_path = "/obj/machinery/computer/communications"
/obj/item/weapon/circuitboard/card
name = "Circuit board (ID Computer)"
- computertype = "/obj/machinery/computer/card"
+ build_path = "/obj/machinery/computer/card"
//obj/item/weapon/circuitboard/shield
// name = "Circuit board (Shield Control)"
-// computertype = "/obj/machinery/computer/stationshield"
+// build_path = "/obj/machinery/computer/stationshield"
/obj/item/weapon/circuitboard/teleporter
name = "Circuit board (Teleporter)"
- computertype = "/obj/machinery/computer/teleporter"
+ build_path = "/obj/machinery/computer/teleporter"
/obj/item/weapon/circuitboard/secure_data
name = "Circuit board (Security Records)"
- computertype = "/obj/machinery/computer/secure_data"
+ build_path = "/obj/machinery/computer/secure_data"
/obj/item/weapon/circuitboard/stationalert
name = "Circuit board (Station Alerts)"
- computertype = "/obj/machinery/computer/station_alert"
+ build_path = "/obj/machinery/computer/station_alert"
/obj/item/weapon/circuitboard/atmospheresiphonswitch
name = "Circuit board (Atmosphere siphon control)"
- computertype = "/obj/machinery/computer/atmosphere/siphonswitch"
+ build_path = "/obj/machinery/computer/atmosphere/siphonswitch"
/obj/item/weapon/circuitboard/air_management
name = "Circuit board (Atmospheric monitor)"
- computertype = "/obj/machinery/computer/general_air_control"
+ build_path = "/obj/machinery/computer/general_air_control"
/obj/item/weapon/circuitboard/injector_control
name = "Circuit board (Injector control)"
- computertype = "/obj/machinery/computer/general_air_control/fuel_injection"
+ build_path = "/obj/machinery/computer/general_air_control/fuel_injection"
/obj/item/weapon/circuitboard/atmos_alert
name = "Circuit board (Atmospheric Alert)"
- computertype = "/obj/machinery/computer/atmos_alert"
+ build_path = "/obj/machinery/computer/atmos_alert"
/obj/item/weapon/circuitboard/pod
name = "Circuit board (Massdriver control)"
- computertype = "/obj/machinery/computer/pod"
+ build_path = "/obj/machinery/computer/pod"
/obj/item/weapon/circuitboard/robotics
name = "Circuit board (Robotics Control)"
- computertype = "/obj/machinery/computer/robotics"
+ build_path = "/obj/machinery/computer/robotics"
/obj/item/weapon/circuitboard/cloning
name = "Circuit board (Cloning)"
- computertype = "/obj/machinery/computer/cloning"
+ build_path = "/obj/machinery/computer/cloning"
/obj/item/weapon/circuitboard/arcade
name = "Circuit board (Arcade)"
- computertype = "/obj/machinery/computer/arcade"
+ build_path = "/obj/machinery/computer/arcade"
/obj/item/weapon/circuitboard/turbine_control
name = "Circuit board (Turbine control)"
- computertype = "/obj/machinery/computer/turbine_computer"
+ build_path = "/obj/machinery/computer/turbine_computer"
/obj/item/weapon/circuitboard/solar_control
name = "Circuit board (Solar Control)" //name fixed 250810
- computertype = "/obj/machinery/power/solar_control"
+ build_path = "/obj/machinery/power/solar_control"
/obj/item/weapon/circuitboard/powermonitor
name = "Circuit board (Power Monitor)" //name fixed 250810
- computertype = "/obj/machinery/power/monitor"
+ build_path = "/obj/machinery/power/monitor"
/obj/item/weapon/circuitboard/olddoor
name = "Circuit board (DoorMex)"
- computertype = "/obj/machinery/computer/pod/old"
+ build_path = "/obj/machinery/computer/pod/old"
/obj/item/weapon/circuitboard/syndicatedoor
name = "Circuit board (ProComp Executive)"
- computertype = "/obj/machinery/computer/pod/old/syndicate"
+ build_path = "/obj/machinery/computer/pod/old/syndicate"
/obj/item/weapon/circuitboard/swfdoor
name = "Circuit board (Magix)"
- computertype = "/obj/machinery/computer/pod/old/swf"
+ build_path = "/obj/machinery/computer/pod/old/swf"
/obj/item/weapon/circuitboard/prisoner
name = "Circuit board (Prisoner Management)"
- computertype = "/obj/machinery/computer/prisoner"
+ build_path = "/obj/machinery/computer/prisoner"
/obj/item/weapon/circuitboard/rdconsole
name = "Circuit Board (RD Console)"
- computertype = "/obj/machinery/computer/rdconsole"
+ build_path = "/obj/machinery/computer/rdconsole"
@@ -131,12 +134,16 @@
src.anchored = 0
src.state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
- playsound(src.loc, 'Deconstruct.ogg', 50, 1)
- user << "\blue You place the circuit board inside the frame."
- src.icon_state = "1"
- src.circuit = P
- user.drop_item()
- P.loc = src
+ var/obj/item/weapon/circuitboard/B = P
+ if(B.board_type == "computer")
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ user << "\blue You place the circuit board inside the frame."
+ src.icon_state = "1"
+ src.circuit = P
+ user.drop_item()
+ P.loc = src
+ else
+ user << "\red This frame does not accept circuit boards of this type!"
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You screw the circuit board into place."
@@ -191,7 +198,7 @@
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
- var/B = new src.circuit.computertype ( src.loc )
+ var/B = new src.circuit.build_path ( src.loc )
if(circuit.powernet) B:powernet = circuit.powernet
if(circuit.id) B:id = circuit.id
if(circuit.records) B:records = circuit.records
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
new file mode 100644
index 00000000000..953196535a0
--- /dev/null
+++ b/code/game/machinery/constructable_frame.dm
@@ -0,0 +1,149 @@
+/obj/machinery/constructable_frame //Made into a seperate type to make future revisions easier.
+ name = "machine frame"
+ icon = 'stock_parts.dmi'
+ icon_state = "box_0"
+ density = 1
+ anchored = 0
+ var
+ obj/item/weapon/circuitboard/circuit = null
+ list/components = null
+ list/req_components = null
+ state = 0
+
+/*
+To Do: Add deconstruct code to constructable machines. A marvelous idea, I know.
+*/
+/obj/machinery/constructable_frame/machine_frame
+ attackby(obj/item/P as obj, mob/user as mob)
+ switch(state)
+ if(0)
+ if(istype(P, /obj/item/weapon/wrench))
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user << "\blue You wrench the frame into place."
+ anchored = 1
+ state = 1
+
+ if(1)
+ if(istype(P, /obj/item/weapon/cable_coil))
+ if(P:amount >= 5)
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ user << "\blue You start to add cables to the frame."
+ if(do_after(user, 20))
+ P:amount -= 5
+ if(!P:amount) del(P)
+ user << "\blue You add cables to the frame."
+ state = 2
+ icon_state = "box_1"
+ if(istype(P, /obj/item/weapon/wrench))
+ playsound(src.loc, 'Ratchet.ogg', 75, 1)
+ user << "\blue You unbolt the frame from the floor."
+ anchored = 0
+ state = 0
+ if(2)
+ if(istype(P, /obj/item/weapon/circuitboard))
+ var/obj/item/weapon/circuitboard/B = P
+ if(B.board_type == "machine")
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ user << "\blue You add the circuit board to the frame."
+ circuit = P
+ user.drop_item()
+ P.loc = src
+ icon_state = "box_2"
+ state = 3
+ components = list()
+ req_components = circuit.req_components.Copy()
+ for(var/A in circuit.req_components)
+ req_components[A] = circuit.req_components[A]
+ else
+ user << "\red This frame does not accept circuit boards of this type!"
+ if(istype(P, /obj/item/weapon/wirecutters))
+ playsound(src.loc, 'wirecutter.ogg', 50, 1)
+ user << "\blue You remove the cables."
+ state = 1
+ icon_state = "box_0"
+ var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
+ A.amount = 5
+
+ if(3)
+ if(istype(P, /obj/item/weapon/crowbar))
+ playsound(src.loc, 'Crowbar.ogg', 50, 1)
+ state = 2
+ circuit.loc = src.loc
+ circuit = null
+ if(components.len == 0)
+ user << "\blue You remove the circuit board."
+ else
+ user << "\blue You remove the circuit board and other components."
+ for(var/obj/item/weapon/W in components)
+ W.loc = src.loc
+ req_components = null
+ components = null
+ icon_state = "box_1"
+
+ if(istype(P, /obj/item/weapon/screwdriver))
+ var/component_check = 1
+ for(var/R in req_components)
+ if(req_components[R] > 0)
+ component_check = 0
+ break
+ if(component_check)
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ new src.circuit.build_path ( src.loc )
+ del(src)
+
+ if(istype(P, /obj/item/weapon))
+ for(var/I in req_components)
+ if(istype(P, text2path(I)) && (req_components[I] > 0))
+ user.drop_item()
+ P.loc = src
+ components += P
+ req_components[I]--
+ break
+ if(P.loc != src)
+ user << "\red You cannot add that component to the machine!"
+
+
+//Machine Frame Circuit Boards
+/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
+micro-manipulator, console screen, beaker, Microlaser, matter bin
+Note: Once everything is added to the public areas, will add m_amt and g_amt to circuit boards since autolathe won't be able
+to destroy them and players will be able to make replacements.
+*/
+/obj/item/weapon/circuitboard/destructive_analyzer
+ name = "Circuit board (Destructive Analyzer)"
+ build_path = "/obj/machinery/r_n_d/destructive_analyzer"
+ board_type = "machine"
+ origin_tech = list("magnets" = 3, "materials" = 2)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/scanning_module" = 1,
+ "/obj/item/weapon/stock_parts/micro_manipulator" = 1,
+ "/obj/item/weapon/stock_parts/micro_laser" = 1)
+
+/obj/item/weapon/circuitboard/autolathe
+ name = "Circuit board (Destructive Analyzer)"
+ build_path = "/obj/machinery/r_n_d/destructive_analyzer"
+ board_type = "machine"
+ origin_tech = list("materials" = 3)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/matter_bin" = 2,
+ "/obj/item/weapon/stock_parts/micro_manipulator" = 2,
+ "/obj/item/weapon/stock_parts/console_screen" = 1)
+
+/obj/item/weapon/circuitboard/protolathe
+ name = "Circuit board (Destructive Analyzer)"
+ build_path = "/obj/machinery/r_n_d/destructive_analyzer"
+ board_type = "machine"
+ origin_tech = list("materials" = 3)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/matter_bin" = 2,
+ "/obj/item/weapon/stock_parts/micro_manipulator" = 2)
+
+/obj/item/weapon/circuitboard/circuit_imprinter
+ name = "Circuit board (Destructive Analyzer)"
+ build_path = "/obj/machinery/r_n_d/destructive_analyzer"
+ board_type = "machine"
+ origin_tech = list("materials" = 3, "programming" = 3)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/matter_bin" = 1,
+ "/obj/item/weapon/stock_parts/micro_manipulator" = 1,
+ "/obj/item/weapon/reagent_containers/glass/beaker" = 2)
\ No newline at end of file
diff --git a/code/game/objects/devices/PDA/uplink.dm b/code/game/objects/devices/PDA/uplink.dm
index 1d1137ff63e..eb7aad0a57d 100644
--- a/code/game/objects/devices/PDA/uplink.dm
+++ b/code/game/objects/devices/PDA/uplink.dm
@@ -40,6 +40,7 @@
src.menu_message += "Electromagnet Card (3)
"
src.menu_message += "Freedom Implant (with injector) (3)
"
src.menu_message += "Sleepy Pen (5)
"
+ src.menu_message += "Paralysis Pen (2)
"
src.menu_message += "Cloaking Device (4)
"
src.menu_message += "Energy Sword (4)
"
src.menu_message += "Plastic Explosives (4)
"
@@ -113,6 +114,10 @@
if (src.uses >= 5)
src.uses -= 5
new /obj/item/weapon/pen/sleepypen(get_turf(src.hostpda))
+ if("paralysispen")
+ if (src.uses >= 2)
+ src.uses -= 2
+ new /obj/item/device/flashlight/pen/paralysis(get_turf(src.hostpda))
if("projector")
if (src.uses >= 4)
src.uses -= 4
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8848afc6c92..1f48f9c2a02 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -171,6 +171,24 @@
if(M.reagents) reagents.trans_to(M, 50) //used to be 150
return
+/obj/item/device/flashlight/pen/paralysis/New()
+ var/datum/reagents/R = new/datum/reagents(15)
+ reagents = R
+ R.my_atom = src
+ R.add_reagent("zombiepowder", 15)
+ ..()
+ return
+
+/obj/item/device/flashlight/pen/paralysis/attack(mob/M as mob, mob/user as mob)
+ if (!( istype(M, /mob) ))
+ return
+ if (reagents.total_volume)
+ user << "\red You stab [M] with the penlight."
+ M << "\red You feel a tiny prick!"
+ if(M.reagents) reagents.trans_to(M, 15)
+ ..()
+ return
+
/obj/item/weapon/Bump(mob/M as mob)
spawn( 0 )
..()
diff --git a/code/game/research/circuitprinter.dm b/code/game/research/circuitprinter.dm
index 1f1f7a6f24e..75e8969f318 100644
--- a/code/game/research/circuitprinter.dm
+++ b/code/game/research/circuitprinter.dm
@@ -4,17 +4,14 @@ a /datum/desgin on the linked R&D console. You can then print them out in a fasi
using metal and glass, it uses glass and reagents (usually sulfuric acis).
*/
-/obj/machinery/circuit_imprinter
+/obj/machinery/r_n_d/circuit_imprinter
name = "Circuit Imprinter"
icon_state = "circuit_imprinter"
- density = 1
- anchored = 1
flags = OPENCONTAINER
var
g_amount = 0
const/max_g_amount = 75000.0
busy = 0
- obj/machinery/computer/rdconsole/linked_console = null //Linked R&D Console
New()
var/datum/reagents/R = new/datum/reagents(100) //Holder for the reagents used as materials.
diff --git a/code/game/research/designs.dm b/code/game/research/designs.dm
index 1cb267a3307..bca8b221a4e 100644
--- a/code/game/research/designs.dm
+++ b/code/game/research/designs.dm
@@ -13,14 +13,11 @@ The currently supporting non-reagent materials:
Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials.
-TODO:
-- Add a "has materials" type proc to... something...
-
*/
#define IMPRINTER 1 //For circuits.
#define PROTOLATHE 2 //For stuff with reliability issues.
#define AUTOLATHE 4 //For general use or 100% reliability items.
-//Note: More then one of these can be added to a design but it isn't suggested.
+//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
datum
design //Datum for object designs, used in construction
@@ -55,7 +52,6 @@ datum
desc = "Allows for the construction of circuit boards used to build security camera computers."
id = "seccamera"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/security"
@@ -65,7 +61,6 @@ datum
desc = "Allows for the construction of circuit boards used to build new AI cores."
id = "aicore"
req_tech = list("programming" = 5, "biotech" = 5)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/aicore"
@@ -75,7 +70,6 @@ datum
desc = "Allows for the construction of circuit boards used to build an AI Upload Console."
id = "aiupload"
req_tech = list("programming" = 5)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/aiupload"
@@ -85,7 +79,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a medical records console."
id = "med_data"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/med_data"
@@ -95,7 +88,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console."
id = "pandemic"
req_tech = list("programming" = 2, "biotech" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/pandemic"
@@ -105,7 +97,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a new DNA scanning console."
id = "scan_console"
req_tech = list("programming" = 2, "biotech" = 3)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/machinery/scan_consolenew"
@@ -115,7 +106,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a communications console."
id = "comconsole"
req_tech = list("programming" = 2, "magnets" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/communications"
@@ -125,7 +115,6 @@ datum
desc = "Allows for the construction of circuit boards used to build an ID computer."
id = "idcardconsole"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/card"
@@ -135,7 +124,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a teleporter control console."
id = "teleconsole"
req_tech = list("programming" = 3, "bluespace" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/teleporter"
@@ -145,7 +133,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a security records console."
id = "secdata"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/secure_data"
@@ -155,7 +142,6 @@ datum
desc = "Allows for the construction of circuit boards used to build an atmosphere alert console.."
id = "atmosalerts"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/atmosphere/alerts"
@@ -165,7 +151,6 @@ datum
desc = "Allows for the construction of circuit boards used to build an Atmospheric Monitor."
id = "air_management"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/general_air_control"
@@ -175,7 +160,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a General Alert console."
id = "general_alert"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/general_alert"
@@ -185,7 +169,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a Robotics Control console."
id = "robocontrol"
req_tech = list("programming" = 4)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/robotics"
@@ -195,7 +178,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console."
id = "clonecontrol"
req_tech = list("programming" = 3, "biotech" = 4)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/cloning"
@@ -205,7 +187,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a new arcade machine."
id = "arcademachine"
req_tech = list("programming" = 1)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/arcade"
@@ -215,7 +196,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a new power monitor"
id = "powermonitor"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/machinery/power/monitor"
@@ -225,7 +205,6 @@ datum
desc = "Allows for the construction of circuit boards used to build a prisoner management console."
id = "prisonmanage"
req_tech = list("programming" = 2)
- reliability = 100
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/prisoner"
diff --git a/code/game/research/destructive_analyzer.dm b/code/game/research/destructive_analyzer.dm
index fd59d90083b..76df05fe8da 100644
--- a/code/game/research/destructive_analyzer.dm
+++ b/code/game/research/destructive_analyzer.dm
@@ -5,13 +5,12 @@ It is used to destroy hand-held objects and advance technological research. Cont
Note: Must be placed east/right of an R&D console to function.
*/
-/obj/machinery/destructive_analyzer
+/obj/machinery/r_n_d/destructive_analyzer
name = "Destructive Analyzer"
icon_state = "d_analyzer"
- var/obj/item/weapon/loaded_item = null
- var/obj/machinery/computer/rdconsole/linked_console
- anchored = 1
- density = 1
+ var
+ obj/item/weapon/loaded_item = null
+ busy = 0
meteorhit()
del(src)
@@ -19,18 +18,24 @@ Note: Must be placed east/right of an R&D console to function.
attackby(var/obj/O as obj, var/mob/user as mob)
if (!linked_console)
- user << "\The protolathe must be linked to an R&D console first!"
+ user << "\red The protolathe must be linked to an R&D console first!"
+ return
+ if (busy)
+ user << "\red The protolathe is busy right now."
return
if (istype(O, /obj/item/weapon) && !loaded_item)
if (O.origin_tech.len == 0)
user << "\red You cannot deconstruct this item!"
return
+ busy = 1
loaded_item = O
user.drop_item()
O.loc = src
user << "\blue You add the [O.name] to the machine!"
- image('stationobjs.dmi', icon_state="d_analyzer_o")
-
+ flick("d_analyzer_la", src)
+ spawn(10)
+ icon_state = "d_analyzer_l"
+ busy = 0
return
//For testing purposes only.
diff --git a/code/game/research/protolathe.dm b/code/game/research/protolathe.dm
index 404627e66da..aec4390b852 100644
--- a/code/game/research/protolathe.dm
+++ b/code/game/research/protolathe.dm
@@ -7,63 +7,61 @@ it creates. All the menus and other manipulation commands are in the R&D console
Note: Must be placed west/left of and R&D console to function.
*/
-/obj/machinery/protolathe
+/obj/machinery/r_n_d/protolathe
name = "Protolathe"
- density = 1
- anchored = 1.0
icon_state = "protolathe"
- var/busy = 0 //
- var/max_m_amount = 150000.0
- var/max_g_amount = 75000.0
- var/m_amount = 0.0
- var/g_amount = 0.0
- var/obj/machinery/computer/rdconsole/linked_console = null
+ var
+ busy = 0 //
+ max_m_amount = 150000.0
+ max_g_amount = 75000.0
+ m_amount = 0.0
+ g_amount = 0.0
-/obj/machinery/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (!linked_console)
- user << "\The protolathe must be linked to an R&D console first!"
- return 1
- if (!istype(O, /obj/item/stack))
- user << "\red You cannot insert this item into the protolathe!"
- return 1
- if (stat)
- return 1
- if (busy)
- user << "\red The protolathe is busy. Please wait for completion of previous operation."
- return 1
- if (src.m_amount + O.m_amt > max_m_amount)
- user << "\red The protolathe is full. Please remove metal from the protolathe in order to insert more."
- return 1
- if (src.g_amount + O.g_amt > max_g_amount)
- user << "\red The protolathe is full. Please remove glass from the protolathe in order to insert more."
- return 1
- if (O.m_amt == 0 && O.g_amt == 0)
- user << "\red This object does not contain significant amounts of metal or glass, or cannot be accepted by the protolathe due to size or hazardous materials."
- return 1
+ attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (!linked_console)
+ user << "\The protolathe must be linked to an R&D console first!"
+ return 1
+ if (!istype(O, /obj/item/stack))
+ user << "\red You cannot insert this item into the protolathe!"
+ return 1
+ if (stat)
+ return 1
+ if (busy)
+ user << "\red The protolathe is busy. Please wait for completion of previous operation."
+ return 1
+ if (src.m_amount + O.m_amt > max_m_amount)
+ user << "\red The protolathe is full. Please remove metal from the protolathe in order to insert more."
+ return 1
+ if (src.g_amount + O.g_amt > max_g_amount)
+ user << "\red The protolathe is full. Please remove glass from the protolathe in order to insert more."
+ return 1
+ if (O.m_amt == 0 && O.g_amt == 0)
+ user << "\red This object does not contain significant amounts of metal or glass, or cannot be accepted by the protolathe due to size or hazardous materials."
+ return 1
- var/amount = 1
- var/obj/item/stack/stack
- var/m_amt = O.m_amt
- var/g_amt = O.g_amt
- stack = O
- amount = stack.amount
- if (m_amt)
- amount = min(amount, round((max_m_amount-src.m_amount)/m_amt))
- flick("protolathe_o",src)//plays metal insertion animation
- if (g_amt)
- amount = min(amount, round((max_g_amount-src.g_amount)/g_amt))
- flick("protolathe_r",src)//plays glass insertion animation
- stack.use(amount)
- icon_state = "protolathe"
- busy = 1
- use_power(max(1000, (m_amt+g_amt)*amount/10))
- spawn(16)
+ var/amount = 1
+ var/obj/item/stack/stack
+ var/m_amt = O.m_amt
+ var/g_amt = O.g_amt
+ stack = O
+ amount = stack.amount
+ if (m_amt)
+ amount = min(amount, round((max_m_amount-src.m_amount)/m_amt))
+ flick("protolathe_o",src)//plays metal insertion animation
+ if (g_amt)
+ amount = min(amount, round((max_g_amount-src.g_amount)/g_amt))
+ flick("protolathe_r",src)//plays glass insertion animation
+ stack.use(amount)
icon_state = "protolathe"
- flick("protolathe_o",src)
- src.m_amount += m_amt * amount
- src.g_amount += g_amt * amount
- if (O && O.loc == src)
- del(O)
- busy = 0
- src.updateUsrDialog()
- return
\ No newline at end of file
+ busy = 1
+ use_power(max(1000, (m_amt+g_amt)*amount/10))
+ spawn(16)
+ icon_state = "protolathe"
+ flick("protolathe_o",src)
+ src.m_amount += m_amt * amount
+ src.g_amount += g_amt * amount
+ if (O && O.loc == src)
+ del(O)
+ busy = 0
+ src.updateUsrDialog()
+ return
\ No newline at end of file
diff --git a/code/game/research/rdconsole.dm b/code/game/research/rdconsole.dm
index a3ec7e121b5..e7b45cc6ece 100644
--- a/code/game/research/rdconsole.dm
+++ b/code/game/research/rdconsole.dm
@@ -1,11 +1,39 @@
/*
Research and Development (R&D) Console
-This is the main work horse of the R&D system. It contains the menus/controls for the Destructive Analyzer and the Protolathe. It
-also contains the /datum/research holder with all the known/possible technology paths and device designs.
+This is the main work horse of the R&D system. It contains the menus/controls for the Destructive Analyzer, Protolathe, and Circuit
+imprinter. It also contains the /datum/research holder with all the known/possible technology paths and device designs.
+
+Basic use: When it first is created, it will attempt to link up to related devices within 3 squares. It'll only link up if they
+aren't already linked to another console. Any consoles it cannot link up with (either because all of a certain type are already
+linked or there aren't any in range), you'll just not have access to that menu. In the settings menu, there are menu options that
+allow a player to attempt to re-sync with nearby consoles. You can also force it to disconnect from a specific console.
+
+The imprinting and construction menus do NOT require toxins access to access but all the other menus do. However, if you leave it
+on a menu, nothing is to stop the person from using the options on that menu (although they won't be able to change to a different
+one). You can also lock the console on the settings menu if you're feeling paranoid and you don't want anyone messing with it who
+doesn't have toxins access.
+
+When a R&D console is destroyed or even partially disassembled, you lose all research data on it. However, there are two ways around
+this dire fate:
+- The easiest way is to go to the settings menu and select "Sync Database with Network." That causes it to upload (but not download)
+it's data to every other device in the game. Each console has a "disconnect from network" option that'll will cause data base sync
+operations to skip that console. This is useful if you want to make a "public" R&D console or, for example, give the engineers
+a circuit imprinter with certain designs on it and don't want it accidentally updating. The downside of this method is that you have
+to have physical access to the other console to send data back. Note: An R&D console is on CentCom so if a random griffan happens to
+cause a ton of data to be lost, an admin can go send it back.
+- The second method is with Technology Disks and Design Disks. Each of these disks can hold a single technology or design datum in
+it's entirety. You can then take the disk to any R&D console and upload it's data to it. This method is a lot more secure (since it
+won't update every console in existence) but it's more of a hassle to do. Also, the disks can be stolen.
*/
+/obj/machinery/r_n_d //All devices that link into the R&D console fall into thise type for easy identification.
+ name = "R&D Device"
+ density = 1
+ anchored = 1
+ var/obj/machinery/computer/rdconsole/linked_console
+
/obj/machinery/computer/rdconsole
name = "R&D Console"
icon_state = "rdcomp"
@@ -14,9 +42,9 @@ also contains the /datum/research holder with all the known/possible technology
obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk.
obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk.
- obj/machinery/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer
- obj/machinery/protolathe/linked_lathe = null //Linked Protolathe
- obj/machinery/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter
+ obj/machinery/r_n_d/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer
+ obj/machinery/r_n_d/protolathe/linked_lathe = null //Linked Protolathe
+ obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter
screen = 1.0 //Which screen is currently showing.
sync = 1 //Will it get updated when the R&D console does it's syncing process.
@@ -60,15 +88,21 @@ also contains the /datum/research holder with all the known/possible technology
return return_name
SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any).
- linked_destroy = null
- linked_destroy = locate(/obj/machinery/destructive_analyzer, get_step(src, EAST))
- if(linked_destroy) linked_destroy.linked_console = src
- linked_lathe = null
- linked_lathe = locate(/obj/machinery/protolathe, get_step(src, WEST))
- if(linked_lathe) linked_lathe.linked_console = src
- linked_imprinter = null
- linked_imprinter = locate(/obj/machinery/circuit_imprinter/, get_step(src, WEST))
- if(linked_imprinter) linked_imprinter.linked_console = src
+ for(var/obj/machinery/r_n_d/D in orange(3,src))
+ if(D.linked_console != null)
+ continue
+ if(istype(D, /obj/machinery/r_n_d/destructive_analyzer))
+ if(linked_destroy == null)
+ linked_destroy = D
+ D.linked_console = src
+ else if(istype(D, /obj/machinery/r_n_d/protolathe))
+ if(linked_lathe == null)
+ linked_lathe = D
+ D.linked_console = src
+ else if(istype(D, /obj/machinery/r_n_d/circuit_imprinter))
+ if(linked_imprinter == null)
+ linked_imprinter = D
+ D.linked_console = src
return
@@ -182,28 +216,39 @@ also contains the /datum/research holder with all the known/possible technology
screen = 1.4
else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer.
- linked_destroy.loaded_item:loc = src.loc
- linked_destroy.loaded_item = null
- screen = 2.1
+ if(linked_destroy.busy)
+ usr << "\red The destructive analyzer is busy at the moment."
+
+ else
+ linked_destroy.loaded_item:loc = linked_destroy.loc
+ linked_destroy.loaded_item = null
+ linked_destroy.icon_state = "d_analyzer"
+ screen = 2.1
else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder.
- var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel")
- if(choice == "Cancel") return
- screen = 0.1
- updateUsrDialog()
- flick("d_analyzer_n", linked_destroy)
- spawn(16)
- for(var/T in linked_destroy.loaded_item.origin_tech)
- files.UpdateTech(T, linked_destroy.loaded_item.origin_tech[T])
- if(linked_lathe) //Also sends salvaged materials to a linked autolateh, if any.
- linked_lathe.m_amount = min(linked_lathe.max_m_amount, (linked_lathe.m_amount + linked_destroy.loaded_item.m_amt))
- linked_lathe.g_amount = min(linked_lathe.max_g_amount, (linked_lathe.g_amount + linked_destroy.loaded_item.g_amt))
- linked_destroy.loaded_item = null
- for(var/I in contents)
- del(I)
- linked_destroy.overlays = null
- screen = 1.0
+ if(linked_destroy.busy)
+ usr << "\red The destructive analyzer is busy at the moment."
+
+ else
+ var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel")
+ linked_destroy.busy = 1
+ if(choice == "Cancel") return
+ screen = 0.1
updateUsrDialog()
+ flick("d_analyzer_process", linked_destroy)
+ spawn(24)
+ linked_destroy.busy = 0
+ for(var/T in linked_destroy.loaded_item.origin_tech)
+ files.UpdateTech(T, linked_destroy.loaded_item.origin_tech[T])
+ if(linked_lathe) //Also sends salvaged materials to a linked autolateh, if any.
+ linked_lathe.m_amount = min(linked_lathe.max_m_amount, (linked_lathe.m_amount + linked_destroy.loaded_item.m_amt))
+ linked_lathe.g_amount = min(linked_lathe.max_g_amount, (linked_lathe.g_amount + linked_destroy.loaded_item.g_amt))
+ linked_destroy.loaded_item = null
+ for(var/I in contents)
+ del(I)
+ linked_destroy.icon_state = "d_analyzer"
+ screen = 1.0
+ updateUsrDialog()
else if(href_list["lock"]) //Lock the console from use by anyone without tox access.
if(src.allowed(usr))
@@ -247,12 +292,12 @@ also contains the /datum/research holder with all the known/possible technology
if(linked_lathe.g_amount < 0)
linked_lathe.g_amount = 0
var/obj/new_item = new being_built.build_path(src)
- new_item.loc = src.loc
+ new_item.loc = linked_destroy.loc
linked_lathe.busy = 0
screen = 3.1
updateUsrDialog()
- else if(href_list["imprint"])
+ else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something.
linked_imprinter.busy = 1
screen = 0.4
updateUsrDialog()
@@ -277,17 +322,36 @@ also contains the /datum/research holder with all the known/possible technology
linked_imprinter.reagents.remove_reagent(I, being_built.materials[I])
power += being_built.materials[I]
var/obj/new_item = new being_built.build_path(src)
- new_item.loc = src.loc
+ new_item.loc = linked_destroy.loc
linked_imprinter.busy = 0
screen = 4.1
updateUsrDialog()
- else if(href_list["dispose"])
+ else if(href_list["dispose"]) //Causes the circuit imprinter to dispose of a single reagent (all of it)
linked_imprinter.reagents.del_reagent(href_list["dispose"])
- else if(href_list["disposeall"])
+ else if(href_list["disposeall"]) //Causes the circuit imprinter to dispose of all it's reagents.
linked_imprinter.reagents.clear_reagents()
+ else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with.
+ screen = 0.0
+ spawn(20)
+ SyncRDevices()
+ screen = 1.6
+ updateUsrDialog()
+
+ else if(href_list["disconnect"]) //The R&D console disconnects with a specific device.
+ switch(href_list["disconnect"])
+ if("destroy")
+ linked_destroy.linked_console = null
+ linked_destroy = null
+ if("lathe")
+ linked_lathe.linked_console = null
+ linked_lathe = null
+ if("imprinter")
+ linked_imprinter.linked_console = null
+ linked_imprinter = null
+
updateUsrDialog()
return
@@ -296,7 +360,6 @@ also contains the /datum/research holder with all the known/possible technology
return
user.machine = src
var/dat = ""
- SyncRDevices()
files.RefreshResearch()
switch(screen) //A quick check to make sure you get the right screen when a device is disconnected.
if(2 to 2.9)
@@ -409,9 +472,25 @@ also contains the /datum/research holder with all the known/possible technology
dat += "Sync Database with Network
"
if(sync) dat += "Disconnect from Research Network
"
else dat += "Connect to Research Network
"
+ dat += "Device Linkage Menu
"
dat += "Lock Console
"
dat += "