diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm index c054b9a4bf1f..c6957eefd22c 100644 --- a/code/_globalvars/global_lists.dm +++ b/code/_globalvars/global_lists.dm @@ -119,6 +119,34 @@ GLOBAL_LIST(chemical_reactions_filtered_list) //List of all /datum/chemical_reac GLOBAL_LIST(chemical_reactions_list) //List of all /datum/chemical_reaction datums indexed by reaction id. Used to search for the result instead of the components. GLOBAL_LIST(chemical_reagents_list) //List of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff GLOBAL_LIST(chemical_properties_list) //List of all /datum/chem_property datums indexed by property name +//list of all properties that conflict with each other. +GLOBAL_LIST_INIT_TYPED(conflicting_properties, /list, list( PROPERTY_NUTRITIOUS = PROPERTY_HEMORRAGING, PROPERTY_NUTRITIOUS = PROPERTY_HEMOLYTIC, PROPERTY_TOXIC = PROPERTY_ANTITOXIC,\ + PROPERTY_CORROSIVE = PROPERTY_ANTICORROSIVE, PROPERTY_BIOCIDIC = PROPERTY_NEOGENETIC, PROPERTY_HYPERTHERMIC = PROPERTY_HYPOTHERMIC,\ + PROPERTY_NUTRITIOUS = PROPERTY_KETOGENIC, PROPERTY_PAINING = PROPERTY_PAINKILLING, PROPERTY_HALLUCINOGENIC = PROPERTY_ANTIHALLUCINOGENIC,\ + PROPERTY_HEPATOTOXIC = PROPERTY_HEPATOPEUTIC, PROPERTY_NEPHROTOXIC = PROPERTY_NEPHROPEUTIC, PROPERTY_PNEUMOTOXIC = PROPERTY_PNEUMOPEUTIC,\ + PROPERTY_OCULOTOXIC = PROPERTY_OCULOPEUTIC, PROPERTY_CARDIOTOXIC = PROPERTY_CARDIOPEUTIC, PROPERTY_NEUROTOXIC = PROPERTY_NEUROPEUTIC,\ + PROPERTY_FLUXING = PROPERTY_REPAIRING, PROPERTY_RELAXING = PROPERTY_MUSCLESTIMULATING, PROPERTY_HEMOGENIC = PROPERTY_HEMOLYTIC,\ + PROPERTY_HEMOGENIC = PROPERTY_HEMORRAGING, PROPERTY_NUTRITIOUS = PROPERTY_EMETIC,\ + PROPERTY_HYPERGENETIC = PROPERTY_NEOGENETIC, PROPERTY_HYPERGENETIC = PROPERTY_HEPATOPEUTIC, PROPERTY_HYPERGENETIC = PROPERTY_NEPHROPEUTIC,\ + PROPERTY_HYPERGENETIC = PROPERTY_PNEUMOPEUTIC, PROPERTY_HYPERGENETIC = PROPERTY_OCULOPEUTIC, PROPERTY_HYPERGENETIC = PROPERTY_CARDIOPEUTIC,\ + PROPERTY_HYPERGENETIC = PROPERTY_NEUROPEUTIC, PROPERTY_ADDICTIVE = PROPERTY_ANTIADDICTIVE, PROPERTY_NEUROSHIELDING = PROPERTY_NEUROTOXIC,\ + PROPERTY_HYPOMETABOLIC = PROPERTY_HYPERMETABOLIC, PROPERTY_HYPERTHROTTLING = PROPERTY_NEUROINHIBITING, + PROPERTY_FOCUSING = PROPERTY_NERVESTIMULATING, PROPERTY_THERMOSTABILIZING = PROPERTY_HYPERTHERMIC, PROPERTY_THERMOSTABILIZING = PROPERTY_HYPOTHERMIC, + PROPERTY_AIDING = PROPERTY_NEUROINHIBITING, PROPERTY_OXYGENATING = PROPERTY_HYPOXEMIC, PROPERTY_ANTICARCINOGENIC = PROPERTY_CARCINOGENIC, \ + PROPERTY_CIPHERING = PROPERTY_CIPHERING_PREDATOR, PROPERTY_TRANSFORMATIVE = PROPERTY_ANTITOXIC, PROPERTY_MUSCLESTIMULATING = PROPERTY_NERVESTIMULATING)) +//list of all properties that combine into something else, now featured in global list +GLOBAL_LIST_INIT_TYPED(combining_properties, /list, list( PROPERTY_DEFIBRILLATING = list(PROPERTY_MUSCLESTIMULATING, PROPERTY_CARDIOPEUTIC),\ + PROPERTY_THANATOMETABOL = list(PROPERTY_HYPOXEMIC, PROPERTY_CRYOMETABOLIZING, PROPERTY_NEUROCRYOGENIC),\ + PROPERTY_HYPERDENSIFICATING = list(PROPERTY_MUSCLESTIMULATING, PROPERTY_BONEMENDING, PROPERTY_CARCINOGENIC),\ + PROPERTY_HYPERTHROTTLING = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_HALLUCINOGENIC),\ + PROPERTY_NEUROSHIELDING = list(PROPERTY_ALCOHOLIC, PROPERTY_BALDING),\ + PROPERTY_ANTIADDICTIVE = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_ANTIHALLUCINOGENIC),\ + PROPERTY_ADDICTIVE = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_NEUROTOXIC),\ + PROPERTY_CIPHERING_PREDATOR = list(PROPERTY_CIPHERING, PROPERTY_CROSSMETABOLIZING),\ + PROPERTY_FIRE_PENETRATING = list(PROPERTY_OXYGENATING, PROPERTY_VISCOUS),\ + PROPERTY_BONEMENDING = list(PROPERTY_HYPERDENSIFICATING, PROPERTY_NUTRITIOUS),\ + PROPERTY_BONEMENDING = list(PROPERTY_HYPERDENSIFICATING, PROPERTY_NUTRITIOUS),\ + PROPERTY_ENCEPHALOPHRASIVE = list(PROPERTY_NERVESTIMULATING, PROPERTY_PSYCHOSTIMULATING))) //List of all id's from classed /datum/reagent datums indexed by class or tier. Used by chemistry generator and chem spawners. GLOBAL_LIST_INIT_TYPED(chemical_gen_classes_list, /list, list("C" = list(),"C1" = list(),"C2" = list(),"C3" = list(),"C4" = list(),"C5" = list(),"C6" = list(),"T1" = list(),"T2" = list(),"T3" = list(),"T4" = list(),"tau", list())) //properties generated in chemicals, helps to make sure the same property doesn't show up 10 times diff --git a/code/modules/reagents/Chemistry-Generator.dm b/code/modules/reagents/Chemistry-Generator.dm index 79efe2ef4453..813e0d9686bd 100644 --- a/code/modules/reagents/Chemistry-Generator.dm +++ b/code/modules/reagents/Chemistry-Generator.dm @@ -319,33 +319,6 @@ //*****************************************************************************************************/ /datum/reagent/proc/insert_property(property, level) - //The list below defines what properties should override each other. - var/list/conflicting_properties = list( PROPERTY_NUTRITIOUS = PROPERTY_HEMORRAGING, PROPERTY_NUTRITIOUS = PROPERTY_HEMOLYTIC, PROPERTY_TOXIC = PROPERTY_ANTITOXIC,\ - PROPERTY_CORROSIVE = PROPERTY_ANTICORROSIVE, PROPERTY_BIOCIDIC = PROPERTY_NEOGENETIC, PROPERTY_HYPERTHERMIC = PROPERTY_HYPOTHERMIC,\ - PROPERTY_NUTRITIOUS = PROPERTY_KETOGENIC, PROPERTY_PAINING = PROPERTY_PAINKILLING, PROPERTY_HALLUCINOGENIC = PROPERTY_ANTIHALLUCINOGENIC,\ - PROPERTY_HEPATOTOXIC = PROPERTY_HEPATOPEUTIC, PROPERTY_NEPHROTOXIC = PROPERTY_NEPHROPEUTIC, PROPERTY_PNEUMOTOXIC = PROPERTY_PNEUMOPEUTIC,\ - PROPERTY_OCULOTOXIC = PROPERTY_OCULOPEUTIC, PROPERTY_CARDIOTOXIC = PROPERTY_CARDIOPEUTIC, PROPERTY_NEUROTOXIC = PROPERTY_NEUROPEUTIC,\ - PROPERTY_FLUXING = PROPERTY_REPAIRING, PROPERTY_RELAXING = PROPERTY_MUSCLESTIMULATING, PROPERTY_HEMOGENIC = PROPERTY_HEMOLYTIC,\ - PROPERTY_HEMOGENIC = PROPERTY_HEMORRAGING, PROPERTY_NUTRITIOUS = PROPERTY_EMETIC,\ - PROPERTY_HYPERGENETIC = PROPERTY_NEOGENETIC, PROPERTY_HYPERGENETIC = PROPERTY_HEPATOPEUTIC, PROPERTY_HYPERGENETIC = PROPERTY_NEPHROPEUTIC,\ - PROPERTY_HYPERGENETIC = PROPERTY_PNEUMOPEUTIC, PROPERTY_HYPERGENETIC = PROPERTY_OCULOPEUTIC, PROPERTY_HYPERGENETIC = PROPERTY_CARDIOPEUTIC,\ - PROPERTY_HYPERGENETIC = PROPERTY_NEUROPEUTIC, PROPERTY_ADDICTIVE = PROPERTY_ANTIADDICTIVE, PROPERTY_NEUROSHIELDING = PROPERTY_NEUROTOXIC,\ - PROPERTY_HYPOMETABOLIC = PROPERTY_HYPERMETABOLIC, PROPERTY_HYPERTHROTTLING = PROPERTY_NEUROINHIBITING, - PROPERTY_FOCUSING = PROPERTY_NERVESTIMULATING, PROPERTY_THERMOSTABILIZING = PROPERTY_HYPERTHERMIC, PROPERTY_THERMOSTABILIZING = PROPERTY_HYPOTHERMIC, - PROPERTY_AIDING = PROPERTY_NEUROINHIBITING, PROPERTY_OXYGENATING = PROPERTY_HYPOXEMIC, PROPERTY_ANTICARCINOGENIC = PROPERTY_CARCINOGENIC, \ - PROPERTY_CIPHERING = PROPERTY_CIPHERING_PREDATOR, PROPERTY_TRANSFORMATIVE = PROPERTY_ANTITOXIC, PROPERTY_MUSCLESTIMULATING = PROPERTY_NERVESTIMULATING) - //The list below defines which properties should be combined into a combo property - var/list/combining_properties = list( PROPERTY_DEFIBRILLATING = list(PROPERTY_MUSCLESTIMULATING, PROPERTY_CARDIOPEUTIC),\ - PROPERTY_THANATOMETABOL = list(PROPERTY_HYPOXEMIC, PROPERTY_CRYOMETABOLIZING, PROPERTY_NEUROCRYOGENIC),\ - PROPERTY_HYPERDENSIFICATING = list(PROPERTY_MUSCLESTIMULATING, PROPERTY_BONEMENDING, PROPERTY_CARCINOGENIC),\ - PROPERTY_HYPERTHROTTLING = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_HALLUCINOGENIC),\ - PROPERTY_NEUROSHIELDING = list(PROPERTY_ALCOHOLIC, PROPERTY_BALDING),\ - PROPERTY_ANTIADDICTIVE = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_ANTIHALLUCINOGENIC),\ - PROPERTY_ADDICTIVE = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_NEUROTOXIC),\ - PROPERTY_CIPHERING_PREDATOR = list(PROPERTY_CIPHERING, PROPERTY_CROSSMETABOLIZING),\ - PROPERTY_FIRE_PENETRATING = list(PROPERTY_OXYGENATING, PROPERTY_VISCOUS),\ - PROPERTY_BONEMENDING = list(PROPERTY_HYPERDENSIFICATING, PROPERTY_NUTRITIOUS),\ - PROPERTY_ENCEPHALOPHRASIVE = list(PROPERTY_NERVESTIMULATING, PROPERTY_PSYCHOSTIMULATING)) var/datum/chem_property/match var/datum/chem_property/initial_property for(var/datum/chem_property/P in properties) @@ -353,8 +326,8 @@ match = P else //Handle properties that combine - for(var/C in combining_properties) - var/list/combo = combining_properties[C] + for(var/C in GLOB.combining_properties) + var/list/combo = GLOB.combining_properties[C] if(!combo.Find(property) || !combo.Find(P.name)) continue var/pieces = 0 @@ -372,11 +345,11 @@ LAZYREMOVE(properties, R) break //Handle properties that conflict - for(var/C in conflicting_properties) - if(property == C && P.name == conflicting_properties[C]) + for(var/C in GLOB.conflicting_properties) + if(property == C && P.name == GLOB.conflicting_properties[C]) match = P break - else if (property == conflicting_properties[C] && C == P.name) + else if (property == GLOB.conflicting_properties[C] && C == P.name) match = P break if(match) diff --git a/code/modules/reagents/chemical_research/Chemical-Research.dm b/code/modules/reagents/chemical_research/Chemical-Research.dm index 2050e7e8e607..a05bc132734d 100644 --- a/code/modules/reagents/chemical_research/Chemical-Research.dm +++ b/code/modules/reagents/chemical_research/Chemical-Research.dm @@ -87,8 +87,8 @@ GLOBAL_DATUM_INIT(chemical_data, /datum/chemical_data, new) if(P.category & PROPERTY_TYPE_UNADJUSTABLE || P.category & PROPERTY_TYPE_ANOMALOUS) continue property_names += P.name - for(var/name in research_property_data) - property_names -= name + for(var/datum/chem_property/property in research_property_data) + property_names -= property.name if(LAZYLEN(property_names)) has_new_properties = TRUE for(var/name in property_names) diff --git a/code/modules/reagents/chemistry_machinery/chem_simulator.dm b/code/modules/reagents/chemistry_machinery/chem_simulator.dm index 650b6cefbae9..13e051f5dc20 100644 --- a/code/modules/reagents/chemistry_machinery/chem_simulator.dm +++ b/code/modules/reagents/chemistry_machinery/chem_simulator.dm @@ -1,3 +1,4 @@ +//mode datums at the bottom. #define MODE_AMPLIFY 1 #define MODE_SUPPRESS 2 #define MODE_RELATE 3 @@ -40,7 +41,6 @@ var/ready = FALSE var/template_filter = PROPERTY_TYPE_ALL - var/complexity_editor = FALSE var/creation_template var/creation_complexity = list(CHEM_CLASS_COMMON, CHEM_CLASS_UNCOMMON, CHEM_CLASS_RARE) var/creation_name = "" @@ -62,29 +62,29 @@ ..() if(inoperable()) icon_state = "modifier_off" - SSnano.nanomanager.update_uis(src) // update all UIs attached to src /obj/structure/machinery/chem_simulator/attackby(obj/item/B, mob/living/user) if(!skillcheck(user, SKILL_RESEARCH, SKILL_RESEARCH_TRAINED)) to_chat(user, SPAN_WARNING("You have no idea how to use this.")) return if(istype(B, /obj/item/paper/research_notes)) - var/obj/item/paper/research_notes/N = B + var/obj/item/paper/research_notes/note = B if(!target || (mode == MODE_RELATE && !reference)) - B = N.convert_to_chem_report() + B = note.convert_to_chem_report() else to_chat(user, SPAN_WARNING("Chemical data already inserted.")) return if(istype(B, /obj/item/paper/research_report)) - if(!target) + var/obj/item/paper/research_report/note = B + if(!target && note.data) target = B ready = check_ready() - else if(mode == MODE_RELATE && !reference) - target_property = "" + else if(mode == MODE_RELATE && !reference && note.data) + target_property = null reference = B ready = check_ready() else - to_chat(user, SPAN_WARNING("Chemical data already inserted.")) + to_chat(user, SPAN_WARNING("Chemical data [note.data ? "is already inserted" : "is refused"]")) return else to_chat(user, SPAN_WARNING("[src] refuses [B].")) @@ -93,7 +93,6 @@ to_chat(user, SPAN_NOTICE("You insert [B] into [src].")) flick("[icon_state]_reading",src) update_costs() - SSnano.nanomanager.update_uis(src) // update all UIs attached to src /obj/structure/machinery/chem_simulator/attack_hand(mob/user as mob) if(inoperable()) @@ -101,256 +100,279 @@ if(!skillcheck(user, SKILL_RESEARCH, SKILL_RESEARCH_TRAINED)) to_chat(user, SPAN_WARNING("You have no idea how to use this.")) return - ui_interact(user) - -/obj/structure/machinery/chem_simulator/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - var/list/data = list( - "rsc_credits" = GLOB.chemical_data.rsc_credits, - "target" = target, - "reference" = reference, - "mode" = mode, - "complexity_editor" = complexity_editor, - "property_costs" = property_costs, - "simulating" = simulating, - "status_bar" = status_bar, - "ready" = ready, - "od_lvl" = new_od_level, - "recipe_target" = recipe_target, - "recipe_targets" = list(), - "property_codings" = list() - ) - - if(simulating == SIMULATION_STAGE_FINAL) - for(var/reagent_id in recipe_targets) - var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_id] - var/list/id_name[0] - id_name["[R.id]"] = R.name - data["recipe_targets"] += id_name + tgui_interact(user) - if(mode == MODE_CREATE) - data["creation_name"] = creation_name - data["creation_cost"] = creation_cost - data["complexity"] = complexity_to_string_list() - - //List of all available properties - data["property_data_list"] = list() - for(var/datum/chem_property/P in GLOB.chemical_data.research_property_data) - data["property_codings"][P.name] = P.code - if(template_filter && !HAS_FLAG(P.category, template_filter)) - continue - data["property_data_list"][P.name] = P.level - data["property_data_list"] = sortAssoc(data["property_data_list"]) - //List of enabled properties - data["target_property_list"] = list() - for(var/datum/chem_property/P in creation_template) - data["target_property_list"][P.name] = P.level - if(template_filter && !HAS_FLAG(P.category, template_filter)) - continue - //Override the editor level with the enabled property level - data["property_data_list"][P.name] = P.level - - data["template_filter"] = list( - "MED" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_MEDICINE), PROPERTY_TYPE_MEDICINE), - "TOX" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_TOXICANT), PROPERTY_TYPE_TOXICANT), - "STI" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_STIMULANT), PROPERTY_TYPE_STIMULANT), - "REA" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_REACTANT), PROPERTY_TYPE_REACTANT), - "IRR" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_IRRITANT), PROPERTY_TYPE_IRRITANT), - "MET" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_METABOLITE), PROPERTY_TYPE_METABOLITE) - ) - - else if(target && target.data && target.completed) - data["target_property_list"] = target.data.properties_to_assoc() - for(var/datum/chem_property/P in target.data.properties) - data["property_codings"][P.name] = P.code - - if(reference && reference.data && reference.completed) - data["reference_property_list"] = reference.data.properties_to_assoc() - for(var/datum/chem_property/P in reference.data.properties) - data["property_codings"][P.name] = P.code - - if(target_property) - data["target_property"] = target_property.name - data["target_info"] = target_property.description - data["target_categories"] = target_property.categories_to_string() - else - data["target_info"] = "" - - if(reference_property) - data["reference_property"] = reference_property.name - data["reference_info"] = reference_property.description - data["reference_categories"] = reference_property.categories_to_string() - else - data["reference_info"] = "" - - ui = SSnano.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) +/obj/structure/machinery/chem_simulator/tgui_interact(mob/user, datum/tgui/ui) //death to the chem simulator! All Hail the new chem simulator! + ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, ui_key, "chem_simulator.tmpl", "Synthesis Simulator", 800, 550) - ui.set_initial_data(data) + ui = new(user, src, "ChemSimulator", "Chemical Simulator") ui.open() -/obj/structure/machinery/chem_simulator/Topic(href, href_list) +/obj/structure/machinery/chem_simulator/ui_data(mob/user) . = ..() - if(.) - return - if(inoperable() || !ishuman(usr)) - return - var/mob/living/carbon/human/user = usr - if(user.stat || user.is_mob_restrained() || !in_range(src, user)) - return + var/list/data = list() + data["status"] = status_bar + ready = check_ready() + data["is_ready"] = ready + data["can_simulate"] = (ready && simulating == SIMULATION_STAGE_OFF) + data["can_eject_target"] = ((target ? TRUE : FALSE) && simulating == SIMULATION_STAGE_OFF) + data["can_eject_reference"] = ((reference ? TRUE : FALSE) && simulating == SIMULATION_STAGE_OFF) + data["is_picking_recipe"] = (simulating == SIMULATION_STAGE_FINAL && mode != MODE_CREATE) + data["lock_control"] = (simulating != SIMULATION_STAGE_OFF) + data["can_cancel_simulation"] = (simulating <= SIMULATION_STAGE_WAIT) + data["estimated_cost"] = (mode == MODE_CREATE ? creation_cost : (!target_property ? "NULL" : property_costs[target_property.name])) + calculate_new_od_level() + data["od_level"] = new_od_level + data["chemical_name"] = (mode == MODE_CREATE ? (creation_name == "" ? "NAME NOT SET" : creation_name) : (isnull(target) ? "CHEMICAL DATA NOT INSERTED" : target.data.name)) + data["reference_name"] = (isnull(reference) ? "CHEMICAL DATA NOT INSERTED" : reference.data.name) if(mode == MODE_CREATE && GLOB.chemical_data.has_new_properties) update_costs() - if(href_list["simulate"] && ready) - simulating = SIMULATION_STAGE_BEGIN - status_bar = "COMMENCING SIMULATION" - icon_state = "modifier_running" - recipe_targets = list() //reset - start_processing() - if(mode == MODE_CREATE) - msg_admin_niche("[key_name(user)] has created the chemical: [creation_name]") - else if(href_list["ejectT"]) - if(target) - if(!user.put_in_active_hand(target)) - target.forceMove(loc) - target = null - target_property = null - stop_processing() - simulating = SIMULATION_STAGE_OFF - flick("[icon_state]_printing",src) - else if(href_list["ejectR"]) - if(reference) - if(!user.put_in_active_hand(reference)) - reference.forceMove(loc) - reference = null - reference_property = null - stop_processing() - simulating = SIMULATION_STAGE_OFF - flick("[icon_state]_printing",src) - else if(href_list["set_mode"]) - if(mode == MODE_CREATE) //for when you set the mode away from MODE_CREATE - target_property = null - reference_property = null - complexity_editor = FALSE - switch(href_list["set_mode"]) - if("amp") - mode = MODE_AMPLIFY - if("sup") - mode = MODE_SUPPRESS - if("rel") - mode = MODE_RELATE - if("cre") - mode = MODE_CREATE - target_property = null - reference_property = null - calculate_new_od_level() - if(mode == MODE_CREATE) - calculate_creation_cost() - update_costs() - else if(href_list["set_target"]) - if(simulating) - return - if(mode == MODE_CREATE) - var/target_name = href_list["set_target"] - for(var/datum/chem_property/P in GLOB.chemical_data.research_property_data) - if(P.name == target_name) - if(target_property && target_property.name == target_name) - //Toggle the property - if(LAZYISIN(creation_template, target_property)) - target_property.level = 0 - LAZYREMOVE(creation_template, target_property) - else - target_property.level = 1 - LAZYADD(creation_template, target_property) - calculate_creation_cost() - else - target_property = P + if(simulating == SIMULATION_STAGE_FINAL) + for(var/reagent_id in recipe_targets) + var/datum/reagent/recipe_option = GLOB.chemical_reagents_list[reagent_id] + data["reagent_option_data"] += list(list( + "id" = recipe_option.id, + "name" = recipe_option.name, + )) + if(target && length(target?.data?.properties)) + for(var/datum/chem_property/target_property_data in target.data.properties) + var/is_locked = FALSE + var/conflicting_tooltip = null + if(!isnull(reference_property)) + if(LAZYACCESS(GLOB.conflicting_properties, reference_property.name) == target_property_data.name || LAZYACCESS(GLOB.conflicting_properties, target_property_data.name) == reference_property.name ) + is_locked = TRUE + conflicting_tooltip = "This property conflicts with the selected reference property!" + data["target_data"] += list(list( + "code" = target_property_data.code, + "level" = target_property_data.level, + "name" = target_property_data.name, + "desc" = target_property_data.description, + "cost" = property_costs[target_property_data.name], + "is_locked" = is_locked, + "tooltip" = conflicting_tooltip, + )) + else + data["target_data"] = null + + if(reference && length(reference?.data?.properties)) + for(var/datum/chem_property/reference_property_data in reference.data.properties) + var/is_locked = FALSE + var/conflicting_tooltip = null + if(!isnull(target_property)) + if(LAZYACCESS(GLOB.conflicting_properties, target_property.name) == reference_property_data.name || LAZYACCESS(GLOB.conflicting_properties, reference_property_data.name) == target_property.name ) + is_locked = TRUE + conflicting_tooltip = "This property conflicts with the selected target property!" + data["reference_data"] += list(list( + "code" = reference_property_data.code, + "level" = reference_property_data.level, + "name" = capitalize_first_letters(reference_property_data.name), + "desc" = reference_property_data.description, + "cost" = property_costs[reference_property_data.name], + "is_locked" = is_locked, + "tooltip" = conflicting_tooltip, + )) + else + data["reference_data"] = null + data["template_filters"] = list( + "MED" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_MEDICINE), PROPERTY_TYPE_MEDICINE), + "TOX" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_TOXICANT), PROPERTY_TYPE_TOXICANT), + "STI" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_STIMULANT), PROPERTY_TYPE_STIMULANT), + "REA" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_REACTANT), PROPERTY_TYPE_REACTANT), + "IRR" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_IRRITANT), PROPERTY_TYPE_IRRITANT), + "MET" = list(HAS_FLAG(template_filter, PROPERTY_TYPE_METABOLITE), PROPERTY_TYPE_METABOLITE) + ) + if(mode == MODE_CREATE) + for(var/datum/chem_property/known_properties in GLOB.chemical_data.research_property_data) + var/datum/chem_property/template_property + var/is_locked = FALSE + var/conflicting_tooltip = null + if(template_filter && !HAS_FLAG(known_properties.category, template_filter)) + continue + for(var/template in creation_template) + template_property = template + if(LAZYACCESS(GLOB.conflicting_properties, template_property.name) == known_properties.name || LAZYACCESS(GLOB.conflicting_properties, known_properties.name) == template_property.name) + is_locked = TRUE + conflicting_tooltip = "This property conflicts with [template_property.code]!" + if(template_property.code == known_properties.code) break - else - target_property = target.data.get_property(href_list["set_target"]) - calculate_new_od_level() - if(simulating) + template_property = null + + data["known_properties"] += list(list( + "code" = known_properties.code, + "level" = (isnull(template_property) ? 0 : template_property.level) , + "name" = capitalize_first_letters(known_properties.name), + "desc" = known_properties.description, + "is_enabled" = LAZYISIN(creation_template, known_properties), + "is_locked" = is_locked, + "conflicting_tooltip" = conflicting_tooltip, + )) + if(!length(data["known_properties"])) + data["known_properties"] = null + data["complexity_list"] += complexity_to_string_list() + + return data + +/obj/structure/machinery/chem_simulator/ui_static_data(mob/user) + . = ..() + var/list/static_data = list() + for(var/modes in subtypesof(/datum/chemical_simulator_modes)) + var/datum/chemical_simulator_modes/modes_datum = modes + static_data["mode_data"] += list(list( + "name" = modes_datum.name, + "desc" = modes_datum.desc, + "mode_id" = modes_datum.mode_id, + "icon_type" = modes_datum.icon_type + )) + static_data["credits"] = GLOB.chemical_data.rsc_credits + return static_data + +/obj/structure/machinery/chem_simulator/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + switch(action) + if("change_mode") + mode = params["mode_id"] + update_costs() + if("eject_target") + if(target) + if(!usr.put_in_active_hand(target)) + target.forceMove(loc) + target = null + target_property = null stop_processing() - icon_state = "modifier" simulating = SIMULATION_STAGE_OFF - else if(href_list["set_reference"]) - reference_property = reference.data.get_property(href_list["set_reference"]) - if(simulating) + flick("[icon_state]_printing",src) + if("eject_reference") + if(reference) + if(!usr.put_in_active_hand(reference)) + reference.forceMove(loc) + reference = null + reference_property = null + stop_processing() + flick("[icon_state]_printing",src) + if("select_target_property") + if(mode != MODE_CREATE) + if(!target) + return + for(var/datum/chem_property/target_prop in target.data.properties) + if(target_prop.code != params["property_code"]) + continue + target_property = target_prop + if(!target_property) + to_chat(usr, SPAN_WARNING("The [src] makes a suspicious wail.")) + return + if("select_reference_property") + if(!reference) + return + for(var/datum/chem_property/reference_prop in reference.data.properties) + if(reference_prop.code != params["property_code"]) + continue + reference_property = reference_prop + if(!reference_property) + to_chat(usr, SPAN_WARNING("The [src] makes a suspicious wail.")) + return + if("simulate") + if(!ready) + return + simulating = SIMULATION_STAGE_BEGIN + status_bar = "COMMENCING SIMULATION" + icon_state = "modifier_running" + recipe_targets = list() //reset + start_processing() + if(mode == MODE_CREATE) + msg_admin_niche("[key_name(usr)] has created the chemical: [creation_name]") + if("submit_recipe_pick") + if(recipe_target) + return + if(params["reagent_picked"] in recipe_targets) + recipe_target = params["reagent_picked"] + finalize_simulation(chem_cache) + recipe_target = null + if("cancel_simulation") stop_processing() icon_state = "modifier" simulating = SIMULATION_STAGE_OFF - update_costs() - else if(href_list["set_recipe_target"]) - recipe_target = href_list["set_recipe_target"] - else if(href_list["stop_simulation"]) - stop_processing() - icon_state = "modifier" - simulating = SIMULATION_STAGE_OFF - else if(href_list["finalize_simulation"] && recipe_target) - finalize_simulation(chem_cache) - //Template creation editor - else if(href_list["set_name"]) - var/newname = input("Set name for template (2-20 characters)","[src]") as text - newname = reject_bad_name(newname, TRUE, 20, FALSE) - if(isnull(newname)) - to_chat(user, "Bad name.") - else if(GLOB.chemical_reagents_list[newname]) - to_chat(user, "Name already taken.") - else - creation_name = newname - else if(href_list["set_level"] && target_property) - var/level_to_set = 1 - if(GLOB.chemical_data.clearance_level <= 2) - level_to_set = tgui_input_list(usr, "Set target level for [target_property.name]:","[src]", list(1,2,3,4)) - else if(GLOB.chemical_data.clearance_level <= 4) - level_to_set = tgui_input_list(usr, "Set target level for [target_property.name]:","[src]", list(1,2,3,4,5,6,7,8)) - else - level_to_set = tgui_input_list(usr, "Set target level for [target_property.name]:","[src]", list(1,2,3,4,5,6,7,8,9,10)) - if(!level_to_set) - return - - target_property.level = level_to_set - if(target_property.max_level && target_property.level > target_property.max_level) - target_property.level = target_property.max_level - to_chat(user, "Max level for [target_property.name] is [target_property.max_level].") - calculate_creation_cost() - else if(href_list["set_od"]) - var/od_to_set = tgui_input_list(usr, "Set new OD:", "[src]", list(5,10,15,20,25,30,35,40,45,50,55,60)) - if(!od_to_set) - return - new_od_level = od_to_set - creation_od_level = od_to_set - calculate_creation_cost() - else if(href_list["set_filter"]) - if(href_list["set_filter"] == "ALL") - template_filter = 0 - else - var/flag_value = text2num(href_list["config_value"]) + if("toggle_flag") + var/flag_value = params["flag_id"] if(template_filter & flag_value) template_filter &= ~flag_value else template_filter |= flag_value - else if(href_list["toggle_complexity_editor"]) - complexity_editor = !complexity_editor - else if(href_list["set_complexity"]) - var/slot = text2num(href_list["set_complexity"]) - var/new_rarity = tgui_input_list(usr, "Set chemical rarity for complexity slot [slot]:","[src]", list("BASIC (+7)","COMMON (+4)","UNCOMMON (1)","RARE (-5)")) - if(!new_rarity) + if("select_create_property") + if(mode == MODE_CREATE) + if(target_property?.code == params["property_code"]) + if(LAZYISIN(creation_template, target_property)) + target_property.level = 0 + LAZYREMOVE(creation_template, target_property) + else + target_property.level = 1 + LAZYADD(creation_template, target_property) + else + for(var/datum/chem_property/known_prop in GLOB.chemical_data.research_property_data) + if(known_prop.code != params["property_code"]) + continue + target_property = known_prop + if(!target_property) + to_chat(usr, SPAN_WARNING("The [src] makes a suspicious wail.")) + return + calculate_creation_cost() + if("select_overdose") + if(simulating == SIMULATION_STAGE_OFF && mode == MODE_CREATE) + var/od_to_set = tgui_input_list(usr, "Set new OD:", "[src]", list(5,10,15,20,25,30,35,40,45,50,55,60)) + if(!od_to_set || simulating != SIMULATION_STAGE_OFF) + return + creation_od_level = od_to_set + calculate_new_od_level() + calculate_creation_cost() + if("change_name") + if(simulating == SIMULATION_STAGE_OFF && mode == MODE_CREATE) + var/newname = input("Set name for template (2-20 characters)","[src]") as text + newname = reject_bad_name(newname, TRUE, 20, FALSE) + if(isnull(newname)) + to_chat(usr, SPAN_WARNING("This name is not permited.")) + else if(GLOB.chemical_reagents_list[newname]) + to_chat(usr, SPAN_WARNING("This name is already occupied")) + else + creation_name = newname + if("change_create_target_level") + var/level_to_set = 1 + if(GLOB.chemical_data.clearance_level <= 2) + level_to_set = tgui_input_list(usr, "Set target level for [target_property.name]:","[src]", list(1,2,3,4)) + else if(GLOB.chemical_data.clearance_level <= 4) + level_to_set = tgui_input_list(usr, "Set target level for [target_property.name]:","[src]", list(1,2,3,4,5,6,7,8)) + else + level_to_set = tgui_input_list(usr, "Set target level for [target_property.name]:","[src]", list(1,2,3,4,5,6,7,8,9,10)) + if(!level_to_set) + return + if(!LAZYISIN(creation_template, target_property)) + LAZYADD(creation_template, target_property) + target_property.level = level_to_set + if(target_property.max_level && target_property.level > target_property.max_level) + target_property.level = target_property.max_level + to_chat(usr, "Max level for [target_property.name] is [target_property.max_level].") + calculate_creation_cost() + if("change_complexity") + var/slot = params["complexity_slot"] + var/new_rarity = tgui_input_list(usr, "Set chemical rarity for complexity slot [slot]:", "[src]", list("BASIC (+7)", "COMMON (+4)", "UNCOMMON (1)", "RARE (-5)")) + if(!new_rarity || simulating != SIMULATION_STAGE_OFF) + return + switch(new_rarity) + if("BASIC (+7)") + creation_complexity[slot] = CHEM_CLASS_BASIC + if("COMMON (+4)") + creation_complexity[slot] = CHEM_CLASS_COMMON + if("UNCOMMON (1)") + creation_complexity[slot] = CHEM_CLASS_UNCOMMON + if("RARE (-5)") + creation_complexity[slot] = CHEM_CLASS_RARE + calculate_creation_cost() + if("keyboard_sound")//only exists to give sound + playsound(loc, pick('sound/machines/computer_typing1.ogg','sound/machines/computer_typing2.ogg','sound/machines/computer_typing3.ogg'), 5, 1) return - - switch(new_rarity) - if("BASIC (+7)") - creation_complexity[slot] = CHEM_CLASS_BASIC - if("COMMON (+4)") - creation_complexity[slot] = CHEM_CLASS_COMMON - if("UNCOMMON (1)") - creation_complexity[slot] = CHEM_CLASS_UNCOMMON - if("RARE (-5)") - creation_complexity[slot] = CHEM_CLASS_RARE - calculate_creation_cost() - ready = check_ready() playsound(loc, pick('sound/machines/computer_typing1.ogg','sound/machines/computer_typing2.ogg','sound/machines/computer_typing3.ogg'), 5, 1) - SSnano.nanomanager.update_uis(src) /obj/structure/machinery/chem_simulator/process() if(inoperable()) @@ -534,24 +556,34 @@ if(target_property.level >= GLOB.chemical_data.clearance_level*TECHTREE_LEVEL_MULTIPLIER + 2 && GLOB.chemical_data.clearance_level < 5) status_bar = "CLEARANCE INSUFFICIENT FOR AMPLIFICATION" return FALSE + else + status_bar = "TARGET NOT SELECTED" + return FALSE if(target && length(target.data.properties) < 2) status_bar = "TARGET COMPLEXITY IMPROPER FOR RELATION" return FALSE - if(reference && target) - if(!reference.completed) - status_bar = "INCOMPLETE DATA DETECTED IN REFERENCE" - return FALSE - if(reference_property) - if(target.data.get_property(reference_property.name)) - status_bar = "REFERENCE PROPERTY ALREADY IN TARGET" + if(mode == MODE_RELATE && isnull(reference)) + status_bar = "NO REFERENCE DATA DETECTED" + return FALSE + if(mode == MODE_RELATE) + if(reference && target) + if(!reference.completed) + status_bar = "INCOMPLETE DATA DETECTED IN REFERENCE" return FALSE - if(target_property) - if(target_property.level != reference_property.level) - status_bar = "REFERENCE AND TARGET PROPERTY MUST BE OF EQUAL LEVELS" - return FALSE - if(reference_property.category & PROPERTY_TYPE_UNADJUSTABLE) - status_bar = "REFERENCE PROPERTY CAN NOT BE SIMULATED" + if(reference_property) + if(target.data.get_property(reference_property.name)) + status_bar = "REFERENCE PROPERTY ALREADY IN TARGET" return FALSE + if(target_property) + if(target_property.level != reference_property.level) + status_bar = "REFERENCE AND TARGET PROPERTY MUST BE OF EQUAL LEVELS" + return FALSE + if(reference_property.category & PROPERTY_TYPE_UNADJUSTABLE) + status_bar = "REFERENCE PROPERTY CAN NOT BE SIMULATED" + return FALSE + else + status_bar = "REFERENCE PROPERTY NOT SELECTED" + return FALSE if(mode == MODE_CREATE) if(!LAZYLEN(creation_template)) status_bar = "TEMPLATE IS EMPTY" @@ -565,7 +597,8 @@ else if(!target) status_bar = "NO TARGET INSERTED" return FALSE - status_bar = "READY" + if(simulating == SIMULATION_STAGE_OFF) + status_bar = "READY" return TRUE /obj/structure/machinery/chem_simulator/proc/print(id, is_new) @@ -714,6 +747,36 @@ status_bar = "SIMULATION COMPLETE" print(C.id, TRUE) +/datum/chemical_simulator_modes + var/name + var/desc + var/mode_id + var/icon_type + +/datum/chemical_simulator_modes/create + name = "CREATE" + desc = "Create a new custom chemical from the known properties discovered earlier." + mode_id = MODE_CREATE + icon_type = "bolt" + +/datum/chemical_simulator_modes/supress + name = "SUPRESS" + desc = "Supress one level in the choosen property. This operation lowers the OD level." + mode_id = MODE_SUPPRESS + icon_type = "square-minus" + +/datum/chemical_simulator_modes/amplify + name = "AMPLIFY" + desc = "Amplify one level in the choosen property. This operation lowers the OD level." + mode_id = MODE_AMPLIFY + icon_type = "square-plus" + +/datum/chemical_simulator_modes/relate + name = "RELATE" + desc = "Use the reference chemical to replace one choosen property in the target chemical. The target and reference target property level must be equal, This operation lowers the OD level." + mode_id = MODE_RELATE + icon_type = "repeat" + #undef SIMULATION_FAILURE #undef SIMULATION_STAGE_OFF #undef SIMULATION_STAGE_FINAL diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 40867892afbd..9243c71ae7df 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -71,7 +71,7 @@ /datum/chem_property/positive/repairing name = PROPERTY_REPAIRING code = "REP" - description = "Repairs cybernetic organs by REDACTED." + description = "Repairs cybernetic organs by the use of REDACTED property of REDACTED element." rarity = PROPERTY_UNCOMMON category = PROPERTY_TYPE_MEDICINE value = 2 diff --git a/nano/templates/chem_simulator.tmpl b/nano/templates/chem_simulator.tmpl deleted file mode 100644 index 47057f13bf85..000000000000 --- a/nano/templates/chem_simulator.tmpl +++ /dev/null @@ -1,366 +0,0 @@ - -
- {{:data.target_info}}
-
Type: {{:data.target_categories}}
-
Research Cost: {{:data.property_costs[data.target_property]}}
-
- {{:data.reference_info}}
-
Type: {{:data.reference_categories}}
-
- {{:data.target_info}}
-
Type: {{:data.target_categories}}
-
Value per level: {{:data.property_costs[data.target_property]}}
-