Ports tg's associative-list research datums

This commit is contained in:
Crazylemon64
2016-09-14 20:38:21 -07:00
parent bf07a52edb
commit fb291bec3f
6 changed files with 163 additions and 197 deletions
+44 -77
View File
@@ -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
+63 -49
View File
@@ -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.
+4 -6
View File
@@ -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.
+24 -31
View File
@@ -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.<br>"
//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 = {"<h1>[initial(part.name)] description:</h1>
[initial(part.desc)]<br>
<a href='?src=[UID()];clear_temp=1'>Return</a>
"}
break
var/datum/design/D = files.known_designs[T]
if(D && D.build_type & PODFAB)
var/obj/part = D.build_path
temp = {"<h1>[initial(part.name)] description:</h1>
[initial(part.desc)]<br>
<a href='?src=[UID()];clear_temp=1'>Return</a>
"}
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)
return copytext(ID,2)