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 += "
Main Menu" + if(1.7) //R&D device linkage + dat += "R&D Console Device Linkage Menu:

" + dat += "Re-sync with Nearby Devices
" + dat += "Linked Devices:
" + if(!linked_destroy && !linked_lathe && !linked_imprinter) + dat += "No devices connected
" + else + if(linked_destroy) + dat += "* Destructive Analyzer (Disconnect)
" + if(linked_lathe) + dat += "* Protolathe (Disconnect)
" + if(linked_imprinter) + dat += "* Circuit Imprinter (Disconnect)
" + dat += "
Settings Menu" + dat += "Main Menu" ////////////////////DESTRUCTIVE ANALYZER SCREENS//////////////////////////// if(2.0) diff --git a/icons/misc/old_or_unused.dmi b/icons/misc/old_or_unused.dmi index 0d9e22b2b49..570c58f10c2 100644 Binary files a/icons/misc/old_or_unused.dmi and b/icons/misc/old_or_unused.dmi differ diff --git a/icons/obj/computer_frame.dmi b/icons/obj/computer_frame.dmi index 63ae70da2cb..e69de29bb2d 100644 Binary files a/icons/obj/computer_frame.dmi and b/icons/obj/computer_frame.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 359975785a3..7e64bf6bfd6 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index ddcef86474d..f73863a0961 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/maps/tgstation.2.0.0.dmm b/maps/tgstation.2.0.0.dmm index c2e34a933b9..813c3bc476a 100644 --- a/maps/tgstation.2.0.0.dmm +++ b/maps/tgstation.2.0.0.dmm @@ -5467,9 +5467,9 @@ "cbg" = (/obj/stool/chair{dir = 1},/turf/unsimulated/floor{tag = "icon-grimy"; icon_state = "grimy"},/area/centcom/creed) "cbh" = (/obj/machinery/computer/pod{id = "NTrasen"; name = "Hull Door Control"},/turf/unsimulated/floor{tag = "icon-grimy"; icon_state = "grimy"},/area/centcom/creed) "cbi" = (/obj/grille,/obj/window/reinforced/west{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced/west,/obj/window/reinforced/west{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom) -"cbj" = (/obj/machinery/protolathe,/turf/unsimulated/floor{tag = "icon-green (WEST)"; icon_state = "green"; dir = 8},/area/centcom) +"cbj" = (/obj/machinery/r_n_d/protolathe,/turf/unsimulated/floor{tag = "icon-green (WEST)"; icon_state = "green"; dir = 8},/area/centcom) "cbk" = (/obj/machinery/computer/rdconsole,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/centcom) -"cbl" = (/obj/machinery/destructive_analyzer,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/centcom) +"cbl" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/centcom) "cbm" = (/obj/machinery/shieldwallgen{attached = 1; locked = 1; pixel_y = 0},/turf/unsimulated/floor{tag = "icon-green (SOUTHEAST)"; icon_state = "green"; dir = 6},/area/centcom) "cbn" = (/obj/grille,/obj/window/reinforced/west{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/window/reinforced/west{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced/west{tag = "icon-rwindow"; icon_state = "rwindow"; dir = 2},/obj/window/reinforced{dir = 8; icon_state = "rwindow"; name = "tinted window"; opacity = 1; tag = "icon-rwindow (WEST)"},/turf/unsimulated/floor{name = "plating"},/area/centcom) "cbo" = (/obj/grille,/obj/window/reinforced/west,/obj/window/reinforced/west{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/window/reinforced/west{tag = "icon-rwindow"; icon_state = "rwindow"; dir = 2},/obj/window/reinforced/west{dir = 4; icon_state = "rwindow"; name = "tinted window"; opacity = 1; tag = "icon-rwindow (EAST)"},/turf/unsimulated/floor{name = "plating"},/area/centcom) @@ -5486,7 +5486,7 @@ "cbz" = (/obj/window/reinforced/east{dir = 5},/turf/unsimulated/floor{tag = "icon-grimy"; icon_state = "grimy"},/area/centcom/creed) "cbA" = (/obj/item/weapon/secstorage/ssafe{pixel_x = 4; pixel_y = -25},/turf/unsimulated/floor{tag = "icon-grimy"; icon_state = "grimy"},/area/centcom/creed) "cbB" = (/obj/grille,/obj/window/reinforced/west{tag = "icon-rwindow"; icon_state = "rwindow"; dir = 2},/obj/window/reinforced/west{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced/west,/turf/unsimulated/floor{name = "plating"},/area/centcom) -"cbC" = (/obj/machinery/circuit_imprinter,/turf/unsimulated/floor{tag = "icon-green (SOUTHWEST)"; icon_state = "green"; dir = 10},/area/centcom) +"cbC" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/unsimulated/floor{tag = "icon-green (SOUTHWEST)"; icon_state = "green"; dir = 10},/area/centcom) "cbD" = (/obj/machinery/computer/rdconsole,/turf/unsimulated/floor{tag = "icon-green"; icon_state = "green"},/area/centcom) "cbE" = (/turf/unsimulated/floor{tag = "icon-green (NORTHEAST)"; icon_state = "green"; dir = 5},/area/centcom) "cbF" = (/obj/secure_closet/engineering_electrical,/turf/unsimulated/floor{tag = "icon-green (SOUTHWEST)"; icon_state = "green"; dir = 10},/area/centcom) diff --git a/tgstation.dme b/tgstation.dme index 833c964582b..47cb2c7e719 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -352,6 +352,7 @@ #include "code\game\machinery\blender.dm" #include "code\game\machinery\camera.dm" #include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\cryo.dm" #include "code\game\machinery\deployable.dm" #include "code\game\machinery\dispenser.dm"