From 59edf2701dc1fc217fc9ea2c308981e209a49c48 Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 18 Nov 2014 20:36:40 +0100 Subject: [PATCH] Makes SMES'es and Vending Machines constructable and upgradeable, gives borgs recorders --- code/datums/supplypacks.dm | 9 +- code/game/machinery/constructable_frame.dm | 252 ++++++++++-------- code/game/machinery/machinery.dm | 8 +- code/game/machinery/vending.dm | 133 ++++++--- .../objects/items/weapons/vending_items.dm | 29 +- .../mob/living/silicon/robot/robot_modules.dm | 2 + code/modules/power/smes.dm | 170 +++++++++++- code/modules/research/designs.dm | 28 +- icons/obj/power.dmi | Bin 21791 -> 22790 bytes maps/cyberiad.dmm | 2 +- maps/cyberiad.dmm.backup | 2 +- 11 files changed, 458 insertions(+), 177 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 75b84527e28..2d6af1550df 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1051,6 +1051,10 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/vending name = "Bartending Supply Crate" contains = list(/obj/item/weapon/vending_refill/boozeomat, + /obj/item/weapon/vending_refill/boozeomat, + /obj/item/weapon/vending_refill/boozeomat, + /obj/item/weapon/vending_refill/coffee, + /obj/item/weapon/vending_refill/coffee, /obj/item/weapon/vending_refill/coffee) cost = 15 containertype = /obj/structure/closet/crate @@ -1070,6 +1074,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/vending/cola name = "Softdrinks Supply Crate" contains = list(/obj/item/weapon/vending_refill/cola, + /obj/item/weapon/vending_refill/cola, /obj/item/weapon/vending_refill/cola) cost = 15 containertype = /obj/structure/closet/crate @@ -1078,7 +1083,9 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/vending/cigarette name = "Cigarette Supply Crate" - contains = list(/obj/item/weapon/vending_refill/cigarette) + contains = list(/obj/item/weapon/vending_refill/cigarette, + /obj/item/weapon/vending_refill/cigarette, + /obj/item/weapon/vending_refill/cigarette) cost = 15 containertype = /obj/structure/closet/crate containername = "cigarette supply crate" diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index c80bd4e8a85..52725ba63f8 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -22,7 +22,7 @@ req_component_names = new() for(var/tname in req_components) - var/path = text2path(tname) + var/path = tname var/obj/O = new path() req_component_names[tname] = O.name @@ -136,7 +136,7 @@ if(istype(P, /obj/item)) var/success for(var/I in req_components) - if(istype(P, text2path(I)) && (req_components[I] > 0)) + if(istype(P, I) && (req_components[I] > 0)) success=1 playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(istype(P, /obj/item/stack/cable_coil)) @@ -166,17 +166,57 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. 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/vendor + name = "circuit board (Booze-O-Mat Vendor)" + build_path = /obj/machinery/vending/boozeomat + board_type = "machine" + origin_tech = "programming=1" + frame_desc = "Requires 3 Resupply Canisters." + req_components = list( + /obj/item/weapon/vending_refill/boozeomat = 3) + + var/list/names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat", + /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", + /obj/machinery/vending/snack = "Getmore Chocolate Corp", + /obj/machinery/vending/cola = "Robust Softdrinks", + /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", + /obj/machinery/vending/autodrobe = "AutoDrobe") + +/obj/item/weapon/circuitboard/vendor/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/screwdriver)) + set_type(pick(names_paths), user) + + +/obj/item/weapon/circuitboard/vendor/proc/set_type(typepath, mob/user) + build_path = typepath + name = "circuit board ([names_paths[build_path]] Vendor)" + user << "You set the board to [names_paths[build_path]]." + req_components = list(text2path("/obj/item/weapon/vending_refill/[copytext("[build_path]", 24)]") = 3) + +/obj/item/weapon/circuitboard/smes + name = "circuit board (SMES)" + build_path = /obj/machinery/power/smes + board_type = "machine" + origin_tech = "programming=4;powerstorage=5;engineering=5" + frame_desc = "Requires 5 pieces of cable, 5 Power Cells and 1 Capacitor." + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/cell = 5, + /obj/item/weapon/stock_parts/capacitor = 1) + + /obj/item/weapon/circuitboard/thermomachine name = "circuit board (Freezer)" desc = "Use screwdriver to switch between heating and cooling modes." build_path = /obj/machinery/atmospherics/unary/cold_sink/freezer board_type = "machine" origin_tech = "programming=3;plasmatech=3" + frame_desc = "Requires 2 Matter Bins, 2 Micro Lasers, 1 piece of cable and 1 Console Screen." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 2, - "/obj/item/weapon/stock_parts/micro_laser" = 2, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/micro_laser = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/thermomachine/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/screwdriver)) @@ -196,10 +236,10 @@ to destroy them and players will be able to make replacements. origin_tech = "programming=3;biotech=2;materials=3" frame_desc = "Requires 1 Matter Bin, 1 Manipulator, 1 piece of cable and 1 Console Screen." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/hydroponics name = "circuit board (Hydroponics Tray)" @@ -208,8 +248,8 @@ to destroy them and players will be able to make replacements. origin_tech = "programming=1;biotech=1" frame_desc = "Requires 2 Matter Bins and 1 Console Screen." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 2, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/microwave name = "circuit board (Microwave)" @@ -218,9 +258,9 @@ to destroy them and players will be able to make replacements. origin_tech = "programming=1" frame_desc = "Requires 1 Micro Laser, 1 piece of cable and 1 Console Screen." req_components = list( - "/obj/item/weapon/stock_parts/micro_laser" = 1, - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/chem_dispenser name = "circuit board (Portable Chem Dispenser)" @@ -229,11 +269,11 @@ to destroy them and players will be able to make replacements. origin_tech = "materials=4;engineering=4;programming=4;plasmatech=3;biotech=3" frame_desc = "Requires 1 Matter Bin, 1 Capacitor, 1 Manipulator, 1 Console Screen, and 1 Power Cell." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 2, - "/obj/item/weapon/stock_parts/capacitor" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1, - "/obj/item/weapon/cell" = 1) + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/cell = 1) /obj/item/weapon/circuitboard/destructive_analyzer name = "Circuit board (Destructive Analyzer)" @@ -242,9 +282,9 @@ to destroy them and players will be able to make replacements. origin_tech = "magnets=2;engineering=2;programming=2" frame_desc = "Requires 1 Scanning Module, 1 Manipulator, and 1 Micro-Laser." req_components = list( - "/obj/item/weapon/stock_parts/scanning_module" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/weapon/stock_parts/micro_laser" = 1) + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1) /obj/item/weapon/circuitboard/autolathe name = "Circuit board (Autolathe)" @@ -253,9 +293,9 @@ to destroy them and players will be able to make replacements. origin_tech = "engineering=2;programming=2" frame_desc = "Requires 3 Matter Bins, 1 Manipulator, and 1 Console Screen." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 3, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/weapon/stock_parts/matter_bin = 3, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/protolathe name = "Circuit board (Protolathe)" @@ -264,9 +304,9 @@ to destroy them and players will be able to make replacements. origin_tech = "engineering=2;programming=2" frame_desc = "Requires 2 Matter Bins, 2 Manipulators, and 2 Beakers." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 2, - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/weapon/reagent_containers/glass/beaker" = 2) + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/reagent_containers/glass/beaker = 2) /obj/item/weapon/circuitboard/circuit_imprinter @@ -276,9 +316,9 @@ to destroy them and players will be able to make replacements. origin_tech = "engineering=2;programming=2" frame_desc = "Requires 1 Matter Bin, 1 Manipulator, and 2 Beakers." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/weapon/reagent_containers/glass/beaker" = 2) + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/reagent_containers/glass/beaker = 2) /obj/item/weapon/circuitboard/pacman name = "Circuit Board (PACMAN-type Generator)" @@ -287,10 +327,10 @@ to destroy them and players will be able to make replacements. origin_tech = "programming=3:powerstorage=3;plasmatech=3;engineering=3" frame_desc = "Requires 1 Matter Bin, 1 Micro-Laser, 2 Pieces of Cable, and 1 Capacitor." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 1, - "/obj/item/weapon/stock_parts/micro_laser" = 1, - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/capacitor" = 1) + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/capacitor = 1) /obj/item/weapon/circuitboard/pacman/super name = "Circuit Board (SUPERPACMAN-type Generator)" @@ -309,8 +349,8 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3" frame_desc = "Requires 2 pieces of cable, and 1 Scanning Module." req_components = list( - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/scanning_module" = 1) + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/scanning_module = 1) /obj/item/weapon/circuitboard/mechfab name = "Circuit board (Exosuit Fabricator)" @@ -319,10 +359,10 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;engineering=3" frame_desc = "Requires 2 Matter Bins, 1 Manipulator, 1 Micro-Laser and 1 Console Screen." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 2, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/weapon/stock_parts/micro_laser" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/clonepod name = "Circuit board (Clone Pod)" @@ -331,10 +371,10 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;biotech=3" frame_desc = "Requires 2 Manipulator, 2 Scanning Module, 2 pieces of cable and 1 Console Screen." req_components = list( - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/scanning_module" = 2, - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/scanning_module = 2, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/clonescanner name = "Circuit board (Cloning Scanner)" @@ -343,11 +383,11 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=2;biotech=2" frame_desc = "Requires 1 Scanning Module, 1 Manipulator, 1 Micro-Laser, 2 pieces of cable and 1 Console Screen." req_components = list( - "/obj/item/weapon/stock_parts/scanning_module" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/weapon/stock_parts/micro_laser" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1, - "/obj/item/stack/cable_coil" = 2,) + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/stack/cable_coil = 2,) /obj/item/weapon/circuitboard/mech_recharger name = "circuit board (Mech Bay Recharger)" @@ -356,8 +396,8 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;powerstorage=4;engineering=4" frame_desc = "Requires 1 piece of cable and 5 Capacitors." req_components = list( - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/capacitor" = 5) + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/capacitor = 5) /obj/item/weapon/circuitboard/teleporter_hub name = "circuit board (Teleporter Hub)" @@ -366,8 +406,8 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;engineering=5;bluespace=5;materials=4" frame_desc = "Requires 3 Bluespace Crystals and 1 Matter Bin." req_components = list( - "/obj/item/bluespace_crystal" = 3, - "/obj/item/weapon/stock_parts/matter_bin" = 1) + /obj/item/bluespace_crystal = 3, + /obj/item/weapon/stock_parts/matter_bin = 1) /obj/item/weapon/circuitboard/teleporter_station name = "circuit board (Teleporter Station)" @@ -376,9 +416,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=4;bluespace=4" frame_desc = "Requires 2 Bluespace Crystals, 2 Capacitors and 1 Console Screen." req_components = list( - "/obj/item/bluespace_crystal" = 2, - "/obj/item/weapon/stock_parts/capacitor" = 2, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/bluespace_crystal = 2, + /obj/item/weapon/stock_parts/capacitor = 2, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/telesci_pad name = "Circuit board (Telepad)" @@ -387,10 +427,10 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=3;materials=3;bluespace=4" frame_desc = "Requires 2 Bluespace Crystals, 1 Capacitor, 1 piece of cable and 1 Console Screen." req_components = list( - "/obj/item/bluespace_crystal" = 2, - "/obj/item/weapon/stock_parts/capacitor" = 1, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1) + /obj/item/bluespace_crystal = 2, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 1) /obj/item/weapon/circuitboard/sleeper @@ -400,10 +440,10 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;biotech=2;engineering=3;materials=3" frame_desc = "Requires 1 Matter Bin, 1 Manipulator, 1 piece of cable and 2 Console Screens." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 1, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 2) + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 2) /obj/item/weapon/circuitboard/sleep_console name = "circuit board (Sleeper Console)" @@ -412,8 +452,8 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;biotech=2;engineering=3;materials=3" frame_desc = "Requires 2 pieces of cable and 2 Console Screens." req_components = list( - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/console_screen" = 2) + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/console_screen = 2) /obj/item/weapon/circuitboard/bodyscanner name = "circuit board (Body Scanner)" @@ -422,9 +462,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;biotech=2;engineering=3;materials=3" frame_desc = "Requires 1 Scanning Module, 2 pieces of cable and 2 Console Screens." req_components = list( - "/obj/item/weapon/stock_parts/scanning_module" = 1, - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/console_screen" = 2) + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/console_screen = 2) /obj/item/weapon/circuitboard/bodyscanner_console name = "circuit board (Body Scanner Console)" @@ -433,8 +473,8 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;biotech=2;engineering=3;materials=3" frame_desc = "Requires 2 pieces of cable and 2 Console Screens." req_components = list( - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/console_screen" = 2) + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/console_screen = 2) /obj/item/weapon/circuitboard/cryo_tube name = "circuit board (Cryotube)" @@ -443,9 +483,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;biotech=3;engineering=4" frame_desc = "Requires 1 Matter Bin, 1 piece of cable and 4 Console Screens." req_components = list( - "/obj/item/weapon/stock_parts/matter_bin" = 1, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 4) + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 4) /obj/item/weapon/circuitboard/cyborgrecharger name = "circuit board (Cyborg Recharger)" @@ -454,9 +494,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "powerstorage=3;engineering=3" frame_desc = "Requires 2 Capacitors, 1 Power Cell and 1 Manipulator." req_components = list( - "/obj/item/weapon/stock_parts/capacitor" = 2, - "/obj/item/weapon/cell" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 1) + /obj/item/weapon/stock_parts/capacitor = 2, + /obj/item/weapon/cell = 1, + /obj/item/weapon/stock_parts/manipulator = 1) // Telecomms circuit boards: /obj/item/weapon/circuitboard/telecomms/receiver @@ -466,10 +506,10 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=3;bluespace=2" frame_desc = "Requires 1 Subspace Ansible, 1 Hyperwave Filter, 2 Manipulators, and 1 Micro-Laser." req_components = list( - "/obj/item/weapon/stock_parts/subspace/ansible" = 1, - "/obj/item/weapon/stock_parts/subspace/filter" = 1, - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/weapon/stock_parts/micro_laser" = 1) + /obj/item/weapon/stock_parts/subspace/ansible = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/micro_laser = 1) /obj/item/weapon/circuitboard/telecomms/hub name = "Circuit Board (Hub Mainframe)" @@ -478,9 +518,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=4" frame_desc = "Requires 2 Manipulators, 2 Cable Coil and 2 Hyperwave Filter." req_components = list( - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/subspace/filter" = 2) + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/filter = 2) /obj/item/weapon/circuitboard/telecomms/relay name = "Circuit Board (Relay Mainframe)" @@ -489,9 +529,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=3;engineering=4;bluespace=3" frame_desc = "Requires 2 Manipulators, 2 Cable Coil and 2 Hyperwave Filters." req_components = list( - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/subspace/filter" = 2) + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/filter = 2) /obj/item/weapon/circuitboard/telecomms/bus name = "Circuit Board (Bus Mainframe)" @@ -500,9 +540,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=4" frame_desc = "Requires 2 Manipulators, 1 Cable Coil and 1 Hyperwave Filter." req_components = list( - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/subspace/filter" = 1) + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1) /obj/item/weapon/circuitboard/telecomms/processor name = "Circuit Board (Processor Unit)" @@ -511,12 +551,12 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=4" frame_desc = "Requires 3 Manipulators, 1 Hyperwave Filter, 2 Treatment Disks, 1 Wavelength Analyzer, 2 Cable Coils and 1 Subspace Amplifier." req_components = list( - "/obj/item/weapon/stock_parts/manipulator" = 3, - "/obj/item/weapon/stock_parts/subspace/filter" = 1, - "/obj/item/weapon/stock_parts/subspace/treatment" = 2, - "/obj/item/weapon/stock_parts/subspace/analyzer" = 1, - "/obj/item/stack/cable_coil" = 2, - "/obj/item/weapon/stock_parts/subspace/amplifier" = 1) + /obj/item/weapon/stock_parts/manipulator = 3, + /obj/item/weapon/stock_parts/subspace/filter = 1, + /obj/item/weapon/stock_parts/subspace/treatment = 2, + /obj/item/weapon/stock_parts/subspace/analyzer = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/amplifier = 1) /obj/item/weapon/circuitboard/telecomms/server name = "Circuit Board (Telecommunication Server)" @@ -525,9 +565,9 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=4" frame_desc = "Requires 2 Manipulators, 1 Cable Coil and 1 Hyperwave Filter." req_components = list( - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/subspace/filter" = 1) + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1) /obj/item/weapon/circuitboard/telecomms/broadcaster name = "Circuit Board (Subspace Broadcaster)" @@ -536,8 +576,8 @@ obj/item/weapon/circuitboard/rdserver origin_tech = "programming=4;engineering=4;bluespace=2" frame_desc = "Requires 2 Manipulators, 1 Cable Coil, 1 Hyperwave Filter, 1 Ansible Crystal and 2 High-Powered Micro-Lasers. " req_components = list( - "/obj/item/weapon/stock_parts/manipulator" = 2, - "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/subspace/filter" = 1, - "/obj/item/weapon/stock_parts/subspace/crystal" = 1, - "/obj/item/weapon/stock_parts/micro_laser/high" = 2) \ No newline at end of file + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1, + /obj/item/weapon/stock_parts/subspace/crystal = 1, + /obj/item/weapon/stock_parts/micro_laser/high = 2) \ No newline at end of file diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 77dbbce7d36..efa941c4c69 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -336,8 +336,8 @@ Class Procs: var/P for(var/obj/item/weapon/stock_parts/A in component_parts) for(var/D in CB.req_components) - if(ispath(A.type, text2path(D))) - P = text2path(D) + if(ispath(A.type, D)) + P = D break for(var/obj/item/weapon/stock_parts/B in W.contents) if(istype(B, P) && istype(A, P)) @@ -353,8 +353,8 @@ Class Procs: // Power cell snowflake for(var/obj/item/weapon/cell/A in component_parts) for(var/D in CB.req_components) - if(ispath(A.type, text2path(D))) - P = text2path(D) + if(ispath(A.type, D)) + P = D break for(var/obj/item/weapon/cell/B in W.contents) if(istype(B, P) && istype(A, P)) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d9cc65c0176..8d0ca71ef03 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -57,7 +57,6 @@ var/obj/item/weapon/coin/coin var/datum/wires/vending/wires = null - /obj/machinery/vending/New() ..() wires = new(src) @@ -82,7 +81,13 @@ return - +/obj/machinery/vending/Destroy() + del(wires) + wires = null + del(coin) + coin = null + ..() + /obj/machinery/vending/ex_act(severity) switch(severity) if(1.0) @@ -96,7 +101,14 @@ if(prob(25)) malfunction() - +/obj/machinery/vending/RefreshParts() //Better would be to make constructable child + if(component_parts) + build_inventory(products, start_empty = 1) + build_inventory(contraband, 1, 1) + build_inventory(premium, 0, 1, 1) + for(var/obj/item/weapon/vending_refill/VR in component_parts) + refill_inventory(VR, product_records) + /obj/machinery/vending/blob_act() if(prob(75)) malfunction() @@ -104,7 +116,7 @@ del(src) -/obj/machinery/vending/proc/build_inventory(var/list/productlist,hidden=0,req_coin=0) +/obj/machinery/vending/proc/build_inventory(var/list/productlist,hidden=0,req_coin=0,start_empty = null) for(var/typepath in productlist) var/amount = productlist[typepath] var/price = prices[typepath] @@ -114,7 +126,8 @@ var/datum/data/vending_product/R = new /datum/data/vending_product() R.product_path = typepath - R.amount = amount + if(!start_empty) + R.amount = amount R.max_amount = amount R.price = price R.display_color = pick("red","blue","green") @@ -166,13 +179,28 @@ break return total - /obj/machinery/vending/attackby(obj/item/weapon/W, mob/user) + if(panel_open) + if(default_unfasten_wrench(user, W, time = 60)) + return + + if(component_parts && istype(W, /obj/item/weapon/crowbar)) + var/datum/data/vending_product/machine = product_records + for(var/datum/data/vending_product/machine_content in machine) + while(machine_content.amount !=0) + for(var/obj/item/weapon/vending_refill/VR in component_parts) + VR.charges++ + machine_content.amount-- + if(!machine_content.amount) + break + default_deconstruction_crowbar(W) + if(istype(W, /obj/item/weapon/card/emag)) emagged = 1 user << "You short out the product lock on [src]" return - else if(istype(W, /obj/item/weapon/screwdriver)) + else if(istype(W, /obj/item/weapon/screwdriver) && anchored) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open user << "You [panel_open ? "open" : "close"] the maintenance panel." overlays.Cut() @@ -184,36 +212,15 @@ if(panel_open) attack_hand(user) return + else if(istype(W, /obj/item/weapon/card) && currently_vending) + var/obj/item/weapon/card/I = W + scan_card(I) else if(istype(W, /obj/item/weapon/coin) && premium.len > 0) user.drop_item() W.loc = src coin = W user << "You insert [W] into [src]." return - - else if(istype(W, /obj/item/weapon/wrench)) - - if(do_after(user, 20)) - if(!src) return - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - switch (anchored) - if (0) - anchored = 1 - user.visible_message("[user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") - if (1) - user.visible_message("[user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") - anchored = 0 - return - - else if(src.panel_open) - for(var/datum/data/vending_product/R in product_records) - if(istype(W, R.product_path)) - stock(R, user) - del(W) - - else if(istype(W, /obj/item/weapon/card) && currently_vending) - var/obj/item/weapon/card/I = W - scan_card(I) else if(istype(W, refill_canister) && refill_canister != null) if(stat & (BROKEN|NOPOWER)) user << "It does nothing." @@ -234,6 +241,8 @@ else ..() + + /obj/machinery/vending/proc/scan_card(var/obj/item/weapon/card/I) if(!currently_vending) return if (istype(I, /obj/item/weapon/card/id)) @@ -661,6 +670,16 @@ contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2) product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" +/obj/machinery/vending/boozeomat/New() + ..() + component_parts = list() + var/obj/item/weapon/circuitboard/vendor/V = new(null) + V.set_type(type) + component_parts += V + component_parts += new /obj/item/weapon/vending_refill/boozeomat(0) + component_parts += new /obj/item/weapon/vending_refill/boozeomat(0) + component_parts += new /obj/item/weapon/vending_refill/boozeomat(0) + /obj/machinery/vending/coffee name = "Hot Drinks machine" desc = "A vending machine which dispenses hot drinks." @@ -673,7 +692,15 @@ prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25, /obj/item/weapon/reagent_containers/food/drinks/tea = 25, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25) refill_canister = /obj/item/weapon/vending_refill/coffee - +/obj/machinery/vending/coffee/New() + ..() + component_parts = list() + var/obj/item/weapon/circuitboard/vendor/V = new(null) + V.set_type(type) + component_parts += V + component_parts += new /obj/item/weapon/vending_refill/coffee(0) + component_parts += new /obj/item/weapon/vending_refill/coffee(0) + component_parts += new /obj/item/weapon/vending_refill/coffee(0) /obj/machinery/vending/snack name = "Getmore Chocolate Corp" @@ -699,6 +726,16 @@ prices = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 50, /obj/item/weapon/reagent_containers/food/snacks/wingfangchu = 50) +/obj/machinery/vending/snack/New() + ..() + component_parts = list() + var/obj/item/weapon/circuitboard/vendor/V = new(null) + V.set_type(type) + component_parts += V + component_parts += new /obj/item/weapon/vending_refill/snack(0) + component_parts += new /obj/item/weapon/vending_refill/snack(0) + component_parts += new /obj/item/weapon/vending_refill/snack(0) + /obj/machinery/vending/cola name = "Robust Softdrinks" desc = "A softdrink vendor provided by Robust Industries, LLC." @@ -724,7 +761,16 @@ /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/device/pda/heads = 10, /obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10) - +/obj/machinery/vending/cola/New() + ..() + component_parts = list() + var/obj/item/weapon/circuitboard/vendor/V = new(null) + V.set_type(type) + component_parts += V + component_parts += new /obj/item/weapon/vending_refill/cola(0) + component_parts += new /obj/item/weapon/vending_refill/cola(0) + component_parts += new /obj/item/weapon/vending_refill/cola(0) + /obj/machinery/vending/cigarette name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating desc = "If you want to get cancer, might as well do it in style" @@ -738,6 +784,16 @@ prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60, /obj/item/weapon/rollingpaperpack = 20) refill_canister = /obj/item/weapon/vending_refill/cigarette +/obj/machinery/vending/cigarette/New() + ..() + component_parts = list() + var/obj/item/weapon/circuitboard/vendor/V = new(null) + V.set_type(type) + component_parts += V + component_parts += new /obj/item/weapon/vending_refill/cigarette(0) + component_parts += new /obj/item/weapon/vending_refill/cigarette(0) + component_parts += new /obj/item/weapon/vending_refill/cigarette(0) + /obj/machinery/vending/medical name = "NanoMed Plus" desc = "Medical drug dispenser." @@ -864,6 +920,17 @@ contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1,/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1) premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1) refill_canister = /obj/item/weapon/vending_refill/autodrobe + +/obj/machinery/vending/cigarette/New() + ..() + component_parts = list() + var/obj/item/weapon/circuitboard/vendor/V = new(null) + V.set_type(type) + component_parts += V + component_parts += new /obj/item/weapon/vending_refill/cigarette(0) + component_parts += new /obj/item/weapon/vending_refill/cigarette(0) + component_parts += new /obj/item/weapon/vending_refill/cigarette(0) + /obj/machinery/vending/dinnerware name = "Dinnerware" desc = "A kitchen and restaurant equipment vendor" diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 3f44e648641..3877094138f 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -1,58 +1,59 @@ /obj/item/weapon/vending_refill - name = "Resupply canister" + name = "resupply canister" var/machine_name = "Generic" icon = 'icons/obj/vending_restock.dmi' icon_state = "refill_snack" item_state = "restock_unit" - flags = FPRINT | TABLEPASS| CONDUCT + flags = CONDUCT force = 7.0 - throwforce = 15.0 + throwforce = 10.0 throw_speed = 1 throw_range = 7 w_class = 4.0 var/charges = 0 //how many restocking "charges" the refill has -/obj/item/weapon/vending_refill/New() +/obj/item/weapon/vending_refill/New(amt = -1) ..() name = "\improper [machine_name] restocking unit" + if(isnum(amt) && amt > -1) + charges = amt -/obj/item/weapon/vending_refill/examine() - set src in usr +/obj/item/weapon/vending_refill/examine(mob/user) ..() if(charges) - usr << "It can restock [charges] item(s)." + user << "It can restock [charges] item(s)." else - usr << "It's empty!" + user << "It's empty!" //NOTE I decided to go for about 1/3 of a machine's capacity /obj/item/weapon/vending_refill/boozeomat machine_name = "Booze-O-Mat" icon_state = "refill_booze" - charges = 50//of 138 + charges = 46//of 138 /obj/item/weapon/vending_refill/coffee machine_name = "hot drinks" icon_state = "refill_joe" - charges = 30//of 85 + charges = 28//of 85 /obj/item/weapon/vending_refill/snack machine_name = "Getmore Chocolate Corp" - charges = 15//of 48 + charges = 16//of 48 /obj/item/weapon/vending_refill/cola machine_name = "Robust Softdrinks" icon_state = "refill_cola" - charges = 20//of 65 + charges = 21//of 65 /obj/item/weapon/vending_refill/cigarette machine_name = "cigarette" icon_state = "refill_smoke" - charges = 10// of 30 + charges = 9// of 30 /obj/item/weapon/vending_refill/autodrobe machine_name = "AutoDrobe" icon_state = "refill_costume" - charges = 28// of 58 + charges = 19// of 58 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 86f7bcc6881..69d5bde666b 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -235,6 +235,7 @@ src.modules += new /obj/item/weapon/melee/baton/robot(src) src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src) src.modules += new /obj/item/taperoll/police(src) + src.modules += new /obj/item/device/taperecorder(src) src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) return @@ -299,6 +300,7 @@ src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/pen/robopen(src) src.modules += new /obj/item/weapon/form_printer(src) + src.modules += new /obj/item/device/taperecorder(src) src.modules += new /obj/item/weapon/gripper/paperwork(src) src.emag = new /obj/item/weapon/stamp/denied(src) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 08b68f1156f..acc6311632c 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -22,6 +22,8 @@ var/chargemode = 0 var/chargecount = 0 var/chargelevel = 50000 + var/input_level_max = 200000 // cap on input_level + var/output_level_max = 200000 // cap on output_level var/online = 1 var/name_tag = null var/obj/machinery/power/terminal/terminal = null @@ -29,6 +31,16 @@ /obj/machinery/power/smes/New() ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/smes(null) + component_parts += new /obj/item/weapon/cell/high(null) + component_parts += new /obj/item/weapon/cell/high(null) + component_parts += new /obj/item/weapon/cell/high(null) + component_parts += new /obj/item/weapon/cell/high(null) + component_parts += new /obj/item/weapon/cell/high(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + component_parts += new /obj/item/stack/cable_coil(null, 5) + RefreshParts() spawn(5) if(!powernet) connect_to_network() @@ -49,7 +61,17 @@ updateicon() return - +/obj/machinery/power/smes/RefreshParts() + var/IO = 0 + var/C = 0 + for(var/obj/item/weapon/stock_parts/capacitor/CP in component_parts) + IO += CP.rating + input_level_max = 200000 * IO + output_level_max = 200000 * IO + for(var/obj/item/weapon/cell/PC in component_parts) + C += PC.maxcharge + capacity = C / (15000) * 1e6 + /obj/machinery/power/smes/proc/updateicon() overlays.Cut() if(stat & BROKEN) return @@ -85,15 +107,139 @@ return +/obj/machinery/power/smes/attackby(obj/item/I, mob/user) + //opening using screwdriver + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) + update_icon() + return + + //changing direction using wrench + if(default_change_direction_wrench(user, I)) + terminal = null + var/turf/T = get_step(src, dir) + for(var/obj/machinery/power/terminal/term in T) + if(term && term.dir == turn(dir, 180)) + terminal = term + terminal.master = src + user << "Terminal found." + break + if(!terminal) + user << "No power source found." + return + stat &= ~BROKEN + update_icon() + return + + //exchanging parts using the RPE + if(exchange_parts(user, I)) + return + + //building and linking a terminal + if(istype(I, /obj/item/stack/cable_coil)) + var/dir = get_dir(user,src) + if(dir & (dir-1))//we don't want diagonal click + return + + if(terminal) //is there already a terminal ? + user << "This SMES already have a power terminal!" + return + + if(!panel_open) //is the panel open ? + user << "You must open the maintenance panel first!" + return + + var/turf/T = get_turf(user) + if (T.intact) //is the floor plating removed ? + user << "You must first remove the floor plating!" + return + + + var/obj/item/stack/cable_coil/C = I + if(C.amount < 10) + user << "You need more wires." + return + + user << "You start building the power terminal..." + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + + if(do_after(user, 20) && C.amount >= 10) + var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one + if (prob(50) && electrocute_mob(usr, N, N)) //animate the electrocution if uncautious and unlucky + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return + + C.use(10) + user.visible_message(\ + "[user.name] has built a power terminal!",\ + "You build the power terminal.") + + //build the terminal and link it to the network + make_terminal(T) + terminal.connect_to_network() + return + + //disassembling the terminal + if(istype(I, /obj/item/weapon/wirecutters) && terminal && panel_open) + var/turf/T = get_turf(terminal) + if (T.intact) //is the floor plating removed ? + user << "You must first expose the power terminal!" + return + + user << "You begin to dismantle the power terminal..." + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + + if(do_after(user, 50)) + if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return + + //give the wires back and delete the terminal + new /obj/item/stack/cable_coil(T,10) + user.visible_message(\ + "[user.name] cuts the cables and dismantles the power terminal.",\ + "You cut the cables and dismantle the power terminal.") + charging = 0 //stop inputting, since we have don't have a terminal anymore + del(terminal) + return + + //crowbarring it ! + default_deconstruction_crowbar(I) + +/obj/machinery/power/smes/Destroy() + if(ticker && ticker.current_state == GAME_STATE_PLAYING) + var/area/area = get_area(src) + message_admins("SMES deleted at ([area.name])") + log_game("SMES deleted at ([area.name])") + investigate_log("deleted at ([area.name])","singulo") + if(terminal) + disconnect_terminal() + ..() + +// create a terminal object pointing towards the SMES +// wires will attach to this +/obj/machinery/power/smes/proc/make_terminal(var/turf/T) + terminal = new/obj/machinery/power/terminal(T) + terminal.dir = get_dir(T,src) + terminal.master = src + +/obj/machinery/power/smes/proc/disconnect_terminal() + if(terminal) + terminal.master = null + terminal = null + /obj/machinery/power/smes/proc/chargedisplay() - return round(5.5*charge/(capacity ? capacity : 5e6)) + return round(5.5*charge/capacity) #define SMESRATE 0.05 // rate of internal charge to external power /obj/machinery/power/smes/process() - - if(stat & BROKEN) return + if(stat & BROKEN) + return //store machine state to see if we need to update the icon overlays var/last_disp = chargedisplay() @@ -205,10 +351,10 @@ data["charging"] = charging data["chargeMode"] = chargemode data["chargeLevel"] = chargelevel - data["chargeMax"] = SMESMAXCHARGELEVEL + data["chargeMax"] = input_level_max data["outputOnline"] = online data["outputLevel"] = output - data["outputMax"] = SMESMAXOUTPUT + data["outputMax"] = output_level_max data["outputLoad"] = round(loaddemand) // update the ui if it exists, returns null if no ui is passed/found @@ -254,20 +400,20 @@ if("min") chargelevel = 0 if("max") - chargelevel = SMESMAXCHARGELEVEL //30000 + chargelevel = input_level_max //30000 if("set") - chargelevel = input(usr, "Enter new input level (0-[SMESMAXCHARGELEVEL])", "SMES Input Power Control", chargelevel) as num - chargelevel = max(0, min(SMESMAXCHARGELEVEL, chargelevel)) // clamp to range + chargelevel = input(usr, "Enter new input level (0-[input_level_max])", "SMES Input Power Control", chargelevel) as num + chargelevel = max(0, min(input_level_max, chargelevel)) // clamp to range else if( href_list["output"] ) switch( href_list["output"] ) if("min") output = 0 if("max") - output = SMESMAXOUTPUT //30000 + output = output_level_max //30000 if("set") - output = input(usr, "Enter new output level (0-[SMESMAXOUTPUT])", "SMES Output Power Control", output) as num - output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range + output = input(usr, "Enter new output level (0-[output_level_max])", "SMES Output Power Control", output) as num + output = max(0, min(output_level_max, output)) // clamp to range investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo") diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 6bed48e5300..594e4186b2f 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1325,8 +1325,17 @@ datum/design/light_replacer //////////////////////////////////////// //////////////MISC Boards/////////////// //////////////////////////////////////// +datum/design/smes + name = "SMES Board" + desc = "The circuit board for a SMES." + id = "smes" + req_tech = list("programming" = 4, "power" = 5, "engineering" = 4) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/smes + datum/design/thermomachine - name = "Machine Design (Freezer/Heater Board)" + name = "Freezer/Heater Board" desc = "The circuit board for a freezer/heater." id = "thermomachine" req_tech = list("programming" = 3, "plasmatech" = 3) @@ -1335,7 +1344,7 @@ datum/design/thermomachine build_path = /obj/item/weapon/circuitboard/thermomachine datum/design/biogenerator - name = "Machine Design (Biogenerator Board)" + name = "Biogenerator Board" desc = "The circuit board for a biogenerator." id = "biogenerator" req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3) @@ -1344,7 +1353,7 @@ datum/design/biogenerator build_path = /obj/item/weapon/circuitboard/biogenerator datum/design/hydroponics - name = "Machine Design (Hydroponics Tray Board)" + name = "Hydroponics Tray Board" desc = "The circuit board for a hydroponics tray." id = "hydro_tray" req_tech = list("programming" = 1, "biotech" = 1) @@ -1353,7 +1362,7 @@ datum/design/hydroponics build_path = /obj/item/weapon/circuitboard/hydroponics datum/design/microwave - name = "Machine Design (Microwave Board)" + name = "Microwave Board" desc = "The circuit board for a microwave." id = "microwave" req_tech = list("programming" = 1) @@ -1362,7 +1371,7 @@ datum/design/microwave build_path = "/obj/item/weapon/circuitboard/microwave" datum/design/chem_dispenser - name = "Machine Design (Portable Chem Dispenser Board)" + name = "Portable Chem Dispenser Board" desc = "The circuit board for a portable chem dispenser." id = "chem_dispenser" req_tech = list("programming" = 4, "biotech" = 3, "engineering" = 4, "materials" = 4, "plasmatech" = 3) @@ -1451,6 +1460,15 @@ datum/design/mech_recharger materials = list("$glass" = 1000, "sacid" = 20) build_path = "/obj/item/weapon/circuitboard/mech_recharger" +datum/design/vendor + name = "Vendor Board" + desc = "The circuit board for a Vendor." + id = "vendor" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = "/obj/item/weapon/circuitboard/vendor" + ///////////////////////////////////////// ////////////Power Stuff////////////////// ///////////////////////////////////////// diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index b0130821d4da342f8759973c763f44d77fae8160..f0628147b4d5ff586fb68ce168d85a925897c93a 100644 GIT binary patch delta 21672 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