diff --git a/baystation12.dme b/baystation12.dme
index 7031dd98066..2d8fab2d712 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -572,6 +572,7 @@
#include "code\game\objects\items\robot\robot_items.dm"
#include "code\game\objects\items\robot\robot_parts.dm"
#include "code\game\objects\items\robot\robot_upgrades.dm"
+#include "code\game\objects\items\stacks\matter_synth.dm"
#include "code\game\objects\items\stacks\medical.dm"
#include "code\game\objects\items\stacks\nanopaste.dm"
#include "code\game\objects\items\stacks\rods.dm"
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index e4d29467e03..1285b47c3e0 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -162,7 +162,7 @@
if(istype(occupant, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = occupant
if(R.module)
- R.module.respawn_consumable(R)
+ R.module.respawn_consumable(R, charge_rate)
if(!R.cell)
return
if(!R.cell.fully_charged())
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 7e69ffe17af..713706475c0 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -55,7 +55,7 @@
var/uses = 0
var/emagged = 0
var/failmsg = ""
- var/charge = 1
+ var/charge = 0
/obj/item/device/lightreplacer/New()
uses = max_uses / 2
@@ -122,11 +122,11 @@
/obj/item/device/lightreplacer/proc/AddUses(var/amount = 1)
uses = min(max(uses + amount, 0), max_uses)
-/obj/item/device/lightreplacer/proc/Charge(var/mob/user)
- charge += 1
- if(charge > 7)
+/obj/item/device/lightreplacer/proc/Charge(var/mob/user, var/amount = 1)
+ charge += amount
+ if(charge > 6)
AddUses(1)
- charge = 1
+ charge = 0
/obj/item/device/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U)
diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm
new file mode 100644
index 00000000000..44ec536d454
--- /dev/null
+++ b/code/game/objects/items/stacks/matter_synth.dm
@@ -0,0 +1,50 @@
+/datum/matter_synth
+ var/name = "Generic Synthesizer"
+ var/max_energy = 50000
+ var/recharge_rate = 2000
+ var/energy
+
+/datum/matter_synth/New(var/store = 0)
+ if(store)
+ max_energy = store
+ energy = max_energy
+ return
+
+/datum/matter_synth/proc/get_charge()
+ return energy
+
+/datum/matter_synth/proc/use_charge(var/amount)
+ if (energy >= amount)
+ energy -= amount
+ return 1
+ return 0
+
+/datum/matter_synth/proc/add_charge(var/amount)
+ energy = min(energy + amount, max_energy)
+
+/datum/matter_synth/proc/emp_act(var/severity)
+ use_charge(max_energy * 0.1 / severity)
+
+/datum/matter_synth/medicine
+ name = "Medicine Synthesizer"
+
+/datum/matter_synth/metal
+ name = "Metal Synthesizer"
+
+/datum/matter_synth/plasteel
+ name = "Plasteel Synthesizer"
+ max_energy = 10000
+
+/datum/matter_synth/glass
+ name = "Glass Synthesizer"
+
+/datum/matter_synth/wood
+ name = "Wood Synthesizer"
+
+/datum/matter_synth/plastic
+ name = "Plastic Synthesizer"
+
+/datum/matter_synth/wire
+ name = "Wire Synthesizer"
+ max_energy = 50
+ recharge_rate = 2
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index 45350a71e9c..81f1e1e98e5 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -13,12 +13,21 @@
max_amount = 60
attack_verb = list("hit", "bludgeoned", "whacked")
+/obj/item/stack/rods/cyborg
+ name = "metal rod synthesizer"
+ desc = "A device that makes metal rods."
+ gender = MALE
+ matter = null
+ uses_charge = 1
+ charge_cost = 500
+ stacktype = /obj/item/stack/rods
+
/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob)
..()
if (istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
- if(amount < 2)
+ if(get_amount() < 2)
user << "\red You need at least two rods to do this."
return
@@ -54,7 +63,7 @@
return 1
else if(!in_use)
- if(amount < 2)
+ if(get_amount() < 2)
user << "\blue You need at least two rods to do this."
return
usr << "\blue Assembling grille..."
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 71fb87f9ad0..43a9e9fec1c 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -22,12 +22,13 @@
var/list/construction_options = list("One Direction", "Full Window")
/obj/item/stack/sheet/glass/cyborg
- name = "glass"
- desc = "HOLY SHEET! That is a lot of glass."
- singular_name = "glass sheet"
- icon_state = "sheet-glass"
+ name = "glass synthesizer"
+ desc = "A device that makes glass."
+ gender = MALE
+ singular_name = "glass"
matter = null
- created_window = /obj/structure/window/basic
+ uses_charge = 1
+ charge_cost = 1000
stacktype = /obj/item/stack/sheet/glass
/obj/item/stack/sheet/glass/attack_self(mob/user as mob)
@@ -69,7 +70,7 @@
if(!user.IsAdvancedToolUser())
return 0
var/title = "Sheet-[name]"
- title += " ([src.amount] sheet\s left)"
+ title += " ([src.get_amount()] sheet\s left)"
switch(input(title, "What would you like to construct?") as null|anything in construction_options)
if("One Direction")
if(!src) return 1
@@ -102,7 +103,7 @@
if("Full Window")
if(!src) return 1
if(src.loc != user) return 1
- if(src.amount < 4)
+ if(src.get_amount() < 4)
user << "\red You need more glass to do that."
return 1
if(locate(/obj/structure/window) in user.loc)
@@ -124,7 +125,7 @@
user << "\red There is already a windoor in that location."
return 1
- if(src.amount < 5)
+ if(src.get_amount() < 5)
user << "\red You need more glass to do that."
return 1
@@ -151,10 +152,33 @@
construction_options = list("One Direction", "Full Window", "Windoor")
/obj/item/stack/sheet/glass/reinforced/cyborg
- name = "reinforced glass"
- desc = "Glass which has been reinforced with metal rods."
+ name = "reinforced glass synthesizer"
+ desc = "A device that makes reinforced glass."
+ gender = MALE
+ matter = null
+ uses_charge = 1
+ charge_cost = 1000
singular_name = "reinforced glass sheet"
icon_state = "sheet-rglass"
+ var/datum/matter_synth/metal_synth
+ var/datum/matter_synth/glass_synth
+ var/metal_charge = 500
+ var/glass_charge = 1000
+
+/obj/item/stack/sheet/glass/reinforced/cyborg/get_amount()
+ return min(round(metal_synth.energy / metal_charge), round(glass_synth.energy / glass_charge))
+
+/obj/item/stack/sheet/glass/reinforced/cyborg/use(var/amount) // Requires special checks, because it uses two storages
+ if(get_amount() < amount)
+ return 0
+ metal_synth.use_charge(amount * metal_charge)
+ glass_synth.use_charge(amount * glass_charge)
+ return 1
+
+/obj/item/stack/sheet/glass/reinforced/cyborg/add(var/amount)
+ metal_synth.add_charge(amount * metal_charge)
+ glass_synth.add_charge(amount * glass_charge)
+ return
/*
* Phoron Glass sheets
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index fccce08dc22..8c675163b12 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -137,9 +137,10 @@ obj/item/stack/sheet/mineral/iron/New()
recipes = plastic_recipes
/obj/item/stack/sheet/mineral/plastic/cyborg
- name = "plastic sheets"
- icon_state = "sheet-plastic"
- perunit = 2000
+ name = "plastic sheets synthesizer"
+ gender = MALE
+ uses_charge = 1
+ charge_cost = 1000
stacktype = /obj/item/stack/sheet/mineral/plastic
/obj/item/stack/sheet/mineral/gold
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 6c440dcb3d4..2d0f4adb052 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -86,12 +86,12 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
origin_tech = "materials=1"
/obj/item/stack/sheet/metal/cyborg
- name = "metal"
- desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
- singular_name = "metal sheet"
- icon_state = "sheet-metal"
- throwforce = 14.0
- flags = CONDUCT
+ name = "metal synthesizer"
+ desc = "A device that makes metal sheets."
+ gender = MALE
+ matter = null
+ uses_charge = 1
+ charge_cost = 1000
stacktype = /obj/item/stack/sheet/metal
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
@@ -121,9 +121,19 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
flags = CONDUCT
origin_tech = "materials=2"
+/obj/item/stack/sheet/plasteel/cyborg
+ name = "plasteel synthesizer"
+ desc = "A device that makes plasteel sheets."
+ gender = MALE
+ singular_name = "plasteel sheet"
+ matter = null
+ uses_charge = 1
+ charge_cost = 1000
+ stacktype = /obj/item/stack/sheet/plasteel
+
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
- recipes = plasteel_recipes
- return ..()
+ recipes = plasteel_recipes
+ return ..()
/*
* Wood
@@ -149,10 +159,13 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
origin_tech = "materials=1;biotech=1"
/obj/item/stack/sheet/wood/cyborg
- name = "wooden plank"
- desc = "One can only guess that this is a bunch of wood."
+ name = "wood synthesizer"
+ desc = "A device that makes wooden planks."
+ gender = MALE
singular_name = "wood plank"
icon_state = "sheet-wood"
+ uses_charge = 1
+ charge_cost = 1000
stacktype = /obj/item/stack/sheet/wood
/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 69b6e97533e..9d79e4c56f6 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -17,6 +17,9 @@
var/amount = 1
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/stacktype //determines whether different stack types can merge
+ var/uses_charge = 0
+ var/charge_cost = 1
+ var/datum/matter_synth/synth = null
/obj/item/stack/New(var/loc, var/amount=null)
..()
@@ -27,13 +30,18 @@
return
/obj/item/stack/Del()
+ if(uses_charge)
+ return
if (src && usr && usr.machine == src)
usr << browse(null, "window=stack")
..()
/obj/item/stack/examine(mob/user)
if(..(user, 1))
- user << "There are [src.amount] [src.singular_name]\s in the stack."
+ if(!uses_charge)
+ user << "There are [src.amount] [src.singular_name]\s in the stack."
+ else
+ user << "There is enough charge for [get_amount()]."
/obj/item/stack/attack_self(mob/user as mob)
list_recipes(user)
@@ -41,14 +49,14 @@
/obj/item/stack/proc/list_recipes(mob/user as mob, recipes_sublist)
if (!recipes)
return
- if (!src || amount<=0)
+ if (!src || get_amount() <= 0)
user << browse(null, "window=stack")
user.set_machine(src) //for correct work of onclose
var/list/recipe_list = recipes
if (recipes_sublist && recipe_list[recipes_sublist] && istype(recipe_list[recipes_sublist], /datum/stack_recipe_list))
var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist]
recipe_list = srl.recipes
- var/t1 = text("
Constructions from []Amount Left: []
", src, src.amount)
+ var/t1 = text("Constructions from []Amount Left: []
", src, src.get_amount())
for(var/i=1;i<=recipe_list.len,i++)
var/E = recipe_list[i]
if (isnull(E))
@@ -60,14 +68,14 @@
if (istype(E, /datum/stack_recipe_list))
var/datum/stack_recipe_list/srl = E
- if (src.amount >= srl.req_amount)
+ if (src.get_amount() >= srl.req_amount)
t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)"
else
t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)
"
if (istype(E, /datum/stack_recipe))
var/datum/stack_recipe/R = E
- var/max_multiplier = round(src.amount / R.req_amount)
+ var/max_multiplier = round(src.get_amount() / R.req_amount)
var/title as text
var/can_build = 1
can_build = can_build && (max_multiplier>0)
@@ -142,7 +150,7 @@
list_recipes(usr, text2num(href_list["sublist"]))
if (href_list["make"])
- if (src.amount < 1) del(src) //Never should happen
+ if (src.get_amount() < 1) del(src) //Never should happen
var/list/recipes_list = recipes
if (href_list["sublist"])
@@ -165,28 +173,39 @@
//Return 1 if an immediate subsequent call to use() would succeed.
//Ensures that code dealing with stacks uses the same logic
/obj/item/stack/proc/can_use(var/used)
- if (amount < used)
+ if (get_amount() < used)
return 0
return 1
/obj/item/stack/proc/use(var/used)
if (!can_use(used))
return 0
- amount -= used
- if (amount <= 0)
- spawn(0) //delete the empty stack once the current context yields
- if (amount <= 0) //check again in case someone transferred stuff to us
- if(usr)
- usr.before_take_item(src)
- del(src)
- return 1
+ if(!uses_charge)
+ amount -= used
+ if (amount <= 0)
+ spawn(0) //delete the empty stack once the current context yields
+ if (amount <= 0) //check again in case someone transferred stuff to us
+ if(usr)
+ usr.before_take_item(src)
+ del(src)
+ return 1
+ else
+ if(!synth)
+ return 0
+ return synth.use_charge(charge_cost * used) // Doesn't need to be deleted
+ return 0
/obj/item/stack/proc/add(var/extra)
- if(amount + extra > max_amount)
+ if(!uses_charge)
+ if(amount + extra > get_max_amount())
+ return 0
+ else
+ amount += extra
+ return 1
+ else if(!synth)
return 0
else
- amount += extra
- return 1
+ synth.add_charge(charge_cost * extra)
/*
The transfer and split procs work differently than use() and add().
@@ -196,16 +215,16 @@
//attempts to transfer amount to S, and returns the amount actually transferred
/obj/item/stack/proc/transfer_to(obj/item/stack/S, var/tamount=null)
- if (!amount)
+ if (!get_amount())
return 0
if (stacktype != S.stacktype)
return 0
if (isnull(tamount))
- tamount = src.amount
+ tamount = src.get_amount()
- var/transfer = max(min(tamount, src.amount, (S.max_amount - S.amount)), 0)
+ var/transfer = max(min(tamount, src.get_amount(), (S.get_max_amount() - S.get_amount())), 0)
- var/orig_amount = src.amount
+ var/orig_amount = src.get_amount()
if (transfer && src.use(transfer))
S.add(transfer)
if (prob(transfer/orig_amount * 100))
@@ -220,6 +239,8 @@
/obj/item/stack/proc/split(var/tamount)
if (!amount)
return null
+ if(uses_charge)
+ return null
var/transfer = max(min(tamount, src.amount, initial(max_amount)), 0)
@@ -234,8 +255,19 @@
return null
/obj/item/stack/proc/get_amount()
+ if(uses_charge)
+ if(!synth)
+ return 0
+ return round(synth.get_charge() / charge_cost)
return amount
+/obj/item/stack/proc/get_max_amount()
+ if(uses_charge)
+ if(!synth)
+ return 0
+ return round(synth.max_energy / charge_cost)
+ return max_amount
+
/obj/item/stack/proc/add_to_stacks(mob/usr as mob)
for (var/obj/item/stack/item in usr.loc)
if (item==src)
diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm
index 7816c45f531..f44789219fc 100644
--- a/code/game/objects/items/stacks/tiles/plasteel.dm
+++ b/code/game/objects/items/stacks/tiles/plasteel.dm
@@ -3,14 +3,12 @@
singular_name = "floor tile"
desc = "Those could work as a pretty decent throwing weapon"
icon_state = "tile"
- w_class = 3.0
force = 6.0
matter = list("metal" = 937.5)
throwforce = 15.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
- max_amount = 60
/obj/item/stack/tile/plasteel/New(var/loc, var/amount=null)
..()
@@ -18,6 +16,16 @@
src.pixel_y = rand(1, 14)
return
+/obj/item/stack/tile/plasteel/cyborg
+ name = "floor tile synthesizer"
+ desc = "A device that makes floor tiles."
+ gender = MALE
+ matter = null
+ uses_charge = 1
+ charge_cost = 250
+ stacktype = /obj/item/stack/tile/plasteel
+ build_type = /obj/item/stack/tile/plasteel
+
/*
/obj/item/stack/tile/plasteel/attack_self(mob/user as mob)
if (usr.stat)
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 7ad6abdd608..7f2588b1c7f 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -1,9 +1,18 @@
/* Diffrent misc types of tiles
* Contains:
+ * Prototype
* Grass
* Wood
* Carpet
*/
+
+/obj/item/stack/tile
+ name = "tile"
+ singular_name = "tile"
+ desc = "A non-descript floor tile"
+ w_class = 3
+ max_amount = 60
+ var/build_type = null
/*
* Grass
@@ -13,13 +22,11 @@
singular_name = "grass floor tile"
desc = "A patch of grass like they often use on golf courses."
icon_state = "tile_grass"
- w_class = 3.0
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
- max_amount = 60
origin_tech = "biotech=1"
/*
@@ -30,13 +37,19 @@
singular_name = "wood floor tile"
desc = "An easy to fit wooden floor tile."
icon_state = "tile-wood"
- w_class = 3.0
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
- max_amount = 60
+
+/obj/item/stack/tile/wood/cyborg
+ name = "wood floor tile synthesizer"
+ desc = "A device that makes wood floor tiles."
+ uses_charge = 1
+ charge_cost = 250
+ stacktype = /obj/item/stack/tile/wood
+ build_type = /obj/item/stack/tile/wood
/*
* Carpets
@@ -46,10 +59,8 @@
singular_name = "carpet"
desc = "A piece of carpet. It is the same size as a normal floor tile!"
icon_state = "tile-carpet"
- w_class = 3.0
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
- max_amount = 60
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 62facb8e4de..a821cde4aef 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -519,7 +519,10 @@ turf/simulated/floor/proc/update_icon()
var/obj/item/stack/tile/T = C
if (T.get_amount() < 1)
return
- floor_type = T.type
+ if(!T.build_type)
+ floor_type = T.type
+ else
+ floor_type = T.build_type
intact = 1
if(istype(T,/obj/item/stack/tile/light))
var/obj/item/stack/tile/light/L = T
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 6b0509eea14..e30ba5f038d 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -579,6 +579,9 @@ var/list/robot_verbs_default = list(
show_cell_power()
show_jetpack_pressure()
stat(null, text("Lights: [lights_on ? "ON" : "OFF"]"))
+ if(module)
+ for(var/datum/matter_synth/ms in module.synths)
+ stat("[ms.name]: [ms.energy]/[ms.max_energy]")
/mob/living/silicon/robot/restrained()
return 0
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 3458a5bb47f..b2bcaa7e3c2 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -7,9 +7,9 @@
flags = CONDUCT
var/channels = list()
var/list/modules = list()
+ var/list/datum/matter_synth/synths = list()
var/obj/item/emag = null
var/obj/item/borg/upgrade/jetpack = null
- var/list/stacktypes
/obj/item/weapon/robot_module/emp_act(severity)
if(modules)
@@ -17,40 +17,19 @@
O.emp_act(severity)
if(emag)
emag.emp_act(severity)
+ if(synths)
+ for(var/datum/synth/S in synths)
+ S.emp_act(severity)
..()
return
-/obj/item/weapon/robot_module/New()
- ..()
- // Build initial inventory.
- if(stacktypes && stacktypes.len)
- for(var/stack_type in stacktypes)
- var/obj/item/stack/new_stack = new stack_type (src)
- new_stack.amount = stacktypes[stack_type]
- modules |= new_stack
+/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
-/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R)
+ if(!synths || !synths.len)
+ return
- if(!stacktypes || !stacktypes.len) return
-
- for(var/T in stacktypes)
- var/obj/item/stack/S
- for(var/obj/O in src.modules)
- if(O.type == T)
- S = O
- break
-
- if(!S)
- src.modules -= null
- S = new T(src)
- src.modules |= S
- S.amount = 1
-
- if(!istype(S))
- continue
-
- if(S && S.amount < stacktypes[T])
- S.amount++
+ for(var/datum/matter_synth/T in synths)
+ T.add_charge(amount * amount)
/obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module
var/list/temp_list = modules
@@ -84,10 +63,6 @@
/obj/item/weapon/robot_module/surgeon
name = "surgeon robot module"
- stacktypes = list(
- /obj/item/stack/medical/advanced/bruise_pack = 5,
- /obj/item/stack/nanopaste = 5
- )
/obj/item/weapon/robot_module/surgeon/New()
..()
@@ -104,26 +79,34 @@
src.modules += new /obj/item/weapon/circular_saw(src)
src.modules += new /obj/item/weapon/surgicaldrill(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src)
- src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src)
- src.modules += new /obj/item/stack/nanopaste(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("pacid", 250)
src.emag.name = "Polyacid spray"
+
+ var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000)
+ synths += medicine
+
+ var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src)
+ var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src)
+ N.uses_charge = 1
+ N.charge_cost = 1000
+ N.synth = medicine
+ B.uses_charge = 1
+ B.charge_cost = 1000
+ B.synth = medicine
+ src.modules += N
+ src.modules += B
+
return
-/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
if(src.emag)
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
- PS.reagents.add_reagent("pacid", 2)
+ PS.reagents.add_reagent("pacid", 2 * amount)
..()
/obj/item/weapon/robot_module/crisis
name = "crisis robot module"
- stacktypes = list(
- /obj/item/stack/medical/ointment = 5,
- /obj/item/stack/medical/bruise_pack = 5,
- /obj/item/stack/medical/splint = 5
- )
/obj/item/weapon/robot_module/crisis/New()
..()
@@ -132,9 +115,6 @@
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
src.modules += new /obj/item/roller_holder(src)
- src.modules += new /obj/item/stack/medical/ointment(src)
- src.modules += new /obj/item/stack/medical/bruise_pack(src)
- src.modules += new /obj/item/stack/medical/splint(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
@@ -143,9 +123,29 @@
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("pacid", 250)
src.emag.name = "Polyacid spray"
+
+ var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000)
+ synths += medicine
+
+ var/obj/item/stack/medical/ointment/O = new /obj/item/stack/medical/ointment(src)
+ var/obj/item/stack/medical/bruise_pack/B = new /obj/item/stack/medical/bruise_pack(src)
+ var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src)
+ O.uses_charge = 1
+ O.charge_cost = 1000
+ O.synth = medicine
+ B.uses_charge = 1
+ B.charge_cost = 1000
+ B.synth = medicine
+ S.uses_charge = 1
+ S.charge_cost = 1000
+ S.synth = medicine
+ src.modules += O
+ src.modules += B
+ src.modules += S
+
return
-/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
if(S.mode == 2)
@@ -156,20 +156,13 @@
if(src.emag)
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
- PS.reagents.add_reagent("pacid", 2)
+ PS.reagents.add_reagent("pacid", 2 * amount)
..()
/obj/item/weapon/robot_module/construction
name = "construction robot module"
- stacktypes = list(
- /obj/item/stack/sheet/metal = 50,
- /obj/item/stack/sheet/plasteel = 10,
- /obj/item/stack/sheet/glass/reinforced = 50,
- /obj/item/stack/rods = 50
- )
-
/obj/item/weapon/robot_module/construction/New()
..()
src.modules += new /obj/item/device/flash(src)
@@ -182,18 +175,33 @@
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
+ var/datum/matter_synth/metal = new /datum/matter_synth/metal()
+ var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel()
+ var/datum/matter_synth/glass = new /datum/matter_synth/glass()
+ synths += metal
+ synths += plasteel
+ synths += glass
+
+ var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
+ M.synth = metal
+ src.modules += M
+
+ var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src)
+ R.synth = metal
+ src.modules += R
+
+ var/obj/item/stack/sheet/plasteel/cyborg/S = new /obj/item/stack/sheet/plasteel/cyborg(src)
+ S.synth = metal
+ src.modules += S
+
+ var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src)
+ RG.metal_synth = metal
+ RG.glass_synth = glass
+ src.modules += R
+
/obj/item/weapon/robot_module/engineering
name = "engineering robot module"
- stacktypes = list(
- /obj/item/stack/sheet/metal = 50,
- /obj/item/stack/sheet/glass = 50,
- /obj/item/stack/sheet/glass/reinforced = 50,
- /obj/item/stack/cable_coil/robot = 50,
- /obj/item/stack/rods = 15,
- /obj/item/stack/tile/plasteel = 15
- )
-
/obj/item/weapon/robot_module/engineering/New()
..()
src.modules += new /obj/item/device/flash(src)
@@ -212,6 +220,39 @@
src.modules += new /obj/item/weapon/matter_decompiler(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.emag = new /obj/item/borg/stun(src)
+
+ var/datum/matter_synth/metal = new /datum/matter_synth/metal(30000)
+ var/datum/matter_synth/glass = new /datum/matter_synth/glass(30000)
+ var/datum/matter_synth/wire = new /datum/matter_synth/wire()
+ synths += metal
+ synths += glass
+ synths += wire
+
+ var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
+ M.synth = metal
+ src.modules += M
+
+ var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src)
+ G.synth = glass
+ src.modules += G
+
+ var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src)
+ R.synth = metal
+ src.modules += R
+
+ var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src)
+ C.synth = wire
+ src.modules += C
+
+ var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src)
+ S.synth = metal
+ src.modules += S
+
+ var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src)
+ RG.metal_synth = metal
+ RG.glass_synth = glass
+ src.modules += RG
+
return
/obj/item/weapon/robot_module/security
@@ -228,7 +269,7 @@
src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
return
-/obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/flash/F = locate() in src.modules
if(F.broken)
F.broken = 0
@@ -238,7 +279,7 @@
F.times_used--
var/obj/item/weapon/gun/energy/taser/cyborg/T = locate() in src.modules
if(T.power_supply.charge < T.power_supply.maxcharge)
- T.power_supply.give(T.charge_cost)
+ T.power_supply.give(T.charge_cost * amount)
T.update_icon()
else
T.charge_tick = 0
@@ -258,12 +299,12 @@
src.emag.name = "Lube spray"
return
-/obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/lightreplacer/LR = locate() in src.modules
- LR.Charge(R)
+ LR.Charge(R, amount)
if(src.emag)
var/obj/item/weapon/reagent_containers/spray/S = src.emag
- S.reagents.add_reagent("lube", 2)
+ S.reagents.add_reagent("lube", 2 * amount)
/obj/item/weapon/robot_module/butler
name = "service robot module"
@@ -327,12 +368,12 @@
R.add_language("Tradeband", 1)
R.add_language("Gutter", 1)
-/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
- E.reagents.add_reagent("enzyme", 2)
+ E.reagents.add_reagent("enzyme", 2 * amount)
if(src.emag)
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag
- B.reagents.add_reagent("beer2", 2)
+ B.reagents.add_reagent("beer2", 2 * amount)
/obj/item/weapon/robot_module/miner
name = "miner robot module"
@@ -392,17 +433,6 @@
/obj/item/weapon/robot_module/drone
name = "drone module"
- stacktypes = list(
- /obj/item/stack/sheet/wood = 1,
- /obj/item/stack/sheet/mineral/plastic = 1,
- /obj/item/stack/sheet/glass/reinforced = 5,
- /obj/item/stack/tile/wood = 5,
- /obj/item/stack/rods = 15,
- /obj/item/stack/tile/plasteel = 15,
- /obj/item/stack/sheet/metal = 20,
- /obj/item/stack/sheet/glass = 20,
- /obj/item/stack/cable_coil/robot = 30
- )
/obj/item/weapon/robot_module/drone/New()
..()
@@ -419,15 +449,63 @@
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
src.emag.name = "Plasma Cutter"
+ var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000)
+ var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000)
+ var/datum/matter_synth/wood = new /datum/matter_synth/wood(2000)
+ var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(1000)
+ var/datum/matter_synth/wire = new /datum/matter_synth/wire(30)
+ synths += metal
+ synths += glass
+ synths += wood
+ synths += plastic
+ synths += wire
+
+ var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
+ M.synth = metal
+ src.modules += M
+
+ var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src)
+ G.synth = glass
+ src.modules += G
+
+ var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src)
+ R.synth = metal
+ src.modules += R
+
+ var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src)
+ C.synth = wire
+ src.modules += C
+
+ var/obj/item/stack/tile/plasteel/cyborg/S = new /obj/item/stack/tile/plasteel/cyborg(src)
+ S.synth = metal
+ src.modules += S
+
+ var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src)
+ RG.metal_synth = metal
+ RG.glass_synth = glass
+ src.modules += RG
+
+ var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src)
+ WT.synth = wood
+ src.modules += WT
+
+ var/obj/item/stack/sheet/wood/cyborg/W = new /obj/item/stack/sheet/wood/cyborg(src)
+ W.synth = wood
+ src.modules += W
+
+ var/obj/item/stack/sheet/mineral/plastic/cyborg/P = new /obj/item/stack/sheet/mineral/plastic/cyborg(src)
+ P.synth = plastic
+ src.modules += P
+
/obj/item/weapon/robot_module/drone/add_languages(var/mob/living/silicon/robot/R)
return //not much ROM to spare in that tiny microprocessor!
-/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R)
+/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules
- C.reagents.add_reagent("cleaner", 3)
+ C.reagents.add_reagent("cleaner", 3 * amount)
var/obj/item/device/lightreplacer/LR = locate() in src.modules
- LR.Charge(R)
+ LR.Charge(R, amount)
..()
return
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 12451f9a5e9..4db363af0eb 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -482,6 +482,15 @@ obj/structure/cable/proc/cableColor(var/colorC)
item_state = "coil"
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
+/obj/item/stack/cable_coil/cyborg
+ name = "cable coil synthesizer"
+ desc = "A device that makes cable."
+ gender = MALE
+ matter = null
+ uses_charge = 1
+ charge_cost = 1
+ stacktype = /obj/item/stack/cable_coil
+
/obj/item/stack/cable_coil/suicide_act(mob/user)
if(locate(/obj/structure/stool) in user.loc)
user.visible_message("[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide.")
@@ -576,7 +585,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
usr << "\blue You cannot do that."
..()
-/obj/item/stack/cable_coil/robot/verb/set_colour()
+/obj/item/stack/cable_coil/cyborg/verb/set_colour()
set name = "Change Colour"
set category = "Object"
@@ -606,26 +615,26 @@ obj/structure/cable/proc/cableColor(var/colorC)
// - Cable coil : merge cables
/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user)
..()
- if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1)
- src.amount--
+ if( istype(W, /obj/item/weapon/wirecutters) && src.get_amount() > 1)
+ src.use(1)
new/obj/item/stack/cable_coil(user.loc, 1,color)
user << "You cut a piece off the cable coil."
src.update_icon()
return
else if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
- if(C.amount >= MAXCOIL)
+ if(C.get_amount() >= get_max_amount())
user << "The coil is too long, you cannot add any more cable to it."
return
- if( (C.amount + src.amount <= MAXCOIL) )
+ if( (C.get_amount() + src.get_amount() <= get_max_amount()) )
user << "You join the cable coils together."
- C.give(src.amount) // give it cable
- src.use(src.amount) // make sure this one cleans up right
+ C.give(src.get_amount()) // give it cable
+ src.use(src.get_amount()) // make sure this one cleans up right
return
else
- var/amt = MAXCOIL - C.amount
+ var/amt = get_max_amount() - C.get_amount()
user << "You transfer [amt] length\s of cable from one coil to the other."
C.give(amt)
src.use(amt)