diff --git a/code/game/dna.dm b/code/game/dna.dm index 04c6a091e5a..7afa8eef26a 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -336,6 +336,9 @@ use_power = 1 idle_power_usage = 50 active_power_usage = 300 + var/damage_coeff + var/scan_level + var/precision_coeff /obj/machinery/dna_scannernew/New() ..() @@ -347,8 +350,20 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(null) component_parts += new /obj/item/weapon/cable_coil(null, 1) component_parts += new /obj/item/weapon/cable_coil(null, 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/proc/toggle_open(mob/user=usr) if(!user) return @@ -582,7 +597,7 @@ if(connected) if(connected.occupant) //set occupant_status message viable_occupant = connected.occupant - if(check_dna_integrity(viable_occupant) && !(NOCLONE in viable_occupant.mutations)) //occupent is viable for dna modification + if(check_dna_integrity(viable_occupant) && (!(NOCLONE in viable_occupant.mutations) || (connected.scan_level == 3))) //occupent is viable for dna modification occupant_status += "[viable_occupant.name] => " switch(viable_occupant.stat) if(CONSCIOUS) occupant_status += "Conscious" @@ -624,7 +639,7 @@ var/stddev = radstrength*RADIATION_STRENGTH_MULTIPLIER status += "
Output Level:
[radstrength]
" status += "
  \> Mutation:
(-[stddev] to +[stddev] = 68%) (-[2*stddev] to +[2*stddev] = 95%)
" - stddev = RADIATION_ACCURACY_MULTIPLIER/radduration + stddev = RADIATION_ACCURACY_MULTIPLIER/(radduration + (connected.precision_coeff ** 2)) var/chance_to_hit switch(stddev) //hardcoded values from a z-table for a normal distribution if(0 to 0.25) chance_to_hit = ">95%" @@ -829,7 +844,7 @@ num = Clamp(num, 1, NUMBER_OF_BUFFERS) var/list/buffer_slot = buffer[num] if(istype(buffer_slot)) - viable_occupant.radiation += rand(15,40) + viable_occupant.radiation += rand(15/(connected.damage_coeff ** 2),40/(connected.damage_coeff ** 2)) switch(href_list["text"]) if("se") if(buffer_slot["SE"]) @@ -899,12 +914,12 @@ current_screen = "mainmenu" if(viable_occupant && connected && connected.occupant==viable_occupant) - viable_occupant.radiation += RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength + viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) switch(href_list["task"]) if("pulseui") var/len = length(viable_occupant.dna.uni_identity) num = Wrap(num, 1, len+1) - num = randomize_radiation_accuracy(num, radduration, len) + num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) var/block = round((num-1)/DNA_BLOCK_SIZE)+1 var/subblock = num - block*DNA_BLOCK_SIZE diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6a31eb60051..c2a68b9f567 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -89,6 +89,7 @@ var/global/list/autolathe_recipes_hidden = list( \ idle_power_usage = 10 active_power_usage = 100 var/busy = 0 + var/prod_coeff proc wires_win(mob/user as mob) @@ -104,6 +105,7 @@ var/global/list/autolathe_recipes_hidden = list( \ onclose(user, "autolathe_hack") 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])
") var/list/objs = list() @@ -111,12 +113,13 @@ 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)" - if (m_amount" - continue - dat += "[title]" if (istype(t, /obj/item/stack)) + var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g)" + if (m_amount" + continue + dat += "[title]" + var/obj/item/stack/S = t var/max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY) if (max_multiplier>1) @@ -127,6 +130,12 @@ var/global/list/autolathe_recipes_hidden = list( \ dat += " x[25]" if (max_multiplier>1) dat += " x[max_multiplier]" + else + var/title = "[t.name] ([t.m_amt/coeff] m /[t.g_amt/coeff] g)" + if (m_amount" + continue + dat += "[title]" dat += "
" user << browse("Autolathe Control Panel[dat]", "window=autolathe_regular") onclose(user, "autolathe_regular") @@ -250,6 +259,7 @@ var/global/list/autolathe_recipes_hidden = list( \ src.add_fingerprint(usr) if (!busy) if(href_list["make"]) + var/coeff = 2 ** prod_coeff var/turf/T = get_step(src.loc, get_dir(src,usr)) var/obj/template = locate(href_list["make"]) var/multiplier = text2num(href_list["multiplier"]) @@ -260,21 +270,27 @@ var/global/list/autolathe_recipes_hidden = list( \ use_power(power) icon_state = "autolathe" flick("autolathe_n",src) - spawn(16) + spawn(16/coeff) use_power(power) - spawn(16) + spawn(16/coeff) use_power(power) - spawn(16) - src.m_amount -= template.m_amt*multiplier - src.g_amount -= template.g_amt*multiplier + spawn(16/coeff) + if(template.type == /obj/item/stack) + src.m_amount -= template.m_amt*multiplier + src.g_amount -= template.g_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 + var/obj/new_item = new template.type(T) + new_item.m_amt /= coeff + new_item.g_amt /= coeff if(src.m_amount < 0) src.m_amount = 0 if(src.g_amount < 0) src.g_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(href_list["act"]) @@ -319,11 +335,14 @@ var/global/list/autolathe_recipes_hidden = list( \ 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 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + prod_coeff += M.rating - 1 New() ..() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 2498538e4f2..21b4645e918 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -18,6 +18,8 @@ var/mess = 0 //Need to clean out it if it's full of exploded clone. 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/speed_coeff + var/efficiency /obj/machinery/clonepod/New() ..() @@ -30,7 +32,16 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(src) component_parts += new /obj/item/weapon/cable_coil(src, 1) component_parts += new /obj/item/weapon/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. @@ -132,8 +143,6 @@ return 0 - src.heal_level = rand(50,90) //Randomizes what health the clone is when ejected - src.attempting = 1 //One at a time!! src.locked = 1 @@ -150,8 +159,8 @@ src.icon_state = "pod_1" //Get the clone body ready - H.adjustCloneLoss(src.heal_level + 100) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite - H.adjustBrainLoss(heal_level) + 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) H.Paralyse(4) //Here let's calculate their health so the pod doesn't immediately eject them!!! @@ -178,7 +187,13 @@ // -- End mode specific stuff hardset_dna(H, ui, se, null, mrace) - randmutb(H) //Sometimes the clones come out wrong. + if(efficiency > 2) + for(var/A in bad_se_blocks) + setblock(H.dna.struc_enzymes, A, construct_block(0,2)) + if(efficiency > 5 && prob(20)) + randmutg(H) + if(efficiency < 3 && prob(50)) + randmutb(H) if(H.gender == MALE) H.facial_hair_style = "Full Beard" @@ -206,14 +221,15 @@ src.connected_message("Clone Rejected: Deceased.") return - else if(src.occupant.cloneloss > src.heal_level) + else if(src.occupant.cloneloss > (100 - src.heal_level)) + world.log << "This works" src.occupant.Paralyse(4) //Slowly get that clone healed and finished. - src.occupant.adjustCloneLoss(-heal_level/50) + src.occupant.adjustCloneLoss(-((speed_coeff/2))) //Premature clones may have brain damage. - src.occupant.adjustBrainLoss(-heal_level/100) + 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) @@ -222,7 +238,7 @@ use_power(7500) //This might need tweaking. return - else if((src.occupant.cloneloss <= 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() @@ -350,7 +366,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 5400185bd75..c83680469cc 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -15,6 +15,7 @@ var/datum/data/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 /obj/machinery/computer/cloning/New() ..() @@ -23,6 +24,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/data/record/R in records) + if(!(pod1.occupant || pod1.mess)) + if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"])) + records -= R + /obj/machinery/computer/cloning/proc/updatemodules() src.scanner = findscanner() src.pod1 = findcloner() @@ -82,7 +96,13 @@ var/dat = "" dat += "Refresh" - + if(scanner && pod1 && ((scanner.scan_level > 2) || (pod1.efficiency > 5))) + if(!autoprocess) + dat += "Autoprocess" + else + dat += "Stop autoprocess" + else + dat += "Autoprocess" dat += "

Cloning Pod Status

" dat += "
[temp] 
" @@ -200,7 +220,14 @@ if(loading) return - if ((href_list["scan"]) && (!isnull(src.scanner))) + if(href_list["task"]) + switch(href_list["task"]) + if("autoprocess") + autoprocess = 1 + if("stopautoprocess") + autoprocess = 0 + + else if ((href_list["scan"]) && (!isnull(src.scanner))) scantemp = "" loading = 1 @@ -296,7 +323,7 @@ temp = "Clonepod malfunction." else if(!config.revival_cloning) temp = "Unable to initiate cloning cycle." - else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"])) + else if(pod1.growclone(null, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"])) temp = "[C.fields["name"]] => Cloning cycle in progress..." records.Remove(C) if(active_record == C) @@ -322,10 +349,10 @@ if (!subject.getorgan(/obj/item/organ/brain)) scantemp = "No signs of intelligence detected." return - if (subject.suiciding == 1) + if (subject.suiciding == 1 && src.scanner.scan_level < 2) scantemp = "Subject's brain is not responding to scanning stimuli." return - if (NOCLONE in subject.mutations) + if (NOCLONE in subject.mutations && src.scanner.scan_level < 2) scantemp = "Subject no longer contains the fundamental materials required to create a living clone." return if ((!subject.ckey) || (!subject.client)) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 2f30bef8818..76dfa89f9e8 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -13,12 +13,32 @@ var/circuitboard = "/obj/item/weapon/circuitboard/cyborgrecharger" var/locked = 1 req_access = list(access_robotics) + var/recharge_speed + var/repairs /obj/machinery/recharge_station/New() ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/cyborgrecharger(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/cell/high(src) + RefreshParts() build_icon() +/obj/machinery/recharge_station/RefreshParts() + recharge_speed = 0 + repairs = 0 + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + recharge_speed += C.rating * 100 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + repairs += M.rating - 1 + for(var/obj/item/weapon/cell/C in component_parts) + recharge_speed *= C.maxcharge / 10000 + + /obj/machinery/recharge_station/process() if(!(NOPOWER|BROKEN)) return @@ -230,22 +250,25 @@ /obj/machinery/recharge_station/proc/process_occupant() if(occupant) restock_modules() + if(repairs) + occupant.heal_organ_damage(repairs, repairs - 1) if(occupant.cell) if(occupant.cell.charge >= occupant.cell.maxcharge) occupant.cell.charge = occupant.cell.maxcharge else - occupant.cell.charge = min(occupant.cell.charge + 200, occupant.cell.maxcharge) + occupant.cell.charge = min(occupant.cell.charge + recharge_speed, occupant.cell.maxcharge) /obj/machinery/recharge_station/proc/restock_modules() if(occupant) if(occupant.module && occupant.module.modules) var/list/um = occupant.contents|occupant.module.modules // ^ makes sinle list of active (occupant.contents) and inactive modules (occupant.module.modules) + var/coeff = recharge_speed / 200 for(var/obj/O in um) // Engineering if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/stack/rods) || istype(O,/obj/item/weapon/cable_coil)|| istype(O,/obj/item/stack/tile/plasteel)) if(O:amount < 50) - O:amount += 1 + O:amount += coeff // Security if(istype(O,/obj/item/device/flash)) if(O:broken) @@ -254,7 +277,7 @@ O:icon_state = "flash" if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg)) if(O:power_supply.charge < O:power_supply.maxcharge) - O:power_supply.give(O:charge_cost) + O:power_supply.give(O:charge_cost * coeff) O:update_icon() else O:charge_tick = 0 @@ -265,16 +288,18 @@ //Service if(istype(O,/obj/item/weapon/reagent_containers/food/condiment/enzyme)) if(O.reagents.get_reagent_amount("enzyme") < 50) - O.reagents.add_reagent("enzyme", 2) + O.reagents.add_reagent("enzyme", 2 * coeff) //Medical if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/robot)) var/obj/item/weapon/reagent_containers/glass/bottle/robot/B = O if(B.reagent && (B.reagents.get_reagent_amount(B.reagent) < B.volume)) - B.reagents.add_reagent(B.reagent, 2) + B.reagents.add_reagent(B.reagent, 2 * coeff) //Janitor if(istype(O, /obj/item/device/lightreplacer)) var/obj/item/device/lightreplacer/LR = O - LR.Charge(occupant) + var/i = 1 + for(1, i < coeff, i++) + LR.Charge(occupant) if(occupant) if(occupant.module) @@ -285,6 +310,6 @@ if(istype(occupant.module.emag, /obj/item/weapon/reagent_containers/spray)) var/obj/item/weapon/reagent_containers/spray/S = occupant.module.emag if(S.name == "polyacid spray") - S.reagents.add_reagent("pacid", 2) + S.reagents.add_reagent("pacid", 2 * coeff) else if(S.name == "lube spray") - S.reagents.add_reagent("lube", 2) + S.reagents.add_reagent("lube", 2 * coeff) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index f8569d10924..edbbf4fd5f4 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -55,6 +55,7 @@ display round(lastgen) and plasmatank amount var/power_gen = 5000 var/recent_fault = 0 var/power_output = 1 + var/consumption = 0 /obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check. return 1 @@ -129,15 +130,19 @@ display round(lastgen) and plasmatank amount /obj/machinery/power/port_gen/pacman/RefreshParts() var/temp_rating = 0 var/temp_reliability = 0 + var/consumption_coeff = 0 for(var/obj/item/weapon/stock_parts/SP in component_parts) if(istype(SP, /obj/item/weapon/stock_parts/matter_bin)) max_sheets = SP.rating * SP.rating * 50 - else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor)) + else if(istype(SP, /obj/item/weapon/stock_parts/capacitor)) temp_rating += SP.rating + else + consumption_coeff += SP.rating for(var/obj/item/weapon/CP in component_parts) temp_reliability += CP.reliability reliability = min(round(temp_reliability / 4), 100) - power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2)) + power_gen = round(initial(power_gen) * temp_rating * 2) + consumption = consumption_coeff /obj/machinery/power/port_gen/pacman/examine() ..() @@ -160,7 +165,7 @@ display round(lastgen) and plasmatank amount sheets -= amount /obj/machinery/power/port_gen/pacman/UseFuel() - var/needed_sheets = 1 / (time_per_sheet / power_output) + var/needed_sheets = 1 / (time_per_sheet * consumption / power_output) var/temp = min(needed_sheets, sheet_left) needed_sheets -= temp sheet_left -= temp @@ -175,9 +180,9 @@ display round(lastgen) and plasmatank amount var/bias = 0 if (power_output > 4) upper_limit = 400 - bias = power_output * 3 + bias = power_output - consumption * (4 - consumption) if (heat < lower_limit) - heat += 3 + heat += 4 - consumption else heat += rand(-7 + bias, 7 + bias) if (heat < lower_limit) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 5ac1762d266..90528dac641 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -13,6 +13,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). var/gold_amount = 0 var/diamond_amount = 0 var/max_material_amount = 75000.0 + var/efficiency_coeff New() ..() @@ -35,7 +36,10 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) T += M.rating max_material_amount = T * 75000.0 - + T = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + T += M.rating + efficiency_coeff = T-1 blob_act() if (prob(50)) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e2a80bdd9d8..ec427f65ac4 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -22,7 +22,7 @@ The currently supporting non-reagent materials: Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials. Design Guidlines -- The reliability formula for all R&D built items is reliability_base (a fixed number) + total tech levels required to make it + +- The reliability formula for all R&D built items is reliability (a fixed number) + total tech levels required to make it + reliability_mod (starts at 0, gets improved through experimentation). Example: PACMAN generator. 79 base reliablity + 6 tech (3 plasmatech, 3 powerstorage) + 0 (since it's completely new) = 85% reliability. Reliability is the chance it works CORRECTLY. - When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed. @@ -43,9 +43,7 @@ datum/design //Datum for object designs, used in construction var/name = "Name" //Name of the created object. var/desc = "Desc" //Description of the created object. var/id = "id" //ID of the created object for easy refernece. Alphanumeric, lower-case, no symbols - var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements. - var/reliability_mod = 0 //Reliability modifier of the device at it's starting point. - var/reliability_base = 100 //Base reliability of a device before modifiers. + var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements. //Reliability modifier of the device at it's starting point. var/reliability = 100 //Reliability of the device. var/build_type = null //Flag as to what kind machine the design is built in. See defines. var/list/materials = list() //List of materials. Format: "id" = amount. @@ -57,11 +55,11 @@ datum/design //Datum for object designs, used in construction //A proc to calculate the reliability of a design based on tech levels and innate modifiers. //Input: A list of /datum/tech; Output: The new reliabilty. datum/design/proc/CalcReliability(var/list/temp_techs) - var/new_reliability = reliability_mod + reliability_base + var/new_reliability for(var/datum/tech/T in temp_techs) if(T.id in req_tech) new_reliability += T.level - new_reliability = Clamp(new_reliability, reliability_base, 100) + new_reliability = Clamp(new_reliability, reliability, 100) reliability = new_reliability return @@ -996,7 +994,7 @@ datum/design/super_capacitor id = "super_capacitor" req_tech = list("powerstorage" = 5, "materials" = 4) build_type = PROTOLATHE - reliability_base = 71 + reliability = 71 materials = list("$metal" = 50, "$glass" = 50, "$gold" = 20) build_path = "/obj/item/weapon/stock_parts/capacitor/super" @@ -1007,7 +1005,7 @@ datum/design/phasic_scanning req_tech = list("magnets" = 5, "materials" = 3) build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 20, "$silver" = 10) - reliability_base = 72 + reliability = 72 build_path = "/obj/item/weapon/stock_parts/scanning_module/phasic" datum/design/pico_mani @@ -1017,7 +1015,7 @@ datum/design/pico_mani req_tech = list("materials" = 5, "programming" = 2) build_type = PROTOLATHE materials = list("$metal" = 30) - reliability_base = 73 + reliability = 73 build_path = "/obj/item/weapon/stock_parts/manipulator/pico" datum/design/ultra_micro_laser @@ -1027,7 +1025,7 @@ datum/design/ultra_micro_laser req_tech = list("magnets" = 5, "materials" = 5) build_type = PROTOLATHE materials = list("$metal" = 10, "$glass" = 20, "$uranium" = 10) - reliability_base = 70 + reliability = 70 build_path = "/obj/item/weapon/stock_parts/micro_laser/ultra" datum/design/super_matter_bin @@ -1037,7 +1035,7 @@ datum/design/super_matter_bin req_tech = list("materials" = 5) build_type = PROTOLATHE materials = list("$metal" = 80) - reliability_base = 75 + reliability = 75 build_path = "/obj/item/weapon/stock_parts/matter_bin/super" @@ -1134,7 +1132,7 @@ datum/design/super_cell desc = "A power cell that holds 20000 units of energy" id = "super_cell" req_tech = list("powerstorage" = 3, "materials" = 2) - reliability_base = 75 + reliability = 75 build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 700, "$glass" = 70) build_path = "/obj/item/weapon/cell/super" @@ -1145,7 +1143,7 @@ datum/design/hyper_cell desc = "A power cell that holds 30000 units of energy" id = "hyper_cell" req_tech = list("powerstorage" = 5, "materials" = 4) - reliability_base = 70 + reliability = 70 build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70) build_path = "/obj/item/weapon/cell/hyper" @@ -1247,7 +1245,7 @@ datum/design/pacman id = "pacman" req_tech = list("programming" = 3, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3) build_type = IMPRINTER - reliability_base = 79 + reliability = 79 materials = list("$glass" = 2000, "sacid" = 20) build_path = "/obj/item/weapon/circuitboard/pacman" @@ -1257,7 +1255,7 @@ datum/design/superpacman id = "superpacman" req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) build_type = IMPRINTER - reliability_base = 76 + reliability = 76 materials = list("$glass" = 2000, "sacid" = 20) build_path = "/obj/item/weapon/circuitboard/pacman/super" @@ -1267,7 +1265,7 @@ datum/design/mrspacman id = "mrspacman" req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5) build_type = IMPRINTER - reliability_base = 74 + reliability = 74 materials = list("$glass" = 2000, "sacid" = 20) build_path = "/obj/item/weapon/circuitboard/pacman/mrs" @@ -1283,7 +1281,7 @@ datum/design/mass_spectrometer req_tech = list("biotech" = 2, "magnets" = 2) build_type = PROTOLATHE materials = list("$metal" = 30, "$glass" = 20) - reliability_base = 76 + reliability = 76 build_path = "/obj/item/device/mass_spectrometer" datum/design/adv_mass_spectrometer @@ -1293,7 +1291,7 @@ datum/design/adv_mass_spectrometer req_tech = list("biotech" = 2, "magnets" = 4) build_type = PROTOLATHE materials = list("$metal" = 30, "$glass" = 20) - reliability_base = 74 + reliability = 74 build_path = "/obj/item/device/mass_spectrometer/adv" datum/design/mmi @@ -1303,7 +1301,7 @@ datum/design/mmi req_tech = list("programming" = 2, "biotech" = 3) build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 1000, "$glass" = 500) - reliability_base = 76 + reliability = 76 build_path = "/obj/item/device/mmi" category = "Misc" @@ -1314,7 +1312,7 @@ datum/design/mmi_radio req_tech = list("programming" = 2, "biotech" = 4) build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 1200, "$glass" = 500) - reliability_base = 74 + reliability = 74 build_path = "/obj/item/device/mmi/radio_enabled" category = "Misc" @@ -1325,7 +1323,7 @@ datum/design/synthetic_flash req_tech = list("magnets" = 3, "combat" = 2) build_type = MECHFAB materials = list("$metal" = 750, "$glass" = 750) - reliability_base = 76 + reliability = 76 build_path = "/obj/item/device/flash/synthetic" category = "Misc" @@ -1336,7 +1334,7 @@ datum/design/bluespacebeaker req_tech = list("bluespace" = 2, "materials" = 6) build_type = PROTOLATHE materials = list("$metal" = 3000, "$plasma" = 3000, "$diamond" = 500) - reliability_base = 76 + reliability = 76 build_path = "/obj/item/weapon/reagent_containers/glass/beaker/bluespace" category = "Misc" @@ -1347,7 +1345,7 @@ datum/design/noreactbeaker req_tech = list("materials" = 2) build_type = PROTOLATHE materials = list("$metal" = 3000) - reliability_base = 76 + reliability = 76 build_path = "/obj/item/weapon/reagent_containers/glass/beaker/noreact" category = "Misc" @@ -1362,7 +1360,7 @@ datum/design/nuclear_gun req_tech = list("combat" = 3, "materials" = 5, "powerstorage" = 3) build_type = PROTOLATHE materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 500) - reliability_base = 76 + reliability = 76 build_path = "/obj/item/weapon/gun/energy/gun/nuclear" locked = 1 @@ -1403,7 +1401,7 @@ datum/design/chemsprayer req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) build_type = PROTOLATHE materials = list("$metal" = 5000, "$glass" = 1000) - reliability_base = 100 + reliability = 100 build_path = "/obj/item/weapon/chemsprayer" */ datum/design/rapidsyringe @@ -1450,7 +1448,7 @@ datum/design/large_grenade req_tech = list("combat" = 3, "materials" = 2) build_type = PROTOLATHE materials = list("$metal" = 3000) - reliability_base = 79 + reliability = 79 build_path = "/obj/item/weapon/grenade/chem_grenade/large" datum/design/smg @@ -1529,7 +1527,7 @@ datum/design/plasmacutter req_tech = list("materials" = 4, "plasmatech" = 3, "engineering" = 3) build_type = PROTOLATHE materials = list("$metal" = 1500, "$glass" = 500, "$gold" = 500, "$plasma" = 500) - reliability_base = 79 + reliability = 79 build_path = "/obj/item/weapon/pickaxe/plasmacutter" datum/design/pick_diamond @@ -1548,7 +1546,7 @@ datum/design/drill_diamond req_tech = list("materials" = 6, "powerstorage" = 4, "engineering" = 4) build_type = PROTOLATHE materials = list("$metal" = 3000, "$glass" = 1000, "$diamond" = 3750) //Yes, a whole diamond is needed. - reliability_base = 79 + reliability = 79 build_path = "/obj/item/weapon/pickaxe/diamonddrill" datum/design/mesons @@ -1580,7 +1578,7 @@ datum/design/bag_holding req_tech = list("bluespace" = 4, "materials" = 6) build_type = PROTOLATHE materials = list("$gold" = 3000, "$diamond" = 1500, "$uranium" = 250) - reliability_base = 80 + reliability = 80 build_path = "/obj/item/weapon/storage/backpack/holding" datum/design/bluespace_crystal @@ -1590,7 +1588,7 @@ datum/design/bluespace_crystal req_tech = list("bluespace" = 4, "materials" = 6) build_type = PROTOLATHE materials = list("$diamond" = 1500, "$plasma" = 1500) - reliability_base = 100 + reliability = 100 build_path = "/obj/item/bluespace_crystal/artificial" ///////////////////////////////////////// diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index bee0c198916..c0d7d862032 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -25,8 +25,7 @@ Note: Must be placed within 3 tiles of the R&D Console /obj/machinery/r_n_d/destructive_analyzer/RefreshParts() var/T = 0 for(var/obj/item/weapon/stock_parts/S in src) - T += S.rating * 0.1 - T = Clamp(T, 0, 1) + T += S.rating decon_mod = T /obj/machinery/r_n_d/destructive_analyzer/meteorhit() @@ -72,7 +71,7 @@ Note: Must be placed within 3 tiles of the R&D Console if (temp_tech.len == 0) user << "\red You cannot deconstruct this item!" return - if(O.reliability < 90 && O.crit_fail == 0) + if(O.reliability < (99-(decon_mod*3)) && O.crit_fail == 0) usr << "\red Item is neither reliable enough or broken enough to learn from." return busy = 1 diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index ec908f22d73..1e09063ca1d 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -22,6 +22,7 @@ Note: Must be placed west/left of and R&D console to function. var/diamond_amount = 0.0 var/clown_amount = 0.0 var/adamantine_amount = 0.0 + var/efficiency_coeff /obj/machinery/r_n_d/protolathe/New() @@ -50,6 +51,10 @@ Note: Must be placed west/left of and R&D console to function. for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) T += M.rating max_material_storage = T * 75000 + T = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + T += M.rating + efficiency_coeff = T-1 /obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) if (shocked) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 21f40240320..ac9743cd52e 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -256,15 +256,15 @@ won't update every console in existence) but it's more of a hassle to do. Also, usr <<"\red The destructive analyzer appears to be empty." screen = 1.0 return - if(linked_destroy.loaded_item.reliability >= 90) + if(linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) for(var/T in temp_tech) - files.UpdateTech(T, temp_tech[T]) - if(linked_destroy.loaded_item.reliability < 100 && linked_destroy.loaded_item.crit_fail) - files.UpdateDesign(linked_destroy.loaded_item.type) + if(prob(linked_destroy.loaded_item.reliability)) + files.UpdateTech(T, temp_tech[T]) + files.UpdateDesigns(linked_destroy.loaded_item, temp_tech, src) if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. - linked_lathe.m_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.m_amt*linked_destroy.decon_mod)) - linked_lathe.g_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.g_amt*linked_destroy.decon_mod)) + linked_lathe.m_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.m_amt*(linked_destroy.decon_mod/10))) + linked_lathe.g_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.g_amt*(linked_destroy.decon_mod/10))) linked_destroy.loaded_item = null for(var/obj/I in linked_destroy.contents) for(var/mob/M in I.contents) @@ -326,6 +326,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, sync = !sync else if(href_list["build"]) //Causes the Protolathe to build something. + var/coeff = linked_lathe.efficiency_coeff var/g2g = 1 if(linked_lathe) var/datum/design/being_built = null @@ -351,23 +352,23 @@ won't update every console in existence) but it's more of a hassle to do. Also, break switch(M) if("$metal") - linked_lathe.m_amount = max(0, (linked_lathe.m_amount-being_built.materials[M])) + linked_lathe.m_amount = max(0, (linked_lathe.m_amount-(being_built.materials[M]/coeff))) if("$glass") - linked_lathe.g_amount = max(0, (linked_lathe.g_amount-being_built.materials[M])) + linked_lathe.g_amount = max(0, (linked_lathe.g_amount-(being_built.materials[M]/coeff))) if("$gold") - linked_lathe.gold_amount = max(0, (linked_lathe.gold_amount-being_built.materials[M])) + linked_lathe.gold_amount = max(0, (linked_lathe.gold_amount-(being_built.materials[M]/coeff))) if("$silver") - linked_lathe.silver_amount = max(0, (linked_lathe.silver_amount-being_built.materials[M])) + linked_lathe.silver_amount = max(0, (linked_lathe.silver_amount-(being_built.materials[M]/coeff))) if("$plasma") - linked_lathe.plasma_amount = max(0, (linked_lathe.plasma_amount-being_built.materials[M])) + linked_lathe.plasma_amount = max(0, (linked_lathe.plasma_amount-(being_built.materials[M]/coeff))) if("$uranium") - linked_lathe.uranium_amount = max(0, (linked_lathe.uranium_amount-being_built.materials[M])) + linked_lathe.uranium_amount = max(0, (linked_lathe.uranium_amount-(being_built.materials[M]/coeff))) if("$diamond") - linked_lathe.diamond_amount = max(0, (linked_lathe.diamond_amount-being_built.materials[M])) + linked_lathe.diamond_amount = max(0, (linked_lathe.diamond_amount-(being_built.materials[M]/coeff))) if("$clown") - linked_lathe.clown_amount = max(0, (linked_lathe.clown_amount-being_built.materials[M])) + linked_lathe.clown_amount = max(0, (linked_lathe.clown_amount-(being_built.materials[M]/coeff))) else - linked_lathe.reagents.remove_reagent(M, being_built.materials[M]) + linked_lathe.reagents.remove_reagent(M, being_built.materials[M]/coeff) var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. var/R = being_built.reliability @@ -378,6 +379,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, if( new_item.type == /obj/item/weapon/storage/backpack/holding ) new_item.investigate_log("built by [key]","singulo") new_item.reliability = R + new_item.m_amt /= coeff + new_item.g_amt /= coeff if(linked_lathe.hacked) R = max((reliability / 2), 0) if(O) var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc) @@ -390,6 +393,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, updateUsrDialog() else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something. + var/coeff = 2 ** linked_imprinter.efficiency_coeff if(linked_imprinter) var/datum/design/being_built = null for(var/datum/design/D in files.known_designs) @@ -409,20 +413,19 @@ won't update every console in existence) but it's more of a hassle to do. Also, for(var/M in being_built.materials) switch(M) if("$glass") - linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M])) + linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]/coeff)) if("$gold") - linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M])) + linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]/coeff)) if("$diamond") - linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M])) + linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]/coeff)) else - linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]) + linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]/coeff) var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. var/R = being_built.reliability spawn(16) var/obj/new_item = new P(src) new_item.reliability = R - if(linked_imprinter.hacked) R = max((reliability / 2), 0) new_item.loc = linked_imprinter.loc linked_imprinter.busy = 0 screen = 4.1 @@ -533,23 +536,23 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/proc/check_mat(datum/design/being_built, var/M) switch(M) if("$metal") - return (linked_lathe.m_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.m_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 if("$glass") - return (linked_lathe.g_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.g_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 if("$gold") - return (linked_lathe.gold_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.gold_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 if("$silver") - return (linked_lathe.silver_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.silver_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 if("$plasma") - return (linked_lathe.plasma_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.plasma_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 if("$uranium") - return (linked_lathe.uranium_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.uranium_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 if("$diamond") - return (linked_lathe.diamond_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.diamond_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 if("$clown") - return (linked_lathe.clown_amount - being_built.materials[M] >= 0) ? 1 : 0 + return (linked_lathe.clown_amount - (being_built.materials[M]/linked_lathe.efficiency_coeff) >= 0) ? 1 : 0 else - return linked_lathe.reagents.remove_reagent(M, being_built.materials[M]) + return linked_lathe.reagents.remove_reagent(M, (being_built.materials[M]/linked_lathe.efficiency_coeff)) /obj/machinery/computer/rdconsole/attack_hand(mob/user as mob) if(..()) @@ -708,6 +711,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Main Menu
" dat += "Deconstruction Menu
" dat += "Name: [linked_destroy.loaded_item.name]
" + dat += "Reliability: [linked_destroy.loaded_item.reliability]
" dat += "Origin Tech:
" var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) for(var/T in temp_tech) @@ -727,32 +731,33 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Protolathe Menu:

" dat += "Material Amount: [linked_lathe.TotalMaterials()] cm3 (MAX: [linked_lathe.max_material_storage])
" dat += "Chemical Volume: [linked_lathe.reagents.total_volume] (MAX: [linked_lathe.reagents.maximum_volume])
" + var/coeff = linked_lathe.efficiency_coeff for(var/datum/design/D in files.known_designs) if(!(D.build_type & PROTOLATHE)) continue var/temp_dat = "[D.name]" var/check_materials = 1 for(var/M in D.materials) - temp_dat += " [D.materials[M]] [CallMaterialName(M)]" + temp_dat += " [D.materials[M]/coeff] [CallMaterialName(M)]" if(copytext(M, 1, 2) == "$") switch(M) if("$glass") - if(D.materials[M] > linked_lathe.g_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_lathe.g_amount) check_materials = 0 if("$metal") - if(D.materials[M] > linked_lathe.m_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_lathe.m_amount) check_materials = 0 if("$gold") - if(D.materials[M] > linked_lathe.gold_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_lathe.gold_amount) check_materials = 0 if("$silver") - if(D.materials[M] > linked_lathe.silver_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_lathe.silver_amount) check_materials = 0 if("$plasma") - if(D.materials[M] > linked_lathe.plasma_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_lathe.plasma_amount) check_materials = 0 if("$uranium") - if(D.materials[M] > linked_lathe.uranium_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_lathe.uranium_amount) check_materials = 0 if("$diamond") - if(D.materials[M] > linked_lathe.diamond_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_lathe.diamond_amount) check_materials = 0 if("$clown") - if(D.materials[M] > linked_lathe.clown_amount) check_materials = 0 - else if (!linked_lathe.reagents.has_reagent(M, D.materials[M])) + if(D.materials[M]/coeff > linked_lathe.clown_amount) check_materials = 0 + else if (!linked_lathe.reagents.has_reagent(M, D.materials[M]/coeff)) check_materials = 0 if (check_materials) dat += "* [temp_dat]
" @@ -840,23 +845,23 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Circuit Imprinter Menu:

" dat += "Material Amount: [linked_imprinter.TotalMaterials()] cm3
" dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
" - + var/coeff = 2 ** linked_imprinter.efficiency_coeff for(var/datum/design/D in files.known_designs) if(!(D.build_type & IMPRINTER)) continue var/temp_dat = "[D.name]" var/check_materials = 1 for(var/M in D.materials) - temp_dat += " [D.materials[M]] [CallMaterialName(M)]" + temp_dat += " [D.materials[M]/coeff] [CallMaterialName(M)]" if(copytext(M, 1, 2) == "$") switch(M) if("$glass") - if(D.materials[M] > linked_imprinter.g_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_imprinter.g_amount) check_materials = 0 if("$gold") - if(D.materials[M] > linked_imprinter.gold_amount) check_materials = 0 + if(D.materials[M]/coeff > linked_imprinter.gold_amount) check_materials = 0 if("$diamond") - if(D.materials[M] > linked_imprinter.diamond_amount) check_materials = 0 - else if (!linked_imprinter.reagents.has_reagent(M, D.materials[M])) + if(D.materials[M]/coeff > linked_imprinter.diamond_amount) check_materials = 0 + else if (!linked_imprinter.reagents.has_reagent(M, D.materials[M]/coeff)) check_materials = 0 if (check_materials) dat += "* [temp_dat]
" diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 7938720c0c9..f65bbad5142 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -118,8 +118,8 @@ research holder datum. /datum/research/proc/AddDesign2Known(var/datum/design/D) for(var/datum/design/known in known_designs) if(D.id == known.id) - if(D.reliability_mod > known.reliability_mod) - known.reliability_mod = D.reliability_mod + if(D.reliability > known.reliability) + known.reliability = D.reliability return known_designs += D return @@ -144,17 +144,20 @@ research holder datum. /datum/research/proc/UpdateTech(var/ID, var/level) for(var/datum/tech/KT in known_tech) if(KT.id == ID) - if(KT.level <= level) KT.level = max((KT.level + 1), (level - 1)) + if(KT.level <= level) + KT.level = max((KT.level + 1), (level - 1)) return -/datum/research/proc/UpdateDesign(var/path) - for(var/datum/design/KD in known_designs) - if(KD.build_path == path) - KD.reliability_mod += rand(1,2) - break - return - - +/datum/research/proc/UpdateDesigns(var/obj/item/I, var/list/temp_tech) + for(var/T in temp_tech) + if(temp_tech[T] - 1 >= known_tech[T]) + for(var/datum/design/D in known_designs) + if(D.req_tech[T]) + D.reliability = min(100, D.reliability + prob(35)) + if(D.build_path == I.type) + D.reliability = min(100, D.reliability + rand(1,3)) + if(I.crit_fail) + D.reliability = min(100, D.reliability + rand(3, 5)) /*************************************************************** diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index b90917b53e1..4c4daca528d 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -250,7 +250,6 @@ if(choice == "Continue") for(var/datum/design/D in temp_server.files.known_designs) if(D.id == href_list["reset_design"]) - D.reliability_mod = 0 temp_server.files.known_designs -= D break temp_server.files.RefreshResearch()