From fb291bec3f75e39fd6db88f84f733016420f226f Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Wed, 14 Sep 2016 00:53:45 -0700 Subject: [PATCH] Ports tg's associative-list research datums --- code/game/machinery/autolathe.dm | 10 +- code/game/mecha/mech_fabricator.dm | 52 +++++----- code/modules/research/rdconsole.dm | 121 +++++++++-------------- code/modules/research/research.dm | 112 ++++++++++++--------- code/modules/research/server.dm | 10 +- code/modules/spacepods/pod_fabricator.dm | 55 +++++------ 6 files changed, 163 insertions(+), 197 deletions(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 09be2918a3b..e52cf428fd3 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -243,7 +243,8 @@ if(href_list["search"]) matching_designs.Cut() - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(findtext(D.name,href_list["to_search"])) matching_designs.Add(D) @@ -445,7 +446,8 @@ dat += "Metal amount: [materials.amount(MAT_METAL)] cm3
" dat += "Glass amount: [materials.amount(MAT_GLASS)] cm3
" - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(!(selected_category in D.category)) continue @@ -518,8 +520,8 @@ if(hack) for(var/datum/design/D in files.possible_designs) if((D.build_type & AUTOLATHE) && ("hacked" in D.category)) - files.known_designs += D + files.AddDesign2Known(D) else for(var/datum/design/D in files.known_designs) if("hacked" in D.category) - files.known_designs -= D + files.known_designs -= D.id diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 23cf5522a5c..3da5587b2a4 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -86,7 +86,8 @@ /obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name) var/output = "" - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(D.build_type & MECHFAB) if(!(set_name in D.category)) continue @@ -165,7 +166,8 @@ /obj/machinery/mecha_part_fabricator/proc/add_part_set_to_queue(set_name) if(set_name in part_sets) - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(D.build_type & MECHFAB) if(set_name in D.category) add_to_queue(D) @@ -230,11 +232,7 @@ for(var/obj/machinery/computer/rdconsole/RDC in localarea.contents) if(!RDC.sync) continue - for(var/datum/tech/T in RDC.files.known_tech) - files.AddTech2Known(T) - for(var/datum/design/D in RDC.files.known_designs) - files.AddDesign2Known(D) - files.RefreshResearch() + RDC.files.push_data(files) temp = "Processed equipment designs.
" //check if the tech coefficients have changed temp += "Return" @@ -334,21 +332,17 @@ screen = "parts" if(href_list["part"]) var/T = filter.getStr("part") - for(var/datum/design/D in files.known_designs) - if(D.build_type & MECHFAB) - if(D.id == T) - if(!processing_queue) - build_part(D) - else - add_to_queue(D) - break + var/datum/design/D = files.known_designs[T] + if(D && (D.build_type & MECHFAB)) + if(!processing_queue) + build_part(D) + else + add_to_queue(D) if(href_list["add_to_queue"]) var/T = filter.getStr("add_to_queue") - for(var/datum/design/D in files.known_designs) - if(D.build_type & MECHFAB) - if(D.id == T) - add_to_queue(D) - break + var/datum/design/D = files.known_designs[T] + if(D && D.build_type & MECHFAB) + add_to_queue(D) return update_queue_on_page() if(href_list["remove_from_queue"]) remove_from_queue(filter.getNum("remove_from_queue")) @@ -381,15 +375,13 @@ sync() if(href_list["part_desc"]) var/T = filter.getStr("part_desc") - for(var/datum/design/D in files.known_designs) - if(D.build_type & MECHFAB) - if(D.id == T) - var/obj/part = D.build_path - temp = {"

[initial(part.name)] description:

- [initial(part.desc)]
- Return - "} - break + var/datum/design/D = files.known_designs[T] + if(D && D.build_type & MECHFAB) + var/obj/part = D.build_path + temp = {"

[initial(part.name)] description:

+ [initial(part.desc)]
+ Return + "} if(href_list["remove_mat"] && href_list["material"]) var/amount = text2num(href_list["remove_mat"]) @@ -519,4 +511,4 @@ return /obj/machinery/mecha_part_fabricator/proc/material2name(var/ID) - return copytext(ID,2) \ No newline at end of file + return copytext(ID,2) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 7840f9f538f..3f17b047007 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -60,24 +60,14 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/list/datum/design/matching_designs = list() //for the search function /proc/CallTechName(ID) //A simple helper proc to find the name of a tech with a given ID. - var/datum/tech/check_tech - var/return_name = null for(var/T in subtypesof(/datum/tech)) - check_tech = null - check_tech = new T() - if(check_tech.id == ID) - return_name = check_tech.name - qdel(check_tech) - check_tech = null - break + var/datum/tech/tt = T + if(initial(tt.id) == ID) + return initial(tt.name) - return return_name - -proc/CallMaterialName(ID) - var/datum/reagent/temp_reagent - var/return_name = null +/proc/CallMaterialName(ID) if(copytext(ID, 1, 2) == "$") - return_name = copytext(ID, 2) + var/return_name = copytext(ID, 2) switch(return_name) if("metal") return_name = "Metal" @@ -97,16 +87,12 @@ proc/CallMaterialName(ID) return_name = "Bananium" if("mime") return_name = "Tranquillite" + return return_name else for(var/R in subtypesof(/datum/reagent)) - temp_reagent = null - temp_reagent = new R() - if(temp_reagent.id == ID) - return_name = temp_reagent.name - qdel(temp_reagent) - temp_reagent = null - break - return return_name + var/datum/reagent/rt = R + if(initial(rt.id) == ID) + return initial(rt.name) /obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any). for(var/obj/machinery/r_n_d/D in range(3,src)) @@ -129,11 +115,7 @@ proc/CallMaterialName(ID) //Have it automatically push research to the centcom server so wild griffins can't fuck up R&D's work --NEO /obj/machinery/computer/rdconsole/proc/griefProtection() for(var/obj/machinery/r_n_d/server/centcom/C in world) - for(var/datum/tech/T in files.known_tech) - C.files.AddTech2Known(T) - for(var/datum/design/D in files.known_designs) - C.files.AddDesign2Known(D) - C.files.RefreshResearch() + files.push_data(C.files) /obj/machinery/computer/rdconsole/proc/Maximize() files.known_tech=files.possible_tech @@ -154,11 +136,6 @@ proc/CallMaterialName(ID) ..() SyncRDevices() -/* Instead of calling this every tick, it is only being called when needed -/obj/machinery/computer/rdconsole/process() - griefProtection() -*/ - /obj/machinery/computer/rdconsole/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params) //Loading a disk into it. @@ -215,7 +192,8 @@ proc/CallMaterialName(ID) else compare = IMPRINTER - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(!(D.build_type & compare)) continue if(href_list["category"] in D.category) @@ -244,10 +222,8 @@ proc/CallMaterialName(ID) submenu = 0 else if(href_list["copy_tech"]) //Copy some technology data from the research holder to the disk. - for(var/datum/tech/T in files.known_tech) - if(href_list["copy_tech_ID"] == T.id) - t_disk.load_tech(T) - break + // Somehow this href makes me very nervous + t_disk.stored = files.known_tech[href_list["copy_tech_ID"]] menu = 2 submenu = 0 @@ -271,21 +247,22 @@ proc/CallMaterialName(ID) submenu = 0 else if(href_list["copy_design"]) //Copy design data from the research holder to the design disk. - for(var/datum/design/D in files.known_designs) - if(href_list["copy_design_ID"] == D.id) - var/autolathe_friendly = 1 - for(var/x in D.materials) - if( !(x in list(MAT_METAL, MAT_GLASS))) - autolathe_friendly = 0 - D.category -= "Imported" - if(D.locked) + // This href ALSO makes me very nervous + var/datum/design/D = files.known_designs[href_list["copy_design_ID"]] + if(D) + // eeeeeep design datums are global be careful! + var/autolathe_friendly = 1 + for(var/x in D.materials) + if( !(x in list(MAT_METAL, MAT_GLASS))) autolathe_friendly = 0 D.category -= "Imported" - if(D.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE)) // Specifically excludes circuit imprinter and mechfab - D.build_type = autolathe_friendly ? (D.build_type | AUTOLATHE) : D.build_type - D.category |= "Imported" - d_disk.load_blueprint(D) - break + if(D.locked) + autolathe_friendly = 0 + D.category -= "Imported" + if(D.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE)) // Specifically excludes circuit imprinter and mechfab + D.build_type = autolathe_friendly ? (D.build_type | AUTOLATHE) : D.build_type + D.category |= "Imported" + d_disk.blueprint = D menu = 2 submenu = 0 @@ -386,19 +363,11 @@ proc/CallMaterialName(ID) var/server_processed = 0 if(S.disabled) continue - if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) - for(var/datum/tech/T in files.known_tech) - S.files.AddTech2Known(T) - for(var/datum/design/D in files.known_designs) - S.files.AddDesign2Known(D) - S.files.RefreshResearch() + if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) + files.push_data(S.files) server_processed = 1 - if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked) - for(var/datum/tech/T in S.files.known_tech) - files.AddTech2Known(T) - for(var/datum/design/D in S.files.known_designs) - files.AddDesign2Known(D) - files.RefreshResearch() + if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked) + S.files.push_data(files) server_processed = 1 if(!istype(S, /obj/machinery/r_n_d/server/centcom) && server_processed) S.produce_heat(100) @@ -416,11 +385,7 @@ proc/CallMaterialName(ID) coeff = 1 var/g2g = 1 if(linked_lathe) - var/datum/design/being_built = null - for(var/datum/design/D in files.known_designs) - if(D.id == href_list["build"]) - being_built = D - break + var/datum/design/being_built = files.known_designs[href_list["build"]] if(being_built) var/power = 2000 var/amount=text2num(href_list["amount"]) @@ -499,10 +464,7 @@ proc/CallMaterialName(ID) var/g2g = 1 if(linked_imprinter) var/datum/design/being_built = null - for(var/datum/design/D in files.known_designs) - if(D.id == href_list["imprint"]) - being_built = D - break + being_built = files.known_designs[href_list["imprint"]] if(being_built) var/power = 2000 for(var/M in being_built.materials) @@ -639,7 +601,8 @@ proc/CallMaterialName(ID) else compare = IMPRINTER - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(!(D.build_type & compare)) continue if(findtext(D.name,href_list["to_search"])) @@ -682,7 +645,8 @@ proc/CallMaterialName(ID) if(menu == 0 || menu == 1) var/list/tech_levels = list() data["tech_levels"] = tech_levels - for(var/datum/tech/T in files.known_tech) + for(var/v in files.known_tech) + var/datum/tech/T = files.known_tech[v] if(T.level <= 0) continue var/list/this_tech_list = list() @@ -703,7 +667,8 @@ proc/CallMaterialName(ID) if(t_disk != null && submenu == 1) var/list/to_copy = list() data["to_copy"] = to_copy - for(var/datum/tech/T in files.known_tech) + for(var/v in files.known_tech) + var/datum/tech/T = files.known_tech[v] var/list/item = list() to_copy[++to_copy.len] = item if(T.level <= 0) @@ -736,7 +701,8 @@ proc/CallMaterialName(ID) if(d_disk != null && submenu == 1) var/list/to_copy = list() data["to_copy"] = to_copy - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] var/list/item = list() to_copy[++to_copy.len] = item item["name"] = D.name @@ -755,7 +721,8 @@ proc/CallMaterialName(ID) tech_list[++tech_list.len] = tech_item tech_item["name"] = CallTechName(T) tech_item["object_level"] = temp_tech[T] - for(var/datum/tech/F in files.known_tech) + for(var/v in files.known_tech) + var/datum/tech/F = files.known_tech[v] if(F.name == CallTechName(T)) tech_item["current_level"] = F.level break diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 2fc3b59f085..a3e175811ec 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -53,6 +53,11 @@ research holder datum. var/list/known_designs = list() //List of available designs (at base reliability). /datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated. + // MON DIEU!!! + // These are semi-global, but not TOTALLY global? + // Using research disks, you can get techs/designs from one research datum + // onto another. What consequences this could have, I am presently unsure, but + // I imagine nothing good. for(var/T in subtypesof(/datum/tech)) possible_tech += new T(src) for(var/D in subtypesof(/datum/design)) @@ -65,47 +70,43 @@ research holder datum. //Input: datum/tech; Output: 0/1 (false/true) /datum/research/proc/TechHasReqs(var/datum/tech/T) if(T.req_tech.len == 0) - return 1 - var/matches = 0 + return TRUE for(var/req in T.req_tech) - for(var/datum/tech/known in known_tech) - if((req == known.id) && (known.level >= T.req_tech[req])) - matches++ - break - if(matches == T.req_tech.len) - return 1 - else - return 0 + var/datum/tech/known = known_tech[req] + if(!known || known.level < T.req_tech[req]) + return FALSE + return TRUE //Checks to see if design has all the required pre-reqs. //Input: datum/design; Output: 0/1 (false/true) /datum/research/proc/DesignHasReqs(var/datum/design/D) if(D.req_tech.len == 0) - return 1 - for(var/datum/tech/T in known_tech) - if((D.req_tech[T.id]) && (T.level < D.req_tech[T.id])) - return 0 - return 1 + return TRUE + for(var/req in D.req_tech) + var/datum/tech/known = known_tech[req] + if(!known || known.level < D.req_tech[req]) + return FALSE + return TRUE //Adds a tech to known_tech list. Checks to make sure there aren't duplicates and updates existing tech's levels if needed. //Input: datum/tech; Output: Null /datum/research/proc/AddTech2Known(var/datum/tech/T) - for(var/datum/tech/known in known_tech) - if(T.id == known.id) - if(T.level > known.level) - known.level = T.level - return - known_tech += T - return + if(known_tech[T.id]) + var/datum/tech/known = known_tech[T.id] + if(T.level > known.level) + known.level = T.level + return + known_tech[T.id] = T /datum/research/proc/AddDesign2Known(var/datum/design/D) - for(var/datum/design/known in known_designs) - if(D.id == known.id) - if(D.reliability > known.reliability) - known.reliability = D.reliability - return - known_designs += D - return + if(known_designs[D.id]) + // NOTE: This is for reliability only - This is on the chopping block + var/datum/design/known = known_designs[D.id] + if(D.reliability > known.reliability) + known.reliability = D.reliability + return + // Global datums make me nervous + known_designs[D.id] = D //Refreshes known_tech and known_designs list. Then updates the reliability vars of the designs in the known_designs list. //Input/Output: n/a @@ -116,25 +117,30 @@ research holder datum. for(var/datum/design/PD in possible_designs) if(DesignHasReqs(PD)) AddDesign2Known(PD) - for(var/datum/tech/T in known_tech) + for(var/v in known_tech) + var/datum/tech/T = known_tech[v] T = Clamp(T.level, 0, 20) - for(var/datum/design/D in known_designs) + for(var/v in known_designs) + var/datum/design/D = known_designs[v] + // NOTE: reliability stuff, axe this later D.CalcReliability(known_tech) - return //Refreshes the levels of a given tech. //Input: Tech's ID and Level; Output: null /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)) - return + var/datum/tech/KT = known_tech[ID] + if(KT) + if(KT.level <= level) + // Will bump the tech to (value_of_target - 1) automatically - + // after that it'll only bump it up by 1 until it's greater + // than the source tech + KT.level = max((KT.level + 1), (level - 1)) /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) + // NOTE: icky reliability stuff if(D.req_tech[T]) D.reliability = min(100, D.reliability + 1) if(D.build_path == I.type) @@ -143,19 +149,27 @@ research holder datum. D.reliability = min(100, D.reliability + rand(3, 5)) /datum/research/proc/FindDesignByID(var/id) - for(var/datum/design/D in known_designs) - if(D.id == id) - return D + return known_designs[id] + +// A common task is for one research datum to copy over its techs and designs +// and update them on another research datum. +// Arguments: +// `other` - The research datum to send designs and techs to +/datum/research/proc/push_data(datum/research/other) + for(var/v in known_tech) + var/datum/tech/T = known_tech[v] + other.AddTech2Known(T) + for(var/v in known_designs) + var/datum/design/D = known_designs[v] + other.AddDesign2Known(D) + other.RefreshResearch() + //Autolathe files -/datum/research/autolathe/New() - for(var/T in subtypesof(/datum/tech)) - possible_tech += new T(src) - for(var/path in subtypesof(/datum/design)) - var/datum/design/D = new path(src) - possible_designs += D - if((D.build_type & AUTOLATHE) && ("initial" in D.category)) //autolathe starts without hacked designs - AddDesign2Known(D) +/datum/research/autolathe + +/datum/research/autolathe/DesignHasReqs(var/datum/design/D) + return D && (D.build_type & AUTOLATHE) && ("initial" in D.category) /datum/research/autolathe/AddDesign2Known(var/datum/design/D) if(!(D.build_type & AUTOLATHE)) @@ -167,7 +181,7 @@ research holder datum. ** Includes all the various technoliges and what they make. ** ***************************************************************/ -datum/tech //Datum of individual technologies. +/datum/tech //Datum of individual technologies. var/name = "name" //Name of the technology. var/desc = "description" //General description of what it does and what it makes. var/id = "id" //An easily referenced ID. Must be alphanumeric, lower-case, and no symbols. diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 3116293607b..5b842c90e08 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -76,7 +76,9 @@ refreshParts and the hasReq procs that get called by this are laggy and do not need to be called by every server on the map every tick */ var/updateRD = 0 files.known_designs = list() - for(var/datum/tech/T in files.known_tech) + for(var/v in files.known_tech) + var/datum/tech/T = files.known_tech[v] + // Slowly decrease research if health drops below 0 if(prob(1)) updateRD++ T.level-- @@ -105,11 +107,7 @@ // Backup files to CentComm to help admins recover data after griefer attacks /obj/machinery/r_n_d/server/proc/griefProtection() for(var/obj/machinery/r_n_d/server/centcom/C in machines) - for(var/datum/tech/T in files.known_tech) - C.files.AddTech2Known(T) - for(var/datum/design/D in files.known_designs) - C.files.AddDesign2Known(D) - C.files.RefreshResearch() + files.push_data(C.files) /obj/machinery/r_n_d/server/proc/produce_heat(heat_amt) if(!(stat & (NOPOWER|BROKEN))) // Blatantly stolen from space heater. diff --git a/code/modules/spacepods/pod_fabricator.dm b/code/modules/spacepods/pod_fabricator.dm index b111a508afc..da3b9879a4d 100644 --- a/code/modules/spacepods/pod_fabricator.dm +++ b/code/modules/spacepods/pod_fabricator.dm @@ -99,7 +99,8 @@ /obj/machinery/spod_part_fabricator/proc/output_parts_list(set_name) var/output = "" - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(D.build_type & PODFAB) if(!(set_name in D.category)) continue @@ -178,7 +179,8 @@ /obj/machinery/spod_part_fabricator/proc/add_part_set_to_queue(set_name) if(set_name in part_sets) - for(var/datum/design/D in files.known_designs) + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] if(D.build_type & PODFAB) if(set_name in D.category) add_to_queue(D) @@ -238,7 +240,8 @@ if(!files) return var/output - for(var/datum/tech/T in files.known_tech) + for(var/v in files.known_tech) + var/datum/tech/T = files.known_tech[v] if(T && T.level > 1) var/diff switch(T.id) @@ -266,11 +269,7 @@ for(var/obj/machinery/computer/rdconsole/RDC in localarea.contents) if(!RDC.sync) continue - for(var/datum/tech/T in RDC.files.known_tech) - files.AddTech2Known(T) - for(var/datum/design/D in RDC.files.known_designs) - files.AddDesign2Known(D) - files.RefreshResearch() + RDC.files.push_data(files) temp = "Processed equipment designs.
" //check if the tech coefficients have changed temp += update_tech() @@ -364,21 +363,17 @@ screen = "parts" if(href_list["part"]) var/T = filter.getStr("part") - for(var/datum/design/D in files.known_designs) - if(D.build_type & PODFAB) - if(D.id == T) - if(!processing_queue) - build_part(D) - else - add_to_queue(D) - break + var/datum/design/D = files.known_designs[T] + if(D && D.build_type & PODFAB) + if(!processing_queue) + build_part(D) + else + add_to_queue(D) if(href_list["add_to_queue"]) var/T = filter.getStr("add_to_queue") - for(var/datum/design/D in files.known_designs) - if(D.build_type & PODFAB) - if(D.id == T) - add_to_queue(D) - break + var/datum/design/D = files.known_designs[T] + if(D && D.build_type & PODFAB) + add_to_queue(D) return update_queue_on_page() if(href_list["remove_from_queue"]) remove_from_queue(filter.getNum("remove_from_queue")) @@ -411,15 +406,13 @@ sync() if(href_list["part_desc"]) var/T = filter.getStr("part_desc") - for(var/datum/design/D in files.known_designs) - if(D.build_type & PODFAB) - if(D.id == T) - var/obj/part = D.build_path - temp = {"

[initial(part.name)] description:

- [initial(part.desc)]
- Return - "} - break + var/datum/design/D = files.known_designs[T] + if(D && D.build_type & PODFAB) + var/obj/part = D.build_path + temp = {"

[initial(part.name)] description:

+ [initial(part.desc)]
+ Return + "} if(href_list["remove_mat"] && href_list["material"]) var/amount = text2num(href_list["remove_mat"]) @@ -545,4 +538,4 @@ return /obj/machinery/spod_part_fabricator/proc/material2name(var/ID) - return copytext(ID,2) \ No newline at end of file + return copytext(ID,2)