/* This is a self assembled wiki for chemical reagents, food recipies, and other information that should be assembled from game files. */ SUBSYSTEM_DEF(internal_wiki) name = "Wiki" wait = 1 dependencies = list( /datum/controller/subsystem/atoms, /datum/controller/subsystem/supply ) flags = SS_NO_FIRE VAR_PRIVATE/list/pages = list() VAR_PRIVATE/list/ores = list() VAR_PRIVATE/list/materials = list() VAR_PRIVATE/list/smashers = list() VAR_PRIVATE/list/appliance_list = list("Simple","Microwave","Fryer","Oven","Grill","Candy Maker","Cereal Maker") VAR_PRIVATE/list/catalog_list = list() VAR_PRIVATE/list/drinkreact = list() VAR_PRIVATE/list/chemreact = list() VAR_PRIVATE/list/botseeds = list() VAR_PRIVATE/list/viruses = list() VAR_PRIVATE/list/genes = list() VAR_PRIVATE/list/foodrecipe = list() VAR_PRIVATE/list/catalogs = list() VAR_PRIVATE/list/searchcache_ore = list() VAR_PRIVATE/list/searchcache_material = list() VAR_PRIVATE/list/searchcache_smasher = list() VAR_PRIVATE/list/searchcache_foodrecipe = list() VAR_PRIVATE/list/searchcache_drinkreact = list() VAR_PRIVATE/list/searchcache_chemreact = list() VAR_PRIVATE/list/searchcache_catalogs = list() VAR_PRIVATE/list/searchcache_botseeds = list() VAR_PRIVATE/list/searchcache_viruses = list() VAR_PRIVATE/list/searchcache_genes = list() VAR_PRIVATE/list/spoiler_entries = list() VAR_PRIVATE/max_donation = 100000 VAR_PRIVATE/min_donation = 50000 VAR_PRIVATE/donation_goal = 0 VAR_PRIVATE/cur_donation = 0 VAR_PRIVATE/list/dono_list = list() VAR_PRIVATE/highest_cached_donator = null /datum/controller/subsystem/internal_wiki/stat_entry(msg) msg = "P: [pages.len] | O: [ores.len] | M: [materials.len] | S: [smashers.len] | F: [foodrecipe.len] | D: [drinkreact.len] | C: [chemreact.len] | B: [botseeds.len] | V: [viruses.len] | G: [genes.len] " return ..() /datum/controller/subsystem/internal_wiki/Initialize() init_ore_data() init_material_data() init_particle_smasher_data() init_reagent_data() init_seed_data() init_virus_data() init_kitchen_data() init_lore_data() init_gene_data() // Donation gag donation_goal = rand(min_donation,max_donation) donation_goal = round(donation_goal,1) cur_donation = rand(0,donation_goal * 0.95) cur_donation = round(cur_donation,1) return SS_INIT_SUCCESS /////////////////////////////////////////////////////////////////////////////////// // Donation system, for the joke of course /////////////////////////////////////////////////////////////////////////////////// /datum/controller/subsystem/internal_wiki/proc/pay_with_card( var/obj/item/card/id/I, var/mob/M, var/obj/device, var/paying_amount) SHOULD_NOT_OVERRIDE(TRUE) if(!purchase_with_id_card(I, M, "Bingle.Co.LLC.UK.M.XM.WMP.AVI.COM", device.name, "Donation", paying_amount)) return FALSE // Keep tabs on donations var/datum/money_account/customer_account = get_account(I.associated_account_number) if(isnull(dono_list[customer_account.owner_name])) dono_list[customer_account.owner_name] = 0 dono_list[customer_account.owner_name] += paying_amount donation_add(paying_amount) return TRUE /datum/controller/subsystem/internal_wiki/proc/donation_add(var/paying_amount) SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) var/old_dono = cur_donation cur_donation += paying_amount if(old_dono < donation_goal) // If donation goal was not yet met upon donation, recalculate leader on donate highest_cached_donator = update_highest_donator(TRUE) if(cur_donation >= donation_goal) // Reached goal! message_admins("Bingle donation goal reached! Winner was [get_highest_donor_name()] with [get_highest_donor_value()]") // TODO - Removed me for something actually interesting /datum/controller/subsystem/internal_wiki/proc/update_highest_donator(var/no_cache = FALSE) SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) if(no_cache) highest_cached_donator = null if(highest_cached_donator) return highest_cached_donator // Search through the donated names for a winner var/highest = "noone!" var/val = 0 for(var/donor in dono_list) if(dono_list[donor] > val) val = dono_list[donor] highest = donor return highest /////////////////////////////////////////////////////////////////////////////////// // Accessors for safely talking with the subsystem /////////////////////////////////////////////////////////////////////////////////// // get a page from a search /datum/controller/subsystem/internal_wiki/proc/get_page_food(var/search) RETURN_TYPE(/datum/internal_wiki/page/food) SHOULD_NOT_OVERRIDE(TRUE) return foodrecipe[search] /datum/controller/subsystem/internal_wiki/proc/get_page_drink(var/search) RETURN_TYPE(/datum/internal_wiki/page/drink) SHOULD_NOT_OVERRIDE(TRUE) return drinkreact[search] /datum/controller/subsystem/internal_wiki/proc/get_page_chem(var/search) RETURN_TYPE(/datum/internal_wiki/page/chemical) SHOULD_NOT_OVERRIDE(TRUE) return chemreact[search] /datum/controller/subsystem/internal_wiki/proc/get_page_seed(var/search) RETURN_TYPE(/datum/internal_wiki/page/seed) SHOULD_NOT_OVERRIDE(TRUE) return botseeds[search] /datum/controller/subsystem/internal_wiki/proc/get_page_virus(var/search) RETURN_TYPE(/datum/internal_wiki/page/virus) SHOULD_NOT_OVERRIDE(TRUE) return viruses[search] /datum/controller/subsystem/internal_wiki/proc/get_page_gene(var/search) RETURN_TYPE(/datum/internal_wiki/page/gene) SHOULD_NOT_OVERRIDE(TRUE) return genes[search] /datum/controller/subsystem/internal_wiki/proc/get_page_catalog(var/search) RETURN_TYPE(/datum/internal_wiki/page/catalog) SHOULD_NOT_OVERRIDE(TRUE) return catalogs[search] /datum/controller/subsystem/internal_wiki/proc/get_page_material(var/search) RETURN_TYPE(/datum/internal_wiki/page/material) SHOULD_NOT_OVERRIDE(TRUE) return materials[search] /datum/controller/subsystem/internal_wiki/proc/get_page_particle(var/search) RETURN_TYPE(/datum/internal_wiki/page/smasher) SHOULD_NOT_OVERRIDE(TRUE) return smashers[search] /datum/controller/subsystem/internal_wiki/proc/get_page_ore(var/search) RETURN_TYPE(/datum/internal_wiki/page/ore) SHOULD_NOT_OVERRIDE(TRUE) return ores[search] // Search lists /datum/controller/subsystem/internal_wiki/proc/get_appliances() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return appliance_list /datum/controller/subsystem/internal_wiki/proc/get_searchcache_food(var/appliance) RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_foodrecipe[appliance] || list() /datum/controller/subsystem/internal_wiki/proc/get_searchcache_drink() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_drinkreact /datum/controller/subsystem/internal_wiki/proc/get_searchcache_chem() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_chemreact /datum/controller/subsystem/internal_wiki/proc/get_searchcache_seed() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_botseeds /datum/controller/subsystem/internal_wiki/proc/get_searchcache_viruses() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_viruses /datum/controller/subsystem/internal_wiki/proc/get_searchcache_genes() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_genes /datum/controller/subsystem/internal_wiki/proc/get_catalogs() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return catalog_list /datum/controller/subsystem/internal_wiki/proc/get_searchcache_catalog(var/section) RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) var/list/known_entries = list() var/list/section_data = searchcache_catalogs[section] || list() for(var/PG in section_data) var/datum/internal_wiki/page/catalog/P = catalogs["[PG]"] var/datum/category_item/catalogue/C = P.catalog_record if(C.visible || C.value <= CATALOGUER_REWARD_TRIVIAL) known_entries.Add(PG) return known_entries /datum/controller/subsystem/internal_wiki/proc/get_searchcache_material() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_material /datum/controller/subsystem/internal_wiki/proc/get_searchcache_particle() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_smasher /datum/controller/subsystem/internal_wiki/proc/get_searchcache_ore() RETURN_TYPE(/list) SHOULD_NOT_OVERRIDE(TRUE) return searchcache_ore // Donating /datum/controller/subsystem/internal_wiki/proc/get_donor_value(var/key) SHOULD_NOT_OVERRIDE(TRUE) if(!dono_list.len || isnull(dono_list[key])) return 0 return dono_list[key] /datum/controller/subsystem/internal_wiki/proc/get_donation_current() SHOULD_NOT_OVERRIDE(TRUE) return cur_donation /datum/controller/subsystem/internal_wiki/proc/get_donation_goal() SHOULD_NOT_OVERRIDE(TRUE) return donation_goal /datum/controller/subsystem/internal_wiki/proc/get_highest_donor_name() SHOULD_NOT_OVERRIDE(TRUE) highest_cached_donator = update_highest_donator(FALSE) return highest_cached_donator /datum/controller/subsystem/internal_wiki/proc/get_highest_donor_value() SHOULD_NOT_OVERRIDE(TRUE) highest_cached_donator = update_highest_donator(FALSE) return get_donor_value(highest_cached_donator) // Helpers for formatting wiki data for tgui pages /datum/controller/subsystem/internal_wiki/proc/assemble_reaction_data(var/list/data, var/datum/reagent/R) var/list/reaction_list = SSchemistry.chemical_reactions_by_product[R.id] var/list/distilled_list = SSchemistry.distilled_reactions_by_product[R.id] data["instant_reactions"] = null if(reaction_list != null && reaction_list.len > 0) var/list/display_reactions = list() for(var/decl/chemical_reaction/CR in reaction_list) if(CR.wiki_flag & WIKI_SPOILER) continue display_reactions.Add(CR) var/reactions = list() for(var/decl/chemical_reaction/CR in display_reactions) var/list/assemble_reaction = list() var/list/reqs = list() for(var/RQ in CR.required_reagents) var/decl/chemical_reaction/r_RQ = SSchemistry.chemical_reagents[RQ] if(!r_RQ) log_runtime(EXCEPTION("Invalid reagent id: [RQ]")) continue reqs.Add("[r_RQ.name]") assemble_reaction["required"] = reqs var/list/inhib = list() for(var/IH in CR.inhibitors) var/decl/chemical_reaction/r_IH = SSchemistry.chemical_reagents[IH] if(!r_IH) log_runtime(EXCEPTION("Invalid reagent id: [IH]")) continue inhib.Add("[r_IH.name]") assemble_reaction["inhibitor"] = inhib var/list/catal = list() for(var/CL in CR.catalysts) var/decl/chemical_reaction/r_CL = SSchemistry.chemical_reagents[CL] if(!r_CL) log_runtime(EXCEPTION("Invalid reagent id: [CL]")) continue catal.Add("[r_CL.name]") assemble_reaction["catalysts"] = catal assemble_reaction["is_slime"] = null if(istype(CR,/decl/chemical_reaction/instant/slime)) var/decl/chemical_reaction/instant/slime/CRS = CR var/obj/item/slime_extract/slime_path = CRS.required assemble_reaction["is_slime"] = initial(slime_path.name) reactions += list(assemble_reaction) if(display_reactions.len) data["instant_reactions"] = reactions data["distilled_reactions"] = null if(distilled_list != null && distilled_list.len > 0) var/list/display_reactions = list() for(var/decl/chemical_reaction/distilling/CR in distilled_list) if(CR.wiki_flag & WIKI_SPOILER) continue display_reactions.Add(CR) var/reactions = list() for(var/decl/chemical_reaction/distilling/CR in display_reactions) var/list/assemble_reaction = list() assemble_reaction["temp_min"] = CR.temp_range[1] assemble_reaction["temp_max"] = CR.temp_range[2] assemble_reaction["xgm_min"] = CR.minimum_xgm_pressure assemble_reaction["xgm_max"] = CR.maximum_xgm_pressure assemble_reaction["require_xgm_gas"] = CR.require_xgm_gas ? GLOB.gas_data.name[CR.require_xgm_gas] : null assemble_reaction["rejects_xgm_gas"] = CR.rejects_xgm_gas ? GLOB.gas_data.name[CR.rejects_xgm_gas] : null var/list/reqs = list() for(var/RQ in CR.required_reagents) var/decl/chemical_reaction/r_RQ = SSchemistry.chemical_reagents[RQ] if(!r_RQ) log_runtime(EXCEPTION("Invalid reagent id: [RQ]")) continue reqs.Add("[r_RQ.name]") assemble_reaction["required"] = reqs var/list/inhib = list() for(var/IH in CR.inhibitors) var/decl/chemical_reaction/r_IH = SSchemistry.chemical_reagents[IH] if(!r_IH) log_runtime(EXCEPTION("Invalid reagent id: [IH]")) continue inhib.Add("[r_IH.name]") assemble_reaction["inhibitor"] = inhib var/list/catal = list() for(var/CL in CR.catalysts) var/decl/chemical_reaction/r_CL = SSchemistry.chemical_reagents[CL] if(!r_CL) log_runtime(EXCEPTION("Invalid reagent id: [CL]")) continue catal.Add("[r_CL.name]") assemble_reaction["catalysts"] = catal assemble_reaction["is_slime"] = null reactions += list(assemble_reaction) if(display_reactions.len) data["distilled_reactions"] = reactions var/grind_list = list() var/list/display_reactions = list() for(var/ore_type in GLOB.ore_reagents) var/obj/item/ore/O = ore_type if(R.id in GLOB.ore_reagents[ore_type]) display_reactions.Add(initial(O.name)) grind_list["ore"] = null if(display_reactions.len > 0) grind_list["ore"] = display_reactions display_reactions = list() for(var/sheet_type in GLOB.sheet_reagents) var/obj/item/stack/material/M = sheet_type if(R.id in GLOB.sheet_reagents[sheet_type]) display_reactions.Add(initial(M.name)) grind_list["material"] = null if(display_reactions.len > 0) grind_list["material"] = display_reactions display_reactions = list() for(var/SN in SSplants.seeds) var/datum/seed/S = SSplants.seeds[SN] if(S && S.roundstart && !S.mysterious) if(S.wiki_flag & WIKI_SPOILER) continue if(!S.chems || !S.chems.len) continue if(!(R.id in S.chems)) continue display_reactions.Add(S.display_name) grind_list["plant"] = null if(display_reactions.len > 0) grind_list["plant"] = display_reactions data["grinding"] = grind_list display_reactions = list() for(var/O in GLOB.ore_data) var/ore/OR = GLOB.ore_data[O] if(OR.reagent == R.id) display_reactions.Add(OR.name) data["fluid"] = null if(display_reactions.len > 0) data["fluid"] = display_reactions display_reactions = list() var/list/instant_by_reagent = SSchemistry.instant_reactions_by_reagent["[R.id]"] if(instant_by_reagent && instant_by_reagent.len) for(var/i = 1, i <= instant_by_reagent.len, i++) var/decl/chemical_reaction/OR = instant_by_reagent[i] if(istype(OR,/decl/chemical_reaction/instant/slime)) // very bloated and meant to be a mystery continue display_reactions.Add(OR.name) var/list/distilled_by_reagent = SSchemistry.distilled_reactions_by_reagent["[R.id]"] if(distilled_by_reagent && distilled_by_reagent.len) for(var/i = 1, i <= distilled_by_reagent.len, i++) var/decl/chemical_reaction/OR = distilled_by_reagent[i] display_reactions.Add(OR.name) data["produces"] = null if(display_reactions.len > 0) data["produces"] = display_reactions /datum/controller/subsystem/internal_wiki/proc/assemble_allergens(var/allergens) if(allergens > 0) var/list/allergies = list() if(allergens & ALLERGEN_MEAT) allergies.Add("Meat protein") if(allergens & ALLERGEN_FISH) allergies.Add("Fish protein") if(allergens & ALLERGEN_FRUIT) allergies.Add("Fruit") if(allergens & ALLERGEN_VEGETABLE) allergies.Add("Vegetable") if(allergens & ALLERGEN_GRAINS) allergies.Add("Grain") if(allergens & ALLERGEN_BEANS) allergies.Add("Bean") if(allergens & ALLERGEN_SEEDS) allergies.Add("Nut") if(allergens & ALLERGEN_DAIRY) allergies.Add("Dairy") if(allergens & ALLERGEN_FUNGI) allergies.Add("Fungi") if(allergens & ALLERGEN_COFFEE) allergies.Add("Caffeine") if(allergens & ALLERGEN_SUGARS) allergies.Add("Sugar") if(allergens & ALLERGEN_EGGS) allergies.Add("Egg") if(allergens & ALLERGEN_STIMULANT) allergies.Add("Stimulant") if(allergens & ALLERGEN_CHOCOLATE) allergies.Add("Chocolate") if(allergens & ALLERGEN_POLLEN) allergies.Add("Pollen") if(allergens & ALLERGEN_SALT) allergies.Add("Salt") return allergies return null /datum/controller/subsystem/internal_wiki/proc/assemble_sintering(var/sinter) if(sinter == REFINERY_SINTERING_EXPLODE) return "violent detonation" if(sinter == REFINERY_SINTERING_SMOKE) return "toxic fumes" if(sinter == REFINERY_SINTERING_SPIDERS) return "OH GOD WHY!?" return sinter /datum/controller/subsystem/internal_wiki/proc/add_icon(var/list/data, var/ic, var/is, var/col) var/load_data = list() load_data["icon"] = ic // dmi path load_data["state"] = is // string load_data["color"] = col // html color data["icon_data"] = load_data /////////////////////////////////////////////////////////////////////////////////// // Initilizing data and creating wiki pages /////////////////////////////////////////////////////////////////////////////////// /datum/controller/subsystem/internal_wiki/proc/init_ore_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // assemble ore wiki for(var/N in GLOB.ore_data) var/ore/OR = GLOB.ore_data[N] if(OR.wiki_flag & WIKI_SPOILER) spoiler_entries.Add(OR.type) continue var/datum/internal_wiki/page/ore/P = new() P.assemble(OR) ores["[OR.display_name]"] = P searchcache_ore.Add("[OR.display_name]") pages.Add(P) /datum/controller/subsystem/internal_wiki/proc/init_material_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // assemble material wiki for(var/mat in name_to_material) var/datum/material/M = name_to_material[mat] if(M.wiki_flag & WIKI_SPOILER) spoiler_entries.Add(M.type) continue var/datum/internal_wiki/page/material/P = new() var/id = "[M.display_name] [M.sheet_singular_name]" P.assemble(M) materials[id] = P searchcache_material.Add(id) pages.Add(P) /datum/controller/subsystem/internal_wiki/proc/init_particle_smasher_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // assemble particle smasher wiki for(var/datum/particle_smasher_recipe/D as anything in subtypesof(/datum/particle_smasher_recipe)) if(initial(D.wiki_flag) & WIKI_SPOILER) spoiler_entries.Add(D) continue var/datum/particle_smasher_recipe/R = new D() var/datum/internal_wiki/page/smasher/P = new() var/id = "[initial(D.display_name)]" P.assemble(R) smashers[id] = P searchcache_smasher.Add(id) pages.Add(P) qdel(R) /datum/controller/subsystem/internal_wiki/proc/init_reagent_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // assemble chemical reactions wiki for(var/reagent in SSchemistry.chemical_reagents) var/datum/internal_wiki/page/P = null var/datum/reagent/R = SSchemistry.chemical_reagents[reagent] if(!allow_reagent(R.id)) continue if((R.wiki_flag & WIKI_FOOD)) // Processed later continue if(R.wiki_flag & WIKI_SPOILER) spoiler_entries.Add(R.type) continue var/id = "[R.name]" if((R.wiki_flag & WIKI_DRINK) && R.id != REAGENT_ID_ETHANOL) // This is no good way to use inheretance for ethanol... We exclude it here so it shows up in chems P = new /datum/internal_wiki/page/drink() P.assemble(R) searchcache_drinkreact.Add(id) drinkreact[id] = P else P = new /datum/internal_wiki/page/chemical() P.assemble(R) searchcache_chemreact.Add(id) chemreact[id] = P pages.Add(P) /datum/controller/subsystem/internal_wiki/proc/init_seed_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // seeds and plants for(var/SN in SSplants.seeds) var/datum/seed/S = SSplants.seeds[SN] if(S && S.roundstart && !S.mysterious) if(S.wiki_flag & WIKI_SPOILER) spoiler_entries.Add(S.type) continue var/datum/internal_wiki/page/seed/P = new() P.assemble(S) searchcache_botseeds.Add("[S.display_name]") botseeds["[S.display_name]"] = P pages.Add(P) /datum/controller/subsystem/internal_wiki/proc/init_virus_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // viruses or diseases for(var/datum/disease/D as anything in subtypesof(/datum/disease)) if(initial(D.name) == DEVELOPER_WARNING_NAME) continue if(initial(D.visibility_flags) & HIDDEN_PANDEMIC) spoiler_entries.Add(D) continue var/datum/internal_wiki/page/virus/P = new() P.assemble(D) searchcache_viruses.Add("[initial(D.medical_name)]") viruses["[initial(D.medical_name)]"] = P pages.Add(P) /datum/controller/subsystem/internal_wiki/proc/init_gene_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // viruses or diseases for(var/datum/gene/G in GLOB.dna_genes) var/N = G.name if(istype(G,/datum/gene/trait)) var/datum/gene/trait/T = G N = T.get_name() var/datum/internal_wiki/page/gene/P = new() P.assemble(G) searchcache_genes.Add("[N]") genes["[N]"] = P pages.Add(P) /datum/controller/subsystem/internal_wiki/proc/init_kitchen_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // Build the kitchen recipe lists var/list/food_recipes = subtypesof(/datum/recipe) for(var/datum/recipe/Rp as anything in food_recipes) //Lists don't work with datum-stealing no-instance initial() so we have to. var/datum/recipe/R = new Rp() if(!isnull(R.result)) var/obj/item/res = R.result food_recipes[Rp] = list( "Result" = "[initial(res.name)]", "ResultPath" = res, "Desc" = "[initial(res.desc)]", "ResAmt" = "1", "Reagents" = R.reagents ? R.reagents.Copy() : list(), "Catalysts" = list(), "Fruit" = R.fruit ? R.fruit.Copy() : list(), "Ingredients" = R.items ? R.items.Copy() : list(), "Coating" = R.coating, "Appliance" = R.appliance, "Allergens" = 0, "Price" = initial(res.price_tag), "Flags" = R.wiki_flag ) qdel(R) // basically condiments, tofu, cheese, soysauce, etc for(var/decl/chemical_reaction/instant/CR in SSchemistry.chemical_reactions) if(!allow_reagent(CR.result)) continue if(CR.wiki_flag & WIKI_SPOILER) continue if(!(CR.wiki_flag & WIKI_FOOD)) continue food_recipes[CR.type] = list("Result" = CR.name, "ResultPath" = null, "ResAmt" = CR.result_amount, "Reagents" = CR.required_reagents ? CR.required_reagents.Copy() : list(), "Catalysts" = CR.catalysts ? CR.catalysts.Copy() : list(), "Fruit" = list(), "Ingredients" = list(), "Appliance" = 0, "Allergens" = 0, "Flags" = CR.wiki_flag ) //Items needs further processing into human-readability. for(var/Rp in food_recipes) var/working_ing_list = list() food_recipes[Rp]["has_coatable_items"] = FALSE for(var/I in food_recipes[Rp]["Ingredients"]) if(I == /obj/item/holder/mouse) // Time for the list of snowflakes if("mouse" in working_ing_list) var/sofar = working_ing_list["mouse"] working_ing_list["mouse"] = sofar+1 else working_ing_list["mouse"] = 1 else if(I == /obj/item/holder/diona) // YOU TOO if("diona" in working_ing_list) var/sofar = working_ing_list["diona"] working_ing_list["diona"] = sofar+1 else working_ing_list["diona"] = 1 else if(I == /obj/item/holder) // And you especially, needed for "splat" microwave recipe if("micro" in working_ing_list) var/sofar = working_ing_list["micro"] working_ing_list["micro"] = sofar+1 else working_ing_list["micro"] = 1 else if(I in typesof(/obj/item/reagent_containers/food/snacks)) // only subtypes of this have a coating variable and are checked for it (fruit are a subtype of this, so there's a check for them too later) food_recipes[Rp]["has_coatable_items"] = TRUE //So now we add something like "Bread" = 3 var/id = initial(I:name) if(id in working_ing_list) var/sofar = working_ing_list[id] working_ing_list[id] = sofar+1 else working_ing_list[id] = 1 if(LAZYLEN(food_recipes[Rp]["Fruit"])) food_recipes[Rp]["has_coatable_items"] = TRUE food_recipes[Rp]["Ingredients"] = working_ing_list //Reagents can be resolved to nicer names as well for(var/Rp in food_recipes) for(var/rid in food_recipes[Rp]["Reagents"]) var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid] if(!Rd) // Leaving this here in the event that if rd is ever invalid or there's a recipe issue, it'll be skipped and recipe dumps can still be ran. log_runtime(EXCEPTION("Food \"[Rp]\" had an invalid RID: \"[rid]\"! Check your reagents list for a missing or mistyped reagent!")) continue // This allows the dump to still continue, and it will skip the invalid recipes. var/R_name = Rd.name var/amt = food_recipes[Rp]["Reagents"][rid] food_recipes[Rp]["Reagents"] -= rid food_recipes[Rp]["Reagents"][R_name] = amt food_recipes[Rp]["Allergens"] |= Rd.allergen_type for(var/rid in food_recipes[Rp]["Catalysts"]) var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid] if(!Rd) // Leaving this here in the event that if rd is ever invalid or there's a recipe issue, it'll be skipped and recipe dumps can still be ran. log_runtime(EXCEPTION("Food \"[Rp]\" had an invalid RID: \"[rid]\"! Check your reagents list for a missing or mistyped reagent!")) continue // This allows the dump to still continue, and it will skip the invalid recipes. var/R_name = Rd.name var/amt = food_recipes[Rp]["Catalysts"][rid] food_recipes[Rp]["Catalysts"] -= rid food_recipes[Rp]["Catalysts"][R_name] = amt //We can also change the appliance to its proper name. for(var/Rp in food_recipes) switch(food_recipes[Rp]["Appliance"]) if(0) food_recipes[Rp]["Appliance"] = "Simple" if(1) food_recipes[Rp]["Appliance"] = "Microwave" if(2) food_recipes[Rp]["Appliance"] = "Fryer" if(4) food_recipes[Rp]["Appliance"] = "Oven" if(8) food_recipes[Rp]["Appliance"] = "Grill" if(16) food_recipes[Rp]["Appliance"] = "Candy Maker" if(32) food_recipes[Rp]["Appliance"] = "Cereal Maker" //////////////////////// SORTING var/list/foods_to_paths = list() for(var/Rp in food_recipes) // "Appliance" will sort the list by APPLIANCES first. Items without an appliance will append to the top of the list. The old method was "Result", which sorts the list by the name of the result. foods_to_paths["[food_recipes[Rp]["Appliance"]] [Rp]"] = Rp //Append recipe datum path to keep uniqueness foods_to_paths = sortAssoc(foods_to_paths) var/list/foods_newly_sorted = list() for(var/Rr in foods_to_paths) var/Rp = foods_to_paths[Rr] foods_newly_sorted[Rp] = food_recipes[Rp] food_recipes = foods_newly_sorted // assemble output pages for(var/Rp in food_recipes) if(food_recipes[Rp] && !isnull(food_recipes[Rp]["Result"])) if(food_recipes[Rp]["Flags"] & WIKI_SPOILER) spoiler_entries.Add(Rp) continue var/datum/internal_wiki/page/recipe/P = new() P.assemble(food_recipes[Rp]) foodrecipe["[P.title]"] = P // organize into sublists var/app = food_recipes[Rp]["Appliance"] if(!searchcache_foodrecipe[app]) searchcache_foodrecipe[app] = list() var/list/FL = searchcache_foodrecipe[app] FL.Add("[P.title]") pages.Add(P) /datum/controller/subsystem/internal_wiki/proc/init_lore_data() SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // assemble low reward catalog entries for(var/datum/category_group/G in GLOB.catalogue_data.categories) for(var/datum/category_item/catalogue/item in G.items) if(istype(item,/datum/category_item/catalogue/anomalous)) continue // lets always consider these spoilers if(istype(item,/datum/category_item/catalogue/fauna/catslug/custom)) continue // too many silly entries var/datum/internal_wiki/page/catalog/P = new() P.title = item.name P.catalog_record = item P.assemble() catalogs["[item.name]"] = P if(!searchcache_catalogs[G.name]) searchcache_catalogs[G.name] = list() var/list/SC = searchcache_catalogs[G.name] SC.Add(P.title) pages.Add(P) catalog_list.Add(G.name) /datum/controller/subsystem/internal_wiki/proc/allow_reagent(var/reagent_id) SHOULD_NOT_OVERRIDE(TRUE) PRIVATE_PROC(TRUE) // This is used to filter out some of the base reagent types, such as admin only reagents if(!reagent_id || reagent_id == "" || reagent_id == REAGENT_ID_DEVELOPER_WARNING || reagent_id == REAGENT_ID_DRINK || reagent_id == REAGENT_DRUGS || reagent_id == REAGENT_ID_ADMINORDRAZINE) return FALSE return TRUE //////////////////////////////////////////////////////////////////////////////////////////////// // PAGES AND THEIR CONSTRUCTION //////////////////////////////////////////////////////////////////////////////////////////////// /datum/internal_wiki/page var/title = "" var/list/data = list() /datum/internal_wiki/page/proc/assemble() return /datum/internal_wiki/page/proc/get_data() RETURN_TYPE(/list) return data /datum/internal_wiki/page/proc/get_print() return // ORES //////////////////////////////////////////// /datum/internal_wiki/page/ore/assemble(var/ore/O) title = O.display_name data["title"] = title var/obj/item/ore/ore_path = O.ore SSinternal_wiki.add_icon(data, initial(ore_path.icon), initial(ore_path.icon_state), "#ffffff") // Get internal data data["smelting"] = null if(O.smelts_to) var/datum/material/S = get_material_by_name(O.smelts_to) data["smelting"] = S.display_name data["compressing"] = null if(O.compresses_to) var/datum/material/C = get_material_by_name(O.compresses_to) data["compressing"] = C.display_name data["alloys"] = null if(O.alloy) var/list/alloy_list = list() for(var/datum/alloy/A in GLOB.alloy_data) for(var/req in A.requires) if(O.name == req ) var/datum/material/M = get_material_by_name(A.metaltag) alloy_list.Add(M.display_name) break data["alloys"] = alloy_list data["pump_reagent"] = null if(O.reagent) var/datum/reagent/REG = SSchemistry.chemical_reagents[O.reagent] data["pump_reagent"] = REG.name data["grind_reagents"] = null if(GLOB.ore_reagents[O.ore]) var/list/output = GLOB.ore_reagents[O.ore] var/list/collect = list() var/total_parts = 0 for(var/Rid in output) var/datum/reagent/CBR = SSchemistry.chemical_reagents[Rid] if(!collect[CBR.name]) collect[CBR.name] = 0 collect[CBR.name] += 1 total_parts += 1 var/per_part = REAGENTS_PER_SHEET / total_parts var/list/grind_list = list() for(var/N in collect) grind_list[N] = "[collect[N] * per_part]" data["grind_reagents"] = grind_list /datum/internal_wiki/page/ore/get_print() var/body = "" if(data["smelting"]) body += "Smelting: [data["smelting"]]
" if(data["compressing"]) body += "Compressing: [data["compressing"]]
" if(data["alloys"]) body += "
" body += "Alloy Component of:
" var/list/alloy_list = data["alloys"] for(var/A in alloy_list) body += "-[A]
" else body += "
" body += "No known Alloys
" if(data["pump_reagent"]) body += "
" body += "Fluid Pump Results:
" body += "-[data["pump_reagent"]]
" if(data["grind_reagents"]) body += "
" body += "Ore Grind Results:
" var/list/grind_list = data["grind_reagents"] for(var/A in grind_list) body += "-[A]: [grind_list[A]]u
" return body // MATERIALS //////////////////////////////////////////// /datum/internal_wiki/page/material/assemble(var/datum/material/M) title = M.display_name + " " + M.sheet_singular_name data["title"] = title var/obj/item/stack/stack_path = M.stack_type SSinternal_wiki.add_icon(data, initial(stack_path.icon), initial(stack_path.icon_state), initial(M.icon_colour)) // Get internal data data["integrity"] = M.integrity data["hardness"] = M.hardness data["weight"] = M.weight data["stack_size"] = initial(stack_path.max_amount) ? initial(stack_path.max_amount) : 0 var/supply_value = M.supply_conversion_value ? M.supply_conversion_value : 0 data["supply_points"] = supply_value var/value = supply_value * SSsupply.points_per_money value = FLOOR(value * 100, 1) / 100 // Truncate decimals data["market_price"] = value data["opacity"] = M.opacity data["conductive"] = M.conductive data["protectiveness"] = M.protectiveness data["explosion_resistance"] = M.explosion_resistance data["radioactivity"] = M.radioactivity data["reflectivity"] = M.reflectivity data["melting_point"] = M.melting_point data["ignition_point"] = M.ignition_point data["grind_reagents"] = null if(GLOB.sheet_reagents[M.stack_type]) var/list/output = GLOB.sheet_reagents[M.stack_type] if(output && output.len > 0) var/list/collect = list() var/total_parts = 0 for(var/Rid in output) var/datum/reagent/CBR = SSchemistry.chemical_reagents[Rid] if(CBR) if(!collect[CBR.name]) collect[CBR.name] = 0 collect[CBR.name] += 1 total_parts += 1 else log_runtime(EXCEPTION("Invalid reagent id: [Rid] in grind results for sheet [title]")) if(total_parts > 0) var/per_part = REAGENTS_PER_SHEET / total_parts var/list/grind_list = list() for(var/N in collect) grind_list[N] = "[collect[N] * per_part]" data["grind_reagents"] = grind_list data["recipies"] = null M.get_recipes() // generate if not already if(M.recipes != null && M.recipes.len > 0) var/list/recipie_list = list() for(var/datum/stack_recipe/R in M.recipes) recipie_list.Add(R.title) data["recipies"] = recipie_list /datum/internal_wiki/page/material/get_print() var/body = "" body += "Integrity: [data["integrity"]]
" body += "Hardness: [data["hardness"]]
" body += "Weight: [data["weight"]]
" var/points = data["supply_points"] var/stack_size = data["stack_size"] body += "Supply Points: [points] per sheet, [points * stack_size] per stack of [stack_size]
" var/value = data["market_price"] body += "Market Price: [value] [value > 1 ? "thalers" : "thaler"] per sheet | [(value*stack_size)] [(value*stack_size) > 1 ? "thalers" : "thaler"] per stack of [stack_size]
" body += "
" body += "Transparent: [data["opacity"] >= 0.5 ? "No" : "Yes"]
" body += "Conductive: [data["conductive"] ? "Yes" : "No"]
" body += "Stability: [data["protectiveness"]]
" body += "Blast Res.: [data["explosion_resistance"]]
" body += "Radioactivity: [data["radioactivity"]]
" body += "Reflectivity: [data["reflectivity"] * 100]%
" body += "
" if(data["melting_point"] > 0) body += "Melting Point: [data["melting_point"]]K ([data["melting_point"] - T0C]C)
" else body += "Melting Point: ---
" if(data["ignition_point"] > 0) body += "Ignition Point: [data["ignition_point"]]K ([data["ignition_point"] - T0C]C)
" else body += "Ignition Point: ---
" if(data["grind_reagents"]) body += "
" var/list/grind_list = data["grind_reagents"] if(grind_list && grind_list.len > 0) body += "Sheet Grind Results:
" for(var/N in grind_list) body += "-[N]: [grind_list[N]]u
" if(data["recipies"]) body += "
" var/list/recipie_list = data["recipies"] body += "Recipies:
" for(var/R in recipie_list) body += "-[R]
" return body // SEEDS //////////////////////////////////////////// /datum/internal_wiki/page/seed/assemble(var/datum/seed/S) title = S.display_name data["title"] = title SSinternal_wiki.add_icon(data, 'icons/obj/hydroponics_growing.dmi', "[S.get_trait(TRAIT_PLANT_ICON)]-[S.growth_stages]", S.get_trait(TRAIT_PLANT_COLOUR)) // Get internal data data["feeding"] = S.get_trait(TRAIT_REQUIRES_NUTRIENTS) data["watering"] = S.get_trait(TRAIT_REQUIRES_WATER) data["lighting"] = S.get_trait(TRAIT_IDEAL_LIGHT) data["crop_yield"] = S.get_trait(TRAIT_YIELD) var/list/traits = list() if(S.has_item_product) traits.Add("Grown Byproducts") if(S.chems && !isnull(S.chems["woodpulp"])) traits.Add("Wooden Growths") if(S.get_trait(TRAIT_FLESH_COLOUR)) traits.Add("Choppable") if(S.kitchen_tag == "pumpkin") traits.Add("Carvable") if(S.kitchen_tag == "potato") traits.Add("Sliceable") if(S.get_trait(TRAIT_JUICY)) traits.Add("Juicy") if(S.get_trait(TRAIT_IMMUTABLE)) traits.Add("Stable Genome") if(S.get_trait(TRAIT_PRODUCES_POWER)) traits.Add("Voltaic") if(S.get_trait(TRAIT_BIOLUM)) traits.Add("Bioluminescence") if(S.get_trait(TRAIT_STINGS)) traits.Add("Stings") if(S.get_trait(TRAIT_SPORING)) traits.Add("Produces Spores") if(S.get_trait(TRAIT_CARNIVOROUS)) traits.Add("Carnivorous") if(S.get_trait(TRAIT_PARASITE)) traits.Add("Parasitic") if(S.get_trait(TRAIT_SPREAD)) traits.Add("Spreading") if(S.get_trait(TRAIT_EXPLOSIVE)) traits.Add("Explosive") if(!traits.len) traits.Add("None") data["traits"] = traits data["mob_product"] = S.has_mob_product data["chem_breakdown"] = null if(S.chems && S.chems.len > 0) var/list/chems = list() for(var/CB in S.chems) var/datum/reagent/CBR = SSchemistry.chemical_reagents[CB] if(CBR) chems.Add(CBR.name) else log_runtime(EXCEPTION("Invalid reagent id: [CB] in chemical breakdown for seed [title]")) data["chem_breakdown"] = chems data["gas_consumed"] = null if(S.consume_gasses && S.consume_gasses.len > 0) var/list/consumed = list() for(var/CG in S.consume_gasses) consumed["[GLOB.gas_data.name[CG]]"] = S.consume_gasses[CG] data["gas_consumed"] = consumed data["gas_exuded"] = null if(S.exude_gasses && S.exude_gasses.len > 0) var/list/exude = list() for(var/EG in S.exude_gasses) exude["[GLOB.gas_data.name[EG]]"] = S.exude_gasses[EG] data["gas_exuded"] = exude data["mutations"] = null if(S.mutants && S.mutants.len > 0) var/list/mutations = list() for(var/MS in S.mutants) var/datum/seed/mut = SSplants.seeds[MS] if(mut) mutations.Add(mut.display_name) data["mutations"] = mutations /datum/internal_wiki/page/seed/get_print() var/body = "" body += "Requires Feeding: [data["feeding"] ? "YES" : "NO"]
" body += "Requires Watering: [data["watering"] ? "YES" : "NO"]
" body += "Requires Light: [data["lighting"]] lumen[data["lighting"] == 1 ? "" : "s"]
" if(data["crop_yield"] > 0) body += "Yield: [data["crop_yield"]]
" body += "
" body += "Traits:
" var/list/traits = data["traits"] for(var/A in traits) body += "-[A]
" body += "
" if(data["mob_product"]) body += "DANGER - MAY BE MOBILE
" body += "
" var/list/chem_list = data["chem_breakdown"] if(chem_list && chem_list.len > 0) body += "Chemical Breakdown:
" for(var/CB in chem_list) body += "-[CB]
" body += "
" var/list/consumed_list = data["gas_consumed"] if(consumed_list && consumed_list.len > 0) body += "Gasses Consumed:
" for(var/CG in consumed_list) var/amount = "[consumed_list[CG]]" if (consumed_list[CG] < 5) amount = "[CG] (trace amounts)" body += "-[amount]
" body += "
" var/list/exuded_list = data["gas_exuded"] if(exuded_list && exuded_list.len > 0) body += "Gasses Produced:
" for(var/EG in exuded_list) var/amount = "[exuded_list[EG]]" if (exuded_list[EG] < 5) amount = "[EG] (trace amounts)" body += "-[amount]
" body += "
" var/list/mutations = data["mutations"] if(mutations && mutations.len > 0) body += "Mutant Strains:
" for(var/MS in mutations) body += "-[MS]
" return body // PARTICLE SMASHER //////////////////////////////////////////// /datum/internal_wiki/page/smasher/assemble(var/datum/particle_smasher_recipe/M) title = M.display_name data["title"] = title var/obj/item/stack/material/result_path = M.result var/datum/material/result_mat = get_material_by_name(initial(result_path.default_type)) SSinternal_wiki.add_icon(data, initial(result_path.icon), initial(result_path.icon_state), initial(result_mat.icon_colour)) // Get internal data var/obj/item/stack/req_mat = M.required_material data["req_mat"] = null if(req_mat != null) data["req_mat"] = initial(req_mat.name) data["target_items"] = null if(M.items && M.items.len > 0) var/list/targs = list() for(var/obj/Ir as anything in M.items) targs.Add(initial(Ir.name)) data["target_items"] = targs data["required_energy_min"] = M.required_energy_min data["required_energy_max"] = M.required_energy_max data["required_atmos_temp_min"] = M.required_atmos_temp_min data["required_atmos_temp_max"] = M.required_atmos_temp_max data["inducers"] = null if(M.reagents != null && M.reagents.len > 0) var/list/inducers = list() for(var/R in M.reagents) var/amnt = M.reagents[R] var/datum/reagent/Rd = SSchemistry.chemical_reagents[R] if(Rd) inducers["[Rd.name]"] = amnt else log_runtime(EXCEPTION("Invalid reagent id: [Rd] in inducer for atom smasher [title]")) data["inducers"] = inducers data["result"] = initial(result_path.name) data["probability"] = M.probability /datum/internal_wiki/page/smasher/get_print() var/body = "" if(data["req_mat"] != null) body += "Target Sheet: [data["req_mat"]]
" var/list/targ_items = data["target_items"] if(targ_items && targ_items.len > 0) for(var/Ir in targ_items) body += "-[Ir]
" body += "Threshold Energy: [data["required_energy_min"]] - [data["required_energy_max"]]
" body += "Threshold Temp: [data["required_atmos_temp_min"]]k - [data["required_atmos_temp_max"]]k | ([data["required_atmos_temp_min"] - T0C]C - [data["required_atmos_temp_max"] - T0C]C)
" var/list/inducers = data["inducers"] if(inducers && inducers.len > 0) body += "
" body += "Inducers:
" for(var/R in inducers) body += "-[R] [inducers[R]]u
" body += "
" body += "Results: [data["result"]]
" body += "Probability: [data["probability"]]%
" return body // CHEMICALS //////////////////////////////////////////// /datum/internal_wiki/page/chemical/assemble(var/datum/reagent/R) title = R.name data["title"] = title var/obj/item/reagent_containers/glass/beaker/large/beaker_path = /obj/item/reagent_containers/glass/beaker/large SSinternal_wiki.add_icon(data, initial(beaker_path.icon), initial(beaker_path.icon_state), R.color) // Get internal data data["description"] = R.description data["addictive"] = 0 if(R.id in get_addictive_reagents(ADDICT_ALL)) data["addictive"] = TRUE data["industrial_use"] = R.industrial_use data["supply_points"] = R.supply_conversion_value ? R.supply_conversion_value : 0 data["cooling_mod"] = R.coolant_modifier var/value = R.supply_conversion_value * REAGENTS_PER_SHEET * SSsupply.points_per_money value = FLOOR(value * 100,1) / 100 // Truncate decimals data["market_price"] = value data["sintering"] = SSinternal_wiki.assemble_sintering(GLOB.reagent_sheets[R.id]) data["overdose"] = R.overdose data["flavor"] = R.taste_description data["allergen"] = SSinternal_wiki.assemble_allergens(R.allergen_type) SSinternal_wiki.assemble_reaction_data(data, R) /datum/internal_wiki/page/chemical/get_print() var/body = "" body += "Description: [data["description"]]
" if(data["addictive"]) body += "DANGER, addictive.
" if(data["industrial_use"]) body += "Industrial Use: [data["industrial_use"]]
" var/tank_size = CARGOTANKER_VOLUME body += "Supply Points: [data["supply_points"]] per unit, [data["supply_points"] * tank_size] per [tank_size] tank
" var/value = data["market_price"] if(value > 0) body += "Market Price: [value] [value > 1 ? "thalers" : "thaler"] per [REAGENTS_PER_SHEET] units | [(value*tank_size)] [(value*tank_size) > 1 ? "thalers" : "thaler"] per [tank_size] unit tank
" if(data["sintering"]) var/mat_id = data["sintering"] switch(mat_id) if(REFINERY_SINTERING_SMOKE) body += "Sintering Results: COMBUSTION
" if(REFINERY_SINTERING_EXPLODE) body += "Sintering Results: DETONATION
" if(REFINERY_SINTERING_SPIDERS) body += "Sintering Results: DO NOT EVER
" else var/datum/material/C = get_material_by_name(data["sintering"]) if(C) body += "Sintering Results: [C.display_name] [C.sheet_plural_name]
" body += "Coolant Factor: [data["cooling_mod"]]x
" if(data["overdose"] > 0) body += "Overdose: [data["overdose"]]u
" body += "Flavor: [data["flavor"]]
" body += "
" body += print_allergens(data["allergen"]) body += "
" body += print_reaction_data(data) return body // FOOD REAGENTS //////////////////////////////////////////// /datum/internal_wiki/page/food/assemble(var/datum/reagent/R) title = R.name data["title"] = title var/obj/item/reagent_containers/glass/beaker/large/beaker_path = /obj/item/reagent_containers/glass/beaker/large SSinternal_wiki.add_icon(data, initial(beaker_path.icon), initial(beaker_path.icon_state), R.color) // Get internal data data["description"] = R.description data["flavor"] = R.taste_description data["allergen"] = SSinternal_wiki.assemble_allergens(R.allergen_type) SSinternal_wiki.assemble_reaction_data(data, R) /datum/internal_wiki/page/food/get_print() var/body = "" body += "Description: [data["description"]]
" body += "
" body += print_allergens(data["allergen"]) body += "
" body += print_reaction_data(data) // DRINK REAGENTS //////////////////////////////////////////// /datum/internal_wiki/page/drink/assemble(var/datum/reagent/R) title = R.name data["title"] = title // Use beaker by default, otherwise try metamorphic glass for icon var/ico = 'icons/obj/drinks.dmi' if(R.glass_icon_file) ico = R.glass_icon_file var/sta = "glass_empty" if(R.glass_icon_state) sta = R.glass_icon_state SSinternal_wiki.add_icon(data, ico, sta, R.color) // Get internal data data["description"] = R.description data["flavor"] = R.taste_description data["allergen"] = SSinternal_wiki.assemble_allergens(R.allergen_type) SSinternal_wiki.assemble_reaction_data(data, R) /datum/internal_wiki/page/drink/get_print() var/body = "" body += "Description: [data["description"]]
" body += "Flavor: [data["flavor"]]
" body += "
" body += print_allergens(data["allergen"]) body += "
" body += print_reaction_data(data) return body // FOOD RECIPIE //////////////////////////////////////////// /datum/internal_wiki/page/recipe/assemble(var/list/recipe) title = recipe["Result"] data["title"] = title var/obj/item/path = recipe["ResultPath"] if(path) SSinternal_wiki.add_icon(data, initial(path.icon), initial(path.icon_state), "#ffffff") else var/obj/item/reagent_containers/glass/beaker/large/beaker_path = /obj/item/reagent_containers/glass/beaker/large SSinternal_wiki.add_icon(data, initial(beaker_path.icon), initial(beaker_path.icon_state), "#ffffff") // Get internal data data["description"] = recipe["Desc"] data["allergen"] = SSinternal_wiki.assemble_allergens(recipe["Allergens"]) var/list/recipe_data = list() var/value = recipe["Price"] ? recipe["Price"] : 0 recipe_data["supply_points"] = value value *= SSsupply.points_per_money // convert to cash value = FLOOR(value * 100,1) / 100 // Truncate decimals recipe_data["market_price"] = value recipe_data["appliance"] = recipe["Appliance"] recipe_data["has_coating"] = recipe["has_coatable_items"] recipe_data["coating"] = recipe["Coating"] if(!isnull(recipe_data["coating"]) && recipe_data["coating"] != -1) // Null is no coatings, -1 is any coating, otherwise specifies the name of coating var/datum/reagent/nutriment/coating/coatingtype = recipe["Coating"] recipe_data["coating"] = initial(coatingtype.name) var/list/ingred = list() for(var/ing in recipe["Ingredients"]) ingred["[ing]"] = recipe["Ingredients"][ing] recipe_data["ingredients"] = ingred.len ? ingred : null var/list/fruits = list() for(var/fru in recipe["Fruit"]) fruits["[fru]"] = recipe["Fruit"][fru] recipe_data["fruits"] = fruits.len ? fruits : null var/list/reagents = list() for(var/rea in recipe["Reagents"]) reagents["[rea]"] = recipe["Reagents"][rea] recipe_data["reagents"] = reagents.len ? reagents : null var/list/catalysts = list() for(var/cat in recipe["Catalysts"]) catalysts["[cat]"] = recipe["Catalysts"][cat] recipe_data["catalysts"] = catalysts.len ? catalysts : null data["recipe"] = recipe_data /datum/internal_wiki/page/recipe/get_print() var/body = "" if(data["description"]) body += "Description: [data["description"]]
" if(data["recipe"]["supply_points"] > 0) var/value = data["recipe"]["supply_points"] body += "Supply Points: [value]
" if(data["recipe"]["market_price"] > 0) var/value = data["recipe"]["market_price"] body += "Market Price: [value] [value > 1 ? "thalers" : "thaler"]
" body += print_allergens(data["allergen"]) body += "
" if(data["recipe"]["appliance"]) body += "Appliance: [data["recipe"]["appliance"]]

" // ingredients var/list/ingreds = data["recipe"]["ingredients"] if(ingreds && ingreds.len) var/count = 0 var/pretty_ing = "" for(var/ing in ingreds) pretty_ing += "[count == 0 ? "" : ", "][ing]x [ingreds[ing]]" count++ if(pretty_ing != "") body += "Ingredients: [pretty_ing]
" // Coatings if(!data["recipe"]["has_coating"]) body += "Coating: N/A, no coatable items
" else if(isnull(data["recipe"]["coating"])) body += "Coating: Must be uncoated
" else if(data["recipe"]["coating"] == -1) body += "Coating: Optionally, any coating
" else body += "Coating: [data["recipe"]["coating"]]
" // Fruits/Veggis var/list/fruits = data["recipe"]["fruits"] if(fruits && fruits.len) // Can't use lazylen, assoc list var/count = 0 var/pretty_fru = "" for(var/fru in fruits) pretty_fru += "[count == 0 ? "" : ", "][fru]x [fruits[fru]]" count++ if(pretty_fru != "") body += "Components: [pretty_fru]
" //For each reagent var/list/reags = data["recipe"]["reagents"] if(reags && reags.len) // Can't use lazylen, assoc list var/count = 0 var/pretty_rea = "" for(var/reg in reags) pretty_rea += "[count == 0 ? "" : ", "][reg] [reags[reg]]u" count++ if(pretty_rea != "") body += "Mix in: [pretty_rea]
" //For each catalyst var/list/catalis = data["recipe"]["catalysts"] if(catalis && catalis.len) // Can't use lazylen, assoc list var/count = 0 var/pretty_cat = "" for(var/cat in catalis) pretty_cat += "[count == 0 ? "" : ", "][cat] [catalis[cat]]u" count++ if(pretty_cat != "") body += "Catalysts: [pretty_cat]
" return body // CATALOG //////////////////////////////////////////// /datum/internal_wiki/page/catalog var/datum/category_item/catalogue/catalog_record = null /datum/internal_wiki/page/catalog/assemble() data["name"] = catalog_record.name data["desc"] = catalog_record.desc // VIRUSES ///////////////////////////////////////////// /datum/internal_wiki/page/virus/assemble(var/datum/disease/D) title = initial(D.name) data["title"] = title data["description"] = initial(D.desc) data["form"] = initial(D.form) data["agent"] = initial(D.agent) data["danger"] = initial(D.danger) data["max_stages"] = initial(D.max_stages) var/infectivity = "" switch(initial(D.infectivity)) if(0) infectivity = "NA" if(1 to 3) infectivity = "Low" if(4 to 7) infectivity = "Medium" if(8 to INFINITY) infectivity = "High" data["infectivity"] = infectivity var/resiliance = "" switch(initial(D.cure_chance)) if(0 to 8) resiliance = "Extreme" if(9 to 12) resiliance = "High" if(13 to 16) resiliance = "Medium" if(17 to INFINITY) resiliance = "Low" data["resiliance"] = resiliance var/discovery = "" switch(initial(D.discovery_threshold)) if(0 to 0.24) discovery = "Extremely Elusive" if(0.25 to 0.49) discovery = "Difficult" if(0.5 to 0.74) discovery = "Moderate" if(0.75 to 0.89) discovery = "Easy" if(0.9 to INFINITY) discovery = "Trivial" data["discovery"] = discovery var/spread_flags = initial(D.spread_flags) var/spread_type = "NA" if(spread_flags & DISEASE_SPREAD_CONTACT) spread_type = "Contact" else if(spread_flags & DISEASE_SPREAD_FLUIDS) spread_type = "Fluids" else if(spread_flags & DISEASE_SPREAD_BLOOD) spread_type = "Blood" else if(spread_flags & DISEASE_SPREAD_AIRBORNE) spread_type = "Airborne" else if(spread_flags & DISEASE_SPREAD_FALTERED) spread_type = "Faltered" data["spread"] = spread_type var/mod_flags = initial(D.virus_modifiers) data["all_cures"] = mod_flags & NEEDS_ALL_CURES data["aggressive"] = mod_flags & BYPASSES_IMMUNITY var/flags = initial(D.disease_flags) data["curable"] = flags & CURABLE data["resistable"] = flags & CAN_RESIST data["carriable"] = flags & CAN_CARRY data["spread_dead"] = flags & SPREAD_DEAD data["infect_synth"] = flags & INFECT_SYNTHETICS /datum/internal_wiki/page/virus/get_print() var/body = "" body += "Description: [data["description"]]
" body += "
" body += "Type: [data["form"]] - [data["agent"]]
" body += "Hazard Level: [data["danger"]]
" body += "Growth Stages: [data["max_stages"]]
" body += "Curable: [(data["curable"]) ? "Yes" : "No"][!(data["all_cures"]) ? " - single treatment" : ""]
" body += "Resistable: [(data["resistable"]) ? "Yes" : "No"]
" body += "
" // Transmission type body += "Transmission: [data["spread"]] [(data["aggressive"]) ? "Aggressive" : ""]
" if(data["carriable"]) body += "Transmissable without symptoms
" if(data["spread_dead"]) body += "Transmissable from dead tissue
" if(data["infect_synth"]) body += "Inorganic pathogen
" // Difficulty of discovery body += "Discoverability: [data["discovery"]]
" // Probability of spreading body += "Infectivity: [data["infectivity"]]
" // Probability of cure, 10 to 20 regularly body += "Resiliance: [data["resiliance"]]
" return body // GENES ///////////////////////////////////////////// /datum/internal_wiki/page/gene/assemble(var/datum/gene/G) if(istype(G,/datum/gene/trait)) // Trait genetics var/datum/gene/trait/T = G title = T.get_name() data["title"] = title data["description"] = T.get_desc() if(istype(T.linked_trait,/datum/trait/positive)) if(!T.linked_trait.hidden) data["trait_type"] = "Positive" else data["trait_type"] = "Super Power" // Likely eye lasers else if(istype(T.linked_trait,/datum/trait/negative)) if(!T.linked_trait.hidden) data["trait_type"] = "Negative" else data["trait_type"] = "Disability" // Likely gibbings or such else if(!T.linked_trait.hidden) data["trait_type"] = "Neutral" else data["trait_type"] = "Strange" // Not sure what neutrals are hidden, but just incase // Conflicts data["blockers"] = null var/list/output_blockers = list() var/list/blockers = T.conflict_traits for(var/path in blockers) var/datum/trait/TG = GLOB.all_traits[path] output_blockers.Add(TG.name) if(output_blockers.len) data["blockers"] = output_blockers else // Old style gene title = G.name data["title"] = title data["description"] = G.desc data["trait_type"] = "Neutral" data["blockers"] = null var/list/bounds = GetDNABounds(G.block) data["bounds_off_min"] = EncodeDNABlock(bounds[1]) // Minimum hex where gene is off data["bounds_off_max"] = EncodeDNABlock(bounds[2]) // Maximum hex where gene is off data["bounds_on_min"] = EncodeDNABlock(bounds[3]) // Minimum hex where gene is on data["bounds_on_max"] = EncodeDNABlock(bounds[4]) // Maximum hex where gene is on /datum/internal_wiki/page/gene/get_print() var/body = "" body += "Description: [data["description"]]
" body += "
" body += "Type: [data["trait_type"]]
" body += "Active Range: [data["bounds_on_min"]] - [data["bounds_on_max"]]
" body += "Inactive Range: [data["bounds_off_min"]] - [data["bounds_off_max"]]
" body += "
" var/list/blockers = data["blockers"] if(blockers) body += "Suppressed By:
" for(var/trait_name in blockers) body += "-[trait_name]
" return body // MISC HELPERS //////////////////////////////////////////// /datum/internal_wiki/page/proc/print_allergens(var/list/allergens) PROTECTED_PROC(TRUE) var/AG = "" if(allergens && allergens.len > 0) AG += "Allergens:
" for(var/ALGY in allergens) AG += "-[ALGY]
" AG += "
" return AG /datum/internal_wiki/page/proc/print_reaction_data(var/list/data) var/body = "" var/list/instant = data["instant_reactions"] if(instant && instant.len > 0) var/segment = 1 for(var/list/react in instant) if(instant.len == 1) body += "Potential Chemical breakdown:
" else body += "Potential Chemical breakdown [segment]:
" segment++ if(react["is_slime"]) for(var/RQ in react["required"]) body += " -[react["is_slime"]] Injection: [RQ]
" else for(var/RQ in react["required"]) body += " -Component: [RQ]
" for(var/IH in react["inhibitor"]) body += " -Inhibitor: [IH]
" for(var/CL in react["catalysts"]) body += " -Catalyst: [CL]
" else body += "Potential Chemical breakdown:
UNKNOWN OR BASE-REAGENT
" var/list/distilled = data["distilled_reactions"] if(distilled && distilled.len > 0) var/segment = 1 for(var/list/react in distilled) if(distilled.len == 1) body += "Potential Chemical breakdown:
" else body += "Potential Chemical breakdown [segment]:
" segment++ body += " -Temperature: [react["xgm_min"]]K - [react["xgm_max"]]K | ([react["xgm_min"] - T0C]C - [react["xgm_max"] - T0C]C)
" if(react["require_xgm_gas"]) body += " -Requires Gas: [react["require_xgm_gas"]]
" if(react["rejects_xgm_gas"]) body += " -Rejects Gas: [react["rejects_xgm_gas"]]
" for(var/RQ in react["required"]) body += " -Component: [RQ]
" for(var/IH in react["inhibitor"]) body += " -Inhibitor: [IH]
" for(var/CL in react["catalysts"]) body += " -Catalyst: [CL]
" var/list/grind_ore = data["grinding"]["ore"] if(grind_ore && grind_ore.len) body += "
" body += "Ore processing results:
" for(var/PL in grind_ore) body += " -Grind: [PL]
" var/list/grind_mats = data["grinding"]["material"] if(grind_mats && grind_mats.len) body += "
" body += "Material processing results:
" for(var/PL in grind_mats) body += " -Grind: [PL]
" var/list/grind_plants = data["grinding"]["plant"] if(grind_plants && grind_plants.len) body += "
" body += "Organic processing results:
" for(var/PL in grind_plants) body += " -Grind: [PL]
" var/list/fluid_pumping = data["fluid"] if(fluid_pumping && fluid_pumping.len) body += "
" body += "Fluid pump results:
" for(var/PL in fluid_pumping) body += " -Erosion: [PL]
" body += "
" var/list/produces = data["produces"] if(produces && produces.len) body += "Is a component of:
" for(var/PL in produces) body += "-[PL]
" return body