From 876a5067a0e774eea3b14d16f539c06b9cc06078 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 17 Nov 2014 08:32:39 +0100 Subject: [PATCH] Adds constructable and upgradeable machinery, fixes the RPED, other minor fixes --- baystation12.dme | 1 + code/defines/obj/weapon.dm | 7 +- code/game/dna/dna_modifier.dm | 113 +++-- code/game/machinery/Sleeper.dm | 136 +++-- code/game/machinery/autolathe.dm | 109 ++-- code/game/machinery/biogenerator.dm | 330 ++++++++----- code/game/machinery/cloning.dm | 78 ++- code/game/machinery/computer/cloning.dm | 270 +++++----- code/game/machinery/computer/telescience.dm | 25 +- code/game/machinery/constructable_frame.dm | 465 +++++++++--------- code/game/machinery/cryo.dm | 53 +- code/game/machinery/hydroponics.dm | 68 ++- code/game/machinery/kitchen/microwave.dm | 41 +- code/game/machinery/machinery.dm | 65 ++- code/game/machinery/rechargestation.dm | 369 +++++++------- code/game/machinery/telecomms/logbrowser.dm | 2 +- .../telecomms/machine_interactions.dm | 16 +- code/game/machinery/telecomms/telemonitor.dm | 3 +- .../machinery/telecomms/traffic_control.dm | 1 + code/game/machinery/telepad.dm | 49 +- code/game/mecha/mech_fabricator.dm | 113 ++--- code/game/objects/items/bluespace_crystal.dm | 36 ++ .../game/objects/items/weapons/power_cells.dm | 10 +- code/modules/clothing/spacesuits/rig.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 6 +- code/modules/reagents/Chemistry-Machinery.dm | 84 +++- code/modules/research/circuitprinter.dm | 32 +- code/modules/research/designs.dm | 112 ++++- code/modules/research/destructive_analyzer.dm | 33 +- code/modules/research/protolathe.dm | 38 +- code/modules/research/rdconsole.dm | 72 +-- code/modules/research/server.dm | 50 +- icons/mob/species/skrell/helmet.dmi | Bin 2595 -> 14498 bytes icons/mob/species/skrell/suit.dmi | Bin 2837 -> 6739 bytes icons/mob/species/tajaran/helmet.dmi | Bin 3837 -> 16974 bytes icons/mob/species/tajaran/suit.dmi | Bin 1961 -> 5614 bytes icons/mob/species/unathi/helmet.dmi | Bin 2645 -> 12314 bytes icons/mob/species/unathi/suit.dmi | Bin 14119 -> 28026 bytes icons/obj/Cryogenic2.dmi | Bin 110255 -> 131849 bytes icons/obj/biogenerator.dmi | Bin 1515 -> 1712 bytes icons/obj/chemical.dmi | Bin 34867 -> 35248 bytes icons/obj/cloning.dmi | Bin 8298 -> 9878 bytes icons/obj/cryogenics.dmi | Bin 14976 -> 16818 bytes icons/obj/kitchen.dmi | Bin 25272 -> 25802 bytes icons/obj/objects.dmi | Bin 130449 -> 132155 bytes icons/obj/telescience.dmi | Bin 6150 -> 2410 bytes maps/cyberiad.dmm | 260 +++++----- maps/cyberiad.dmm.backup | 288 +++++------ nano/templates/cloning_console.tmpl | 124 +++++ nano/templates/telescience_console.tmpl | 1 + sound/items/rped.ogg | Bin 0 -> 51612 bytes 51 files changed, 2126 insertions(+), 1336 deletions(-) create mode 100644 code/game/objects/items/bluespace_crystal.dm create mode 100644 nano/templates/cloning_console.tmpl create mode 100644 sound/items/rped.ogg diff --git a/baystation12.dme b/baystation12.dme index adeb1dcc9e0..7fa9dd42499 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -582,6 +582,7 @@ #include "code\game\objects\effects\spawners\vaultspawner.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\bluespace_crystal.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\candle.dm" #include "code\game\objects\items\contraband.dm" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 17fda46ef26..92314aa7b48 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -589,7 +589,7 @@ icon_state = "RPED" item_state = "RPED" w_class = 5 - can_hold = list("/obj/item/weapon/stock_parts") + can_hold = list("/obj/item/weapon/stock_parts","/obj/item/weapon/cell") storage_slots = 14 use_to_pickup = 1 allow_quick_gather = 1 @@ -598,7 +598,10 @@ max_w_class = 3 max_combined_w_class = 28 - +/obj/item/weapon/storage/part_replacer/proc/play_rped_sound() + //Plays the sound for RPED exhanging or installing parts. + playsound(src, 'sound/items/rped.ogg', 40, 1) + /obj/item/weapon/stock_parts name = "stock part" desc = "What?" diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 6a538c4ab16..fd5fbc96e3e 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -39,7 +39,7 @@ name = "\improper DNA modifier" desc = "It scans DNA structures." icon = 'icons/obj/Cryogenic2.dmi' - icon_state = "scanner_0" + icon_state = "scanner_open" density = 1 anchored = 1.0 use_power = 1 @@ -49,6 +49,9 @@ var/mob/living/carbon/occupant = null var/obj/item/weapon/reagent_containers/glass/beaker = null var/opened = 0 + var/damage_coeff + var/scan_level + var/precision_coeff /obj/machinery/dna_scannernew/New() ..() @@ -58,10 +61,21 @@ component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) component_parts += new /obj/item/weapon/stock_parts/console_screen(src) - component_parts += new /obj/item/stack/cable_coil(src) - component_parts += new /obj/item/stack/cable_coil(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + component_parts += new /obj/item/stack/cable_coil(src, 1) RefreshParts() +/obj/machinery/dna_scannernew/RefreshParts() + scan_level = 0 + damage_coeff = 0 + precision_coeff = 0 + for(var/obj/item/weapon/stock_parts/scanning_module/P in component_parts) + scan_level += P.rating + for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts) + precision_coeff = P.rating + for(var/obj/item/weapon/stock_parts/micro_laser/P in component_parts) + damage_coeff = P.rating + /obj/machinery/dna_scannernew/allow_drop() return 0 @@ -119,7 +133,7 @@ usr.client.eye = src usr.loc = src src.occupant = usr - src.icon_state = "scanner_1" + src.icon_state = "scanner_occupied" src.add_fingerprint(usr) return @@ -165,31 +179,21 @@ user.pulling = null /obj/machinery/dna_scannernew/attackby(var/obj/item/weapon/item as obj, var/mob/user as mob) - if (istype(item, /obj/item/weapon/screwdriver)) - if (!opened) - src.opened = 1 - user << "You open the maintenance hatch of [src]." - //src.icon_state = "autolathe_t" - else - src.opened = 0 - user << "You close the maintenance hatch of [src]." - //src.icon_state = "autolathe" - return 1 - else if(istype(item, /obj/item/weapon/crowbar)) - if (occupant) - user << "\red You cannot disassemble this [src], it's occupado." - return 1 - if (opened) - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) - var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) - M.state = 2 - M.icon_state = "box_1" - for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 - I.loc = src.loc - del(src) + if(istype(item, /obj/item/weapon/screwdriver)) + if(occupant) + user << "The maintenance panel is locked." return + default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", item) + + if(exchange_parts(user, item)) + return + + if(istype(item, /obj/item/weapon/crowbar)) + if(panel_open) + for(var/obj/I in contents) // in case there is something in the scanner + I.loc = src.loc + default_deconstruction_crowbar(item) + return else if(istype(item, /obj/item/weapon/reagent_containers/glass)) if(beaker) user << "\red A beaker is already loaded into the machine." @@ -206,10 +210,13 @@ if (!ismob(G.affecting)) return if (src.occupant) - user << "\blue The scanner is already occupied!" + user << "\blue The scanner is already occupied!" return if (G.affecting.abiotic()) - user << "\blue Subject cannot have abiotic items on." + user << "\blue Subject cannot have abiotic items on." + return + if(panel_open) + usr << "\blue Close the maintenance panel first." return put_in(G.affecting) src.add_fingerprint(user) @@ -222,7 +229,7 @@ M.client.eye = src M.loc = src src.occupant = M - src.icon_state = "scanner_1" + src.icon_state = "scanner_occupied" // search for ghosts, if the corpse is empty and the scanner is connected to a cloner if(locate(/obj/machinery/computer/cloning, get_step(src, NORTH)) \ @@ -238,14 +245,20 @@ return /obj/machinery/dna_scannernew/proc/go_out() - if ((!( src.occupant ) || src.locked)) + if (!src.occupant) + usr << "The scanner is empty!" return + + if (src.locked) + usr << "The scanner is locked!" + return + if (src.occupant.client) src.occupant.client.eye = src.occupant.client.mob src.occupant.client.perspective = MOB_PERSPECTIVE src.occupant.loc = src.loc src.occupant = null - src.icon_state = "scanner_0" + src.icon_state = "scanner_open" return /obj/machinery/dna_scannernew/ex_act(severity) @@ -288,7 +301,7 @@ /obj/machinery/computer/scan_consolenew name = "DNA Modifier Access Console" - desc = "Scand DNA." + desc = "Allows you to scan and modify DNA." icon = 'icons/obj/computer.dmi' icon_state = "scanner" density = 1 @@ -327,7 +340,6 @@ return /obj/machinery/computer/scan_consolenew/ex_act(severity) - switch(severity) if(1.0) //SN src = null @@ -342,7 +354,6 @@ return /obj/machinery/computer/scan_consolenew/blob_act() - if(prob(75)) del(src) @@ -395,14 +406,20 @@ return */ /obj/machinery/computer/scan_consolenew/attack_paw(user as mob) - ui_interact(user) + attack_hand(user) /obj/machinery/computer/scan_consolenew/attack_ai(user as mob) src.add_hiddenprint(user) - ui_interact(user) + attack_hand(user) /obj/machinery/computer/scan_consolenew/attack_hand(user as mob) - if(!..()) + if(isnull(connected)) + for(dir in list(NORTH,EAST,SOUTH,WEST)) + connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) + if(!isnull(connected)) + attack_hand(user) + break + else if(!..()) ui_interact(user) /** @@ -475,7 +492,7 @@ occupantData["name"] = connected.occupant.name occupantData["stat"] = connected.occupant.stat occupantData["isViableSubject"] = 1 - if (M_NOCLONE in connected.occupant.mutations || !src.connected.occupant.dna) + if ((M_NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna) occupantData["isViableSubject"] = 0 occupantData["health"] = connected.occupant.health occupantData["maxHealth"] = connected.occupant.maxHealth @@ -553,7 +570,7 @@ else randmuti(src.connected.occupant) - src.connected.occupant.radiation += ((src.radiation_intensity*3)+src.radiation_duration*3) + src.connected.occupant.radiation += (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -649,7 +666,7 @@ src.connected.occupant.UpdateAppearance() src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration) else - if (prob(20+src.radiation_intensity)) + if (prob(20+src.radiation_intensity)) randmutb(src.connected.occupant) domutcheck(src.connected.occupant,src.connected) else @@ -700,7 +717,7 @@ irradiating = 0 if(src.connected.occupant) - if (prob((80 + (src.radiation_duration / 2)))) + if (prob((80 + ((src.radiation_duration / 2) + (connected.precision_coeff ** 3))))) // FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be. //if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20)) var/real_SE_block=selected_se_block @@ -713,11 +730,11 @@ //testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!") connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block) - src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration) + src.connected.occupant.radiation += ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) domutcheck(src.connected.occupant,src.connected) else - src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration) - if (prob(80-src.radiation_duration)) + src.connected.occupant.radiation += (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff) + if (prob(80-src.radiation_duration)) //testing("Random bad mut!") randmutb(src.connected.occupant) domutcheck(src.connected.occupant,src.connected) @@ -814,7 +831,7 @@ return 1 if (bufferOption == "transfer") - if (!src.connected.occupant || (M_NOCLONE in src.connected.occupant.mutations) || !src.connected.occupant.dna) + if (!src.connected.occupant || (M_NOCLONE in src.connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna) return irradiating = 2 @@ -838,7 +855,7 @@ src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.UpdateSE() domutcheck(src.connected.occupant,src.connected) - src.connected.occupant.radiation += rand(20,50) + src.connected.occupant.radiation += (rand(20,50) / connected.damage_coeff) return 1 if (bufferOption == "createInjector") diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 77dafd65054..c1e9fd6a9c4 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -5,11 +5,12 @@ /obj/machinery/sleep_console name = "Sleeper Console" icon = 'icons/obj/Cryogenic2.dmi' - icon_state = "sleeperconsole" + icon_state = "console" var/obj/machinery/sleeper/connected = null anchored = 1 //About time someone fixed this. density = 1 var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r" + dir = 4 l_color = "#7BF9FF" power_change() @@ -42,12 +43,12 @@ /obj/machinery/sleep_console/New() ..() spawn( 5 ) - if(orient == "RIGHT") - icon_state = "sleeperconsole-r" - src.connected = locate(/obj/machinery/sleeper, get_step(src, EAST)) - else - src.connected = locate(/obj/machinery/sleeper, get_step(src, WEST)) - + var/obj/machinery/sleeper/sleepernew = null + // Loop through every direction + for(dir in list(NORTH,EAST,SOUTH,WEST)) + // Try to find a scanner in that direction + sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) + src.connected = sleepernew return return @@ -60,6 +61,13 @@ /obj/machinery/sleep_console/attack_hand(mob/user as mob) if(..()) return + if (!src.connected) + var/obj/machinery/sleeper/sleepernew = null + // Loop through every direction + for(dir in list(NORTH,EAST,SOUTH,WEST)) + // Try to find a scanner in that direction + sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) + src.connected = sleepernew if (src.connected) var/mob/living/occupant = src.connected.occupant var/dat = "Occupant Statistics:
" @@ -83,8 +91,9 @@ dat += text("[]\t-Burn Severity %: []
", (occupant.getFireLoss() < 60 ? "" : ""), occupant.getFireLoss()) dat += text("
Paralysis Summary %: [] ([] seconds left!)
", occupant.paralysis, round(occupant.paralysis / 4)) if(occupant.reagents) - for(var/chemical in connected.available_chemicals) - dat += "[connected.available_chemicals[chemical]]: [occupant.reagents.get_reagent_amount(chemical)] units
" + for(var/chemical in connected.injection_chems) + var/datum/reagent/C = chemical_reagents_list[chemical] + dat += "[C.name]: [occupant.reagents.get_reagent_amount(chemical)] units
" dat += "Refresh Meter Readings
" if(src.connected.beaker) dat += "
Remove Beaker
" @@ -96,8 +105,9 @@ dat += text("Output Beaker has [] units of free space remaining

", src.connected.beaker.reagents.maximum_volume - src.connected.beaker.reagents.total_volume) else dat += "
No Dialysis Output Beaker is present.

" - for(var/chemical in connected.available_chemicals) - dat += "Inject [connected.available_chemicals[chemical]]: " + for(var/chemical in connected.injection_chems) + var/datum/reagent/C = chemical_reagents_list[chemical] + dat += "Inject [C.name]: " for(var/amount in connected.amounts) dat += "[amount] units
" dat += "
Eject Patient" @@ -118,7 +128,7 @@ if (src.connected.occupant) if (src.connected.occupant.stat == DEAD) usr << "\red \b This person has no life for to preserve anymore. Take them to a department capable of reanimating them." - else if(src.connected.occupant.health > 0 || href_list["chemical"] == "inaprovaline") + else if(src.connected.occupant.health > src.connected.min_health || href_list["chemical"] == "inaprovaline") src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"])) else usr << "\red \b This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!" @@ -142,12 +152,6 @@ return // no change - sleeper works without power (you just can't inject more) - - - - - - ///////////////////////////////////////// // THE SLEEPER ITSELF ///////////////////////////////////////// @@ -155,25 +159,51 @@ /obj/machinery/sleeper name = "Sleeper" icon = 'icons/obj/Cryogenic2.dmi' - icon_state = "sleeper_0" + icon_state = "sleeper-open" density = 1 anchored = 1 var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r" var/mob/living/carbon/human/occupant = null - var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") + var/possible_chems = list(list("inaprovaline", "stoxin", "dexalin", "bicaridine", "kelotane"), + list("inaprovaline", "stoxin", "dexalinp", "bicaridine", "dermaline", "kelotane", "imidazoline"), + list("inaprovaline", "stoxin", "dexalinp", "bicaridine", "dermaline", "kelotane", "imidazoline", "anti_toxin", "ryetalyn", "alkysine", "arithrazine")) var/amounts = list(5, 10) var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 + var/efficiency + var/initial_bin_rating = 1 + var/min_health = 25 + var/injection_chems = list() + dir = 4 New() ..() - beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large() - spawn( 5 ) - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - return - return + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/sleeper(src) + // Customizable bin rating, used by the labor camp to stop people filling themselves with chemicals and escaping. + var/obj/item/weapon/stock_parts/matter_bin/B = new(src) + B.rating = initial_bin_rating + component_parts += B + + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + RefreshParts() + + RefreshParts() + var/E + var/I + for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) + E += B.rating + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + I += M.rating + + injection_chems = possible_chems[I] + efficiency = E + min_health = -E * 25 + process() if(filtering > 0) if(beaker) @@ -208,8 +238,38 @@ else user << "\red The sleeper has a beaker already." return + + if (istype(G, /obj/item/weapon/screwdriver)) + if(src.occupant) + user << "The maintenance panel is locked." + return + default_deconstruction_screwdriver(user, "sleeper-o", "sleeper-open", G) + return + + if (istype(G, /obj/item/weapon/wrench)) + if(src.occupant) + user << "The scanner is occupied." + return + if(panel_open) + user << "Close the maintenance panel first." + return + if(dir == 4) + orient = "LEFT" + dir = 8 + else + orient = "RIGHT" + dir = 4 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + + if(exchange_parts(user, G)) + return - else if(istype(G, /obj/item/weapon/grab)) + default_deconstruction_crowbar(G) + + if(istype(G, /obj/item/weapon/grab)) + if(panel_open) + user << "\blue Close the maintenance panel first." + return if(!ismob(G:affecting)) return if(src.occupant) @@ -236,7 +296,6 @@ src.icon_state = "sleeper_1" if(orient == "RIGHT") icon_state = "sleeper_1-r" - M << "\blue You feel cool air surround you. You go numb as your senses turn inward." src.add_fingerprint(user) @@ -322,12 +381,12 @@ proc/inject_chemical(mob/living/user as mob, chemical, amount) if(src.occupant) if(src.occupant.reagents) - if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 40) + if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20 * efficiency) src.occupant.reagents.add_reagent(chemical, amount) - user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream." + user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [chemical] in his/her bloodstream." return else - user << "Medical overdose safeties restrict you injecting any more of this chemical." + user << "You can not inject any more of this chemical." return else user << "The patient rejects the chemicals!" @@ -372,9 +431,7 @@ set src in oview(1) if(usr.stat != 0) return - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - src.icon_state = "sleeper_0" + src.icon_state = "sleeper-open" src.go_out() add_fingerprint(usr) return @@ -401,7 +458,7 @@ return if(!ismob(O)) //humans only return - if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit + if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robots dont fit return if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper return @@ -409,6 +466,9 @@ return if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return + if(panel_open) + user << "\blue Close the maintenance panel first." + return if(occupant) user << "\blue The sleeper is already occupied!" return @@ -446,8 +506,6 @@ if(orient == "RIGHT") icon_state = "sleeper_1-r" L << "\blue You feel cool air surround you. You go numb as your senses turn inward." - for(var/obj/OO in src) - OO.loc = src.loc src.add_fingerprint(user) if(user.pulling == L) user.pulling = null @@ -483,9 +541,7 @@ usr.client.eye = src usr.loc = src src.occupant = usr - src.icon_state = "sleeper_1" - if(orient == "RIGHT") - icon_state = "sleeper_1-r" + src.icon_state = "sleeper" for(var/obj/O in src) del(O) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index a33f0e29398..8e34f6bf496 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -98,6 +98,7 @@ var/global/list/autolathe_recipes_hidden = list( \ idle_power_usage = 10 active_power_usage = 100 var/busy = 0 + var/prod_coeff l_color = "#7BF9FF" power_change() @@ -106,7 +107,22 @@ var/global/list/autolathe_recipes_hidden = list( \ SetLuminosity(2) else SetLuminosity(0) + +/obj/machinery/autolathe/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/autolathe(src) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + RefreshParts() + wires = new(src) + src.L = autolathe_recipes + src.LL = autolathe_recipes_hidden + /obj/machinery/autolathe/proc/wires_win(mob/user as mob) var/dat as text dat += "Autolathe Wires:
" @@ -120,6 +136,7 @@ var/global/list/autolathe_recipes_hidden = list( \ onclose(user, "autolathe_hack") /obj/machinery/autolathe/proc/regular_win(mob/user as mob) + var/coeff = 2 ** prod_coeff var/dat as text dat = text("Metal Amount: [src.m_amount] cm3 (MAX: [max_m_amount])
\nGlass Amount: [src.g_amount] cm3 (MAX: [max_g_amount])
\nFur Amount: [src.f_amount] cm3 (MAX: [max_f_amount])
") var/list/objs = list() @@ -127,7 +144,7 @@ var/global/list/autolathe_recipes_hidden = list( \ if (src.hacked) objs += src.LL for(var/obj/t in objs) - var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g/[t.f_amt] f)" + var/title = "[t.name] ([t.m_amt/coeff] m / [t.g_amt/coeff] g / [t.f_amt/coeff] f)" if (m_amount" continue @@ -143,6 +160,8 @@ var/global/list/autolathe_recipes_hidden = list( \ dat += " x[25]" if (max_multiplier>1) dat += " x[max_multiplier]" + else + dat += " [t.m_amt/coeff] m / [t.g_amt/coeff] g / [t.f_amt/coeff] f" dat += "
" user << browse("Autolathe Control Panel[dat]", "window=autolathe_regular") onclose(user, "autolathe_regular") @@ -163,34 +182,37 @@ var/global/list/autolathe_recipes_hidden = list( \ /obj/machinery/autolathe/interact(mob/user as mob) if(..()) return + if (src.shocked) src.shock(user,50) + if (src.opened) wires_win(user,50) return + if (src.disabled) user << "\red You press the button, but nothing happens." return + regular_win(user) return /obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) if (stat) return 1 + if (busy) user << "\red The autolathe is busy. Please wait for completion of previous operation." return 1 + if (istype(O, /obj/item/weapon/screwdriver)) - if (!opened) - src.opened = 1 - src.icon_state = "autolathe_t" - user << "You open the maintenance hatch of [src]." - else - src.opened = 0 - src.icon_state = "autolathe" - user << "You close the maintenance hatch of [src]." + default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O) return 1 - if (opened) + + if(exchange_parts(user, O)) + return + + if (panel_open) //Don't eat multitools or wirecutters used on an open lathe. if(istype(O, /obj/item/device/multitool) || istype(O, /obj/item/weapon/wirecutters)) attack_hand(user) @@ -198,10 +220,6 @@ var/global/list/autolathe_recipes_hidden = list( \ //Dismantle the frame. if(istype(O, /obj/item/weapon/crowbar)) - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) - var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) - M.state = 2 - M.icon_state = "box_1" for(var/obj/I in component_parts) if(I.reliability != 100 && crit_fail) I.crit_fail = 1 @@ -212,7 +230,7 @@ var/global/list/autolathe_recipes_hidden = list( \ if(g_amount >= 3750) var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc) G.amount = round(g_amount / 3750) - del(src) + default_deconstruction_crowbar(O) return 1 else user.set_machine(src) @@ -288,7 +306,8 @@ var/global/list/autolathe_recipes_hidden = list( \ usr.set_machine(src) src.add_fingerprint(usr) if (!busy) - if(href_list["make"]) + if(href_list["make"]) + var/coeff = 2 ** prod_coeff var/turf/T = get_step(src.loc, get_dir(src,usr)) // critical exploit fix start -walter0o @@ -327,31 +346,36 @@ var/global/list/autolathe_recipes_hidden = list( \ return var/power = max(2000, (template.m_amt+template.g_amt+template.f_amt)*multiplier/5) - if(src.m_amount >= template.m_amt*multiplier && src.g_amount >= template.g_amt*multiplier && src.f_amount >= template.f_amt*multiplier) + if(src.m_amount >= template.m_amt*multiplier/coeff && src.g_amount >= template.g_amt*multiplier/coeff && src.f_amount >= template.f_amt*multiplier/coeff) busy = 1 use_power(power) icon_state = "autolathe" flick("autolathe_n",src) - spawn(16) + spawn(32/coeff) use_power(power) - spawn(16) - use_power(power) - spawn(16) - src.m_amount -= template.m_amt*multiplier - src.g_amount -= template.g_amt*multiplier - src.f_amount -= template.f_amt*multiplier - if(src.m_amount < 0) - src.m_amount = 0 - if(src.g_amount < 0) - src.g_amount = 0 - if(src.f_amount < 0) - src.f_amount = 0 - var/obj/new_item = new template.type(T) - if (multiplier>1) - var/obj/item/stack/S = new_item - S.amount = multiplier - busy = 0 - src.updateUsrDialog() + if(istype(template, /obj/item/stack)) + src.m_amount -= template.m_amt*multiplier + src.g_amount -= template.g_amt*multiplier + src.f_amount -= template.f_amt*multiplier + var/obj/new_item = new template.type(T) + var/obj/item/stack/S = new_item + S.amount = multiplier + else + src.m_amount -= template.m_amt/coeff + src.g_amount -= template.g_amt/coeff + src.f_amount -= template.f_amt/coeff + var/obj/item/new_item = new template.type(T) + new_item.m_amt /= coeff + new_item.g_amt /= coeff + new_item.f_amt /= coeff + if(src.m_amount < 0) + src.m_amount = 0 + if(src.g_amount < 0) + src.g_amount = 0 + if(src.f_amount < 0) + src.f_amount = 0 + busy = 0 + if(href_list["act"]) var/temp_wire = href_list["wire"] if(href_list["act"] == "pulse") @@ -390,7 +414,18 @@ var/global/list/autolathe_recipes_hidden = list( \ src.updateUsrDialog() return - +/obj/machinery/autolathe/RefreshParts() + var/tot_rating = 0 + prod_coeff = 0 + for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts) + tot_rating += MB.rating + tot_rating *= 25000 + max_m_amount = tot_rating * 2 + max_g_amount = tot_rating + max_f_amount = tot_rating + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + prod_coeff += M.rating - 1 + /obj/machinery/autolathe/RefreshParts() ..() var/tot_rating = 0 diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 263f797a95d..94e3e75a1ea 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -1,8 +1,8 @@ /obj/machinery/biogenerator name = "Biogenerator" - desc = "" + desc = "Converts plants into biomass, which can be used to construct useful items." icon = 'icons/obj/biogenerator.dmi' - icon_state = "biogen-stand" + icon_state = "biogen-empty" density = 1 anchored = 1 use_power = 1 @@ -11,111 +11,165 @@ var/obj/item/weapon/reagent_containers/glass/beaker = null var/points = 0 var/menustat = "menu" + var/efficiency = 0 + var/productivity = 0 - New() +/obj/machinery/biogenerator/New() ..() - var/datum/reagents/R = new/datum/reagents(1000) - reagents = R - R.my_atom = src - beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + create_reagents(1000) + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/biogenerator(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) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() - on_reagent_change() //When the reagents change, change the icon as well. +/obj/machinery/biogenerator/RefreshParts() + var/E = 0 + var/P = 0 + for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) + P += B.rating + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + E += M.rating + efficiency = E + productivity = P + +/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. update_icon() - update_icon() - if(!src.beaker) - icon_state = "biogen-empty" - else if(!src.processing) - icon_state = "biogen-stand" - else - icon_state = "biogen-work" - return +/obj/machinery/biogenerator/update_icon() + if(panel_open) + icon_state = "biogen-empty-o" + else if(!src.beaker) + icon_state = "biogen-empty" + else if(!src.processing) + icon_state = "biogen-stand" + else + icon_state = "biogen-work" + return /obj/machinery/biogenerator/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/weapon/reagent_containers/glass)) + if(istype(O, /obj/item/weapon/reagent_containers/glass) && !panel_open) if(beaker) - user << "\red The biogenerator is already loaded." + user << "A container is already loaded into the machine." else user.before_take_item(O) O.loc = src beaker = O + user << "You add the container to the machine." updateUsrDialog() + + if(!processing) + if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O)) + if(beaker) + var/obj/item/weapon/reagent_containers/glass/B = beaker + B.loc = loc + beaker = null + return + + if(exchange_parts(user, O)) + return + + else if(istype(O, /obj/item/weapon/crowbar)) + else if(panel_open) + user << "Close the maintenance panel first." else if(processing) - user << "\red The biogenerator is currently processing." + user << "The biogenerator is currently processing." else if(istype(O, /obj/item/weapon/storage/bag/plants)) var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= 10) - user << "\red The biogenerator is already full! Activate it." + user << "The biogenerator is already full! Activate it." else for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) + if(i >= 10) + break G.loc = src i++ - if(i >= 10) - user << "\blue You fill the biogenerator to its capacity." - break if(i<10) - user << "\blue You empty the plant bag into the biogenerator." + user << "You 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." + else + user << "You fill the biogenerator to its capacity." - - else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) - user << "\red You cannot put this in [src.name]" + else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) && !istype(O, /obj/item/weapon/crowbar)) + user << "You can not put this in [src.name]" else var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= 10) - user << "\red The biogenerator is full! Activate it." + user << "The biogenerator is full! Activate it." else user.before_take_item(O) O.loc = src - user << "\blue You put [O.name] in [src.name]" + user << "You put [O.name] in [src.name]" + + + default_deconstruction_crowbar(O) + update_icon() return /obj/machinery/biogenerator/interact(mob/user as mob) - if(stat & BROKEN) + if(stat & BROKEN || panel_open) return user.set_machine(src) - var/dat = "BiogeneratorBiogenerator:
" - if (processing) - dat += "Biogenerator is processing! Please wait..." + var/dat + if(processing) + dat += "
Biogenerator is processing! Please wait...

" else - dat += "Biomass: [points] points.
" switch(menustat) - if("menu") - if (beaker) - dat += "Activate Biogenerator!
" - dat += "Detach Container

" - dat += "Food
" - dat += "10 milk (20)
" - dat += "Slab of meat (50)
" - dat += "Nutrient
" - dat += "E-Z-Nutrient (10) | x5
" - dat += "Left 4 Zed (20) | x5
" - dat += "Robust Harvest (25) | x5
" - dat += "Leather
" - dat += "Wallet (100)
" - dat += "Botanical gloves (250)
" - dat += "Utility belt (300)
" - dat += "Leather Satchel (400)
" - dat += "Cash Bag (400)
" - //dat += "Other
" - //dat += "Monkey (500)
" - else - dat += "
No beaker inside. Please insert a beaker.
" if("nopoints") - dat += "You do not have biomass to create products.
Please, put growns into reactor and activate it.
" - dat += "Return to menu" + dat += "
You do not have sufficient biomass to create products.
Please put growns into the reactor and activate it.
" + menustat = "menu" if("complete") - dat += "Operation complete.
" - dat += "Return to menu" + dat += "
Operation complete.
" + menustat = "menu" if("void") - dat += "Error: No growns inside.
Please, put growns into reactor.
" - dat += "Return to menu" - user << browse(dat, "window=biogenerator") - onclose(user, "biogenerator") + dat += "
Error: No growns inside.
Please put growns into reactor.
" + menustat = "menu" + if("nobeakerspace") + dat += "
Not enough space left in container. Unable to create product.
" + menustat = "menu" + if(beaker) + dat += "
Biomass: [points] units.

" + dat += "ActivateDetach Container" + dat += "

Food:

" + dat += "
" + dat += "10 milk: Make ([20/efficiency])
" + /*dat += "10 cream: Make ([30/efficiency])
"*/ + dat += "Monkey cube: Make ([250/efficiency])" + dat += "
" + dat += "

Nutrients:

" + dat += "
" + dat += "E-Z-Nutrient: Makex5 ([10/efficiency])
" + dat += "Left 4 Zed: Makex5 ([20/efficiency])
" + dat += "Robust Harvest: Makex5 ([25/efficiency])
" + dat += "
" + dat += "

Leather:

" + dat += "
" + dat += "Wallet: Make ([100/efficiency])
" + /*dat += "Book bag: Make ([200/efficiency])
" + dat += "Plant bag: Make ([200/efficiency])
" + dat += "Mining satchel: Make ([200/efficiency])
"*/ + dat += "Botanical gloves: Make ([250/efficiency])
" + dat += "Utility belt: Make ([300/efficiency])
" + dat += "Leather Satchel: Make ([400/efficiency])
" + dat += "Cash Bag: Make ([400/efficiency])
" + /*dat += "Leather Jacket: Make ([500/efficiency])
"*/ + //dat += "

Other:

" + //dat += "Monkey: Make ([400/efficiency])
" + dat += "
" + else + dat += "
No container inside. Please insert a container.
" + + var/datum/browser/popup = new(user, "biogen", name, 350, 520) + popup.set_content(dat) + popup.open() return /obj/machinery/biogenerator/attack_hand(mob/user as mob) @@ -127,100 +181,132 @@ if (src.stat != 0) //NOPOWER etc return if(src.processing) - usr << "\red The biogenerator is in the process of working." + usr << "The biogenerator is in the process of working." return var/S = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents) S += 5 if(I.reagents.get_reagent_amount("nutriment") < 0.1) - points += 1 - else points += I.reagents.get_reagent_amount("nutriment")*10 - del(I) + points += 1*productivity + else points += I.reagents.get_reagent_amount("nutriment")*10*productivity + qdel(I) if(S) processing = 1 update_icon() updateUsrDialog() playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) use_power(S*30) - sleep(S+15) + sleep(S+15/productivity) processing = 0 update_icon() else menustat = "void" return -/obj/machinery/biogenerator/proc/create_product(var/item,var/cost) - if(cost > points) +/obj/machinery/biogenerator/proc/check_cost(var/cost) + if (cost > points) menustat = "nopoints" + return 1 + else + points -= cost + processing = 1 + update_icon() + updateUsrDialog() return 0 - processing = 1 - update_icon() - updateUsrDialog() - points -= cost - sleep(30) - switch(item) + +/obj/machinery/biogenerator/proc/check_container_volume(var/reagent_amount) + if(beaker.reagents.total_volume + reagent_amount > beaker.reagents.maximum_volume) + menustat = "nobeakerspace" + return 1 + +/obj/machinery/biogenerator/proc/create_product(var/create) + switch(create) if("milk") - beaker.reagents.add_reagent("milk",10) + if(check_container_volume(10)) return 0 + else if (check_cost(20/efficiency)) return 0 + else beaker.reagents.add_reagent("milk",10) + /*if("cream") + if(check_container_volume(10)) return 0 + else if (check_cost(30/efficiency)) return 0 + else beaker.reagents.add_reagent("cream",10)*/ if("meat") - new/obj/item/weapon/reagent_containers/food/snacks/meat(src.loc) + if (check_cost(250/efficiency)) return 0 + else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc) if("ez") - new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) + if (check_cost(10/efficiency)) return 0 + else new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) if("l4z") - new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) + if (check_cost(20/efficiency)) return 0 + else new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) if("rh") - new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) - if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan - new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc) - if("l4z5") - new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc) - if("rh5") - new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) - new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) + if (check_cost(25/efficiency)) return 0 + else new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc) if("wallet") - new/obj/item/weapon/storage/wallet(src.loc) + if (check_cost(100/efficiency)) return 0 + else new/obj/item/weapon/storage/wallet(src.loc) + /*if("bkbag") + if (check_cost(200/efficiency)) return 0 + else new/obj/item/weapon/storage/bag/books(src.loc) + if("ptbag") + if (check_cost(200/efficiency)) return 0 + else new/obj/item/weapon/storage/bag/plants(src.loc) + if("mnbag") + if (check_cost(200/efficiency)) return 0 + else new/obj/item/weapon/storage/bag/ore(src.loc)*/ if("gloves") - new/obj/item/clothing/gloves/botanic_leather(src.loc) + if (check_cost(250/efficiency)) return 0 + else new/obj/item/clothing/gloves/botanic_leather(src.loc) if("tbelt") - new/obj/item/weapon/storage/belt/utility(src.loc) + if (check_cost(300/efficiency)) return 0 + else new/obj/item/weapon/storage/belt/utility(src.loc) if("satchel") - new/obj/item/weapon/storage/backpack/satchel(src.loc) + if (check_cost(400/efficiency)) return 0 + else new/obj/item/weapon/storage/backpack/satchel(src.loc) if("cashbag") - new/obj/item/weapon/storage/bag/cash(src.loc) - if("monkey") - new/mob/living/carbon/monkey(src.loc) + if (check_cost(400/efficiency)) return 0 + else new/obj/item/weapon/storage/bag/cash(src.loc) + /*if("jacket") + if (check_cost(500/efficiency)) return 0 + else new/obj/item/clothing/suit/jacket/leather(src.loc)*/ + //if("monkey") + // if (check_cost(500)) return 0 + // else new/mob/living/carbon/monkey(src.loc) processing = 0 menustat = "complete" update_icon() return 1 +/obj/machinery/biogenerator/proc/detach() + if(beaker) + beaker.loc = src.loc + beaker = null + update_icon() + /obj/machinery/biogenerator/Topic(href, href_list) - if(stat & BROKEN) return - if(usr.stat || usr.restrained()) return - if(!in_range(src, usr)) return + if(..() || panel_open) + return usr.set_machine(src) - switch(href_list["action"]) - if("activate") - activate() - if("detach") - if(beaker) - beaker.loc = src.loc - beaker = null - update_icon() - if("create") - create_product(href_list["item"],text2num(href_list["cost"])) - if("menu") - menustat = "menu" - updateUsrDialog() + if(href_list["activate"]) + activate() + updateUsrDialog() + + else if(href_list["detach"]) + detach() + updateUsrDialog() + + else if(href_list["create"]) + var/amount = (text2num(href_list["amount"])) + var/i = amount + var/C = href_list["create"] + if(i <= 0) + return + while(i >= 1) + create_product(C) + i-- + updateUsrDialog() + + else if(href_list["menu"]) + menustat = "menu" + updateUsrDialog() \ No newline at end of file diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index bf2e96c0f70..2ffffad0879 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -21,6 +21,8 @@ var/attempting = 0 //One clone attempt at a time thanks var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk var/biomass = CLONE_BIOMASS // * 3 - N3X + var/speed_coeff + var/efficiency l_color = "#00FF00" power_change() @@ -30,7 +32,28 @@ else SetLuminosity(0) +/obj/machinery/clonepod/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/clonepod(src) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + component_parts += new /obj/item/stack/cable_coil(src, 1) + RefreshParts() +/obj/machinery/clonepod/RefreshParts() + speed_coeff = 0 + efficiency = 0 + for(var/obj/item/weapon/stock_parts/scanning_module/S in component_parts) + efficiency += S.rating + for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts) + speed_coeff += P.rating + heal_level = (efficiency * 15) + 10 + //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. /obj/item/weapon/disk/data @@ -143,7 +166,7 @@ //Start growing a human clone in the pod! /obj/machinery/clonepod/proc/growclone(var/datum/dna2/record/R) - if(mess || attempting) + if(mess || attempting || panel_open) return 0 var/datum/mind/clonemind = locate(R.mind) if(!istype(clonemind)) //not a mind @@ -165,7 +188,6 @@ break return 0 - src.heal_level = rand(10,40) //Randomizes what health the clone is when ejected src.attempting = 1 //One at a time!! src.locked = 1 @@ -182,8 +204,8 @@ src.icon_state = "pod_1" //Get the clone body ready - H.adjustCloneLoss(150) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite - H.adjustBrainLoss(src.heal_level + 50 + rand(10, 30)) // The rand(10, 30) will come out as extra brain damage + H.adjustCloneLoss(190) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite + H.adjustBrainLoss(190) // The rand(10, 30) will come out as extra brain damage H.Paralyse(4) //Here let's calculate their health so the pod doesn't immediately eject them!!! @@ -217,7 +239,12 @@ else H.dna=R.dna H.UpdateAppearance() - randmutb(H) //Sometimes the clones come out wrong. + if(efficiency > 2 && efficiency < 5 && prob(25)) + randmutb(H) + if(efficiency > 5 && prob(20)) + randmutg(H) + if(efficiency < 3 && prob(50)) + randmutb(H) H.dna.UpdateSE() H.dna.UpdateUI() @@ -250,14 +277,14 @@ src.connected_message("Clone Rejected: Deceased.") return - else if(src.occupant.health < src.heal_level) + else if(src.occupant.cloneloss > (100 - src.heal_level)) src.occupant.Paralyse(4) //Slowly get that clone healed and finished. - src.occupant.adjustCloneLoss(-2) + src.occupant.adjustCloneLoss(-((speed_coeff/2))) //Premature clones may have brain damage. - src.occupant.adjustBrainLoss(-1) + src.occupant.adjustBrainLoss(-((speed_coeff/2))) //So clones don't die of oxyloss in a running pod. if (src.occupant.reagents.get_reagent_amount("inaprovaline") < 30) @@ -269,7 +296,7 @@ use_power(7500) //This might need tweaking. return - else if((src.occupant.health >= src.heal_level) && (!src.eject_wait)) + else if((src.occupant.cloneloss <= (100 - src.heal_level)) && (!src.eject_wait)) src.connected_message("Cloning Process Complete.") src.locked = 0 src.go_out() @@ -279,7 +306,7 @@ src.occupant = null if (src.locked) src.locked = 0 - if (!src.mess) + if (!src.mess && !panel_open) icon_state = "pod_0" //use_power(200) return @@ -288,6 +315,20 @@ //Let's unlock this early I guess. Might be too early, needs tweaking. /obj/machinery/clonepod/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/screwdriver)) + if(occupant || mess || locked) + user << "The maintenance panel is locked." + return + default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W) + return + + if(exchange_parts(user, W)) + return + + if(istype(W, /obj/item/weapon/crowbar)) + if(panel_open) + default_deconstruction_crowbar(W) + return if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (!src.check_access(W)) user << "\red Access Denied." @@ -348,17 +389,16 @@ set name = "Eject Cloner" set category = "Object" set src in oview(1) - + + if(!usr) + return if (usr.stat != 0) return - src.go_out() + src.go_out(usr) add_fingerprint(usr) return -/obj/machinery/clonepod/proc/go_out() - if (src.locked) - return - +/obj/machinery/clonepod/proc/go_out(user) if (src.mess) //Clean that mess and dump those gibs! src.mess = 0 gibs(src.loc) @@ -371,8 +411,12 @@ return if (!(src.occupant)) + user << "The cloning pod is empty!" return + if (src.locked) + user << "The cloning pod is locked!" + return /* for(var/obj/O in src) O.loc = src.loc @@ -409,7 +453,7 @@ return /obj/machinery/clonepod/emp_act(severity) - if(prob(100/severity)) malfunction() + if(prob(100/(severity*efficiency))) malfunction() ..() /obj/machinery/clonepod/ex_act(severity) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 32bc1d50cc7..fe146f96aea 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -1,5 +1,5 @@ /obj/machinery/computer/cloning - name = "Cloning console" + name = "Cloning Console" icon = 'icons/obj/computer.dmi' icon_state = "dna" circuit = "/obj/item/weapon/circuitboard/cloning" @@ -7,12 +7,14 @@ var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. var/obj/machinery/clonepod/pod1 = null //Linked cloning pod. var/temp = "" - var/scantemp = "Scanner unoccupied" + var/scantemp = "Scanner ready." var/menu = 1 //Which menu screen to display var/list/records = list() var/datum/dna2/record/active_record = null var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything. var/loading = 0 // Nice loading text + var/autoprocess = 0 + var/data[0] l_color = "#0000FF" @@ -23,6 +25,19 @@ return return +/obj/machinery/computer/cloning/process() + if(!(scanner && pod1 && autoprocess)) + return + + if(scanner.occupant && (scanner.scan_level > 2)) + scan_mob(scanner.occupant) + + if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5)) + for(var/datum/dna2/record/R in src.records) + if(!(pod1.occupant || pod1.mess)) + if(pod1.growclone(R)) + records.Remove(R) + /obj/machinery/computer/cloning/proc/updatemodules() src.scanner = findscanner() src.pod1 = findcloner() @@ -65,7 +80,7 @@ W.loc = src src.diskette = W user << "You insert [W]." - src.updateUsrDialog() + nanomanager.update_uis(src) return else ..() @@ -85,118 +100,58 @@ return updatemodules() + ui_interact(user) - var/dat = "

Cloning System Control

" - dat += "Refresh" +/obj/machinery/computer/cloning/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(..()) + return + if(stat & (NOPOWER|BROKEN)) + return - dat += "
[temp]
" - - switch(src.menu) - if(1) - // Modules - dat += "

Modules

" - //dat += "Reload Modules" - if (isnull(src.scanner)) - dat += " Scanner-ERROR
" - else - dat += " Scanner-Found!
" - if (isnull(src.pod1)) - dat += " Pod-ERROR
" - else - dat += " Pod-Found!
" - - // Scanner - dat += "

Scanner Functions

" - - if(loading) - dat += "Scanning...
" - else - dat += "[scantemp]
" - - if (isnull(src.scanner)) - dat += "No scanner connected!
" - else - if (src.scanner.occupant) - if(scantemp == "Scanner unoccupied") scantemp = "" // Stupid check to remove the text - - dat += "Scan - [src.scanner.occupant]
" - else - scantemp = "Scanner unoccupied" - - dat += "Lock status: [src.scanner.locked ? "Locked" : "Unlocked"]
" - - if (!isnull(src.pod1)) - dat += "Biomass: [src.pod1.biomass]
" - - // Database - dat += "

Database Functions

" - dat += "View Records
" - if (src.diskette) - dat += "Eject Disk" - - - if(2) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\computer\cloning.dm:217: dat += "

Current records

" - dat += {"

Current records

- Back