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