diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index e40d8bc6b3a..34097634102 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -209,7 +209,7 @@
if(/mob/living/silicon/ai, /mob/living/silicon/pai)
continue
if(get_area(player) == A)
- if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/simulated/shuttle/floor4))
+ if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red))
return 0
return 1
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 4f7c4dfad82..85a817974bf 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -265,6 +265,15 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/stock_parts/cell = 5,
/obj/item/weapon/stock_parts/capacitor = 1)
+/obj/item/weapon/circuitboard/emitter
+ name = "circuit board (Emitter)"
+ build_path = /obj/machinery/power/emitter
+ board_type = "machine"
+ origin_tech = "programming=4;powerstorage=5;engineering=5"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
/obj/item/weapon/circuitboard/power_compressor
name = "circuit board (Power Compressor)"
build_path = /obj/machinery/power/compressor
@@ -384,6 +393,7 @@ to destroy them and players will be able to make replacements.
origin_tech = "programming=1;biotech=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/microwave
@@ -396,6 +406,24 @@ to destroy them and players will be able to make replacements.
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/console_screen = 1)
+/obj/item/weapon/circuitboard/gibber
+ name = "circuit board (Gibber)"
+ build_path = /obj/machinery/gibber
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/processor
+ name = "circuit board (Food processor)"
+ build_path = /obj/machinery/processor
+ board_type = "machine"
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
/obj/item/weapon/circuitboard/chem_dispenser
name = "circuit board (Portable Chem Dispenser)"
build_path = /obj/machinery/chem_dispenser/constructable
diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm
index 38a52ffa9ff..fa7a491eab7 100644
--- a/code/modules/food&drinks/kitchen machinery/gibber.dm
+++ b/code/modules/food&drinks/kitchen machinery/gibber.dm
@@ -10,6 +10,8 @@
var/dirty = 0 // Does it need cleaning?
var/gibtime = 40 // Time from starting until meat appears
var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/
+ var/meat_produced = 0
+ var/ignore_clothing = 0
use_power = 1
idle_power_usage = 2
active_power_usage = 500
@@ -47,6 +49,21 @@
/obj/machinery/gibber/New()
..()
src.overlays += image('icons/obj/kitchen.dmi', "grjam")
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/gibber(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+
+/obj/machinery/gibber/RefreshParts()
+ var/gib_time = 40
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ meat_produced += 3 * B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ gib_time -= 5 * M.rating
+ gibtime = gib_time
+ if(M.rating >= 2)
+ ignore_clothing = 1
/obj/machinery/gibber/update_icon()
overlays.Cut()
@@ -77,29 +94,43 @@
else
src.startgibbing(user)
-/obj/machinery/gibber/attackby(obj/item/weapon/grab/G as obj, mob/user as mob, params)
- if(default_unfasten_wrench(user, G))
+/obj/machinery/gibber/attackby(obj/item/P as obj, mob/user as mob, params)
+ if (istype(P, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = P
+ if(!istype(G.affecting, /mob/living/carbon/human))
+ user << "This item is not suitable for the gibber!"
+ return
+ if(G.affecting.abiotic(1) && !ignore_clothing)
+ user << "Subject may not have abiotic items on."
+ return
+
+ user.visible_message("[user] starts to put [G.affecting] into the gibber!")
+ src.add_fingerprint(user)
+ if(do_after(user, 30) && G && G.affecting && !occupant)
+ user.visible_message("[user] stuffs [G.affecting] into the gibber!")
+ var/mob/M = G.affecting
+ if(M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.loc = src
+ src.occupant = M
+ qdel(G)
+ update_icon()
+
+ if(default_deconstruction_screwdriver(user, "grinder", "grinder", P))
return
- if (!( istype(G, /obj/item/weapon/grab)) || !(istype(G.affecting, /mob/living/carbon/human)))
- user << "This item is not suitable for the gibber!"
- return
- if(G.affecting.abiotic(1))
- user << "Subject may not have abiotic items on."
+ if(exchange_parts(user, P))
return
- user.visible_message("[user] starts to put [G.affecting] into the gibber!")
- src.add_fingerprint(user)
- if(do_after(user, 30) && G && G.affecting && !occupant)
- user.visible_message("[user] stuffs [G.affecting] into the gibber!")
- var/mob/M = G.affecting
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- src.occupant = M
- qdel(G)
- update_icon()
+ if(default_pry_open(P))
+ return
+
+ if(default_unfasten_wrench(user, P))
+ return
+
+ default_deconstruction_crowbar(P)
+
/obj/machinery/gibber/verb/eject()
@@ -131,9 +162,8 @@
var/sourcejob = src.occupant.job
var/sourcenutriment = src.occupant.nutrition / 15
var/sourcetotalreagents = src.occupant.reagents.total_volume
- var/totalslabs = 3
- var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/allmeat[totalslabs]
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/allmeat[meat_produced]
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
@@ -141,13 +171,13 @@
typeofmeat = gibee.dna.species.meat
else
typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
- for (var/i=1 to totalslabs)
+ for (var/i=1 to meat_produced)
var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/newmeat = new typeofmeat
newmeat.name = sourcename + newmeat.name
newmeat.subjectname = sourcename
newmeat.subjectjob = sourcejob
- newmeat.reagents.add_reagent ("nutriment", sourcenutriment / totalslabs) // Thehehe. Fat guys go first
- src.occupant.reagents.trans_to (newmeat, round (sourcetotalreagents / totalslabs, 1)) // Transfer all the reagents from the
+ newmeat.reagents.add_reagent ("nutriment", sourcenutriment / meat_produced) // Thehehe. Fat guys go first
+ src.occupant.reagents.trans_to (newmeat, round (sourcetotalreagents / meat_produced, 1)) // Transfer all the reagents from the
allmeat[i] = newmeat
add_logs(user, occupant, "gibbed")
@@ -157,7 +187,7 @@
spawn(src.gibtime)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
operating = 0
- for (var/i=1 to totalslabs)
+ for (var/i=1 to meat_produced)
var/obj/item/meatslab = allmeat[i]
var/turf/Tx = locate(src.x - i, src.y, src.z)
meatslab.loc = src.loc
diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm
index ff196ae88db..c35ffc078f6 100644
--- a/code/modules/food&drinks/kitchen machinery/microwave.dm
+++ b/code/modules/food&drinks/kitchen machinery/microwave.dm
@@ -12,7 +12,7 @@
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
- var/global/max_n_of_items = 10
+ var/max_n_of_items = 10 // whatever fat fuck made this a global var needs to look at themselves in the mirror sometime
var/efficiency = 0
var/microwavepower = 1
@@ -28,15 +28,20 @@
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/microwave(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 2)
RefreshParts()
/obj/machinery/microwave/RefreshParts()
var/E
+ var/max_items = 10
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts)
E += M.rating
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ max_items = 10 * M.rating
efficiency = E
+ max_n_of_items = max_items
/*******************
* Item Adding
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm
index cde0bf70683..7128ecb6360 100644
--- a/code/modules/food&drinks/kitchen machinery/processor.dm
+++ b/code/modules/food&drinks/kitchen machinery/processor.dm
@@ -12,16 +12,32 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 50
+ var/rating_speed = 1
+ var/rating_amount = 1
+/obj/machinery/processor/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/processor(null)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+/obj/machinery/processor/RefreshParts()
+ for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
+ rating_amount = B.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ rating_speed = M.rating
/datum/food_processor_process
var/input
var/output
var/time = 40
-/datum/food_processor_process/proc/process_food(loc, what)
- if (src.output && loc)
- new src.output(loc)
+/datum/food_processor_process/proc/process_food(loc, what, var/obj/machinery/processor/processor)
+ world << "[processor.rating_amount]"
+ if (src.output && loc && processor)
+ for(var/i = 0, i < processor.rating_amount, i++)
+ new src.output(loc)
if (what)
qdel(what) // Note to self: Make this safer
@@ -60,18 +76,18 @@
/* mobs */
-/datum/food_processor_process/mob/process_food(loc, what)
+/datum/food_processor_process/mob/process_food(loc, what, processor)
..()
-/datum/food_processor_process/mob/slime/process_food(loc, what)
+/datum/food_processor_process/mob/slime/process_food(loc, what, var/obj/machinery/processor/processor)
var/mob/living/simple_animal/slime/S = what
var/C = S.cores
if(S.stat != DEAD)
S.loc = loc
S.visible_message("[C] crawls free of the processor!")
return
- for(var/i = 1, i <= C, i++)
+ for(var/i = 1, i <= C * processor.rating_amount, i++)
new S.coretype(loc)
feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]")
..()
@@ -79,7 +95,7 @@
/datum/food_processor_process/mob/slime/input = /mob/living/simple_animal/slime
/datum/food_processor_process/mob/slime/output = null
-/datum/food_processor_process/mob/monkey/process_food(loc, what)
+/datum/food_processor_process/mob/monkey/process_food(loc, what, processor)
var/mob/living/carbon/monkey/O = what
if (O.client) //grief-proof
O.loc = loc
@@ -123,8 +139,20 @@
if(src.processing)
user << "The processor is in the process of processing!"
return 1
+ if(default_deconstruction_screwdriver(user, "processor", "processor", O))
+ return
+
+ if(exchange_parts(user, O))
+ return
+
+ if(default_pry_open(O))
+ return
+
if(default_unfasten_wrench(user, O))
return
+
+ default_deconstruction_crowbar(O)
+
var/what = O
if (istype(O, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
@@ -151,20 +179,27 @@
if(src.contents.len == 0)
user << "The processor is empty!"
return 1
+ src.processing = 1
+ user.visible_message("[user] turns on [src].", \
+ "You turn on [src].", \
+ "You hear a food processor.")
+ playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
+ use_power(500)
+ var/total_time = 0
+ for(var/O in src.contents)
+ var/datum/food_processor_process/P = select_recipe(O)
+ if (!P)
+ log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") //-rastaf0 // DEAR GOD THIS BURNS MY EYES HAVE YOU EVER LOOKED IN AN ENGLISH DICTONARY BEFORE IN YOUR LIFE AAAAAAAAAAAAAAAAAAAAA - Iamgoofball
+ continue
+ total_time += P.time
+ sleep(total_time / rating_speed)
for(var/O in src.contents)
var/datum/food_processor_process/P = select_recipe(O)
if (!P)
log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") //-rastaf0
continue
- src.processing = 1
- user.visible_message("[user] turns on \a [src].", \
- "You turn on \a [src].", \
- "You hear a food processor.")
- playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
- use_power(500)
- sleep(P.time)
- P.process_food(src.loc, O)
- src.processing = 0
+ P.process_food(src.loc, O, src)
+ src.processing = 0
src.visible_message("\the [src] finishes processing.")
/obj/machinery/processor/verb/eject()
diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food&drinks/kitchen machinery/smartfridge.dm
index 9746ee4a83c..f4b50112632 100644
--- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm
+++ b/code/modules/food&drinks/kitchen machinery/smartfridge.dm
@@ -13,7 +13,7 @@
idle_power_usage = 5
active_power_usage = 100
flags = NOREACT
- var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't like things over 1000.
+ var/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't like things over 1000.
var/icon_on = "smartfridge"
var/icon_off = "smartfridge-off"
var/item_quants = list()
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 41d7dedaaa5..4ba2414beb7 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -13,6 +13,7 @@
var/menustat = "menu"
var/efficiency = 0
var/productivity = 0
+ var/max_items = 40
/obj/machinery/biogenerator/New()
..()
@@ -28,12 +29,15 @@
/obj/machinery/biogenerator/RefreshParts()
var/E = 0
var/P = 0
+ var/max_storage = 40
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
P += B.rating
+ max_storage = 40 * B.rating
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
E += M.rating
efficiency = E
productivity = P
+ max_items = max_storage
/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
update_icon()
@@ -65,15 +69,15 @@
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
- if(i >= 10)
+ if(i >= max_items)
user << "The biogenerator is already full! Activate it."
else
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
- if(i >= 10)
+ if(i >= max_items)
break
G.loc = src
i++
- if(i<10)
+ if(iYou empty the plant bag into the biogenerator."
else if(O.contents.len == 0)
user << "You empty the plant bag into the biogenerator, filling it to its capacity."
@@ -87,7 +91,7 @@
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
- if(i >= 10)
+ if(i >= max_items)
user << "The biogenerator is full! Activate it."
else
user.unEquip(O)
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 78a92dc1481..44475f8d92b 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -22,6 +22,7 @@
var/planted = 0 //Is it occupied?
var/harvest = 0 //Ready to harvest?
var/obj/item/seeds/myseed = null //The currently planted seed
+ var/rating = 1
var/unwrenchable = 1
pixel_y=8
@@ -37,22 +38,34 @@
component_parts += new /obj/item/weapon/circuitboard/hydroponics(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/hydroponics/constructable/RefreshParts()
- var tmp_capacity = 0
+ var/tmp_capacity = 0
for (var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
tmp_capacity += M.rating
+ for (var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ rating = M.rating
maxwater = tmp_capacity * 50 // Up to 300
maxnutri = tmp_capacity * 5 // Up to 30
waterlevel = maxwater
nutrilevel = 3
/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", I))
+ return
+
if(exchange_parts(user, I))
return
+ if(default_pry_open(I))
+ return
+
+ if(default_unfasten_wrench(user, I))
+ return
+
if(istype(I, /obj/item/weapon/crowbar))
if(anchored==2)
user << "Unscrew the hoses first!"
@@ -89,10 +102,10 @@
mutate()
else if(istype(Proj ,/obj/item/projectile/energy/florayield))
if(myseed.yield == 0)//Oh god don't divide by zero you'll doom us all.
- adjustSYield(1)
+ adjustSYield(1 * rating)
//world << "Yield increased by 1, from 0, to a total of [myseed.yield]"
else if(prob(1/(myseed.yield * myseed.yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
- adjustSYield(1)
+ adjustSYield(1 * rating)
//world << "Yield increased by 1, to a total of [myseed.yield]"
else
..()
@@ -115,7 +128,7 @@
//Nutrients//////////////////////////////////////////////////////////////
// Nutrients deplete slowly
if(prob(50))
- adjustNutri(-1)
+ adjustNutri(-1 / rating)
// Lack of nutrients hurts non-weeds
if(nutrilevel <= 0 && myseed.plant_type != 1)
@@ -128,56 +141,56 @@
var/lightAmt = currentTurf.lighting_lumcount
if(myseed.plant_type == 2) // Mushroom
if(lightAmt < 2)
- adjustHealth(-1)
+ adjustHealth(-1 / rating)
else // Non-mushroom
if(lightAmt < 4)
- adjustHealth(-2)
+ adjustHealth(-2 / rating)
//Water//////////////////////////////////////////////////////////////////
// Drink random amount of water
- adjustWater(-rand(1,6))
+ adjustWater(-rand(1,6) / rating)
// If the plant is dry, it loses health pretty fast, unless mushroom
if(waterlevel <= 10 && myseed.plant_type != 2)
- adjustHealth(-rand(0,1))
+ adjustHealth(-rand(0,1) / rating)
if(waterlevel <= 0)
- adjustHealth(-rand(0,2))
+ adjustHealth(-rand(0,2) / rating)
// Sufficient water level and nutrient level = plant healthy
else if(waterlevel > 10 && nutrilevel > 0)
- adjustHealth(rand(1,2))
+ adjustHealth(rand(1,2) / rating)
if(prob(5)) //5 percent chance the weed population will increase
- adjustWeeds(1)
+ adjustWeeds(1 / rating)
//Toxins/////////////////////////////////////////////////////////////////
// Too much toxins cause harm, but when the plant drinks the contaiminated water, the toxins disappear slowly
if(toxic >= 40 && toxic < 80)
- adjustHealth(-1)
- adjustToxic(-rand(1,10))
+ adjustHealth(-1 / rating)
+ adjustToxic(-rand(1,10) / rating)
else if(toxic >= 80) // I don't think it ever gets here tbh unless above is commented out
adjustHealth(-3)
- adjustToxic(-rand(1,10))
+ adjustToxic(-rand(1,10) / rating)
//Pests & Weeds//////////////////////////////////////////////////////////
else if(pestlevel >= 5)
- adjustHealth(-1)
+ adjustHealth(-1 / rating)
// If it's a weed, it doesn't stunt the growth
if(weedlevel >= 5 && myseed.plant_type != 1 )
- adjustHealth(-1)
+ adjustHealth(-1 / rating)
//Health & Age///////////////////////////////////////////////////////////
// Plant dies if health <= 0
if(health <= 0)
plantdies()
- adjustWeeds(1) // Weeds flourish
+ adjustWeeds(1 / rating) // Weeds flourish
// If the plant is too old, lose health fast
if(age > myseed.lifespan)
- adjustHealth(-rand(1,5))
+ adjustHealth(-rand(1,5) / rating)
// Harvest code
if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead))
@@ -187,10 +200,10 @@
else
lastproduce = age
if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase
- adjustPests(1)
+ adjustPests(1 / rating)
else
if(waterlevel > 10 && nutrilevel > 0 && prob(10)) // If there's no plant, the percentage chance is 10%
- adjustWeeds(1)
+ adjustWeeds(1 / rating)
// Weeeeeeeeeeeeeeedddssss
@@ -436,18 +449,18 @@
// Nutriments
if(S.has_reagent("eznutriment", 1))
- yieldmod = 1
- mutmod = 1
+ yieldmod = 1 * rating
+ mutmod = 1 * rating
adjustNutri(round(S.get_reagent_amount("eznutriment") * 1))
if(S.has_reagent("left4zednutriment", 1))
- yieldmod = 0
- mutmod = 2
+ yieldmod = 0 * rating
+ mutmod = 2 * rating
adjustNutri(round(S.get_reagent_amount("left4zednutriment") * 1))
if(S.has_reagent("robustharvestnutriment", 1))
- yieldmod = 2
- mutmod = 0
+ yieldmod = 2 * rating
+ mutmod = 0 * rating
adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 ))
// Antitoxin binds shit pretty well. So the tox goes significantly down
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 125d19729e9..849c404c9fd 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -217,6 +217,19 @@
..()
charge = 0
+/obj/item/weapon/stock_parts/cell/bluespace
+ name = "bluespace power cell"
+ origin_tech = "powerstorage=7"
+ icon_state = "bscell"
+ maxcharge = 40000
+ g_amt = 80
+ rating = 6
+ chargerate = 4000
+
+/obj/item/weapon/stock_parts/cell/bluespace/empty/New()
+ ..()
+ charge = 0
+
/obj/item/weapon/stock_parts/cell/infinite
name = "infinite-capacity power cell!"
icon_state = "icell"
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 9a09974598c..8320aceda54 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -16,11 +16,36 @@
var/active = 0
var/powered = 0
var/fire_delay = 100
+ var/maximum_fire_delay = 100
+ var/minimum_fire_delay = 20
var/last_shot = 0
var/shot_number = 0
var/state = 0
var/locked = 0
+/obj/machinery/power/emitter/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/emitter(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ RefreshParts()
+
+/obj/machinery/power/emitter/RefreshParts()
+ var/max_firedelay = 120
+ var/firedelay = 120
+ var/min_firedelay = 24
+ var/power_usage = 350
+ for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts)
+ max_firedelay -= 20 * L.rating
+ min_firedelay -= 4 * L.rating
+ firedelay -= 20 * L.rating
+ maximum_fire_delay = max_firedelay
+ minimum_fire_delay = min_firedelay
+ fire_delay = firedelay
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ power_usage -= 50 * M.rating
+ active_power_usage = power_usage
/obj/machinery/power/emitter/verb/rotate()
set name = "Rotate"
@@ -71,7 +96,7 @@
src.active = 1
user << "You turn on \the [src]."
src.shot_number = 0
- src.fire_delay = 100
+ src.fire_delay = maximum_fire_delay
investigate_log("turned on by [user.key]","singulo")
update_icon()
else
@@ -119,7 +144,7 @@
src.fire_delay = 2
src.shot_number ++
else
- src.fire_delay = rand(20,100)
+ src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
src.shot_number = 0
var/obj/item/projectile/beam/emitter/A = PoolOrNew(/obj/item/projectile/beam/emitter,src.loc)
@@ -221,6 +246,17 @@
user << "Access denied."
return
+ if(default_deconstruction_screwdriver(user, "emitter", "emitter", W))
+ return
+
+ if(exchange_parts(user, W))
+ return
+
+ if(default_pry_open(W))
+ return
+
+ default_deconstruction_crowbar(W)
+
..()
return
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index ee333ef117b..6eaa62758d9 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -111,7 +111,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/chem_dispenser
category = list ("Medical Machinery")
-
+
/datum/design/chem_master
name = "Machine Design (Chem Master Board)"
desc = "The circuit board for a Chem Master 2999."
@@ -252,6 +252,16 @@
build_path = /obj/item/weapon/circuitboard/microwave
category = list ("Misc. Machinery")
+/datum/design/microwave
+ name = "Machine Design (Gibber Board)"
+ desc = "The circuit board for a gibber."
+ id = "gibber"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list("$glass" = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/gibber
+ category = list ("Misc. Machinery")
+
/datum/design/autolathe
name = "Machine Design (Autolathe Board)"
desc = "The circuit board for an autolathe."
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index ddf3ff047de..f9749c7267b 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -48,6 +48,19 @@
build_path = /obj/item/weapon/stock_parts/cell/hyper
category = list("Misc","Power Designs")
+/datum/design/bluespace_cell
+ name = "Bluespace Power Cell"
+ desc = "A power cell that holds 40000 units of energy."
+ id = "bluespace_cell"
+ req_tech = list("powerstorage" = 6, "materials" = 5)
+ reliability = 70
+ build_type = PROTOLATHE | MECHFAB
+ materials = list("$metal" = 800, "$gold" = 300, "$silver" = 300, "$glass" = 160, "$diamond" = 160)
+ construction_time=100
+ build_path = /obj/item/weapon/stock_parts/cell/bluespace
+ category = list("Misc","Power Designs")
+
+
/datum/design/light_replacer
name = "Light Replacer"
desc = "A device to automatically replace lights. Refill with working lightbulbs."
diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm
index 117722ecb4e..997716673bd 100644
--- a/code/modules/research/designs/stock_parts_designs.dm
+++ b/code/modules/research/designs/stock_parts_designs.dm
@@ -45,6 +45,17 @@
build_path = /obj/item/weapon/stock_parts/capacitor/super
category = list("Stock Parts")
+/datum/design/quadratic_capacitor
+ name = "Quadratic Capacitor"
+ desc = "A stock part used in the construction of various devices."
+ id = "quadratic_capacitor"
+ req_tech = list("powerstorage" = 6, "materials" = 5)
+ build_type = PROTOLATHE
+ reliability = 71
+ materials = list("$metal" = 100, "$glass" = 100, "$diamond" = 40)
+ build_path = /obj/item/weapon/stock_parts/capacitor/quadratic
+ category = list("Stock Parts")
+
//Scanning modules
/datum/design/basic_scanning
name = "Basic Scanning Module"
@@ -77,6 +88,17 @@
build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
category = list("Stock Parts")
+/datum/design/triphasic_scanning
+ name = "Triphasic Scanning Module"
+ desc = "A stock part used in the construction of various devices."
+ id = "triphasic_scanning"
+ req_tech = list("magnets" = 6, "materials" = 4)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 100, "$glass" = 40, "$diamond" = 20)
+ reliability = 72
+ build_path = /obj/item/weapon/stock_parts/scanning_module/triphasic
+ category = list("Stock Parts")
+
//Maipulators
/datum/design/micro_mani
name = "Micro Manipulator"
@@ -109,6 +131,17 @@
build_path = /obj/item/weapon/stock_parts/manipulator/pico
category = list("Stock Parts")
+/datum/design/femto_mani
+ name = "Femto Manipulator"
+ desc = "A stock part used in the construction of various devices."
+ id = "femto_mani"
+ req_tech = list("materials" = 6, "programming" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 60, "$diamond" = 30)
+ reliability = 73
+ build_path = /obj/item/weapon/stock_parts/manipulator/femto
+ category = list("Stock Parts")
+
//Micro-lasers
/datum/design/basic_micro_laser
name = "Basic Micro-Laser"
@@ -141,6 +174,17 @@
build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
category = list("Stock Parts")
+/datum/design/quadultra_micro_laser
+ name = "Quad-Ultra Micro-Laser"
+ desc = "A stock part used in the construction of various devices."
+ id = "quadultra_micro_laser"
+ req_tech = list("magnets" = 6, "materials" = 6)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 20, "$glass" = 40, "$uranium" = 20, "$diamond" = 20)
+ reliability = 70
+ build_path = /obj/item/weapon/stock_parts/micro_laser/quadultra
+ category = list("Stock Parts")
+
/datum/design/basic_matter_bin
name = "Basic Matter Bin"
desc = "A stock part used in the construction of various devices."
@@ -172,6 +216,17 @@
build_path = /obj/item/weapon/stock_parts/matter_bin/super
category = list("Stock Parts")
+/datum/design/bluespace_matter_bin
+ name = "Bluespace Matter Bin"
+ desc = "A stock part used in the construction of various devices."
+ id = "bluespace_matter_bin"
+ req_tech = list("materials" = 6)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 160, "$diamond" = 200)
+ reliability = 75
+ build_path = /obj/item/weapon/stock_parts/matter_bin/bluespace
+ category = list("Stock Parts")
+
//T-Comms devices
/datum/design/subspace_ansible
name = "Subspace Ansible"
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index e522d1fc166..ee9a8724618 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -172,6 +172,51 @@
rating = 3
m_amt = 80
+//Rating 4
+
+/obj/item/weapon/stock_parts/capacitor/quadratic
+ name = "quadratic capacitor"
+ desc = "An capacity capacitor used in the construction of a variety of devices."
+ icon_state = "quadratic_capacitor"
+ origin_tech = "powerstorage=6;materials=5"
+ rating = 4
+ m_amt = 50
+ g_amt = 50
+
+/obj/item/weapon/stock_parts/scanning_module/triphasic
+ name = "triphasic scanning module"
+ desc = "A compact, ultra resolution triphasic scanning module used in the construction of certain devices."
+ icon_state = "triphasic_scan_module"
+ origin_tech = "magnets=6"
+ rating = 4
+ m_amt = 50
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/manipulator/femto
+ name = "femto-manipulator"
+ desc = "A tiny little manipulator used in the construction of certain devices."
+ icon_state = "femto_mani"
+ origin_tech = "materials=6;programming=3"
+ rating = 4
+ m_amt = 30
+
+/obj/item/weapon/stock_parts/micro_laser/quadultra
+ name = "quad-ultra micro-laser"
+ icon_state = "quadultra_micro_laser"
+ desc = "A tiny laser used in certain devices."
+ origin_tech = "magnets=6"
+ rating = 4
+ m_amt = 10
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/matter_bin/bluespace
+ name = "bluespace matter bin"
+ desc = "A container for hold compressed matter awaiting re-construction."
+ icon_state = "bluespace_matter_bin"
+ origin_tech = "materials=6"
+ rating = 4
+ m_amt = 80
+
// Subspace stock parts
/obj/item/weapon/stock_parts/subspace/ansible
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 4d6c9a00bbb..f51725357a4 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 03e4bae5b5f..8b5b5b812e4 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ