diff --git a/baystation12.dme b/baystation12.dme
index 3682d72495..f022a2b292 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -632,9 +632,11 @@
#include "code\game\objects\items\weapons\circuitboards\computer\research.dm"
#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm"
#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm"
+#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm"
+#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm"
diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index 766279a630..82d7d41b7b 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -7,52 +7,47 @@
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "freezer_0"
density = 1
-
- anchored = 1.0
-
- var/heatsink_temperature = T20C //the constant temperature resevoir into which the freezer pumps heat. Probably the hull of the station or something.
- var/internal_volume = 600 //L
-
+ anchored = 1
use_power = 0
- idle_power_usage = 5 //5 Watts for thermostat related circuitry
+ idle_power_usage = 5 // 5 Watts for thermostat related circuitry
- var/max_power_rating = 20000 //power rating when the usage is turned up to 100
+ var/heatsink_temperature = T20C // The constant temperature reservoir into which the freezer pumps heat. Probably the hull of the station or something.
+ var/internal_volume = 600 // L
+
+ var/max_power_rating = 20000 // Power rating when the usage is turned up to 100
var/power_setting = 100
- var/set_temperature = T20C //thermostat
+ var/set_temperature = T20C // Thermostat
var/cooling = 0
- var/opened = 0 //for deconstruction
/obj/machinery/atmospherics/unary/freezer/New()
..()
- air_contents.volume = internal_volume
initialize_directions = dir
-
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/unary_atmos/cooler(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
-
- power_rating = max_power_rating * (power_setting/100)
+ component_parts += new /obj/item/stack/cable_coil(src, 2)
+ RefreshParts()
/obj/machinery/atmospherics/unary/freezer/initialize()
- if(node) return
+ if(node)
+ return
var/node_connect = dir
- for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
- if(target.initialize_directions & get_dir(target,src))
+ for(var/obj/machinery/atmospherics/target in get_step(src, node_connect))
+ if(target.initialize_directions & get_dir(target, src))
node = target
break
update_icon()
-
/obj/machinery/atmospherics/unary/freezer/update_icon()
- if(src.node)
- if(src.use_power && cooling)
+ if(node)
+ if(use_power && cooling)
icon_state = "freezer_1"
else
icon_state = "freezer"
@@ -61,10 +56,10 @@
return
/obj/machinery/atmospherics/unary/freezer/attack_ai(mob/user as mob)
- src.ui_interact(user)
+ ui_interact(user)
/obj/machinery/atmospherics/unary/freezer/attack_hand(mob/user as mob)
- src.ui_interact(user)
+ ui_interact(user)
/obj/machinery/atmospherics/unary/freezer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
// this is the data which will be sent to the ui
@@ -78,15 +73,15 @@
data["powerSetting"] = power_setting
var/temp_class = "good"
- if (air_contents.temperature > (T0C - 20))
+ if(air_contents.temperature > (T0C - 20))
temp_class = "bad"
- else if (air_contents.temperature < (T0C - 20) && air_contents.temperature > (T0C - 100))
+ else if(air_contents.temperature < (T0C - 20) && air_contents.temperature > (T0C - 100))
temp_class = "average"
data["gasTemperatureClass"] = temp_class
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "freezer.tmpl", "Gas Cooling System", 440, 300)
@@ -98,30 +93,31 @@
ui.set_auto_update(1)
/obj/machinery/atmospherics/unary/freezer/Topic(href, href_list)
- if (href_list["toggleStatus"])
- src.use_power = !src.use_power
+ if(href_list["toggleStatus"])
+ use_power = !use_power
update_icon()
if(href_list["temp"])
var/amount = text2num(href_list["temp"])
if(amount > 0)
- src.set_temperature = min(src.set_temperature+amount, 1000)
+ set_temperature = min(set_temperature + amount, 1000)
else
- src.set_temperature = max(src.set_temperature+amount, 0)
+ set_temperature = max(set_temperature + amount, 0)
if(href_list["setPower"]) //setting power to 0 is redundant anyways
var/new_setting = between(0, text2num(href_list["setPower"]), 100)
set_power_level(new_setting)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
return 1
/obj/machinery/atmospherics/unary/freezer/process()
..()
+
if(stat & (NOPOWER|BROKEN) || !use_power)
cooling = 0
update_icon()
return
- if (network && air_contents.temperature > set_temperature)
+ if(network && air_contents.temperature > set_temperature)
cooling = 1
var/heat_transfer = max( -air_contents.get_thermal_energy_change(set_temperature - 5), 0 )
@@ -132,7 +128,7 @@
heat_transfer = min(heat_transfer, cop * power_rating) //limit heat transfer by available power
var/removed = -air_contents.add_thermal_energy(-heat_transfer) //remove the heat
- if (debug)
+ if(debug)
visible_message("[src]: Removing [removed] W.")
use_power(power_rating)
@@ -147,49 +143,37 @@
/obj/machinery/atmospherics/unary/freezer/RefreshParts()
..()
var/cap_rating = 0
- var/cap_count = 0
var/manip_rating = 0
- var/manip_count = 0
var/bin_rating = 0
- var/bin_count = 0
for(var/obj/item/weapon/stock_parts/P in component_parts)
if(istype(P, /obj/item/weapon/stock_parts/capacitor))
cap_rating += P.rating
- cap_count++
if(istype(P, /obj/item/weapon/stock_parts/manipulator))
manip_rating += P.rating
- manip_count++
if(istype(P, /obj/item/weapon/stock_parts/matter_bin))
bin_rating += P.rating
- bin_count++
- cap_rating /= cap_count
- bin_rating /= bin_count
- manip_rating /= manip_count
- power_rating = initial(power_rating)*cap_rating //more powerful
- heatsink_temperature = initial(heatsink_temperature)/((manip_rating+bin_rating)/2) //more efficient
- air_contents.volume = max(initial(internal_volume) - 200, 0) + 200*bin_rating
+ power_rating = initial(power_rating) * cap_rating / 2 //more powerful
+ heatsink_temperature = initial(heatsink_temperature) / ((manip_rating + bin_rating) / 2) //more efficient
+ air_contents.volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating
set_power_level(power_setting)
/obj/machinery/atmospherics/unary/freezer/proc/set_power_level(var/new_power_setting)
power_setting = new_power_setting
power_rating = max_power_rating * (power_setting/100)
-//dismantling code. copied from autolathe
/obj/machinery/atmospherics/unary/freezer/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/weapon/screwdriver))
- opened = !opened
- user << "You [opened ? "open" : "close"] the maintenance hatch of [src]."
+ if(default_deconstruction_screwdriver(user, O))
return
-
- if (opened && istype(O, /obj/item/weapon/crowbar))
- dismantle()
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
return
..()
/obj/machinery/atmospherics/unary/freezer/examine(mob/user)
..(user)
- if (opened)
+ if(panel_open)
user << "The maintenance hatch is open."
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index 891a19cc74..829f06f420 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -7,25 +7,21 @@
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "heater_0"
density = 1
-
- anchored = 1.0
-
- var/set_temperature = T20C //thermostat
- var/max_temperature = T20C + 680
- var/internal_volume = 600 //L
-
+ anchored = 1
use_power = 0
idle_power_usage = 5 //5 Watts for thermostat related circuitry
+ var/max_temperature = T20C + 680
+ var/internal_volume = 600 //L
+
var/max_power_rating = 20000 //power rating when the usage is turned up to 100
var/power_setting = 100
+ var/set_temperature = T20C //thermostat
var/heating = 0 //mainly for icon updates
- var/opened = 0 //for deconstruction
/obj/machinery/atmospherics/unary/heater/New()
..()
- air_contents.volume = internal_volume
initialize_directions = dir
component_parts = list()
@@ -33,16 +29,18 @@
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 5)
- power_rating = max_power_rating * (power_setting/100)
+ RefreshParts()
/obj/machinery/atmospherics/unary/heater/initialize()
- if(node) return
+ if(node)
+ return
var/node_connect = dir
- for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
- if(target.initialize_directions & get_dir(target,src))
+ for(var/obj/machinery/atmospherics/target in get_step(src, node_connect))
+ if(target.initialize_directions & get_dir(target, src))
node = target
break
@@ -50,8 +48,8 @@
/obj/machinery/atmospherics/unary/heater/update_icon()
- if(src.node)
- if(src.use_power && src.heating)
+ if(node)
+ if(use_power && heating)
icon_state = "heater_1"
else
icon_state = "heater"
@@ -68,7 +66,7 @@
update_icon()
return
- if (network && air_contents.total_moles && air_contents.temperature < set_temperature)
+ if(network && air_contents.total_moles && air_contents.temperature < set_temperature)
air_contents.add_thermal_energy(power_rating * HEATER_PERF_MULT)
use_power(power_rating)
@@ -80,10 +78,10 @@
update_icon()
/obj/machinery/atmospherics/unary/heater/attack_ai(mob/user as mob)
- src.ui_interact(user)
+ ui_interact(user)
/obj/machinery/atmospherics/unary/heater/attack_hand(mob/user as mob)
- src.ui_interact(user)
+ ui_interact(user)
/obj/machinery/atmospherics/unary/heater/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
// this is the data which will be sent to the ui
@@ -97,13 +95,13 @@
data["powerSetting"] = power_setting
var/temp_class = "normal"
- if (air_contents.temperature > (T20C+40))
+ if(air_contents.temperature > (T20C+40))
temp_class = "bad"
data["gasTemperatureClass"] = temp_class
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "freezer.tmpl", "Gas Heating System", 440, 300)
@@ -115,63 +113,54 @@
ui.set_auto_update(1)
/obj/machinery/atmospherics/unary/heater/Topic(href, href_list)
- if (href_list["toggleStatus"])
- src.use_power = !src.use_power
+ if(href_list["toggleStatus"])
+ use_power = !use_power
update_icon()
if(href_list["temp"])
var/amount = text2num(href_list["temp"])
if(amount > 0)
- src.set_temperature = min(src.set_temperature+amount, max_temperature)
+ set_temperature = min(set_temperature + amount, max_temperature)
else
- src.set_temperature = max(src.set_temperature+amount, 0)
+ set_temperature = max(set_temperature + amount, 0)
if(href_list["setPower"]) //setting power to 0 is redundant anyways
var/new_setting = between(0, text2num(href_list["setPower"]), 100)
set_power_level(new_setting)
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
return 1
//upgrading parts
/obj/machinery/atmospherics/unary/heater/RefreshParts()
..()
-
var/cap_rating = 0
- var/cap_count = 0
var/bin_rating = 0
- var/bin_count = 0
+
for(var/obj/item/weapon/stock_parts/P in component_parts)
if(istype(P, /obj/item/weapon/stock_parts/capacitor))
cap_rating += P.rating
- cap_count++
if(istype(P, /obj/item/weapon/stock_parts/matter_bin))
bin_rating += P.rating
- bin_count++
- cap_rating /= cap_count
- bin_rating /= bin_count
- max_power_rating = initial(max_power_rating)*cap_rating
- max_temperature = max(initial(max_temperature) - T20C, 0)*((bin_rating*2 + cap_rating)/3) + T20C
- air_contents.volume = max(initial(internal_volume) - 200, 0) + 200*bin_rating
+ max_power_rating = initial(max_power_rating) * cap_rating / 2
+ max_temperature = max(initial(max_temperature) - T20C, 0) * ((bin_rating * 4 + cap_rating) / 5) + T20C
+ air_contents.volume = max(initial(internal_volume) - 200, 0) + 200 * bin_rating
set_power_level(power_setting)
/obj/machinery/atmospherics/unary/heater/proc/set_power_level(var/new_power_setting)
power_setting = new_power_setting
power_rating = max_power_rating * (power_setting/100)
-//dismantling code. copied from autolathe
/obj/machinery/atmospherics/unary/heater/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/weapon/screwdriver))
- opened = !opened
- user << "You [opened ? "open" : "close"] the maintenance hatch of [src]."
+ if(default_deconstruction_screwdriver(user, O))
return
-
- if (opened && istype(O, /obj/item/weapon/crowbar))
- dismantle()
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
return
..()
/obj/machinery/atmospherics/unary/heater/examine(mob/user)
..(user)
- if (opened)
+ if(panel_open)
user << "The maintenance hatch is open."
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index ab7b57cb42..634121b08c 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -395,6 +395,22 @@
///////////////////////////////////////Stock Parts /////////////////////////////////
+/obj/item/weapon/storage/part_replacer
+ name = "rapid part exchange device"
+ desc = "Special mechanical module made to store, sort, and apply standard machine parts."
+ icon_state = "RPED"
+ item_state = "RPED"
+ w_class = 5
+ can_hold = list("/obj/item/weapon/stock_parts")
+ storage_slots = 50
+ use_to_pickup = 1
+ allow_quick_gather = 1
+ allow_quick_empty = 1
+ collection_mode = 1
+ display_contents_with_number = 1
+ max_w_class = 3
+ max_combined_w_class = 100
+
/obj/item/weapon/stock_parts
name = "stock part"
desc = "What?"
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 7b44e443c4..5361bea23a 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -13,14 +13,30 @@
var/list/storage_capacity = list("metal" = 0, "glass" = 0)
var/show_category = "All"
- var/panel_open = 0
var/hacked = 0
var/disabled = 0
var/shocked = 0
var/busy = 0
+ var/mat_efficiency = 1
+ var/build_time = 50
+
var/datum/wires/autolathe/wires = null
+/obj/machinery/autolathe/New()
+
+ ..()
+ wires = new(src)
+ //Create parts for lathe.
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/autolathe(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
+ RefreshParts()
+
/obj/machinery/autolathe/proc/update_recipe_list()
if(!machine_recipes)
machine_recipes = autolathe_recipes
@@ -33,8 +49,8 @@
user << "\The [src] is disabled!"
return
- if (shocked)
- shock(user,50)
+ if(shocked)
+ shock(user, 50)
var/dat = "
Autolathe Control Panel
"
@@ -65,16 +81,16 @@
else
//Make sure it's buildable and list requires resources.
for(var/material in R.resources)
- var/sheets = round(stored_material[material]/R.resources[material])
+ var/sheets = round(stored_material[material]/round(R.resources[material]*mat_efficiency))
if(isnull(max_sheets) || max_sheets > sheets)
max_sheets = sheets
- if(!isnull(stored_material[material]) && stored_material[material] < R.resources[material])
+ if(!isnull(stored_material[material]) && stored_material[material] < round(R.resources[material]*mat_efficiency))
can_make = 0
if(!comma)
comma = 1
else
material_string += ", "
- material_string += "[R.resources[material]] [material]"
+ material_string += "[round(R.resources[material] * mat_efficiency)] [material]"
material_string += ".
"
//Build list of multipliers for sheets.
if(R.is_stack)
@@ -99,31 +115,27 @@
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (stat)
- return
-
- if (busy)
+ if(busy)
user << "\The [src] is busy. Please wait for completion of previous operation."
return
- if(istype(O, /obj/item/weapon/screwdriver))
- panel_open = !panel_open
- icon_state = (panel_open ? "autolathe_t": "autolathe")
- user << "You [panel_open ? "open" : "close"] the maintenance hatch of [src]."
+ if(default_deconstruction_screwdriver(user, O))
updateUsrDialog()
return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
+ return
- if (panel_open)
+ if(stat)
+ return
+
+ if(panel_open)
//Don't eat multitools or wirecutters used on an open lathe.
if(istype(O, /obj/item/device/multitool) || istype(O, /obj/item/weapon/wirecutters))
attack_hand(user)
return
- //Dismantle the frame.
- if(istype(O, /obj/item/weapon/crowbar))
- dismantle()
- return
-
if(O.loc != user && !(istype(O,/obj/item/stack)))
return 0
@@ -170,11 +182,11 @@
else
user << "You fill \the [src] with \the [eating]."
- flick("autolathe_o",src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z
+ flick("autolathe_o", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z
if(istype(eating,/obj/item/stack))
var/obj/item/stack/stack = eating
- stack.use(max(1,round(total_used/mass_per_sheet))) // Always use at least 1 to prevent infinite materials.
+ stack.use(max(1, round(total_used/mass_per_sheet))) // Always use at least 1 to prevent infinite materials.
else
user.drop_item(O)
del(O)
@@ -227,18 +239,18 @@
//Check if we still have the materials.
for(var/material in making.resources)
if(!isnull(stored_material[material]))
- if(stored_material[material] < (making.resources[material]*multiplier))
+ if(stored_material[material] < round(making.resources[material] * mat_efficiency) * multiplier)
return
//Consume materials.
for(var/material in making.resources)
if(!isnull(stored_material[material]))
- stored_material[material] = max(0,stored_material[material]-(making.resources[material]*multiplier))
+ stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * mat_efficiency) * multiplier)
//Fancy autolathe animation.
- flick("autolathe_n",src)
+ flick("autolathe_n", src)
- sleep(50)
+ sleep(build_time)
busy = 0
@@ -247,39 +259,31 @@
//Create the desired item.
var/obj/item/I = new making.path(get_step(loc, get_dir(src,usr)))
- if(multiplier>1 && istype(I,/obj/item/stack))
+ if(multiplier > 1 && istype(I, /obj/item/stack))
var/obj/item/stack/S = I
S.amount = multiplier
updateUsrDialog()
-
-/obj/machinery/autolathe/New()
-
- ..()
- wires = new(src)
- //Create parts for lathe.
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/autolathe(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
- RefreshParts()
+/obj/machinery/autolathe/update_icon()
+ icon_state = (panel_open ? "autolathe_t" : "autolathe")
//Updates overall lathe storage size.
/obj/machinery/autolathe/RefreshParts()
..()
- var/tot_rating = 0
+ var/mb_rating = 0
+ var/man_rating = 0
for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts)
- tot_rating += MB.rating
+ mb_rating += MB.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ man_rating += M.rating
- storage_capacity["metal"] = tot_rating * 25000
- storage_capacity["glass"] = tot_rating * 12500
+ storage_capacity["metal"] = mb_rating * 25000
+ storage_capacity["glass"] = mb_rating * 12500
+ build_time = 50 / man_rating
+ mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.8. Maximum rating of parts is 3
/obj/machinery/autolathe/dismantle()
- ..()
var/list/sheets = list("metal" = /obj/item/stack/sheet/metal, "glass" = /obj/item/stack/sheet/glass)
for(var/mat in stored_material)
@@ -288,3 +292,4 @@
if(stored_material[mat] > S.perunit)
S.amount = round(stored_material[mat] / S.perunit)
S.loc = loc
+ ..()
diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm
index 3948f70f33..f13c3dc634 100644
--- a/code/game/machinery/autolathe_datums.dm
+++ b/code/game/machinery/autolathe_datums.dm
@@ -15,7 +15,7 @@
if(I.matter && !recipe.resources) //This can be overidden in the datums.
recipe.resources = list()
for(var/material in I.matter)
- recipe.resources[material] = round(I.matter[material]*1.25) // More expensive to produce than they are to recycle.
+ recipe.resources[material] = I.matter[material]*1.25 // More expensive to produce than they are to recycle.
del(I)
/datum/autolathe/recipe
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index d631ca46df..3b3104201f 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -13,7 +13,6 @@
var/c_tag_order = 999
var/status = 1
anchored = 1.0
- var/panel_open = 0 // 0 = Closed / 1 = Open
var/invuln = null
var/bugged = 0
var/obj/item/weapon/camera_assembly/assembly = null
@@ -57,7 +56,7 @@
/obj/machinery/camera/Del()
if(!alarm_on)
triggerCameraAlarm()
-
+
cancelCameraAlarm()
..()
@@ -70,7 +69,7 @@
kick_viewers()
triggerCameraAlarm()
update_icon()
-
+
spawn(900)
stat &= ~EMPED
cancelCameraAlarm()
@@ -85,11 +84,11 @@
/obj/machinery/camera/ex_act(severity)
if(src.invuln)
return
-
+
//camera dies if an explosion touches it!
if(severity <= 2 || prob(50))
destroy()
-
+
..() //and give it the regular chance of being deleted outright
@@ -174,7 +173,7 @@
if (S.current == src)
O << "[U] holds \a [itemname] up to one of the cameras ..."
O << browse(text("[][]", itemname, info), text("window=[]", itemname))
-
+
else if (istype(W, /obj/item/weapon/camera_bug))
if (!src.can_use())
user << "\blue Camera non-functional"
@@ -185,7 +184,7 @@
else
user << "\blue Camera bugged."
src.bugged = 1
-
+
else if(W.damtype == BRUTE || W.damtype == BURN) //bashing cameras
if (W.force >= src.toughness)
visible_message("[src] has been [pick(W.attack_verb)] with [W] by [user]!")
@@ -194,7 +193,7 @@
if (I.hitsound)
playsound(loc, I.hitsound, 50, 1, -1)
take_damage(W.force)
-
+
else
..()
@@ -221,14 +220,14 @@
if (force >= toughness && (force > toughness*4 || prob(25)))
destroy()
-//Used when someone breaks a camera
+//Used when someone breaks a camera
/obj/machinery/camera/proc/destroy()
invalidateCameraCache()
stat |= BROKEN
kick_viewers()
triggerCameraAlarm()
update_icon()
-
+
//sparks
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, loc)
@@ -266,7 +265,7 @@
alarm_on = 1
if(!get_area(src))
return
-
+
for(var/mob/living/silicon/S in mob_list)
S.triggerAlarm("Camera", get_area(src), list(src), src)
@@ -275,7 +274,7 @@
alarm_on = 0
if(!get_area(src))
return
-
+
for(var/mob/living/silicon/S in mob_list)
S.cancelAlarm("Camera", get_area(src), src)
@@ -355,7 +354,7 @@
/obj/machinery/camera/interact(mob/living/user as mob)
if(!panel_open || istype(user, /mob/living/silicon/ai))
return
-
+
if(stat & BROKEN)
user << "\The [src] is broken."
return
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 454e6e44fc..343c8ab2db 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -3,18 +3,41 @@
//Potential replacement for genetics revives or something I dunno (?)
+//Find a dead mob with a brain and client.
+/proc/find_dead_player(var/find_key)
+ if(isnull(find_key))
+ return
+
+ var/mob/selected = null
+ for(var/mob/living/M in player_list)
+ //Dead people only thanks!
+ if((M.stat != 2) || (!M.client))
+ continue
+ //They need a brain!
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.species.has_organ["brain"] && !H.has_brain())
+ continue
+ if(M.ckey == find_key)
+ selected = M
+ break
+ return selected
+
#define CLONE_BIOMASS 150
/obj/machinery/clonepod
- anchored = 1
name = "cloning pod"
desc = "An electronically-lockable pod for growing organic tissue."
density = 1
+ anchored = 1
icon = 'icons/obj/cloning.dmi'
icon_state = "pod_0"
req_access = list(access_genetics) //For premature unlocking.
+
var/mob/living/occupant
- var/heal_level = 90 //The clone is released once its health reaches this level.
+ var/heal_level = 20 //The clone is released once its health reaches this level.
+ var/heal_rate = 1
+ var/notoxin = 0
var/locked = 0
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
var/mess = 0 //Need to clean out it if it's full of exploded clone.
@@ -22,6 +45,366 @@
var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk
var/biomass = CLONE_BIOMASS * 3
+/obj/machinery/clonepod/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/clonepod(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 2)
+
+ RefreshParts()
+
+/obj/machinery/clonepod/attack_ai(mob/user as mob)
+ add_hiddenprint(user)
+ return attack_hand(user)
+
+/obj/machinery/clonepod/attack_hand(mob/user as mob)
+ if((isnull(occupant)) || (stat & NOPOWER))
+ return
+ if((!isnull(occupant)) && (occupant.stat != 2))
+ var/completion = (100 * ((occupant.health + 50) / (heal_level + 100))) // Clones start at -150 health
+ user << "Current clone cycle is [round(completion)]% complete."
+ return
+
+//Clonepod
+
+//Start growing a human clone in the pod!
+/obj/machinery/clonepod/proc/growclone(var/datum/dna2/record/R)
+ if(mess || attempting)
+ return 0
+ var/datum/mind/clonemind = locate(R.mind)
+ if(!istype(clonemind, /datum/mind)) //not a mind
+ return 0
+ if(clonemind.current && clonemind.current.stat != DEAD) //mind is associated with a non-dead body
+ return 0
+ if(clonemind.active) //somebody is using that mind
+ if(ckey(clonemind.key) != R.ckey)
+ return 0
+ else
+ for(var/mob/dead/observer/G in player_list)
+ if(G.ckey == R.ckey)
+ if(G.can_reenter_corpse)
+ break
+ else
+ return 0
+
+ attempting = 1 //One at a time!!
+ locked = 1
+
+ eject_wait = 1
+ spawn(30)
+ eject_wait = 0
+
+ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species)
+ occupant = H
+
+ if(!R.dna.real_name) //to prevent null names
+ R.dna.real_name = "clone ([rand(0,999)])"
+ H.real_name = R.dna.real_name
+
+ icon_state = "pod_1"
+ //Get the clone body ready
+ H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
+ H.adjustBrainLoss(80) // Even if healed to full health, it will have some brain damage
+ H.Paralyse(4)
+
+ //Here let's calculate their health so the pod doesn't immediately eject them!!!
+ H.updatehealth()
+
+ clonemind.transfer_to(H)
+ H.ckey = R.ckey
+ H << "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?"
+
+ // -- Mode/mind specific stuff goes here
+ callHook("clone", list(H))
+
+ switch(ticker.mode.name)
+ if("revolution")
+ if((H.mind in ticker.mode:revolutionaries) || (H.mind in ticker.mode:head_revolutionaries))
+ ticker.mode.update_all_rev_icons() //So the icon actually appears
+ if("mercenary")
+ if(H.mind in ticker.mode.syndicates)
+ ticker.mode.update_all_synd_icons()
+ if("cult")
+ if(H.mind in ticker.mode.cult)
+ ticker.mode.add_cultist(occupant.mind)
+ ticker.mode.update_all_cult_icons() //So the icon actually appears
+
+ // -- End mode specific stuff
+
+ if(!R.dna)
+ H.dna = new /datum/dna()
+ H.dna.real_name = H.real_name
+ else
+ H.dna = R.dna
+ H.UpdateAppearance()
+ if(heal_level < 60)
+ randmutb(H) //Sometimes the clones come out wrong.
+ H.dna.UpdateSE()
+ H.dna.UpdateUI()
+
+ H.set_cloned_appearance()
+
+ for(var/datum/language/L in R.languages)
+ H.add_language(L.name)
+ H.flavor_texts = R.flavor.Copy()
+ H.suiciding = 0
+ attempting = 0
+ return 1
+
+//Grow clones to maturity then kick them out. FREELOADERS
+/obj/machinery/clonepod/process()
+
+ if(stat & NOPOWER) //Autoeject if power is lost
+ if(occupant)
+ locked = 0
+ go_out()
+ return
+
+ if((occupant) && (occupant.loc == src))
+ if((occupant.stat == DEAD) || (occupant.suiciding) || !occupant.key) //Autoeject corpses and suiciding dudes.
+ locked = 0
+ go_out()
+ connected_message("Clone Rejected: Deceased.")
+ return
+
+ else if(occupant.health < heal_level && occupant.getCloneLoss() > 0)
+ occupant.Paralyse(4)
+
+ //Slowly get that clone healed and finished.
+ occupant.adjustCloneLoss(-2 * heal_rate)
+
+ //Premature clones may have brain damage.
+ occupant.adjustBrainLoss(-1 * heal_rate)
+
+ //So clones don't die of oxyloss in a running pod.
+ if(occupant.reagents.get_reagent_amount("inaprovaline") < 30)
+ occupant.reagents.add_reagent("inaprovaline", 60)
+
+ //So clones will remain asleep for long enough to get them into cryo (Bay RP edit)
+ if(occupant.reagents.get_reagent_amount("stoxin") < 10)
+ occupant.reagents.add_reagent("stoxin", 5)
+ if(occupant.reagents.get_reagent_amount("chloralhydrate") < 1)
+ occupant.reagents.add_reagent("chloralhydrate", 1)
+
+ //Also heal some oxyloss ourselves because inaprovaline is so bad at preventing it!!
+ occupant.adjustOxyLoss(-4)
+ if(notoxin)
+ occupant.adjustToxLoss(-2) // If sufficiently upgraded - remove toxin damage from chloral
+
+ use_power(7500) //This might need tweaking.
+ return
+
+ else if((occupant.health >= heal_level) && (!eject_wait))
+ connected_message("Cloning Process Complete.")
+ locked = 0
+ go_out()
+ return
+
+ else if((!occupant) || (occupant.loc != src))
+ occupant = null
+ if(locked)
+ locked = 0
+ if(!mess)
+ icon_state = "pod_0"
+ //use_power(200)
+ return
+
+ return
+
+//Let's unlock this early I guess. Might be too early, needs tweaking.
+/obj/machinery/clonepod/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(isnull(occupant))
+ if(default_deconstruction_screwdriver(user, W))
+ return
+ if(default_deconstruction_crowbar(user, W))
+ return
+ if(default_part_replacement(user, W))
+ return
+ if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
+ if(!check_access(W))
+ user << "Access Denied."
+ return
+ if((!locked) || (isnull(occupant)))
+ return
+ if((occupant.health < -20) && (occupant.stat != 2))
+ user << "Access Refused."
+ return
+ else
+ locked = 0
+ user << "System unlocked."
+ else if(istype(W, /obj/item/weapon/card/emag))
+ if(isnull(occupant))
+ return
+ user << "You force an emergency ejection."
+ locked = 0
+ go_out()
+ return
+ else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
+ user << "\The [src] processes \the [W]."
+ biomass += 50
+ user.drop_item()
+ del(W)
+ return
+ else if(istype(W, /obj/item/weapon/wrench))
+ if(locked && (anchored || occupant))
+ user << "Can not do that while [src] is in use."
+ else
+ if(anchored)
+ anchored = 0
+ connected.pod1 = null
+ connected = null
+ else
+ anchored = 1
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ if(anchored)
+ user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
+ else
+ user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.")
+ else
+ ..()
+
+//Put messages in the connected computer's temp var for display.
+/obj/machinery/clonepod/proc/connected_message(var/message)
+ if((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning)))
+ return 0
+ if(!message)
+ return 0
+
+ connected.temp = message
+ connected.updateUsrDialog()
+ return 1
+
+/obj/machinery/clonepod/RefreshParts()
+ ..()
+ var/rating = 0
+ for(var/obj/item/weapon/stock_parts/P in component_parts)
+ if(istype(P, /obj/item/weapon/stock_parts/scanning_module) || istype(P, /obj/item/weapon/stock_parts/manipulator))
+ rating += P.rating
+
+ heal_level = rating * 10 - 20
+ heal_rate = round(rating / 4)
+ if(rating >= 8)
+ notoxin = 1
+ else
+ notoxin = 0
+
+/obj/machinery/clonepod/verb/eject()
+ set name = "Eject Cloner"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0)
+ return
+ go_out()
+ add_fingerprint(usr)
+ return
+
+/obj/machinery/clonepod/proc/go_out()
+ if(locked)
+ return
+
+ if(mess) //Clean that mess and dump those gibs!
+ mess = 0
+ gibs(loc)
+ icon_state = "pod_0"
+
+ /*
+ for(var/obj/O in src)
+ O.loc = loc
+ */
+ return
+
+ if(!(occupant))
+ return
+
+ /*
+ for(var/obj/O in src)
+ O.loc = loc
+ */
+
+ if(occupant.client)
+ occupant.client.eye = occupant.client.mob
+ occupant.client.perspective = MOB_PERSPECTIVE
+ occupant.loc = loc
+ icon_state = "pod_0"
+ eject_wait = 0 //If it's still set somehow.
+ domutcheck(occupant) //Waiting until they're out before possible monkeyizing.
+// occupant.add_side_effect("Bad Stomach") // Give them an extra side-effect for free.
+ occupant = null
+
+ biomass -= CLONE_BIOMASS
+
+ return
+
+/obj/machinery/clonepod/proc/malfunction()
+ if(occupant)
+ connected_message("Critical Error!")
+ mess = 1
+ icon_state = "pod_g"
+ occupant.ghostize()
+ spawn(5)
+ del(occupant)
+ return
+
+/obj/machinery/clonepod/relaymove(mob/user as mob)
+ if(user.stat)
+ return
+ go_out()
+ return
+
+/obj/machinery/clonepod/emp_act(severity)
+ if(prob(100/severity))
+ malfunction()
+ ..()
+
+/obj/machinery/clonepod/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = loc
+ ex_act(severity)
+ del(src)
+ return
+ if(2.0)
+ if(prob(50))
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = loc
+ ex_act(severity)
+ del(src)
+ return
+ if(3.0)
+ if(prob(25))
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = loc
+ ex_act(severity)
+ del(src)
+ return
+ else
+ return
+
+//Health Tracker Implant
+
+/obj/item/weapon/implant/health
+ name = "health implant"
+ var/healthstring = ""
+
+/obj/item/weapon/implant/health/proc/sensehealth()
+ if(!implanted)
+ return "ERROR"
+ else
+ if(isliving(implanted))
+ var/mob/living/L = implanted
+ healthstring = "[round(L.getOxyLoss())] - [round(L.getFireLoss())] - [round(L.getToxLoss())] - [round(L.getBruteLoss())]"
+ if(!healthstring)
+ healthstring = "ERROR"
+ return healthstring
+
+//Disk stuff.
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
/obj/item/weapon/disk/data
@@ -30,7 +413,7 @@
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
item_state = "card-id"
w_class = 2.0
- var/datum/dna2/record/buf=null
+ var/datum/dna2/record/buf = null
var/read_only = 0 //Well,it's still a floppy disk
/obj/item/weapon/disk/data/proc/initializeDisk()
@@ -65,363 +448,18 @@
buf.dna.SE=new_SE
buf.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF)
-
-//Find a dead mob with a brain and client.
-/proc/find_dead_player(var/find_key)
- if (isnull(find_key))
- return
-
- var/mob/selected = null
- for(var/mob/living/M in player_list)
- //Dead people only thanks!
- if ((M.stat != 2) || (!M.client))
- continue
- //They need a brain!
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.species.has_organ["brain"] && !H.has_brain())
- continue
- if (M.ckey == find_key)
- selected = M
- break
- return selected
-
-//Disk stuff.
/obj/item/weapon/disk/data/New()
..()
var/diskcolor = pick(0,1,2)
- src.icon_state = "datadisk[diskcolor]"
+ icon_state = "datadisk[diskcolor]"
/obj/item/weapon/disk/data/attack_self(mob/user as mob)
- src.read_only = !src.read_only
- user << "You flip the write-protect tab to [src.read_only ? "protected" : "unprotected"]."
+ read_only = !read_only
+ user << "You flip the write-protect tab to [read_only ? "protected" : "unprotected"]."
/obj/item/weapon/disk/data/examine(mob/user)
..(user)
- user << text("The write-protect tab is set to [src.read_only ? "protected" : "unprotected"].")
- return
-
-//Health Tracker Implant
-
-/obj/item/weapon/implant/health
- name = "health implant"
- var/healthstring = ""
-
-/obj/item/weapon/implant/health/proc/sensehealth()
- if (!src.implanted)
- return "ERROR"
- else
- if(isliving(src.implanted))
- var/mob/living/L = src.implanted
- src.healthstring = "[round(L.getOxyLoss())] - [round(L.getFireLoss())] - [round(L.getToxLoss())] - [round(L.getBruteLoss())]"
- if (!src.healthstring)
- src.healthstring = "ERROR"
- return src.healthstring
-
-/obj/machinery/clonepod/attack_ai(mob/user as mob)
- src.add_hiddenprint(user)
- return attack_hand(user)
-
-/obj/machinery/clonepod/attack_hand(mob/user as mob)
- if ((isnull(src.occupant)) || (stat & NOPOWER))
- return
- if ((!isnull(src.occupant)) && (src.occupant.stat != 2))
- var/completion = (100 * ((src.occupant.health + 100) / (src.heal_level + 100)))
- user << "Current clone cycle is [round(completion)]% complete."
- return
-
-//Clonepod
-
-//Start growing a human clone in the pod!
-/obj/machinery/clonepod/proc/growclone(var/datum/dna2/record/R)
- if(mess || attempting)
- return 0
- var/datum/mind/clonemind = locate(R.mind)
- if(!istype(clonemind,/datum/mind)) //not a mind
- return 0
- if( clonemind.current && clonemind.current.stat != DEAD ) //mind is associated with a non-dead body
- return 0
- if(clonemind.active) //somebody is using that mind
- if( ckey(clonemind.key)!=R.ckey )
- return 0
- else
- for(var/mob/dead/observer/G in player_list)
- if(G.ckey == R.ckey)
- if(G.can_reenter_corpse)
- break
- else
- return 0
-
-
- src.heal_level = rand(10,40) //Randomizes what health the clone is when ejected
- src.attempting = 1 //One at a time!!
- src.locked = 1
-
- src.eject_wait = 1
- spawn(30)
- src.eject_wait = 0
-
- var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species)
- occupant = H
-
- if(!R.dna.real_name) //to prevent null names
- R.dna.real_name = "clone ([rand(0,999)])"
- H.real_name = R.dna.real_name
-
- src.icon_state = "pod_1"
- //Get the clone body ready
- H.adjustCloneLoss(150) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
- H.adjustBrainLoss(src.heal_level + 50 + rand(10, 30)) // The rand(10, 30) will come out as extra brain damage
- H.Paralyse(4)
-
- //Here let's calculate their health so the pod doesn't immediately eject them!!!
- H.updatehealth()
-
- clonemind.transfer_to(H)
- H.ckey = R.ckey
- H << "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?"
-
- // -- Mode/mind specific stuff goes here
- callHook("clone", list(H))
-
- switch(ticker.mode.name)
- if("revolution")
- if((H.mind in ticker.mode:revolutionaries) || (H.mind in ticker.mode:head_revolutionaries))
- ticker.mode.update_all_rev_icons() //So the icon actually appears
- if("mercenary")
- if(H.mind in ticker.mode.syndicates)
- ticker.mode.update_all_synd_icons()
- if("cult")
- if (H.mind in ticker.mode.cult)
- ticker.mode.add_cultist(src.occupant.mind)
- ticker.mode.update_all_cult_icons() //So the icon actually appears
-
- // -- End mode specific stuff
-
- if(!R.dna)
- H.dna = new /datum/dna()
- H.dna.real_name = H.real_name
- else
- H.dna=R.dna
- H.UpdateAppearance()
- randmutb(H) //Sometimes the clones come out wrong.
- H.dna.UpdateSE()
- H.dna.UpdateUI()
-
- H.set_cloned_appearance()
-
- for(var/datum/language/L in R.languages)
- H.add_language(L.name)
- H.flavor_texts = R.flavor.Copy()
- H.suiciding = 0
- src.attempting = 0
- return 1
-
-//Grow clones to maturity then kick them out. FREELOADERS
-/obj/machinery/clonepod/process()
-
- if(stat & NOPOWER) //Autoeject if power is lost
- if (src.occupant)
- src.locked = 0
- src.go_out()
- return
-
- if((src.occupant) && (src.occupant.loc == src))
- if((src.occupant.stat == DEAD) || (src.occupant.suiciding) || !occupant.key) //Autoeject corpses and suiciding dudes.
- src.locked = 0
- src.go_out()
- src.connected_message("Clone Rejected: Deceased.")
- return
-
- else if(src.occupant.health < src.heal_level)
- src.occupant.Paralyse(4)
-
- //Slowly get that clone healed and finished.
- src.occupant.adjustCloneLoss(-2)
-
- //Premature clones may have brain damage.
- src.occupant.adjustBrainLoss(-1)
-
- //So clones don't die of oxyloss in a running pod.
- if (src.occupant.reagents.get_reagent_amount("inaprovaline") < 30)
- src.occupant.reagents.add_reagent("inaprovaline", 60)
-
- //So clones will remain asleep for long enough to get them into cryo (Bay RP edit)
- if (src.occupant.reagents.get_reagent_amount("stoxin") < 10)
- src.occupant.reagents.add_reagent("stoxin", 5)
- if (src.occupant.reagents.get_reagent_amount("chloralhydrate") < 1)
- src.occupant.reagents.add_reagent("chloralhydrate", 1)
-
- //Also heal some oxyloss ourselves because inaprovaline is so bad at preventing it!!
- src.occupant.adjustOxyLoss(-4)
-
- use_power(7500) //This might need tweaking.
- return
-
- else if((src.occupant.health >= src.heal_level) && (!src.eject_wait))
- src.connected_message("Cloning Process Complete.")
- src.locked = 0
- src.go_out()
- return
-
- else if ((!src.occupant) || (src.occupant.loc != src))
- src.occupant = null
- if (src.locked)
- src.locked = 0
- if (!src.mess)
- icon_state = "pod_0"
- //use_power(200)
- return
-
- return
-
-//Let's unlock this early I guess. Might be too early, needs tweaking.
-/obj/machinery/clonepod/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (!src.check_access(W))
- user << "\red Access Denied."
- return
- if ((!src.locked) || (isnull(src.occupant)))
- return
- if ((src.occupant.health < -20) && (src.occupant.stat != 2))
- user << "\red Access Refused."
- return
- else
- src.locked = 0
- user << "System unlocked."
- else if (istype(W, /obj/item/weapon/card/emag))
- if (isnull(src.occupant))
- return
- user << "You force an emergency ejection."
- src.locked = 0
- src.go_out()
- return
- else if (istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
- user << "\blue \The [src] processes \the [W]."
- biomass += 50
- user.drop_item()
- del(W)
- return
- else if (istype(W, /obj/item/weapon/wrench))
- if(src.locked && (src.anchored || src.occupant))
- user << "\red Can not do that while [src] is in use."
- else
- if(src.anchored)
- src.anchored = 0
- connected.pod1 = null
- connected = null
- else
- src.anchored = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- if(anchored)
- user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
- else
- user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.")
- else
- ..()
-
-//Put messages in the connected computer's temp var for display.
-/obj/machinery/clonepod/proc/connected_message(var/message)
- if ((isnull(src.connected)) || (!istype(src.connected, /obj/machinery/computer/cloning)))
- return 0
- if (!message)
- return 0
-
- src.connected.temp = message
- src.connected.updateUsrDialog()
- return 1
-
-/obj/machinery/clonepod/verb/eject()
- set name = "Eject Cloner"
- set category = "Object"
- set src in oview(1)
-
- if (usr.stat != 0)
- return
- src.go_out()
- add_fingerprint(usr)
- return
-
-/obj/machinery/clonepod/proc/go_out()
- if (src.locked)
- return
-
- if (src.mess) //Clean that mess and dump those gibs!
- src.mess = 0
- gibs(src.loc)
- src.icon_state = "pod_0"
-
- /*
- for(var/obj/O in src)
- O.loc = src.loc
- */
- return
-
- if (!(src.occupant))
- return
-
- /*
- for(var/obj/O in src)
- O.loc = src.loc
- */
-
- if (src.occupant.client)
- src.occupant.client.eye = src.occupant.client.mob
- src.occupant.client.perspective = MOB_PERSPECTIVE
- src.occupant.loc = src.loc
- src.icon_state = "pod_0"
- src.eject_wait = 0 //If it's still set somehow.
- domutcheck(src.occupant) //Waiting until they're out before possible monkeyizing.
-// src.occupant.add_side_effect("Bad Stomach") // Give them an extra side-effect for free.
- src.occupant = null
-
- src.biomass -= CLONE_BIOMASS
-
- return
-
-/obj/machinery/clonepod/proc/malfunction()
- if(src.occupant)
- src.connected_message("Critical Error!")
- src.mess = 1
- src.icon_state = "pod_g"
- src.occupant.ghostize()
- spawn(5)
- del(src.occupant)
- return
-
-/obj/machinery/clonepod/relaymove(mob/user as mob)
- if (user.stat)
- return
- src.go_out()
- return
-
-/obj/machinery/clonepod/emp_act(severity)
- if(prob(100/severity)) malfunction()
- ..()
-
-/obj/machinery/clonepod/ex_act(severity)
- switch(severity)
- if(1.0)
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- del(src)
- return
- if(2.0)
- if (prob(50))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- del(src)
- return
- if(3.0)
- if (prob(25))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- del(src)
- return
- else
+ user << text("The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
return
/*
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index 8e86678ef2..7b186bcc9c 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -19,7 +19,6 @@
var/seconds_electrified = 0;
var/shoot_inventory = 0
var/locked = 0
- var/panel_open = 0 //Hacking a smartfridge
var/scan_id = 1
var/is_secure = 0
var/datum/wires/smartfridge/wires = null
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index c5eaf35497..819cc05632 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -28,6 +28,9 @@ Class Variables:
component_parts (list)
A list of component parts of machine used by frame based machines.
+ panel_open (num)
+ Whether the panel is open
+
uid (num)
Unique id of machine across all machines.
@@ -43,9 +46,6 @@ Class Variables:
MAINT:8 -- machine is currently under going maintenance.
EMPED:16 -- temporary broken by EMP pulse
- manual (num)
- Currently unused.
-
Class Procs:
New() 'game/machinery/machine.dm'
@@ -104,13 +104,12 @@ Class Procs:
//2 = run auto, use active
var/idle_power_usage = 0
var/active_power_usage = 0
- var/power_channel = EQUIP
- //EQUIP,ENVIRON or LIGHT
- var/list/component_parts = list() //list of all the parts used to build it, if made from certain kinds of frames.
+ var/power_channel = EQUIP //EQUIP, ENVIRON or LIGHT
+ var/list/component_parts = null //list of all the parts used to build it, if made from certain kinds of frames.
var/uid
- var/manual = 0
- var/interact_offline = 0 // Can the machine be interacted with while de-powered.
+ var/panel_open = 0
var/global/gl_uid = 1
+ var/interact_offline = 0 // Can the machine be interacted with while de-powered.
/obj/machinery/New(l, d=0)
..(l)
@@ -238,15 +237,15 @@ Class Procs:
gl_uid++
/obj/machinery/proc/state(var/msg)
- for(var/mob/O in hearers(src, null))
- O.show_message("\icon[src] [msg]", 2)
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\icon[src] [msg]", 2)
/obj/machinery/proc/ping(text=null)
- if (!text)
- text = "\The [src] pings."
+ if (!text)
+ text = "\The [src] pings."
- state(text, "blue")
- playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
+ state(text, "blue")
+ playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
/obj/machinery/proc/shock(mob/user, prb)
if(inoperable())
@@ -267,6 +266,54 @@ Class Procs:
else
return 0
+/obj/machinery/proc/default_deconstruction_crowbar(var/mob/user, var/obj/item/weapon/crowbar/C)
+ if(!istype(C))
+ return 0
+ if(!panel_open)
+ return 0
+ . = dismantle()
+
+/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S)
+ if(!istype(S))
+ return 0
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ panel_open = !panel_open
+ user << "You [panel_open ? "open" : "close"] the maintenance hatch of [src]."
+ update_icon()
+ return 1
+
+/obj/machinery/proc/default_part_replacement(var/mob/user, var/obj/item/weapon/storage/part_replacer/R)
+ if(!istype(R))
+ return 0
+ if(!component_parts)
+ return 0
+ if(panel_open)
+ var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts
+ var/P
+ for(var/obj/item/weapon/stock_parts/A in component_parts)
+ for(var/D in CB.req_components)
+ var/T = text2path(D)
+ if(ispath(A.type, T))
+ P = T
+ break
+ for(var/obj/item/weapon/stock_parts/B in R.contents)
+ if(istype(B, P) && istype(A, P))
+ if(B.rating > A.rating)
+ R.remove_from_storage(B, src)
+ R.handle_item_insertion(A, 1)
+ component_parts -= A
+ component_parts += B
+ B.loc = null
+ user << "[A.name] replaced with [B.name]."
+ break
+ update_icon()
+ RefreshParts()
+ else
+ user << "Following parts detected in the machine:"
+ for(var/var/obj/item/C in component_parts)
+ user << " [C.name]"
+ return 1
+
/obj/machinery/proc/dismantle()
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 3049a6f694..63abf6bfbf 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/objects.dmi'
icon_state = "borgcharger0"
density = 1
- anchored = 1.0
+ anchored = 1
use_power = 1
idle_power_usage = 50
active_power_usage = 50
@@ -13,177 +13,216 @@
var/charging_cap_active = 25000 // Active Cap - When cyborg is inside
var/charging_cap_passive = 2500 // Passive Cap - Recharging internal capacitor when no cyborg is inside
var/icon_update_tick = 0 // Used to update icon only once every 10 ticks
+ var/charge_rate = 250 // How much charge is restored per tick
+ var/weld_rate = 0 // How much brute damage is repaired per tick
+ var/wire_rate = 0 // How much burn damage is repaired per tick
+/obj/machinery/recharge_station/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/recharge_station(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 5)
- New()
- ..()
- build_icon()
- update_icon()
+ build_icon()
+ update_icon()
- process()
- if(stat & (BROKEN))
- return
+ RefreshParts()
- if((stat & (NOPOWER)) && !current_internal_charge) // No Power.
- return
-
- var/chargemode = 0
- if(src.occupant)
- process_occupant()
- chargemode = 1
- // Power Stuff
-
- if(stat & NOPOWER)
- current_internal_charge = max(0, (current_internal_charge - (50 * CELLRATE))) // Internal Circuitry, 50W load. No power - Runs from internal cell
- return // No external power = No charging
-
-
-
- if(max_internal_charge < current_internal_charge)
- current_internal_charge = max_internal_charge// Safety check if varedit adminbus or something screws up
- // Calculating amount of power to draw
- var/charge_diff = max_internal_charge - current_internal_charge // OK we have charge differences
- charge_diff = charge_diff / CELLRATE // Deconvert from Charge to Joules
- if(chargemode) // Decide if use passive or active power
- charge_diff = between(0, charge_diff, charging_cap_active) // Trim the values to limits
- else // We should have load for this tick in Watts
- charge_diff = between(0, charge_diff, charging_cap_passive)
-
- charge_diff += 50 // 50W for circuitry
-
- if(idle_power_usage != charge_diff) // Force update, but only when our power usage changed this tick.
- idle_power_usage = charge_diff
- update_use_power(1,1)
-
- current_internal_charge = min((current_internal_charge + ((charge_diff - 50) * CELLRATE)), max_internal_charge)
-
- if(icon_update_tick >= 10)
- update_icon()
- icon_update_tick = 0
- else
- icon_update_tick++
-
- return 1
-
-
- allow_drop()
- return 0
-
- examine(mob/user)
- ..(user)
- user << "The charge meter reads: [round(chargepercentage())]%"
-
- proc/chargepercentage()
- return ((current_internal_charge / max_internal_charge) * 100)
-
- relaymove(mob/user as mob)
- if(user.stat)
- return
- src.go_out()
+/obj/machinery/recharge_station/process()
+ if(stat & (BROKEN))
return
- emp_act(severity)
- if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
- if(occupant)
- occupant.emp_act(severity)
- go_out()
- ..(severity)
-
- update_icon()
- ..()
- overlays.Cut()
- switch(round(chargepercentage()))
- if(1 to 20)
- overlays += image('icons/obj/objects.dmi', "statn_c0")
- if(21 to 40)
- overlays += image('icons/obj/objects.dmi', "statn_c20")
- if(41 to 60)
- overlays += image('icons/obj/objects.dmi', "statn_c40")
- if(61 to 80)
- overlays += image('icons/obj/objects.dmi', "statn_c60")
- if(81 to 98)
- overlays += image('icons/obj/objects.dmi', "statn_c80")
- if(99 to 110)
- overlays += image('icons/obj/objects.dmi', "statn_c100")
-
- proc
- build_icon()
- if(NOPOWER|BROKEN)
- if(src.occupant)
- icon_state = "borgcharger1"
- else
- icon_state = "borgcharger0"
- else
- icon_state = "borgcharger0"
+ if((stat & (NOPOWER)) && !current_internal_charge) // No Power.
+ return
+ var/chargemode = 0
+ if(occupant)
process_occupant()
- if(src.occupant)
- if (istype(occupant, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = occupant
- if(R.module)
- R.module.respawn_consumable(R)
- if(!R.cell)
- return
- if(!R.cell.fully_charged())
- var/diff = min(R.cell.maxcharge - R.cell.charge, 250) // Capped at 250 charge / tick
- diff = min(diff, current_internal_charge) // No over-discharging
- R.cell.give(diff)
- current_internal_charge -= diff
- else
- update_use_power(1)
+ chargemode = 1
+ // Power Stuff
+
+ if(stat & NOPOWER)
+ current_internal_charge = max(0, (current_internal_charge - (50 * CELLRATE))) // Internal Circuitry, 50W load. No power - Runs from internal cell
+ return // No external power = No charging
+
+ if(max_internal_charge < current_internal_charge)
+ current_internal_charge = max_internal_charge// Safety check if varedit adminbus or something screws up
+ // Calculating amount of power to draw
+ var/charge_diff = max_internal_charge - current_internal_charge // OK we have charge differences
+ charge_diff = charge_diff / CELLRATE // Deconvert from Charge to Joules
+ if(chargemode) // Decide if use passive or active power
+ charge_diff = between(0, charge_diff, charging_cap_active) // Trim the values to limits
+ else // We should have load for this tick in Watts
+ charge_diff = between(0, charge_diff, charging_cap_passive)
+
+ charge_diff += 50 // 50W for circuitry
+
+ if(idle_power_usage != charge_diff) // Force update, but only when our power usage changed this tick.
+ idle_power_usage = charge_diff
+ update_use_power(1, 1)
+
+ current_internal_charge = min((current_internal_charge + ((charge_diff - 50) * CELLRATE)), max_internal_charge)
+
+ if(icon_update_tick >= 10)
+ update_icon()
+ icon_update_tick = 0
+ else
+ icon_update_tick++
+
+ return 1
+
+
+/obj/machinery/recharge_station/allow_drop()
+ return 0
+
+/obj/machinery/recharge_station/examine(mob/user)
+ ..(user)
+ user << "The charge meter reads: [round(chargepercentage())]%"
+
+/obj/machinery/recharge_station/proc/chargepercentage()
+ return ((current_internal_charge / max_internal_charge) * 100)
+
+/obj/machinery/recharge_station/relaymove(mob/user as mob)
+ if(user.stat)
+ return
+ go_out()
+ return
+
+/obj/machinery/recharge_station/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+ if(occupant)
+ occupant.emp_act(severity)
go_out()
- if(!( src.occupant ))
- return
- //for(var/obj/O in src)
- // O.loc = src.loc
- if (src.occupant.client)
- src.occupant.client.eye = src.occupant.client.mob
- src.occupant.client.perspective = MOB_PERSPECTIVE
- src.occupant.loc = src.loc
- src.occupant = null
- build_icon()
- update_use_power(1)
+ ..(severity)
+
+/obj/machinery/recharge_station/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(!occupant)
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
return
+ ..()
- verb
- move_eject()
- set category = "Object"
- set src in oview(1)
- if (usr.stat != 0)
- return
- src.go_out()
- add_fingerprint(usr)
- return
+/obj/machinery/recharge_station/RefreshParts()
+ ..()
+ var/man_rating = 0
+ var/cap_rating = 0
- move_inside()
- set category = "Object"
- set src in oview(1)
- if (usr.stat == 2)
- //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO
+ for(var/obj/item/weapon/stock_parts/P in component_parts)
+ if(istype(P, /obj/item/weapon/stock_parts/capacitor))
+ cap_rating += P.rating
+ if(istype(P, /obj/item/weapon/stock_parts/manipulator))
+ man_rating += P.rating
+
+ charge_rate = 125 * cap_rating
+ weld_rate = max(0, man_rating - 3)
+ wire_rate = max(0, man_rating - 5)
+
+/obj/machinery/recharge_station/update_icon()
+ ..()
+ overlays.Cut()
+ switch(round(chargepercentage()))
+ if(1 to 20)
+ overlays += image('icons/obj/objects.dmi', "statn_c0")
+ if(21 to 40)
+ overlays += image('icons/obj/objects.dmi', "statn_c20")
+ if(41 to 60)
+ overlays += image('icons/obj/objects.dmi', "statn_c40")
+ if(61 to 80)
+ overlays += image('icons/obj/objects.dmi', "statn_c60")
+ if(81 to 98)
+ overlays += image('icons/obj/objects.dmi', "statn_c80")
+ if(99 to 110)
+ overlays += image('icons/obj/objects.dmi', "statn_c100")
+
+
+/obj/machinery/recharge_station/proc/build_icon()
+ if(NOPOWER|BROKEN)
+ if(occupant)
+ icon_state = "borgcharger1"
+ else
+ icon_state = "borgcharger0"
+ else
+ icon_state = "borgcharger0"
+
+/obj/machinery/recharge_station/proc/process_occupant()
+ if(occupant)
+ if(istype(occupant, /mob/living/silicon/robot))
+ var/mob/living/silicon/robot/R = occupant
+ if(R.module)
+ R.module.respawn_consumable(R)
+ if(!R.cell)
return
- if (!(istype(usr, /mob/living/silicon/)))
- usr << "\blue Only non-organics may enter the recharger!"
- return
- if (src.occupant)
- usr << "\blue The cell is already occupied!"
- return
- if (!usr:cell)
- usr<<"\blue Without a powercell, you can't be recharged."
- //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO
- return
- usr.stop_pulling()
- if(usr && usr.client)
- usr.client.perspective = EYE_PERSPECTIVE
- usr.client.eye = src
- usr.loc = src
- src.occupant = usr
- /*for(var/obj/O in src)
- O.loc = src.loc*/
- src.add_fingerprint(usr)
- build_icon()
- update_use_power(1)
- return
\ No newline at end of file
+ if(!R.cell.fully_charged())
+ var/diff = min(R.cell.maxcharge - R.cell.charge, charge_rate) // Capped at charge_rate charge / tick
+ diff = min(diff, current_internal_charge) // No over-discharging
+ R.cell.give(diff)
+ current_internal_charge -= diff
+ if(weld_rate && R.getBruteLoss())
+ R.adjustBruteLoss(-1)
+ if(wire_rate && R.getFireLoss())
+ R.adjustFireLoss(-1)
+ else
+ update_use_power(1)
+
+/obj/machinery/recharge_station/proc/go_out()
+ if(!(occupant))
+ return
+ //for(var/obj/O in src)
+ // O.loc = loc
+ if(occupant.client)
+ occupant.client.eye = occupant.client.mob
+ occupant.client.perspective = MOB_PERSPECTIVE
+ occupant.loc = loc
+ occupant = null
+ build_icon()
+ update_use_power(1)
+ return
+
+/obj/machinery/recharge_station/verb/move_eject()
+ set category = "Object"
+ set src in oview(1)
+ if(usr.stat != 0)
+ return
+ go_out()
+ add_fingerprint(usr)
+ return
+
+/obj/machinery/recharge_station/verb/move_inside()
+ set category = "Object"
+ set src in oview(1)
+ if(usr.stat == 2)
+ //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO
+ return
+ if(!(istype(usr, /mob/living/silicon/)))
+ usr << "Only non-organics may enter the recharger!"
+ return
+ if(occupant)
+ usr << "The cell is already occupied!"
+ return
+ if(!usr:cell)
+ usr << "Without a powercell, you can't be recharged."
+ //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO
+ return
+ usr.stop_pulling()
+ if(usr && usr.client)
+ usr.client.perspective = EYE_PERSPECTIVE
+ usr.client.eye = src
+ usr.loc = src
+ occupant = usr
+ /*for(var/obj/O in src)
+ O.loc = loc*/
+ add_fingerprint(usr)
+ build_icon()
+ update_use_power(1)
+ return
\ No newline at end of file
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index ab4967d04e..c5d389c66e 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -7,7 +7,6 @@
desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
var/obj/item/weapon/cell/cell
var/on = 0
- var/open = 0
var/set_temperature = T0C + 50 //K
var/heating_power = 40000
@@ -20,14 +19,14 @@
/obj/machinery/space_heater/update_icon()
overlays.Cut()
icon_state = "sheater[on]"
- if(open)
+ if(panel_open)
overlays += "sheater-open"
/obj/machinery/space_heater/examine(mob/user)
..(user)
- user << "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"]."
- if(open)
+ user << "The heater is [on ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"]."
+ if(panel_open)
user << "The power cell is [cell ? "installed" : "missing"]."
else
user << "The charge meter reads [cell ? round(cell.percent(),1) : 0]%"
@@ -43,7 +42,7 @@
/obj/machinery/space_heater/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/cell))
- if(open)
+ if(panel_open)
if(cell)
user << "There is already a power cell inside."
return
@@ -61,10 +60,10 @@
user << "The hatch must be open to insert a power cell."
return
else if(istype(I, /obj/item/weapon/screwdriver))
- open = !open
- user.visible_message("\blue [user] [open ? "opens" : "closes"] the hatch on the [src].", "\blue You [open ? "open" : "close"] the hatch on the [src].")
+ panel_open = !panel_open
+ user.visible_message("\blue [user] [panel_open ? "opens" : "closes"] the hatch on the [src].", "\blue You [panel_open ? "open" : "close"] the hatch on the [src].")
update_icon()
- if(!open && user.machine == src)
+ if(!panel_open && user.machine == src)
user << browse(null, "window=spaceheater")
user.unset_machine()
else
@@ -77,7 +76,7 @@
/obj/machinery/space_heater/interact(mob/user as mob)
- if(open)
+ if(panel_open)
var/dat
dat = "Power cell: "
@@ -120,7 +119,7 @@
set_temperature = dd_range(T0C, T0C + 90, set_temperature + value)
if("cellremove")
- if(open && cell && !usr.get_active_hand())
+ if(panel_open && cell && !usr.get_active_hand())
usr.visible_message("\blue [usr] removes \the [cell] from \the [src].", "\blue You remove \the [cell] from \the [src].")
cell.updateicon()
usr.put_in_hands(cell)
@@ -129,7 +128,7 @@
if("cellinstall")
- if(open && !cell)
+ if(panel_open && !cell)
var/obj/item/weapon/cell/C = usr.get_active_hand()
if(istype(C))
usr.drop_item()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 4bf1c07abc..f8ae293bba 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -589,7 +589,6 @@
var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing phoron.
var/model_text = "" // Some flavour text for the topic box.
var/locked = 1 // If locked, nothing can be taken from or added to the cycler.
- var/panel_open = 0 // Hacking!
var/can_repair // If set, the cycler can repair voidsuits.
var/electrified = 0
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 26f1c620c7..7d7ee3113d 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -54,7 +54,6 @@
var/shoot_inventory = 0 //Fire items at customers! We're broken!
var/shut_up = 1 //Stop spouting those godawful pitches!
var/extended_inventory = 0 //can we access the hidden inventory?
- var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar.
var/scan_id = 1
var/obj/item/weapon/coin/coin
var/datum/wires/vending/wires = null
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
new file mode 100644
index 0000000000..c01893b158
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
@@ -0,0 +1,13 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
+/obj/item/weapon/circuitboard/biogenerator
+ name = T_BOARD("biogenerator")
+ build_path = "/obj/machinery/biogenerator"
+ board_type = "machine"
+ origin_tech = "programming=2"
+ frame_desc = "Requires 1 Manipulator, and 1 Matter Bin."
+ req_components = list(
+ "/obj/item/weapon/stock_parts/matter_bin" = 1,
+ "/obj/item/weapon/stock_parts/manipulator" = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
new file mode 100644
index 0000000000..6018d4c2bf
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
@@ -0,0 +1,14 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
+/obj/item/weapon/circuitboard/recharge_station
+ name = T_BOARD("cyborg recharging station")
+ build_path = "/obj/machinery/recharge_station"
+ board_type = "machine"
+ origin_tech = "programming=3;engineering=3"
+ frame_desc = "Requires 2 Manipulator, 2 Capacitor, and 5 pieces of cable."
+ req_components = list(
+ "/obj/item/stack/cable_coil" = 5,
+ "/obj/item/weapon/stock_parts/capacitor" = 2,
+ "/obj/item/weapon/stock_parts/manipulator" = 2)
\ No newline at end of file
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 263f797a95..4afd4f0e44 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -11,66 +11,80 @@
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/points = 0
var/menustat = "menu"
+ var/build_eff = 1
+ var/eat_eff = 1
- New()
- ..()
- var/datum/reagents/R = new/datum/reagents(1000)
- reagents = R
- R.my_atom = src
- beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
+/obj/machinery/biogenerator/New()
+ ..()
+ var/datum/reagents/R = new/datum/reagents(1000)
+ reagents = R
+ R.my_atom = src
+ beaker = new /obj/item/weapon/reagent_containers/glass/bottle(src)
- on_reagent_change() //When the reagents change, change the icon as well.
- update_icon()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/biogenerator(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ RefreshParts()
+
+/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
update_icon()
- if(!src.beaker)
- icon_state = "biogen-empty"
- else if(!src.processing)
- icon_state = "biogen-stand"
- else
- icon_state = "biogen-work"
- return
+
+/obj/machinery/biogenerator/update_icon()
+ if(!beaker)
+ icon_state = "biogen-empty"
+ else if(!processing)
+ icon_state = "biogen-stand"
+ else
+ icon_state = "biogen-work"
+ return
/obj/machinery/biogenerator/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
+ return
if(istype(O, /obj/item/weapon/reagent_containers/glass))
if(beaker)
- user << "\red The biogenerator is already loaded."
+ user << "]The [src] is already loaded."
else
user.before_take_item(O)
O.loc = src
beaker = O
updateUsrDialog()
else if(processing)
- user << "\red The biogenerator is currently processing."
+ user << "\The [src] is currently processing."
else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
- user << "\red The biogenerator is already full! Activate it."
+ user << "\The [src] is already full! Activate it."
else
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
G.loc = src
i++
if(i >= 10)
- user << "\blue You fill the biogenerator to its capacity."
+ user << "You fill \the [src] to its capacity."
break
- if(i<10)
- user << "\blue You empty the plant bag into the biogenerator."
-
+ if(i < 10)
+ user << "You empty \the [O] into \the [src]."
else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- user << "\red You cannot put this in [src.name]"
+ user << "You cannot put this in \the [src]."
else
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
- user << "\red The biogenerator is full! Activate it."
+ user << "\The [src] is full! Activate it."
else
user.before_take_item(O)
O.loc = src
- user << "\blue You put [O.name] in [src.name]"
+ user << "You put \the [O] in \the [src]"
update_icon()
return
@@ -89,18 +103,18 @@
dat += "Activate Biogenerator!
"
dat += "Detach Container
"
dat += "Food
"
- dat += "10 milk (20)
"
- dat += "Slab of meat (50)
"
+ dat += "10 milk ([round(20/build_eff)])
"
+ dat += "Slab of meat ([round(50/build_eff)])
"
dat += "Nutrient
"
- dat += "E-Z-Nutrient (10) | x5
"
- dat += "Left 4 Zed (20) | x5
"
- dat += "Robust Harvest (25) | x5
"
+ dat += "E-Z-Nutrient ([round(10/build_eff)]) | x5
"
+ dat += "Left 4 Zed ([round(20/build_eff)]) | x5
"
+ dat += "Robust Harvest ([round(25/build_eff)]) | x5
"
dat += "Leather
"
- dat += "Wallet (100)
"
- dat += "Botanical gloves (250)
"
- dat += "Utility belt (300)
"
- dat += "Leather Satchel (400)
"
- dat += "Cash Bag (400)
"
+ dat += "Wallet ([round(100/build_eff)])
"
+ dat += "Botanical gloves ([round(250/build_eff)])
"
+ dat += "Utility belt ([round(300/build_eff)])
"
+ dat += "Leather Satchel ([round(400/build_eff)])
"
+ dat += "Cash Bag ([round(400/build_eff)])
"
//dat += "Other
"
//dat += "Monkey (500)
"
else
@@ -122,34 +136,35 @@
interact(user)
/obj/machinery/biogenerator/proc/activate()
- if (usr.stat != 0)
+ if (usr.stat)
return
- if (src.stat != 0) //NOPOWER etc
+ if (stat) //NOPOWER etc
return
- if(src.processing)
- usr << "\red The biogenerator is in the process of working."
+ if(processing)
+ usr << "The biogenerator is in the process of working."
return
var/S = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents)
S += 5
if(I.reagents.get_reagent_amount("nutriment") < 0.1)
points += 1
- else points += I.reagents.get_reagent_amount("nutriment")*10
+ else points += I.reagents.get_reagent_amount("nutriment") * 10 * eat_eff
del(I)
if(S)
processing = 1
update_icon()
updateUsrDialog()
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
- use_power(S*30)
- sleep(S+15)
+ use_power(S * 30)
+ sleep((S + 15) / eat_eff)
processing = 0
update_icon()
else
menustat = "void"
return
-/obj/machinery/biogenerator/proc/create_product(var/item,var/cost)
+/obj/machinery/biogenerator/proc/create_product(var/item, var/cost)
+ cost = round(cost/build_eff)
if(cost > points)
menustat = "nopoints"
return 0
@@ -160,45 +175,45 @@
sleep(30)
switch(item)
if("milk")
- beaker.reagents.add_reagent("milk",10)
+ beaker.reagents.add_reagent("milk", 10)
if("meat")
- new/obj/item/weapon/reagent_containers/food/snacks/meat(src.loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
if("ez")
- new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(loc)
if("l4z")
- new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(loc)
if("rh")
- new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(loc)
if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan
- new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(loc)
if("l4z5")
- new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(loc)
if("rh5")
- new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
- new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(loc)
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(loc)
if("wallet")
- new/obj/item/weapon/storage/wallet(src.loc)
+ new/obj/item/weapon/storage/wallet(loc)
if("gloves")
- new/obj/item/clothing/gloves/botanic_leather(src.loc)
+ new/obj/item/clothing/gloves/botanic_leather(loc)
if("tbelt")
- new/obj/item/weapon/storage/belt/utility(src.loc)
+ new/obj/item/weapon/storage/belt/utility(loc)
if("satchel")
- new/obj/item/weapon/storage/backpack/satchel(src.loc)
+ new/obj/item/weapon/storage/backpack/satchel(loc)
if("cashbag")
- new/obj/item/weapon/storage/bag/cash(src.loc)
+ new/obj/item/weapon/storage/bag/cash(loc)
if("monkey")
- new/mob/living/carbon/monkey(src.loc)
+ new/mob/living/carbon/monkey(loc)
processing = 0
menustat = "complete"
update_icon()
@@ -220,7 +235,21 @@
beaker = null
update_icon()
if("create")
- create_product(href_list["item"],text2num(href_list["cost"]))
+ create_product(href_list["item"], text2num(href_list["cost"]))
if("menu")
menustat = "menu"
updateUsrDialog()
+
+/obj/machinery/biogenerator/RefreshParts()
+ ..()
+ var/man_rating = 0
+ var/bin_rating = 0
+
+ for(var/obj/item/weapon/stock_parts/P in component_parts)
+ if(istype(P, /obj/item/weapon/stock_parts/matter_bin))
+ bin_rating += P.rating
+ if(istype(P, /obj/item/weapon/stock_parts/manipulator))
+ man_rating += P.rating
+
+ build_eff = man_rating
+ eat_eff = bin_rating
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index e64504cf51..a16e5653a9 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -14,138 +14,136 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
var/diamond_amount = 0
var/uranium_amount = 0
var/max_material_amount = 75000.0
+ var/mat_efficiency = 1
use_power = 1
idle_power_usage = 30
active_power_usage = 2500
- New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/circuit_imprinter(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
- RefreshParts()
-
+/obj/machinery/r_n_d/circuit_imprinter/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/circuit_imprinter(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
RefreshParts()
- var/T = 0
- for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
- T += G.reagents.maximum_volume
- var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials.
- reagents = R
- R.my_atom = src
- T = 0
- for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
- T += M.rating
- max_material_amount = T * 75000.0
+/obj/machinery/r_n_d/circuit_imprinter/RefreshParts()
+ var/T = 0
+ for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
+ T += G.reagents.maximum_volume
+ var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials.
+ reagents = R
+ R.my_atom = src
+ T = 0
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ T += M.rating
+ max_material_amount = T * 75000.0
+ T = 0
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ T += M.rating
+ mat_efficiency = 1 - (T - 1) / 4
- blob_act()
- if (prob(50))
- del(src)
+/obj/machinery/r_n_d/circuit_imprinter/update_icon()
+ if(panel_open)
+ icon_state = "circuit_imprinter_t"
+ else
+ icon_state = "circuit_imprinter"
- meteorhit()
+/obj/machinery/r_n_d/circuit_imprinter/blob_act()
+ if(prob(50))
del(src)
+
+/obj/machinery/r_n_d/circuit_imprinter/meteorhit()
+ del(src)
+ return
+
+/obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials()
+ return g_amount + gold_amount + diamond_amount + uranium_amount
+
+/obj/machinery/r_n_d/circuit_imprinter/dismantle()
+ for(var/obj/I in component_parts)
+ if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
+ reagents.trans_to(I, reagents.total_volume)
+ if(g_amount >= 3750)
+ var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(loc)
+ G.amount = round(g_amount / 3750)
+ if(gold_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(loc)
+ G.amount = round(gold_amount / 2000)
+ if(diamond_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(loc)
+ G.amount = round(diamond_amount / 2000)
+ if(uranium_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(loc)
+ G.amount = round(uranium_amount / 2000)
+ ..()
+
+/obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(shocked)
+ shock(user, 50)
+ if(default_deconstruction_screwdriver(user, O))
+ if(linked_console)
+ linked_console.linked_imprinter = null
+ linked_console = null
return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
+ return
+ if(panel_open)
+ user << "You can't load \the [src] while it's opened."
+ return 1
+ if(disabled)
+ user << "\The [src] appears to not be working!"
+ return
+ if(!linked_console)
+ user << "\The [src] must be linked to an R&D console first!"
+ return 1
+ if(O.is_open_container())
+ return 0
+ if(!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond) && !istype(O, /obj/item/stack/sheet/mineral/uranium))
+ user << "You cannot insert this item into \the [src]!"
+ return 1
+ if(stat)
+ return 1
+ if(busy)
+ user << "\The [src] is busy. Please wait for completion of previous operation."
+ return 1
+ var/obj/item/stack/sheet/stack = O
+ if((TotalMaterials() + stack.perunit) > max_material_amount)
+ user << "\The [src] is full. Please remove glass from \the [src] in order to insert more."
+ return 1
- proc/TotalMaterials()
- return g_amount + gold_amount + diamond_amount + uranium_amount
+ var/amount = round(input("How many sheets do you want to add?") as num)
+ if(amount < 0)
+ amount = 0
+ if(amount == 0)
+ return
+ if(amount > stack.amount)
+ amount = min(stack.amount, round((max_material_amount - TotalMaterials()) / stack.perunit))
- attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (shocked)
- shock(user,50)
- if (istype(O, /obj/item/weapon/screwdriver))
- if (!opened)
- opened = 1
- if(linked_console)
- linked_console.linked_imprinter = null
- linked_console = null
- icon_state = "circuit_imprinter_t"
- user << "You open the maintenance hatch of [src]."
- else
- opened = 0
- icon_state = "circuit_imprinter"
- user << "You close the maintenance hatch of [src]."
- return
- if (opened)
- if(istype(O, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
- reagents.trans_to(I, reagents.total_volume)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
- I.loc = src.loc
- if(g_amount >= 3750)
- var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc)
- G.amount = round(g_amount / 3750)
- if(gold_amount >= 2000)
- var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc)
- G.amount = round(gold_amount / 2000)
- if(diamond_amount >= 2000)
- var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc)
- G.amount = round(diamond_amount / 2000)
- if(uranium_amount >= 2000)
- var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(src.loc)
- G.amount = round(uranium_amount / 2000)
- del(src)
- return 1
- else
- user << "\red You can't load the [src.name] while it's opened."
- return 1
- if (disabled)
- user << "\The [name] appears to not be working!"
- return
- if (!linked_console)
- user << "\The [name] must be linked to an R&D console first!"
- return 1
- if (O.is_open_container())
- return 0
- if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond) && !istype(O, /obj/item/stack/sheet/mineral/uranium))
- user << "\red You cannot insert this item into the [name]!"
- return 1
- if (stat)
- return 1
- if (busy)
- user << "\red The [name] is busy. Please wait for completion of previous operation."
- return 1
- var/obj/item/stack/sheet/stack = O
- if ((TotalMaterials() + stack.perunit) > max_material_amount)
- user << "\red The [name] is full. Please remove glass from the protolathe in order to insert more."
- return 1
-
- var/amount = round(input("How many sheets do you want to add?") as num)
- if(amount < 0)
- amount = 0
- if(amount == 0)
- return
- if(amount > stack.amount)
- amount = min(stack.amount, round((max_material_amount-TotalMaterials())/stack.perunit))
-
- busy = 1
- use_power(max(1000, (3750*amount/10)))
- var/stacktype = stack.type
- stack.use(amount)
- if(do_after(usr,16))
- user << "\blue You add [amount] sheets to the [src.name]."
- switch(stacktype)
- if(/obj/item/stack/sheet/glass)
- g_amount += amount * 3750
- if(/obj/item/stack/sheet/mineral/gold)
- gold_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/diamond)
- diamond_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/uranium)
- uranium_amount += amount * 2000
- else
- new stacktype(src.loc, amount)
- busy = 0
- src.updateUsrDialog()
+ busy = 1
+ use_power(max(1000, (3750 * amount / 10)))
+ var/stacktype = stack.type
+ stack.use(amount)
+ if(do_after(usr, 16))
+ user << "You add [amount] sheets to \the [src]."
+ switch(stacktype)
+ if(/obj/item/stack/sheet/glass)
+ g_amount += amount * 3750
+ if(/obj/item/stack/sheet/mineral/gold)
+ gold_amount += amount * 2000
+ if(/obj/item/stack/sheet/mineral/diamond)
+ diamond_amount += amount * 2000
+ if(/obj/item/stack/sheet/mineral/uranium)
+ uranium_amount += amount * 2000
+ else
+ new stacktype(loc, amount)
+ busy = 0
+ updateUsrDialog()
//This is to stop these machines being hackable via clicking.
/obj/machinery/r_n_d/circuit_imprinter/attack_hand(mob/user as mob)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 40de21081d..e04618cf20 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -760,6 +760,14 @@ datum/design/item/stock_part/AssembleDesignDesc()
if(!desc)
desc = "A stock part used in the construction of various devices."
+/datum/design/item/stock_part/RPED
+ name = "Rapid Part Exchange Device"
+ desc = "Special mechanical module made to store, sort, and apply standard machine parts."
+ id = "rped"
+ req_tech = list("engineering" = 3, "materials" = 3)
+ materials = list("$metal" = 15000, "$glass" = 5000)
+ build_path = /obj/item/weapon/storage/part_replacer
+
datum/design/item/stock_part/basic_capacitor
build_type = PROTOLATHE | AUTOLATHE
id = "basic_capacitor"
@@ -971,6 +979,18 @@ datum/design/circuit/secure_airlock
req_tech = list("programming" = 3)
build_path = /obj/item/weapon/airlock_electronics/secure
+datum/design/circuit/biogenerator
+ name = "biogenerator"
+ id = "biogenerator"
+ req_tech = list("programming" = 2)
+ build_path = /obj/item/weapon/circuitboard/biogenerator
+
+datum/design/circuit/recharge_station
+ name = "cyborg recharge station"
+ id = "recharge_station"
+ req_tech = list("programming" = 3, "engineering" = 2)
+ build_path = /obj/item/weapon/circuitboard/recharge_station
+
/////////////////////////////////////////
////////Power Stuff Circuitboards////////
/////////////////////////////////////////
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index aef24dd8be..7b7445f099 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -12,6 +12,7 @@ Note: Must be placed within 3 tiles of the R&D Console
icon_state = "d_analyzer"
var/obj/item/weapon/loaded_item = null
var/decon_mod = 1
+ var/min_reliability = 90
use_power = 1
idle_power_usage = 30
@@ -29,9 +30,9 @@ Note: Must be placed within 3 tiles of the R&D Console
/obj/machinery/r_n_d/destructive_analyzer/RefreshParts()
var/T = 0
for(var/obj/item/weapon/stock_parts/S in src)
- T += S.rating * 0.1
- T = between (0, T, 1)
- decon_mod = T
+ T += S.rating
+ decon_mod = T * 0.1
+ min_reliability = 93 - T
/obj/machinery/r_n_d/destructive_analyzer/meteorhit()
del(src)
@@ -43,65 +44,58 @@ Note: Must be placed within 3 tiles of the R&D Console
temp_list[O] = text2num(temp_list[O])
return temp_list
+/obj/machinery/r_n_d/destructive_analyzer/update_icon()
+ if(panel_open)
+ icon_state = "d_analyzer_t"
+ else if(loaded_item)
+ icon_state = "d_analyzer_l"
+ else
+ icon_state = "d_analyzer"
/obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/O as obj, var/mob/user as mob)
- if (shocked)
- shock(user,50)
- if (istype(O, /obj/item/weapon/screwdriver))
- if (!opened)
- opened = 1
- if(linked_console)
- linked_console.linked_destroy = null
- linked_console = null
- icon_state = "d_analyzer_t"
- user << "You open the maintenance hatch of [src]."
- else
- opened = 0
- icon_state = "d_analyzer"
- user << "You close the maintenance hatch of [src]."
+ if(shocked)
+ shock(user, 50)
+ if(default_deconstruction_screwdriver(user, O))
+ if(linked_console)
+ linked_console.linked_destroy = null
+ linked_console = null
return
- if (opened)
- if(istype(O, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- I.loc = src.loc
- del(src)
- return 1
- else
- user << "\red You can't load the [src.name] while it's opened."
- return 1
- if (disabled)
+ if(default_deconstruction_crowbar(user, O))
return
- if (!linked_console)
- user << "\red The destructive analyzer must be linked to an R&D console first!"
+ if(default_part_replacement(user, O))
return
- if (busy)
- user << "\red The destructive analyzer is busy right now."
+ if(panel_open)
+ user << "You can't load \the [src] while it's opened."
+ return 1
+ if(disabled)
return
- if (istype(O, /obj/item) && !loaded_item)
+ if(!linked_console)
+ user << "\The [src] must be linked to an R&D console first!"
+ return
+ if(busy)
+ user << "\The [src] is busy right now."
+ return
+ if(istype(O, /obj/item) && !loaded_item)
if(isrobot(user)) //Don't put your module items in there!
return
if(!O.origin_tech)
- user << "\red This doesn't seem to have a tech origin!"
+ user << "This doesn't seem to have a tech origin!"
return
var/list/temp_tech = ConvertReqString2List(O.origin_tech)
- if (temp_tech.len == 0)
- user << "\red You cannot deconstruct this item!"
+ if(temp_tech.len == 0)
+ user << "You cannot deconstruct this item!"
return
- if(O.reliability < 90 && O.crit_fail == 0)
- usr << "\red Item is neither reliable enough nor broken enough to learn from."
+ if(O.reliability < min_reliability && O.crit_fail == 0)
+ usr << "Item is neither reliable enough nor broken enough to learn from."
return
busy = 1
loaded_item = O
user.drop_item()
O.loc = src
- user << "\blue You add the [O.name] to the machine!"
+ user << "You add \the [O] to \the [src]!"
flick("d_analyzer_la", src)
spawn(10)
- icon_state = "d_analyzer_l"
+ update_icon()
busy = 0
return 1
return
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index f23176de96..22df4b82dd 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -25,6 +25,8 @@ Note: Must be placed west/left of and R&D console to function.
var/uranium_amount = 0.0
var/diamond_amount = 0.0
+ var/mat_efficiency = 1
+
/obj/machinery/r_n_d/protolathe/New()
..()
component_parts = list()
@@ -51,80 +53,78 @@ Note: Must be placed west/left of and R&D console to function.
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
T += M.rating
max_material_storage = T * 75000
+ T = 0
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ T += M.rating
+ mat_efficiency = 1 - (T - 2) / 8
+
+/obj/machinery/r_n_d/protolathe/dismantle()
+ for(var/obj/I in component_parts)
+ if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
+ reagents.trans_to(I, reagents.total_volume)
+ if(m_amount >= 3750)
+ var/obj/item/stack/sheet/metal/G = new /obj/item/stack/sheet/metal(loc)
+ G.amount = round(m_amount / G.perunit)
+ if(g_amount >= 3750)
+ var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(loc)
+ G.amount = round(g_amount / G.perunit)
+ if(phoron_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/phoron/G = new /obj/item/stack/sheet/mineral/phoron(loc)
+ G.amount = round(phoron_amount / G.perunit)
+ if(silver_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/silver/G = new /obj/item/stack/sheet/mineral/silver(loc)
+ G.amount = round(silver_amount / G.perunit)
+ if(gold_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(loc)
+ G.amount = round(gold_amount / G.perunit)
+ if(uranium_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(loc)
+ G.amount = round(uranium_amount / G.perunit)
+ if(diamond_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(loc)
+ G.amount = round(diamond_amount / G.perunit)
+ ..()
+
+/obj/machinery/r_n_d/protolathe/update_icon()
+ if(panel_open)
+ icon_state = "protolathe_t"
+ else
+ icon_state = "protolathe"
/obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (shocked)
- shock(user,50)
- if (O.is_open_container())
- return 1
- if (istype(O, /obj/item/weapon/screwdriver))
- if (!opened)
- opened = 1
- if(linked_console)
- linked_console.linked_lathe = null
- linked_console = null
- icon_state = "protolathe_t"
- user << "You open the maintenance hatch of [src]."
- else
- opened = 0
- icon_state = "protolathe"
- user << "You close the maintenance hatch of [src]."
+ if(shocked)
+ shock(user, 50)
+ if(default_deconstruction_screwdriver(user, O))
+ if(linked_console)
+ linked_console.linked_lathe = null
+ linked_console = null
return
- if (opened)
- if(istype(O, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
- reagents.trans_to(I, reagents.total_volume)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
- I.loc = src.loc
- if(m_amount >= 3750)
- var/obj/item/stack/sheet/metal/G = new /obj/item/stack/sheet/metal(src.loc)
- G.amount = round(m_amount / G.perunit)
- if(g_amount >= 3750)
- var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc)
- G.amount = round(g_amount / G.perunit)
- if(phoron_amount >= 2000)
- var/obj/item/stack/sheet/mineral/phoron/G = new /obj/item/stack/sheet/mineral/phoron(src.loc)
- G.amount = round(phoron_amount / G.perunit)
- if(silver_amount >= 2000)
- var/obj/item/stack/sheet/mineral/silver/G = new /obj/item/stack/sheet/mineral/silver(src.loc)
- G.amount = round(silver_amount / G.perunit)
- if(gold_amount >= 2000)
- var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc)
- G.amount = round(gold_amount / G.perunit)
- if(uranium_amount >= 2000)
- var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(src.loc)
- G.amount = round(uranium_amount / G.perunit)
- if(diamond_amount >= 2000)
- var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc)
- G.amount = round(diamond_amount / G.perunit)
- del(src)
- return 1
- else
- user << "\red You can't load the [src.name] while it's opened."
- return 1
- if (disabled)
+ if(default_deconstruction_crowbar(user, O))
return
- if (!linked_console)
- user << "\The protolathe must be linked to an R&D console first!"
+ if(default_part_replacement(user, O))
+ return
+ if(O.is_open_container())
return 1
- if (busy)
- user << "\red The protolathe is busy. Please wait for completion of previous operation."
+ if(panel_open)
+ user << "You can't load \the [src] while it's opened."
return 1
- if (!istype(O, /obj/item/stack/sheet))
- user << "\red You cannot insert this item into the protolathe!"
+ if(disabled)
+ return
+ if(!linked_console)
+ user << "\The [src] must be linked to an R&D console first!"
return 1
- if (stat)
+ if(busy)
+ user << "\The [src] is busy. Please wait for completion of previous operation."
+ return 1
+ if(!istype(O, /obj/item/stack/sheet))
+ user << "You cannot insert this item into \the [src]!"
+ return 1
+ if(stat)
return 1
if(istype(O,/obj/item/stack/sheet))
var/obj/item/stack/sheet/S = O
- if (TotalMaterials() + S.perunit > max_material_storage)
- user << "\red The protolathe's material bin is full. Please remove material before adding more."
+ if(TotalMaterials() + S.perunit > max_material_storage)
+ user << "\The [src]'s material bin is full. Please remove material before adding more."
return 1
var/obj/item/stack/sheet/stack = O
@@ -137,20 +137,20 @@ Note: Must be placed west/left of and R&D console to function.
return
if(amount > stack.get_amount())
amount = stack.get_amount()
- if(max_material_storage - TotalMaterials() < (amount*stack.perunit))//Can't overfill
- amount = min(stack.amount, round((max_material_storage-TotalMaterials())/stack.perunit))
+ if(max_material_storage - TotalMaterials() < (amount * stack.perunit))//Can't overfill
+ amount = min(stack.amount, round((max_material_storage - TotalMaterials()) / stack.perunit))
- src.overlays += "protolathe_[stack.name]"
+ overlays += "protolathe_[stack.name]"
sleep(10)
- src.overlays -= "protolathe_[stack.name]"
+ overlays -= "protolathe_[stack.name]"
icon_state = "protolathe"
busy = 1
- use_power(max(1000, (3750*amount/10)))
+ use_power(max(1000, (3750 * amount / 10)))
var/stacktype = stack.type
stack.use(amount)
- if (do_after(user, 16))
- user << "\blue You add [amount] sheets to the [src.name]."
+ if(do_after(user, 16))
+ user << "You add [amount] sheets to \the [src]."
icon_state = "protolathe"
switch(stacktype)
if(/obj/item/stack/sheet/metal)
@@ -168,9 +168,9 @@ Note: Must be placed west/left of and R&D console to function.
if(/obj/item/stack/sheet/mineral/diamond)
diamond_amount += amount * 2000
else
- new stacktype(src.loc, amount)
+ new stacktype(loc, amount)
busy = 0
- src.updateUsrDialog()
+ updateUsrDialog()
return
//This is to stop these machines being hackable via clicking.
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 8d390fa785..16c14863aa 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -93,7 +93,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any).
for(var/obj/machinery/r_n_d/D in oview(3,src))
- if(D.linked_console != null || D.disabled || D.opened)
+ if(D.linked_console != null || D.disabled || D.panel_open)
continue
if(istype(D, /obj/machinery/r_n_d/destructive_analyzer))
if(linked_destroy == null)
@@ -255,7 +255,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
usr <<"\red The destructive analyzer appears to be empty."
screen = 1.0
return
- if(linked_destroy.loaded_item.reliability >= 90)
+ if(linked_destroy.loaded_item.reliability >= linked_destroy.min_reliability)
var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
for(var/T in temp_tech)
files.UpdateTech(T, temp_tech[T])
@@ -347,21 +347,21 @@ won't update every console in existence) but it's more of a hassle to do. Also,
for(var/M in being_built.materials)
switch(M)
if("$metal")
- linked_lathe.m_amount = max(0, (linked_lathe.m_amount-being_built.materials[M]))
+ linked_lathe.m_amount = max(0, (linked_lathe.m_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
if("$glass")
- linked_lathe.g_amount = max(0, (linked_lathe.g_amount-being_built.materials[M]))
+ linked_lathe.g_amount = max(0, (linked_lathe.g_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
if("$gold")
- linked_lathe.gold_amount = max(0, (linked_lathe.gold_amount-being_built.materials[M]))
+ linked_lathe.gold_amount = max(0, (linked_lathe.gold_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
if("$silver")
- linked_lathe.silver_amount = max(0, (linked_lathe.silver_amount-being_built.materials[M]))
+ linked_lathe.silver_amount = max(0, (linked_lathe.silver_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
if("$phoron")
- linked_lathe.phoron_amount = max(0, (linked_lathe.phoron_amount-being_built.materials[M]))
+ linked_lathe.phoron_amount = max(0, (linked_lathe.phoron_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
if("$uranium")
- linked_lathe.uranium_amount = max(0, (linked_lathe.uranium_amount-being_built.materials[M]))
+ linked_lathe.uranium_amount = max(0, (linked_lathe.uranium_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
if("$diamond")
- linked_lathe.diamond_amount = max(0, (linked_lathe.diamond_amount-being_built.materials[M]))
+ linked_lathe.diamond_amount = max(0, (linked_lathe.diamond_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
else
- linked_lathe.reagents.remove_reagent(M, being_built.materials[M])
+ linked_lathe.reagents.remove_reagent(M, being_built.materials[M]*linked_lathe.mat_efficiency)
if(being_built.build_path)
var/obj/new_item = new being_built.build_path(src)
@@ -375,6 +375,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
L.name += " ([new_item.name])"*/
else
new_item.loc = linked_lathe.loc
+ if(linked_lathe.mat_efficiency != 1) // No matter out of nowhere
+ if(new_item.matter && new_item.matter.len > 0)
+ for(var/i in new_item.matter)
+ new_item.matter[i] = new_item.matter[i] * linked_lathe.mat_efficiency
linked_lathe.busy = 0
screen = 3.1
errored = 0
@@ -401,15 +405,15 @@ won't update every console in existence) but it's more of a hassle to do. Also,
for(var/M in being_built.materials)
switch(M)
if("$glass")
- linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]))
+ linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
if("$gold")
- linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]))
+ linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
if("$diamond")
- linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]))
+ linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
if("$uranium")
- linked_imprinter.uranium_amount = max(0, (linked_imprinter.uranium_amount-being_built.materials[M]))
+ linked_imprinter.uranium_amount = max(0, (linked_imprinter.uranium_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
else
- linked_imprinter.reagents.remove_reagent(M, being_built.materials[M])
+ linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]*linked_imprinter.mat_efficiency)
var/obj/new_item = new being_built.build_path(src)
new_item.reliability = being_built.reliability
if(linked_imprinter.hacked) being_built.reliability = max((reliability / 2), 0)
@@ -752,6 +756,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
for(var/T in temp_tech)
dat += "[CallTechName(T)] [temp_tech[T]]"
+ for(var/datum/tech/F in files.known_tech)
+ if(F.name == CallTechName(T))
+ dat += " (Current: [F.level])"
+ break
dat += ""
dat += "
Deconstruct Item || "
dat += "Eject Item || "
@@ -775,31 +783,33 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/temp_dat
var/check_materials = 1
for(var/M in D.materials)
- temp_dat += ", [D.materials[M]] [CallMaterialName(M)]"
+ temp_dat += ", [D.materials[M]*linked_lathe.mat_efficiency] [CallMaterialName(M)]"
if(copytext(M, 1, 2) == "$")
switch(M)
if("$glass")
- if(D.materials[M] > linked_lathe.g_amount) check_materials = 0
+ if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.g_amount) check_materials = 0
if("$metal")
- if(D.materials[M] > linked_lathe.m_amount) check_materials = 0
+ if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.m_amount) check_materials = 0
if("$gold")
- if(D.materials[M] > linked_lathe.gold_amount) check_materials = 0
+ if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.gold_amount) check_materials = 0
if("$silver")
- if(D.materials[M] > linked_lathe.silver_amount) check_materials = 0
+ if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.silver_amount) check_materials = 0
if("$phoron")
- if(D.materials[M] > linked_lathe.phoron_amount) check_materials = 0
+ if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.phoron_amount) check_materials = 0
if("$uranium")
- if(D.materials[M] > linked_lathe.uranium_amount) check_materials = 0
+ if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.uranium_amount) check_materials = 0
if("$diamond")
- if(D.materials[M] > linked_lathe.diamond_amount) check_materials = 0
- else if (!linked_lathe.reagents.has_reagent(M, D.materials[M]))
+ if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.diamond_amount) check_materials = 0
+ else if (!linked_lathe.reagents.has_reagent(M, D.materials[M]*linked_lathe.mat_efficiency))
check_materials = 0
if(temp_dat)
temp_dat = " \[[copytext(temp_dat,3)]\]"
- if (check_materials)
+ if(check_materials)
dat += "[D.name][temp_dat]"
else
dat += "[D.name][temp_dat]"
+ if(D.reliability < 100)
+ dat += " (Reliability: [D.reliability])"
dat += ""
if(3.2) //Protolathe Material Storage Sub-menu
@@ -869,18 +879,18 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/temp_dat
var/check_materials = 1
for(var/M in D.materials)
- temp_dat += ", [D.materials[M]] [CallMaterialName(M)]"
+ temp_dat += ", [D.materials[M]*linked_imprinter.mat_efficiency] [CallMaterialName(M)]"
if(copytext(M, 1, 2) == "$")
switch(M)
if("$glass")
- if(D.materials[M] > linked_imprinter.g_amount) check_materials = 0
+ if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.g_amount) check_materials = 0
if("$gold")
- if(D.materials[M] > linked_imprinter.gold_amount) check_materials = 0
+ if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.gold_amount) check_materials = 0
if("$diamond")
- if(D.materials[M] > linked_imprinter.diamond_amount) check_materials = 0
+ if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.diamond_amount) check_materials = 0
if("$uranium")
- if(D.materials[M] > linked_imprinter.uranium_amount) check_materials = 0
- else if (!linked_imprinter.reagents.has_reagent(M, D.materials[M]))
+ if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.uranium_amount) check_materials = 0
+ else if (!linked_imprinter.reagents.has_reagent(M, D.materials[M]*linked_imprinter.mat_efficiency))
check_materials = 0
if(temp_dat)
temp_dat = " \[[copytext(temp_dat,3)]\]"
@@ -888,6 +898,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "[D.name][temp_dat]"
else
dat += "[D.name][temp_dat]"
+ if(D.reliability < 100)
+ dat += " (Reliability: [D.reliability])"
dat += ""
if(4.2)
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 04f1536c25..4f0b81e531 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -17,7 +17,6 @@
var/hack_wire
var/disable_wire
var/shock_wire
- var/opened = 0
var/obj/machinery/computer/rdconsole/linked_console
/obj/machinery/r_n_d/New()
@@ -39,7 +38,7 @@
/obj/machinery/r_n_d/attack_hand(mob/user as mob)
if (shocked)
shock(user,50)
- if(opened)
+ if(panel_open)
var/dat as text
dat += "[src.name] Wires:
"
for(var/wire in src.wires)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 99b4719e28..5688f6b6d7 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -103,7 +103,7 @@
/obj/machinery/r_n_d/server/proc/produce_heat()
if (!produces_heat)
return
-
+
if (!use_power)
return
@@ -118,7 +118,7 @@
if(removed)
var/heat_produced = idle_power_usage //obviously can't produce more heat than the machine draws from it's power source
-
+
removed.add_thermal_energy(heat_produced)
env.merge(removed)
@@ -129,16 +129,16 @@
if (shocked)
shock(user,50)
if (istype(O, /obj/item/weapon/screwdriver))
- if (!opened)
- opened = 1
+ if (!panel_open)
+ panel_open = 1
icon_state = "server_o"
user << "You open the maintenance hatch of [src]."
else
- opened = 0
+ panel_open = 0
icon_state = "server"
user << "You close the maintenance hatch of [src]."
return
- if (opened)
+ if (panel_open)
if(istype(O, /obj/item/weapon/crowbar))
griefProtection()
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index b70af9c656..1239c1c1b5 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index c6183f6ff5..c7521751ad 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 989c1001b3..377d12b4ff 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ