diff --git a/code/__DEFINES/wires.dm b/code/__DEFINES/wires.dm index 0b1b68c5d8d1..704207dfc915 100644 --- a/code/__DEFINES/wires.dm +++ b/code/__DEFINES/wires.dm @@ -49,3 +49,4 @@ #define WIRE_ZAP1 "High Voltage Circuit 1" #define WIRE_ZAP2 "High Voltage Circuit 2" #define WIRE_AGELIMIT "Age Limit" +#define WIRE_LAUNCH "Launch" diff --git a/code/datums/wires/mass_driver.dm b/code/datums/wires/mass_driver.dm new file mode 100644 index 000000000000..fd6f69707021 --- /dev/null +++ b/code/datums/wires/mass_driver.dm @@ -0,0 +1,25 @@ +/datum/wires/mass_driver + holder_type = /obj/machinery/mass_driver + proper_name = "Mass Driver" + +/datum/wires/mass_driver/New(atom/holder) + wires = list(WIRE_LAUNCH, WIRE_SAFETY) + ..() + +/datum/wires/mass_driver/on_pulse(wire) + var/obj/machinery/mass_driver/the_mass_driver = holder + switch(wire) + if(WIRE_LAUNCH) + the_mass_driver.drive() + holder.visible_message(span_notice("The drive mechanism activates.")) + if(WIRE_SAFETY) + the_mass_driver.power = 3 + holder.visible_message(span_notice("You hear a worrying whirring noise emitting from the mass driver.")) + +/datum/wires/mass_driver/on_cut(wire, mend, source) + var/obj/machinery/mass_driver/the_mass_driver = holder + switch(wire) + if(WIRE_SAFETY) + if(the_mass_driver.power > 1) + the_mass_driver.power = 1 + holder.visible_message(span_notice("The whirring noise emitting from the mass driver stops.")) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 5217c389f2d7..1c71e691b8ff 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -1,21 +1,30 @@ /obj/machinery/mass_driver name = "mass driver" - desc = "The finest in spring-loaded piston toy technology, now on a space station near you." + desc = "A miniaturized mass driver, the finest in hydraulic piston technology." // Imagine what an actual mass driver would look like icon = 'icons/obj/stationobjs.dmi' icon_state = "mass_driver" + circuit = /obj/item/circuitboard/machine/mass_driver use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 50 var/power = 1 var/code = 1 var/id = 1 - var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess. + var/drive_range = 10 + var/power_per_obj = 500 +/obj/machinery/mass_driver/Initialize(mapload) + . = ..() + wires = new /datum/wires/mass_driver(src) + +/obj/machinery/mass_driver/Destroy() + QDEL_NULL(wires) + . = ..() /obj/machinery/mass_driver/proc/drive(amount) - if(stat & (BROKEN|NOPOWER)) + if(stat & (BROKEN|NOPOWER) || panel_open) return - use_power(500) + use_power(power_per_obj) var/O_limit var/atom/target = get_edge_target_turf(src, dir) for(var/atom/movable/O in loc) @@ -26,15 +35,34 @@ if(O_limit >= 20) audible_message(span_notice("[src] lets out a screech, it doesn't seem to be able to handle the load.")) break - use_power(500) + use_power(power_per_obj) O.throw_at(target, drive_range * power, power) + playsound(get_turf(src), 'sound/machines/mass_driver.ogg', 75) flick("mass_driver1", src) +/obj/machinery/mass_driver/attackby(obj/item/I, mob/living/user, params) + + if(is_wire_tool(I) && panel_open) + wires.interact(user) + return + if(default_deconstruction_screwdriver(user, "mass_driveropen", "mass_driver", I)) + return + if(default_change_direction_wrench(user, I)) + return + if(default_deconstruction_crowbar(I)) + return + + return ..() + +/obj/machinery/mass_driver/RefreshParts() + . = ..() + for(var/obj/item/stock_parts/capacitor/C in component_parts) + drive_range += 10 * C.rating /obj/machinery/mass_driver/emp_act(severity) . = ..() if (. & EMP_PROTECT_SELF) return - if(stat & (BROKEN|NOPOWER)) + if(stat & (BROKEN|NOPOWER) || panel_open) return drive() diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 6128663daf4a..baf533a0496d 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1438,3 +1438,9 @@ req_components = list( /obj/item/stock_parts/capacitor = 3, /obj/item/stock_parts/micro_laser = 1) + +/obj/item/circuitboard/machine/mass_driver + name = "Mass Driver" + build_path = /obj/machinery/mass_driver + req_components = list( + /obj/item/stock_parts/capacitor = 1) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 2bd439510abd..205047e1c867 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -793,4 +793,12 @@ id = "mindmachine_pod" build_path = /obj/item/circuitboard/machine/mindmachine_pod category = list("Medical Machinery") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL \ No newline at end of file + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/board/mass_driver + name = "Machine Design (Mass Driver)" + desc = "The circuit board for a mass driver." + id = "mass_driver" + build_path = /obj/item/circuitboard/machine/mass_driver + category = list("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 5da7e68680ee..a0cc937c928b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -155,7 +155,8 @@ design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", "scanner_gate", "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", "cell_charger", "stack_console", "stack_machine", "conveyor_belt", "conveyor_switch", "reactor_control", - "oxygen_tank", "plasma_tank", "emergency_oxygen", "emergency_oxygen_engi", "plasmaman_tank_belt", "electrolyzer", "floorigniter", "crystallizer", "suit_storage_unit", "atmos_thermal") + "oxygen_tank", "plasma_tank", "emergency_oxygen", "emergency_oxygen_engi", "plasmaman_tank_belt", "electrolyzer", "floorigniter", "crystallizer", "suit_storage_unit", + "atmos_thermal") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) /datum/techweb_node/adv_engi @@ -163,7 +164,7 @@ display_name = "Advanced Engineering" description = "Pushing the boundaries of physics, one chainsaw-fist at a time." prereq_ids = list("engineering", "emp_basic") - design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "decontamination_unit", "particle_emitter", "tricorder") + design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "decontamination_unit", "particle_emitter", "tricorder", "mass_driver") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/anomaly diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 7bf2ddaed7fc..505e934fb411 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/sound/machines/mass_driver.ogg b/sound/machines/mass_driver.ogg new file mode 100644 index 000000000000..b277b5a897bd Binary files /dev/null and b/sound/machines/mass_driver.ogg differ diff --git a/yogstation.dme b/yogstation.dme index 3da3de258ce7..0f7d67687a66 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -808,6 +808,7 @@ #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\igniter.dm" +#include "code\datums\wires\mass_driver.dm" #include "code\datums\wires\mech_fabricator.dm" #include "code\datums\wires\microwave.dm" #include "code\datums\wires\mulebot.dm"